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,840 @@
1
+ /**
2
+ * FileContentReplaceTool - Replace specific content within files
3
+ *
4
+ * Purpose:
5
+ * - Replace text content in files with precision
6
+ * - Support line-limited replacements
7
+ * - Handle whitespace intelligently with trim modes
8
+ * - Create backups before modifications
9
+ * - Generate diff reports
10
+ * - Support multi-file operations
11
+ */
12
+
13
+ import { BaseTool } from './baseTool.js';
14
+ import { promises as fs } from 'fs';
15
+ import path from 'path';
16
+
17
+ // Configuration constants
18
+ const REPLACE_CONFIG = {
19
+ // File size limits
20
+ MAX_FILE_SIZE: 10 * 1024 * 1024, // 10MB max file size
21
+ MAX_OLD_CONTENT_SIZE: 100 * 1024, // 100KB max old content
22
+ MAX_NEW_CONTENT_SIZE: 100 * 1024, // 100KB max new content
23
+
24
+ // Operation limits
25
+ MAX_REPLACEMENTS_PER_FILE: 1000, // Max replacements in single file
26
+ MAX_FILES_PER_OPERATION: 50, // Max files in one operation
27
+ MAX_LINE_RANGE_SIZE: 10000, // Max lines in a range
28
+
29
+ // Backup settings
30
+ CREATE_BACKUPS: true,
31
+ BACKUP_EXTENSION: '.bak',
32
+
33
+ // Diff settings
34
+ DIFF_CONTEXT_LINES: 3, // Lines of context in diff
35
+ MAX_DIFF_LINES: 100, // Max lines to show in diff
36
+
37
+ // Default settings
38
+ DEFAULT_TRIM_MODE: 'trim'
39
+ };
40
+
41
+ class FileContentReplaceTool extends BaseTool {
42
+ constructor(config = {}, logger = null) {
43
+ super(config, logger);
44
+
45
+ // Override tool ID to match documentation (with hyphens)
46
+ this.id = 'file-content-replace';
47
+
48
+ // Tool metadata
49
+ this.requiresProject = true;
50
+ this.isAsync = true;
51
+ this.timeout = config.timeout || 120000; // 2 minutes default
52
+
53
+ // Merge config with defaults
54
+ this.replaceConfig = {
55
+ ...REPLACE_CONFIG,
56
+ ...config.replaceConfig
57
+ };
58
+ }
59
+
60
+ /**
61
+ * Get tool description for LLM consumption
62
+ * @returns {string} Tool description
63
+ */
64
+ getDescription() {
65
+ return `
66
+ File Content Replace Tool: Replace specific content within files with precision.
67
+
68
+ USAGE:
69
+ \`\`\`json
70
+ {
71
+ "toolId": "file-content-replace",
72
+ "files": [
73
+ {
74
+ "path": "src/app.js",
75
+ "replacements": [
76
+ {
77
+ "oldContent": "const oldFunction = () => {}",
78
+ "newContent": "const newFunction = () => {}",
79
+ "mode": "trim",
80
+ "linesLimit": "5,7-10"
81
+ }
82
+ ]
83
+ }
84
+ ]
85
+ }
86
+ \`\`\`
87
+
88
+ PARAMETERS:
89
+
90
+ path (required):
91
+ - Path to the file to modify
92
+ - Can be relative or absolute
93
+ - Examples: "src/app.js", "./config.json"
94
+
95
+ oldContent (required):
96
+ - Content to find and replace
97
+ - Subject to trim mode processing
98
+ - Must exist in file
99
+
100
+ newContent (required):
101
+ - Replacement content
102
+ - Subject to trim mode processing
103
+ - Can be same length, shorter, or longer
104
+
105
+ mode (optional):
106
+ - Whitespace handling mode
107
+ - Options:
108
+ * "trim" (default): Trim all whitespace from both ends
109
+ * "newlines": Only trim newline characters
110
+ * "none": Use content exactly as provided
111
+ - Helps with matching despite indentation differences
112
+
113
+ linesLimit (optional):
114
+ - Restrict replacement to specific lines
115
+ - Format: Comma-separated line numbers or ranges
116
+ - Examples: "5", "5,10,15", "5-10", "1-5,10,15-20"
117
+ - Line numbers are 1-based
118
+
119
+ EXAMPLES:
120
+
121
+ Example 1 - Basic replacement:
122
+ \`\`\`json
123
+ {
124
+ "toolId": "file-content-replace",
125
+ "files": [{
126
+ "path": "src/components/Button.js",
127
+ "replacements": [{
128
+ "oldContent": "const handleClick = (event) => { console.log('clicked'); }",
129
+ "newContent": "const handleClick = (event) => { console.log('clicked'); props.onClick?.(event); }",
130
+ "mode": "trim"
131
+ }]
132
+ }]
133
+ }
134
+ \`\`\`
135
+
136
+ Example 2 - Line-limited replacement:
137
+ \`\`\`json
138
+ {
139
+ "toolId": "file-content-replace",
140
+ "files": [{
141
+ "path": "src/App.js",
142
+ "replacements": [{
143
+ "oldContent": "const API_URL = 'http://localhost:3000'",
144
+ "newContent": "const API_URL = process.env.API_URL",
145
+ "linesLimit": "10-20"
146
+ }]
147
+ }]
148
+ }
149
+ \`\`\`
150
+
151
+ Example 3 - Multiple replacements in one file:
152
+ \`\`\`json
153
+ {
154
+ "toolId": "file-content-replace",
155
+ "files": [{
156
+ "path": "src/config.js",
157
+ "replacements": [
158
+ { "oldContent": "DEBUG = false", "newContent": "DEBUG = true" },
159
+ { "oldContent": "LOG_LEVEL = 'error'", "newContent": "LOG_LEVEL = 'debug'" }
160
+ ]
161
+ }]
162
+ }
163
+ \`\`\`
164
+
165
+ Example 4 - Multiple files:
166
+ \`\`\`json
167
+ {
168
+ "toolId": "file-content-replace",
169
+ "files": [
170
+ {
171
+ "path": "src/app.js",
172
+ "replacements": [{ "oldContent": "version = '1.0.0'", "newContent": "version = '1.1.0'" }]
173
+ },
174
+ {
175
+ "path": "package.json",
176
+ "replacements": [{ "oldContent": "\\"version\\": \\"1.0.0\\"", "newContent": "\\"version\\": \\"1.1.0\\"", "mode": "none" }]
177
+ }
178
+ ]
179
+ }
180
+ \`\`\`
181
+
182
+ TIP: Before replacing, use code-map read-range to preview the target lines and verify the exact content to match. This avoids failed replacements due to unexpected whitespace or content.
183
+
184
+ FEATURES:
185
+ - Automatic backup creation (.bak files)
186
+ - Before/after diff reports
187
+ - Replacement counting and statistics
188
+ - Multi-file operations
189
+ - Line-limited replacements
190
+ - Intelligent whitespace handling
191
+
192
+ LIMITATIONS:
193
+ - Maximum file size: ${REPLACE_CONFIG.MAX_FILE_SIZE / (1024 * 1024)}MB
194
+ - Maximum old content size: ${REPLACE_CONFIG.MAX_OLD_CONTENT_SIZE / 1024}KB
195
+ - Maximum new content size: ${REPLACE_CONFIG.MAX_NEW_CONTENT_SIZE / 1024}KB
196
+ - Maximum replacements per file: ${REPLACE_CONFIG.MAX_REPLACEMENTS_PER_FILE}
197
+ - Maximum files per operation: ${REPLACE_CONFIG.MAX_FILES_PER_OPERATION}
198
+ `;
199
+ }
200
+
201
+ /**
202
+ * Parse parameters from tool command content
203
+ * @param {string} content - Raw tool command content
204
+ * @returns {Object} Parsed parameters
205
+ */
206
+ parseParameters(content) {
207
+ try {
208
+ // Try JSON first
209
+ if (content.trim().startsWith('{')) {
210
+ return this.parseJSON(content);
211
+ }
212
+
213
+ // Otherwise parse XML
214
+ return this.parseXML(content);
215
+ } catch (error) {
216
+ this.logger?.error('Failed to parse file-content-replace parameters', {
217
+ error: error.message
218
+ });
219
+ throw new Error(`Parameter parsing failed: ${error.message}`);
220
+ }
221
+ }
222
+
223
+ /**
224
+ * Parse JSON format
225
+ * @param {string} content - JSON string
226
+ * @returns {Object} Parsed parameters
227
+ */
228
+ parseJSON(content) {
229
+ const parsed = JSON.parse(content);
230
+
231
+ if (!parsed.files || !Array.isArray(parsed.files)) {
232
+ throw new Error('JSON must have "files" array');
233
+ }
234
+
235
+ return {
236
+ files: parsed.files.map(file => ({
237
+ path: file.path,
238
+ replacements: (file.replacements || []).map(r => ({
239
+ oldContent: r.oldContent,
240
+ newContent: r.newContent,
241
+ mode: r.mode || REPLACE_CONFIG.DEFAULT_TRIM_MODE,
242
+ linesLimit: r.linesLimit || null
243
+ }))
244
+ }))
245
+ };
246
+ }
247
+
248
+ /**
249
+ * Parse XML format
250
+ * @param {string} content - XML string
251
+ * @returns {Object} Parsed parameters
252
+ */
253
+ parseXML(content) {
254
+ const files = [];
255
+
256
+ // Extract <file> tags
257
+ const filePattern = /<file\s+path="([^"]+)">([\s\S]*?)<\/file>/gi;
258
+ let fileMatch;
259
+
260
+ while ((fileMatch = filePattern.exec(content)) !== null) {
261
+ const filePath = fileMatch[1];
262
+ const fileContent = fileMatch[2];
263
+
264
+ const replacements = [];
265
+
266
+ // Extract <replace> tags within this file
267
+ const replacePattern = /<replace(?:\s+([^>]*?))?>([\s\S]*?)<\/replace>/gi;
268
+ let replaceMatch;
269
+
270
+ while ((replaceMatch = replacePattern.exec(fileContent)) !== null) {
271
+ const attributes = replaceMatch[1] || '';
272
+ const replaceContent = replaceMatch[2];
273
+
274
+ // Parse attributes
275
+ const mode = this.extractAttribute(attributes, 'mode') || REPLACE_CONFIG.DEFAULT_TRIM_MODE;
276
+ const linesLimit = this.extractAttribute(attributes, 'lines-limit');
277
+
278
+ // Extract old-content
279
+ const oldContentMatch = /<old-content>([\s\S]*?)<\/old-content>/i.exec(replaceContent);
280
+ if (!oldContentMatch) {
281
+ this.logger?.warn('Missing old-content in replace tag');
282
+ continue;
283
+ }
284
+ const oldContentRaw = oldContentMatch[1];
285
+
286
+ // Extract new-content
287
+ const newContentMatch = /<new-content>([\s\S]*?)<\/new-content>/i.exec(replaceContent);
288
+ if (!newContentMatch) {
289
+ this.logger?.warn('Missing new-content in replace tag');
290
+ continue;
291
+ }
292
+ const newContentRaw = newContentMatch[1];
293
+
294
+ // Apply trim mode
295
+ const oldContent = this.applyTrimMode(oldContentRaw, mode);
296
+ const newContent = this.applyTrimMode(newContentRaw, mode);
297
+
298
+ replacements.push({
299
+ oldContent,
300
+ newContent,
301
+ mode,
302
+ linesLimit
303
+ });
304
+ }
305
+
306
+ if (replacements.length > 0) {
307
+ files.push({
308
+ path: filePath,
309
+ replacements
310
+ });
311
+ }
312
+ }
313
+
314
+ return { files };
315
+ }
316
+
317
+ /**
318
+ * Extract attribute value from attribute string
319
+ * @param {string} attributes - Attribute string
320
+ * @param {string} name - Attribute name
321
+ * @returns {string|null} Attribute value
322
+ */
323
+ extractAttribute(attributes, name) {
324
+ const pattern = new RegExp(`${name}=["']([^"']*)["']`, 'i');
325
+ const match = pattern.exec(attributes);
326
+ return match ? match[1] : null;
327
+ }
328
+
329
+ /**
330
+ * Apply trim mode to content
331
+ * @param {string} content - Content to process
332
+ * @param {string} mode - Trim mode
333
+ * @returns {string} Processed content
334
+ */
335
+ applyTrimMode(content, mode) {
336
+ switch (mode) {
337
+ case 'newlines':
338
+ return content.replace(/^\n+|\n+$/g, '');
339
+ case 'none':
340
+ return content;
341
+ case 'trim':
342
+ default:
343
+ return content.trim();
344
+ }
345
+ }
346
+
347
+ /**
348
+ * Get required parameters
349
+ * @returns {Array<string>} Array of required parameter names
350
+ */
351
+ getRequiredParameters() {
352
+ return ['files'];
353
+ }
354
+
355
+ /**
356
+ * Custom parameter validation
357
+ * @param {Object} params - Parameters to validate
358
+ * @returns {Object} Validation result
359
+ */
360
+ customValidateParameters(params) {
361
+ const errors = [];
362
+
363
+ // Validate files array
364
+ if (!params.files || !Array.isArray(params.files)) {
365
+ errors.push('files must be an array');
366
+ } else {
367
+ if (params.files.length === 0) {
368
+ errors.push('files array cannot be empty');
369
+ }
370
+
371
+ if (params.files.length > this.replaceConfig.MAX_FILES_PER_OPERATION) {
372
+ errors.push(`Cannot process more than ${this.replaceConfig.MAX_FILES_PER_OPERATION} files in one operation`);
373
+ }
374
+
375
+ // Validate each file
376
+ for (const file of params.files) {
377
+ if (!file.path) {
378
+ errors.push('Each file must have a path');
379
+ }
380
+
381
+ // Check for path traversal
382
+ if (file.path && file.path.includes('..')) {
383
+ errors.push(`Path traversal (..) not allowed for security: ${file.path}`);
384
+ }
385
+
386
+ if (!file.replacements || !Array.isArray(file.replacements)) {
387
+ errors.push(`File ${file.path} must have replacements array`);
388
+ } else if (file.replacements.length === 0) {
389
+ errors.push(`File ${file.path} replacements array cannot be empty`);
390
+ } else {
391
+ // Validate each replacement
392
+ for (const replacement of file.replacements) {
393
+ if (!replacement.oldContent && replacement.oldContent !== '') {
394
+ errors.push(`Replacement in ${file.path} missing oldContent`);
395
+ }
396
+
397
+ if (!replacement.newContent && replacement.newContent !== '') {
398
+ errors.push(`Replacement in ${file.path} missing newContent`);
399
+ }
400
+
401
+ // Validate content sizes
402
+ if (replacement.oldContent && replacement.oldContent.length > this.replaceConfig.MAX_OLD_CONTENT_SIZE) {
403
+ errors.push(`oldContent too large (max ${this.replaceConfig.MAX_OLD_CONTENT_SIZE / 1024}KB)`);
404
+ }
405
+
406
+ if (replacement.newContent && replacement.newContent.length > this.replaceConfig.MAX_NEW_CONTENT_SIZE) {
407
+ errors.push(`newContent too large (max ${this.replaceConfig.MAX_NEW_CONTENT_SIZE / 1024}KB)`);
408
+ }
409
+
410
+ // Validate mode
411
+ if (replacement.mode && !['trim', 'newlines', 'none'].includes(replacement.mode)) {
412
+ errors.push(`Invalid mode: ${replacement.mode}. Must be 'trim', 'newlines', or 'none'`);
413
+ }
414
+ }
415
+ }
416
+ }
417
+ }
418
+
419
+ // Throw error if validation fails
420
+ if (errors.length > 0) {
421
+ throw new Error(`Parameter validation failed: ${errors.join(', ')}`);
422
+ }
423
+
424
+ return {
425
+ valid: true,
426
+ errors: []
427
+ };
428
+ }
429
+
430
+ /**
431
+ * Check if params are already normalized (have replacements with mode defaults)
432
+ * @param {Object} params - Parameters to check
433
+ * @returns {boolean} True if already normalized
434
+ * @private
435
+ */
436
+ _isNormalizedParams(params) {
437
+ if (!params.files || !Array.isArray(params.files) || params.files.length === 0) {
438
+ return false;
439
+ }
440
+ // Check if first file's first replacement has 'mode' property (set by parseJSON)
441
+ const firstFile = params.files[0];
442
+ if (!firstFile.replacements || !Array.isArray(firstFile.replacements) || firstFile.replacements.length === 0) {
443
+ return false;
444
+ }
445
+ return firstFile.replacements[0].hasOwnProperty('mode');
446
+ }
447
+
448
+ /**
449
+ * Execute tool with parsed parameters
450
+ * @param {Object} params - Parsed parameters
451
+ * @param {Object} context - Execution context
452
+ * @returns {Promise<Object>} Execution result
453
+ */
454
+ async execute(params, context) {
455
+ // Handle string input (needs parsing)
456
+ if (typeof params === 'string') {
457
+ this.logger?.info('FileContentReplaceTool: Parsing string parameters');
458
+ params = this.parseParameters(params);
459
+ }
460
+
461
+ // Handle object that needs normalization (when files array exists but not parsed)
462
+ if (params && typeof params === 'object' && params.files && !this._isNormalizedParams(params)) {
463
+ this.logger?.info('FileContentReplaceTool: Normalizing object parameters');
464
+ // Re-parse to ensure proper structure with defaults
465
+ params = this.parseJSON(JSON.stringify(params));
466
+ }
467
+
468
+ const { files } = params;
469
+ const { projectDir, agentId, directoryAccess } = context;
470
+
471
+ // Determine working directory (respect multi-directory access)
472
+ let workingDirectory = projectDir || process.cwd();
473
+
474
+ if (directoryAccess && directoryAccess.workingDirectory) {
475
+ workingDirectory = directoryAccess.workingDirectory;
476
+ this.logger?.info('Using agent configured working directory', {
477
+ workingDirectory: directoryAccess.workingDirectory,
478
+ agentId
479
+ });
480
+ }
481
+
482
+ this.logger?.info('Executing file content replace', {
483
+ fileCount: files.length,
484
+ workingDirectory,
485
+ agentId
486
+ });
487
+
488
+ const results = [];
489
+ const stats = {
490
+ filesProcessed: 0,
491
+ filesModified: 0,
492
+ totalReplacements: 0,
493
+ backupsCreated: 0,
494
+ errors: 0
495
+ };
496
+
497
+ // Process each file
498
+ for (const file of files) {
499
+ try {
500
+ const fileResult = await this.processFile(file, workingDirectory, directoryAccess);
501
+ results.push(fileResult);
502
+
503
+ stats.filesProcessed++;
504
+ if (fileResult.replacementsMade > 0) {
505
+ stats.filesModified++;
506
+ stats.totalReplacements += fileResult.replacementsMade;
507
+ }
508
+ if (fileResult.backupCreated) {
509
+ stats.backupsCreated++;
510
+ }
511
+ } catch (error) {
512
+ this.logger?.error(`Error processing file ${file.path}`, { error: error.message });
513
+ results.push({
514
+ filePath: file.path,
515
+ success: false,
516
+ error: error.message
517
+ });
518
+ stats.errors++;
519
+ }
520
+ }
521
+
522
+ return {
523
+ success: stats.errors === 0,
524
+ results,
525
+ statistics: stats,
526
+ summary: this.generateSummary(stats),
527
+ toolUsed: 'file-content-replace'
528
+ };
529
+ }
530
+
531
+ /**
532
+ * Process a single file
533
+ * @param {Object} file - File object with path and replacements
534
+ * @param {string} workingDirectory - Working directory
535
+ * @param {Object} directoryAccess - Directory access config
536
+ * @returns {Promise<Object>} File processing result
537
+ */
538
+ async processFile(file, workingDirectory, directoryAccess) {
539
+ const { path: filePath, replacements } = file;
540
+
541
+ // Resolve path
542
+ const resolvedPath = path.isAbsolute(filePath)
543
+ ? filePath
544
+ : path.resolve(workingDirectory, filePath);
545
+
546
+ // Validate path access (if directoryAccess provided)
547
+ if (directoryAccess) {
548
+ const accessible = this.isPathAccessible(resolvedPath, workingDirectory, directoryAccess);
549
+ if (!accessible) {
550
+ throw new Error(`Path not accessible: ${filePath}`);
551
+ }
552
+ }
553
+
554
+ // Check file exists
555
+ try {
556
+ await fs.access(resolvedPath);
557
+ } catch (error) {
558
+ throw new Error(`File not found: ${filePath}`);
559
+ }
560
+
561
+ // Check file size
562
+ const stats = await fs.stat(resolvedPath);
563
+ if (stats.size > this.replaceConfig.MAX_FILE_SIZE) {
564
+ throw new Error(`File too large (max ${this.replaceConfig.MAX_FILE_SIZE / (1024 * 1024)}MB): ${filePath}`);
565
+ }
566
+
567
+ // Read file content
568
+ let content = await fs.readFile(resolvedPath, 'utf-8');
569
+ const originalContent = content;
570
+
571
+ // Create backup
572
+ let backupCreated = false;
573
+ if (this.replaceConfig.CREATE_BACKUPS) {
574
+ const backupPath = resolvedPath + this.replaceConfig.BACKUP_EXTENSION;
575
+ try {
576
+ await fs.writeFile(backupPath, originalContent, 'utf-8');
577
+ backupCreated = true;
578
+ } catch (error) {
579
+ this.logger?.warn(`Failed to create backup: ${error.message}`);
580
+ }
581
+ }
582
+
583
+ // Apply replacements
584
+ let replacementsMade = 0;
585
+ const replacementDetails = [];
586
+
587
+ for (const replacement of replacements) {
588
+ const result = await this.applyReplacement(
589
+ content,
590
+ replacement.oldContent,
591
+ replacement.newContent,
592
+ replacement.linesLimit,
593
+ replacement.mode
594
+ );
595
+
596
+ content = result.newContent;
597
+ replacementsMade += result.count;
598
+
599
+ replacementDetails.push({
600
+ oldContent: replacement.oldContent.substring(0, 50) + (replacement.oldContent.length > 50 ? '...' : ''),
601
+ newContent: replacement.newContent.substring(0, 50) + (replacement.newContent.length > 50 ? '...' : ''),
602
+ count: result.count,
603
+ mode: replacement.mode,
604
+ linesLimit: replacement.linesLimit
605
+ });
606
+ }
607
+
608
+ // Write back if changes were made
609
+ if (replacementsMade > 0) {
610
+ await fs.writeFile(resolvedPath, content, 'utf-8');
611
+ }
612
+
613
+ // Generate diff
614
+ const diff = replacementsMade > 0
615
+ ? this.generateDiff(originalContent, content)
616
+ : null;
617
+
618
+ return {
619
+ filePath,
620
+ resolvedPath,
621
+ success: true,
622
+ replacementsMade,
623
+ backupCreated,
624
+ replacementDetails,
625
+ diff,
626
+ message: replacementsMade > 0
627
+ ? `Made ${replacementsMade} replacement(s) in ${filePath}`
628
+ : `No replacements made in ${filePath} (content not found)`
629
+ };
630
+ }
631
+
632
+ /**
633
+ * Check if path is accessible
634
+ * @param {string} targetPath - Path to check
635
+ * @param {string} workingDirectory - Working directory
636
+ * @param {Object} directoryAccess - Directory access config
637
+ * @returns {boolean} True if accessible
638
+ */
639
+ isPathAccessible(targetPath, workingDirectory, directoryAccess) {
640
+ // Always allow paths within working directory
641
+ const relativeToWorking = path.relative(workingDirectory, targetPath);
642
+ if (!relativeToWorking.startsWith('..') && !path.isAbsolute(relativeToWorking)) {
643
+ return true;
644
+ }
645
+
646
+ // Check writeEnabledDirectories
647
+ if (directoryAccess.writeEnabledDirectories) {
648
+ for (const dir of directoryAccess.writeEnabledDirectories) {
649
+ const relative = path.relative(dir, targetPath);
650
+ if (!relative.startsWith('..') && !path.isAbsolute(relative)) {
651
+ return true;
652
+ }
653
+ }
654
+ }
655
+
656
+ return false;
657
+ }
658
+
659
+ /**
660
+ * Apply a single replacement
661
+ * @param {string} content - File content
662
+ * @param {string} oldContent - Content to replace
663
+ * @param {string} newContent - Replacement content
664
+ * @param {string|null} linesLimit - Line limit specification
665
+ * @param {string} mode - Trim mode
666
+ * @returns {Object} Result with newContent and count
667
+ */
668
+ async applyReplacement(content, oldContent, newContent, linesLimit, mode) {
669
+ if (!linesLimit) {
670
+ // Replace in entire file (simple string replace, not regex)
671
+ const count = this.countOccurrences(content, oldContent);
672
+
673
+ if (count === 0) {
674
+ return { newContent: content, count: 0 };
675
+ }
676
+
677
+ // Simple replaceAll
678
+ const newFileContent = content.split(oldContent).join(newContent);
679
+
680
+ return { newContent: newFileContent, count };
681
+ }
682
+
683
+ // Line-limited replacement
684
+ const lineNumbers = this.parseLineRanges(linesLimit);
685
+ const lines = content.split('\n');
686
+ let replacementCount = 0;
687
+
688
+ // Process each line
689
+ for (let i = 0; i < lines.length; i++) {
690
+ const lineNumber = i + 1; // 1-based
691
+
692
+ if (lineNumbers.has(lineNumber)) {
693
+ // Check if this line contains the old content
694
+ if (lines[i].includes(oldContent)) {
695
+ const occurrencesInLine = this.countOccurrences(lines[i], oldContent);
696
+ lines[i] = lines[i].split(oldContent).join(newContent);
697
+ replacementCount += occurrencesInLine;
698
+ }
699
+ }
700
+ }
701
+
702
+ return {
703
+ newContent: lines.join('\n'),
704
+ count: replacementCount
705
+ };
706
+ }
707
+
708
+ /**
709
+ * Count occurrences of substring in string
710
+ * @param {string} str - String to search
711
+ * @param {string} substr - Substring to count
712
+ * @returns {number} Count of occurrences
713
+ */
714
+ countOccurrences(str, substr) {
715
+ if (!substr) return 0;
716
+ return str.split(substr).length - 1;
717
+ }
718
+
719
+ /**
720
+ * Parse line ranges from string like "3,5,7-9"
721
+ * @param {string} rangesStr - Line range string
722
+ * @returns {Set<number>} Set of line numbers
723
+ */
724
+ parseLineRanges(rangesStr) {
725
+ const result = new Set();
726
+
727
+ if (!rangesStr || rangesStr.trim() === '') {
728
+ return result;
729
+ }
730
+
731
+ const ranges = rangesStr.split(',');
732
+
733
+ for (const range of ranges) {
734
+ const trimmed = range.trim();
735
+
736
+ if (trimmed === '') continue;
737
+
738
+ // Check if it's a range (e.g., "7-9")
739
+ if (trimmed.includes('-')) {
740
+ const [start, end] = trimmed.split('-').map(n => parseInt(n.trim(), 10));
741
+
742
+ if (!isNaN(start) && !isNaN(end) && end - start < this.replaceConfig.MAX_LINE_RANGE_SIZE) {
743
+ for (let i = start; i <= end; i++) {
744
+ result.add(i);
745
+ }
746
+ }
747
+ } else {
748
+ // Single line number
749
+ const lineNum = parseInt(trimmed, 10);
750
+ if (!isNaN(lineNum)) {
751
+ result.add(lineNum);
752
+ }
753
+ }
754
+ }
755
+
756
+ return result;
757
+ }
758
+
759
+ /**
760
+ * Generate diff between original and new content
761
+ * @param {string} original - Original content
762
+ * @param {string} modified - Modified content
763
+ * @returns {string} Diff string
764
+ */
765
+ generateDiff(original, modified) {
766
+ const oldLines = original.split('\n');
767
+ const newLines = modified.split('\n');
768
+
769
+ // Find first and last lines that differ
770
+ let firstDiff = -1;
771
+ let lastDiff = -1;
772
+
773
+ const maxLines = Math.max(oldLines.length, newLines.length);
774
+
775
+ for (let i = 0; i < maxLines; i++) {
776
+ const oldLine = i < oldLines.length ? oldLines[i] : '';
777
+ const newLine = i < newLines.length ? newLines[i] : '';
778
+
779
+ if (oldLine !== newLine) {
780
+ if (firstDiff === -1) firstDiff = i;
781
+ lastDiff = i;
782
+ }
783
+ }
784
+
785
+ if (firstDiff === -1) return 'No differences';
786
+
787
+ // Add context
788
+ const contextLines = this.replaceConfig.DIFF_CONTEXT_LINES;
789
+ const startLine = Math.max(0, firstDiff - contextLines);
790
+ const endLine = Math.min(maxLines - 1, lastDiff + contextLines);
791
+
792
+ // Limit total lines shown
793
+ if (endLine - startLine > this.replaceConfig.MAX_DIFF_LINES) {
794
+ return `Diff too large (${endLine - startLine + 1} lines), showing summary only:\n` +
795
+ `Changed lines: ${firstDiff + 1} to ${lastDiff + 1}`;
796
+ }
797
+
798
+ let diff = `@@ -${startLine + 1},${endLine - startLine + 1} +${startLine + 1},${endLine - startLine + 1} @@\n`;
799
+
800
+ for (let i = startLine; i <= endLine; i++) {
801
+ const oldLine = i < oldLines.length ? oldLines[i] : '';
802
+ const newLine = i < newLines.length ? newLines[i] : '';
803
+
804
+ if (oldLine === newLine) {
805
+ diff += ` ${oldLine}\n`;
806
+ } else {
807
+ diff += `- ${oldLine}\n`;
808
+ diff += `+ ${newLine}\n`;
809
+ }
810
+ }
811
+
812
+ return diff;
813
+ }
814
+
815
+ /**
816
+ * Generate summary text
817
+ * @param {Object} stats - Statistics object
818
+ * @returns {string} Summary text
819
+ */
820
+ generateSummary(stats) {
821
+ return `
822
+ Processed ${stats.filesProcessed} file(s)
823
+ Modified ${stats.filesModified} file(s)
824
+ Total replacements: ${stats.totalReplacements}
825
+ Backups created: ${stats.backupsCreated}
826
+ Errors: ${stats.errors}
827
+ `.trim();
828
+ }
829
+
830
+ /**
831
+ * Resource cleanup
832
+ * @param {string} operationId - Operation identifier
833
+ */
834
+ async cleanup(operationId) {
835
+ // No persistent resources to clean up
836
+ this.logger?.info('File content replace tool cleanup completed', { operationId });
837
+ }
838
+ }
839
+
840
+ export default FileContentReplaceTool;