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,1212 @@
1
+ /**
2
+ * @file tools/dependencyResolverTool.js
3
+ * @description Modern tool for resolving Node.js dependency conflicts by checking and updating to latest compatible versions
4
+ */
5
+
6
+ import { promises as fs } from 'fs';
7
+ import path from 'path';
8
+ import { exec as execCb } from 'child_process';
9
+ import { promisify } from 'util';
10
+ import { BaseTool } from './baseTool.js';
11
+ import TagParser from '../utilities/tagParser.js';
12
+
13
+ const exec = promisify(execCb);
14
+
15
+ /**
16
+ * Configuration constants for the dependency resolver
17
+ */
18
+ const RESOLVER_CONFIG = {
19
+ DEFAULT_MODE: 'check',
20
+ VALID_MODES: ['check', 'fix', 'auto'],
21
+ NPM_COMMAND_TIMEOUT: 300000, // 5 minutes for npm commands
22
+ REGISTRY_TIMEOUT: 10000, // 10 seconds for registry requests
23
+ MAX_CONCURRENT_CHECKS: 5, // Max parallel registry checks
24
+ BACKUP_EXTENSION: '.backup.json', // Backup file extension
25
+ CREATE_BACKUPS: true, // Always create backups
26
+ RETRY_ATTEMPTS: 3, // Registry request retry attempts
27
+ RETRY_DELAY: 1000, // Delay between retries (ms)
28
+ MAX_DEPENDENCIES: 500, // Safety limit
29
+ NPM_REGISTRY_URL: 'https://registry.npmjs.org'
30
+ };
31
+
32
+ /**
33
+ * DependencyResolverTool - Modern implementation
34
+ * Resolves Node.js package dependency conflicts with improved security and reliability
35
+ */
36
+ export class DependencyResolverTool extends BaseTool {
37
+ constructor(config = {}, logger = null) {
38
+ super(config, logger);
39
+
40
+ // Override tool ID to match documentation (with hyphen)
41
+ this.id = 'dependency-resolver';
42
+ }
43
+
44
+ /**
45
+ * Get tool description for agent system prompt
46
+ * @returns {string} Formatted tool description
47
+ */
48
+ getDescription() {
49
+ return `Tool: Dependency Resolver - Resolve Node.js package dependency conflicts
50
+
51
+ **Purpose:** Checks npm dependencies for updates and optionally updates package.json to latest compatible versions automatically.
52
+
53
+ **USAGE:**
54
+ \`\`\`json
55
+ {
56
+ "toolId": "dependency-resolver",
57
+ "parameters": {
58
+ "path": "./my-project",
59
+ "mode": "check",
60
+ "includeDev": true
61
+ }
62
+ }
63
+ \`\`\`
64
+
65
+ **Parameters:**
66
+ - **path** (string, optional): Path to project directory with package.json. Default: "."
67
+ - **mode** (string, optional): Operation mode. Options:
68
+ - "check" - Only check for updates (default)
69
+ - "fix" - Update package.json and run npm install
70
+ - "auto" - Automatically fix all conflicts
71
+ - **includeDev** (boolean, optional): Include devDependencies. Default: true
72
+
73
+ **What It Does:**
74
+ - Checks npm registry for latest compatible versions
75
+ - Respects semver ranges (^, ~, >=, etc.)
76
+ - Creates automatic backups before modifications
77
+ - Runs npm install after updates (in fix/auto mode)
78
+ - Provides detailed update report
79
+
80
+ **Examples:**
81
+
82
+ 1. Check for updates:
83
+ \`\`\`json
84
+ {
85
+ "toolId": "dependency-resolver",
86
+ "parameters": { "mode": "check" }
87
+ }
88
+ \`\`\`
89
+
90
+ 2. Fix outdated dependencies:
91
+ \`\`\`json
92
+ {
93
+ "toolId": "dependency-resolver",
94
+ "parameters": { "path": "./my-project", "mode": "fix" }
95
+ }
96
+ \`\`\`
97
+
98
+ 3. Auto-fix with devDependencies:
99
+ \`\`\`json
100
+ {
101
+ "toolId": "dependency-resolver",
102
+ "parameters": { "mode": "auto", "includeDev": true }
103
+ }
104
+ \`\`\`
105
+
106
+ **Notes:**
107
+ - Always creates backup (.backup.json) before modifications
108
+ - Network requests have timeout and retry logic
109
+ - npm install runs with timeout protection (5 minutes max)
110
+ - Supports complex semver ranges (||, &&, etc.)`;
111
+ }
112
+
113
+ /**
114
+ * Parse tool parameters from raw content (XML or JSON)
115
+ * @param {string|Object} content - Raw tool content or parsed object
116
+ * @returns {Object} Parsed parameters
117
+ */
118
+ parseParameters(content) {
119
+ // If already an object, validate and return
120
+ if (typeof content === 'object' && content !== null) {
121
+ return {
122
+ path: content.path || '.',
123
+ mode: content.mode || RESOLVER_CONFIG.DEFAULT_MODE,
124
+ includeDev: content.includeDev !== undefined ? content.includeDev : true
125
+ };
126
+ }
127
+
128
+ // Parse XML content
129
+ if (typeof content === 'string') {
130
+ // Try modern XML format first: <dependency-resolve>...</dependency-resolve>
131
+ const modernPattern = /<dependency-resolve([^>]*)>([\s\S]*?)<\/dependency-resolve>/i;
132
+ const modernMatch = modernPattern.exec(content);
133
+
134
+ if (modernMatch) {
135
+ const attributesStr = modernMatch[1];
136
+ const innerContent = modernMatch[2];
137
+
138
+ // Parse attributes from opening tag
139
+ const pathAttr = /path=["']([^"']*)["']/i.exec(attributesStr);
140
+ const modeAttr = /mode=["']([^"']*)["']/i.exec(attributesStr);
141
+ const includeDevAttr = /include-dev=["']([^"']*)["']/i.exec(attributesStr);
142
+
143
+ // Extract from inner content
144
+ const pathPattern = /<path>(.*?)<\/path>/i;
145
+ const pathMatch = pathPattern.exec(innerContent);
146
+
147
+ const modePattern = /<mode>(.*?)<\/mode>/i;
148
+ const modeMatch = modePattern.exec(innerContent);
149
+
150
+ const includeDevPattern = /<include-dev>(.*?)<\/include-dev>/i;
151
+ const includeDevMatch = includeDevPattern.exec(innerContent);
152
+
153
+ // Content takes precedence over attributes
154
+ const extractedPath = (pathMatch ? pathMatch[1].trim() : null) || (pathAttr ? pathAttr[1] : '.');
155
+ const extractedMode = (modeMatch ? modeMatch[1].trim() : null) || (modeAttr ? modeAttr[1] : RESOLVER_CONFIG.DEFAULT_MODE);
156
+ const extractedIncludeDev = (includeDevMatch ? includeDevMatch[1].trim() : null) || (includeDevAttr ? includeDevAttr[1] : 'true');
157
+
158
+ return {
159
+ path: extractedPath,
160
+ mode: extractedMode,
161
+ includeDev: this._parseBoolean(extractedIncludeDev, true)
162
+ };
163
+ }
164
+
165
+ // Try legacy format: [resolve path="..." mode="..."]
166
+ const legacyPattern = /\[resolve\s+([^\]]*)\]/i;
167
+ const legacyMatch = legacyPattern.exec(content);
168
+
169
+ if (legacyMatch) {
170
+ const attrString = legacyMatch[1];
171
+
172
+ // Parse attributes manually
173
+ const pathAttr = /path=["']([^"']*)["']/i.exec(attrString);
174
+ const modeAttr = /mode=["']([^"']*)["']/i.exec(attrString);
175
+ const includeDevAttr = /include-dev=["']([^"']*)["']/i.exec(attrString);
176
+
177
+ return {
178
+ path: pathAttr ? pathAttr[1] : '.',
179
+ mode: modeAttr ? modeAttr[1] : RESOLVER_CONFIG.DEFAULT_MODE,
180
+ includeDev: this._parseBoolean(includeDevAttr ? includeDevAttr[1] : 'true', true)
181
+ };
182
+ }
183
+
184
+ throw new Error('Invalid dependency-resolve format. Use <dependency-resolve> tags or JSON format.');
185
+ }
186
+
187
+ throw new Error('Invalid parameter format. Expected string (XML) or object (JSON).');
188
+ }
189
+
190
+ /**
191
+ * Parse boolean from string or boolean
192
+ * @param {any} value - Value to parse
193
+ * @param {boolean} defaultValue - Default if undefined
194
+ * @returns {boolean}
195
+ * @private
196
+ */
197
+ _parseBoolean(value, defaultValue = false) {
198
+ if (value === undefined || value === null) return defaultValue;
199
+ if (typeof value === 'boolean') return value;
200
+ if (typeof value === 'string') {
201
+ return value.toLowerCase() === 'true' || value === '1';
202
+ }
203
+ return defaultValue;
204
+ }
205
+
206
+ /**
207
+ * Validate parameters
208
+ * @param {Object} params - Parameters to validate
209
+ * @throws {Error} If validation fails
210
+ * @private
211
+ */
212
+ _validateParameters(params) {
213
+ if (!params || typeof params !== 'object') {
214
+ throw new Error('Parameters must be an object');
215
+ }
216
+
217
+ if (params.path && typeof params.path !== 'string') {
218
+ throw new Error('path must be a string');
219
+ }
220
+
221
+ if (params.mode && !RESOLVER_CONFIG.VALID_MODES.includes(params.mode)) {
222
+ throw new Error(`Invalid mode: ${params.mode}. Must be one of: ${RESOLVER_CONFIG.VALID_MODES.join(', ')}`);
223
+ }
224
+
225
+ if (params.includeDev !== undefined && typeof params.includeDev !== 'boolean') {
226
+ throw new Error('includeDev must be a boolean');
227
+ }
228
+ }
229
+
230
+ /**
231
+ * Validate and resolve file path
232
+ * @param {string} targetPath - Target path from parameters
233
+ * @param {Object} context - Execution context
234
+ * @returns {string} Resolved absolute path
235
+ * @throws {Error} If path is invalid or inaccessible
236
+ * @private
237
+ */
238
+ _resolveAndValidatePath(targetPath, context) {
239
+ const { projectDir, directoryAccess } = context;
240
+
241
+ // Determine working directory
242
+ let workingDirectory = projectDir || process.cwd();
243
+
244
+ if (directoryAccess && directoryAccess.workingDirectory) {
245
+ workingDirectory = directoryAccess.workingDirectory;
246
+ }
247
+
248
+ // Resolve the target path
249
+ const resolvedPath = path.isAbsolute(targetPath)
250
+ ? path.normalize(targetPath)
251
+ : path.normalize(path.join(workingDirectory, targetPath));
252
+
253
+ // Security: Check for path traversal
254
+ const realWorkingDir = path.normalize(workingDirectory);
255
+ if (!resolvedPath.startsWith(realWorkingDir)) {
256
+ throw new Error(`Path traversal detected: ${targetPath} resolves outside working directory`);
257
+ }
258
+
259
+ return resolvedPath;
260
+ }
261
+
262
+ /**
263
+ * Create backup of package.json
264
+ * @param {string} pkgPath - Path to package.json
265
+ * @returns {Promise<string|null>} Backup file path or null if failed
266
+ * @private
267
+ */
268
+ async _createBackup(pkgPath) {
269
+ if (!RESOLVER_CONFIG.CREATE_BACKUPS) {
270
+ return null;
271
+ }
272
+
273
+ try {
274
+ const backupPath = pkgPath + RESOLVER_CONFIG.BACKUP_EXTENSION;
275
+ await fs.copyFile(pkgPath, backupPath);
276
+ this.logger?.info('Created backup', { backupPath });
277
+ return backupPath;
278
+ } catch (error) {
279
+ this.logger?.warn('Failed to create backup', { error: error.message });
280
+ return null;
281
+ }
282
+ }
283
+
284
+ /**
285
+ * Fetch package info from npm registry with retries
286
+ * @param {string} packageName - Package name
287
+ * @returns {Promise<Object|null>} Package data or null if failed
288
+ * @private
289
+ */
290
+ async _fetchPackageInfo(packageName) {
291
+ const url = `${RESOLVER_CONFIG.NPM_REGISTRY_URL}/${encodeURIComponent(packageName)}`;
292
+
293
+ for (let attempt = 1; attempt <= RESOLVER_CONFIG.RETRY_ATTEMPTS; attempt++) {
294
+ try {
295
+ const controller = new AbortController();
296
+ const timeout = setTimeout(() => controller.abort(), RESOLVER_CONFIG.REGISTRY_TIMEOUT);
297
+
298
+ const response = await fetch(url, { signal: controller.signal });
299
+ clearTimeout(timeout);
300
+
301
+ if (!response.ok) {
302
+ if (response.status === 404) {
303
+ this.logger?.warn(`Package not found: ${packageName}`);
304
+ return null;
305
+ }
306
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
307
+ }
308
+
309
+ const data = await response.json();
310
+
311
+ // Validate response structure
312
+ if (!data || typeof data !== 'object' || !data['dist-tags']) {
313
+ throw new Error('Invalid registry response format');
314
+ }
315
+
316
+ return data;
317
+
318
+ } catch (error) {
319
+ if (attempt < RESOLVER_CONFIG.RETRY_ATTEMPTS) {
320
+ this.logger?.debug(`Retry ${attempt}/${RESOLVER_CONFIG.RETRY_ATTEMPTS} for ${packageName}`);
321
+ await new Promise(resolve => setTimeout(resolve, RESOLVER_CONFIG.RETRY_DELAY * attempt));
322
+ } else {
323
+ this.logger?.error(`Failed to fetch ${packageName}:`, error.message);
324
+ return null;
325
+ }
326
+ }
327
+ }
328
+
329
+ return null;
330
+ }
331
+
332
+ /**
333
+ * Get latest compatible version for a package
334
+ * Enhanced self-contained semver logic supporting:
335
+ * - Caret ranges (^) with 0.x.y and 0.0.x special cases
336
+ * - Tilde ranges (~)
337
+ * - Comparison operators (>, >=, <, <=)
338
+ * - X-ranges (4.x, 4.*, etc.)
339
+ * - Pre-release versions
340
+ * - Complex range expressions (AND/OR)
341
+ * - Exact versions
342
+ *
343
+ * @param {string} packageName - Package name
344
+ * @param {string} currentRange - Current version range
345
+ * @returns {Promise<string|null>} Latest version or null if no update needed
346
+ * @private
347
+ */
348
+ async _getLatestCompatibleVersion(packageName, currentRange) {
349
+ const data = await this._fetchPackageInfo(packageName);
350
+
351
+ if (!data) {
352
+ return null;
353
+ }
354
+
355
+ const latest = data['dist-tags']?.latest;
356
+
357
+ if (!latest) {
358
+ return null;
359
+ }
360
+
361
+ // Parse latest version
362
+ const latestParsed = this._parseVersion(latest);
363
+
364
+ if (!latestParsed) {
365
+ return null; // Can't parse latest
366
+ }
367
+
368
+ // Check if it's a complex range (AND/OR)
369
+ if (this._isComplexRange(currentRange)) {
370
+ const complexRange = this._parseComplexRange(currentRange);
371
+ const isUpdateAvailable = this._satisfiesComplexRange(complexRange, latestParsed);
372
+
373
+ if (isUpdateAvailable) {
374
+ // For complex ranges, preserve the original format
375
+ return latest;
376
+ }
377
+ return null;
378
+ }
379
+
380
+ // Simple range - parse normally
381
+ const rangeInfo = this._parseVersionRange(currentRange);
382
+
383
+ if (!rangeInfo) {
384
+ return null; // Can't parse, skip
385
+ }
386
+
387
+ // Check if update is available and compatible
388
+ const isUpdateAvailable = this._isUpdateAvailable(rangeInfo, latestParsed);
389
+
390
+ if (isUpdateAvailable) {
391
+ // Preserve the original prefix
392
+ return rangeInfo.prefix + latest;
393
+ }
394
+
395
+ return null;
396
+ }
397
+
398
+ /**
399
+ * Parse a version string into components including pre-release and build metadata
400
+ * @param {string} version - Version string (e.g., "4.17.1", "1.0.0-alpha.1", "1.0.0+build.123")
401
+ * @returns {Object|null} Parsed version or null
402
+ * @private
403
+ */
404
+ _parseVersion(version) {
405
+ // Match: major.minor.patch[-prerelease][+build]
406
+ // Pre-release and build are optional
407
+ const pattern = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$/;
408
+ const match = pattern.exec(version);
409
+
410
+ if (!match) {
411
+ // Fallback: try simple X.Y.Z pattern without pre-release/build
412
+ const simpleMatch = version.match(/^(\d+)\.(\d+)\.(\d+)/);
413
+ if (simpleMatch) {
414
+ return {
415
+ major: parseInt(simpleMatch[1], 10),
416
+ minor: parseInt(simpleMatch[2], 10),
417
+ patch: parseInt(simpleMatch[3], 10),
418
+ prerelease: null,
419
+ build: null
420
+ };
421
+ }
422
+ return null;
423
+ }
424
+
425
+ return {
426
+ major: parseInt(match[1], 10),
427
+ minor: parseInt(match[2], 10),
428
+ patch: parseInt(match[3], 10),
429
+ prerelease: match[4] ? match[4].split('.') : null,
430
+ build: match[5] || null
431
+ };
432
+ }
433
+
434
+ /**
435
+ * Compare two versions according to semver rules
436
+ * Returns: < 0 if v1 < v2, 0 if v1 === v2, > 0 if v1 > v2
437
+ * Handles pre-release versions correctly:
438
+ * - 1.0.0 > 1.0.0-alpha (release > pre-release)
439
+ * - 1.0.0-alpha < 1.0.0-beta (lexical comparison)
440
+ * - 1.0.0-1 < 1.0.0-2 (numeric comparison)
441
+ * @param {Object} v1 - First version
442
+ * @param {Object} v2 - Second version
443
+ * @returns {number} Comparison result
444
+ * @private
445
+ */
446
+ _compareVersions(v1, v2) {
447
+ // Compare major.minor.patch first
448
+ if (v1.major !== v2.major) return v1.major - v2.major;
449
+ if (v1.minor !== v2.minor) return v1.minor - v2.minor;
450
+ if (v1.patch !== v2.patch) return v1.patch - v2.patch;
451
+
452
+ // When major.minor.patch are equal, check pre-release
453
+ // According to semver spec:
454
+ // 1. Release version (no prerelease) > prerelease version
455
+ // 2. If both have prerelease, compare identifiers
456
+
457
+ if (!v1.prerelease && !v2.prerelease) {
458
+ // Both are release versions, equal
459
+ return 0;
460
+ }
461
+
462
+ if (!v1.prerelease && v2.prerelease) {
463
+ // v1 is release, v2 is pre-release → v1 > v2
464
+ return 1;
465
+ }
466
+
467
+ if (v1.prerelease && !v2.prerelease) {
468
+ // v1 is pre-release, v2 is release → v1 < v2
469
+ return -1;
470
+ }
471
+
472
+ // Both have pre-release, compare them
473
+ return this._comparePrerelease(v1.prerelease, v2.prerelease);
474
+ }
475
+
476
+ /**
477
+ * Compare pre-release version identifiers according to semver spec
478
+ * Identifiers are compared as:
479
+ * 1. Numeric identifiers are compared numerically
480
+ * 2. Alphanumeric identifiers are compared lexically (ASCII sort)
481
+ * 3. Numeric identifiers have lower precedence than alphanumeric
482
+ * 4. Larger set of identifiers has higher precedence if all preceding are equal
483
+ * @param {Array<string>} pre1 - First pre-release identifiers
484
+ * @param {Array<string>} pre2 - Second pre-release identifiers
485
+ * @returns {number} Comparison result
486
+ * @private
487
+ */
488
+ _comparePrerelease(pre1, pre2) {
489
+ const len = Math.max(pre1.length, pre2.length);
490
+
491
+ for (let i = 0; i < len; i++) {
492
+ // If one pre-release has fewer identifiers, it has lower precedence
493
+ if (i >= pre1.length) return -1; // pre1 is shorter, pre1 < pre2
494
+ if (i >= pre2.length) return 1; // pre2 is shorter, pre1 > pre2
495
+
496
+ const part1 = pre1[i];
497
+ const part2 = pre2[i];
498
+
499
+ // Check if parts are numeric
500
+ const num1 = /^\d+$/.test(part1) ? parseInt(part1, 10) : null;
501
+ const num2 = /^\d+$/.test(part2) ? parseInt(part2, 10) : null;
502
+
503
+ // Both numeric: compare numerically
504
+ if (num1 !== null && num2 !== null) {
505
+ if (num1 !== num2) return num1 - num2;
506
+ continue;
507
+ }
508
+
509
+ // One numeric, one alphanumeric: numeric has lower precedence
510
+ if (num1 !== null && num2 === null) return -1;
511
+ if (num1 === null && num2 !== null) return 1;
512
+
513
+ // Both alphanumeric: compare lexically
514
+ if (part1 < part2) return -1;
515
+ if (part1 > part2) return 1;
516
+ }
517
+
518
+ // All identifiers equal
519
+ return 0;
520
+ }
521
+
522
+ /**
523
+ * Parse version range into components
524
+ * @param {string} range - Version range (e.g., "^4.17.1", "~4.17.1", "<5.0.0", "4.x", "4.*")
525
+ * @returns {Object|null} Parsed range or null
526
+ * @private
527
+ */
528
+ _parseVersionRange(range) {
529
+ const trimmed = range.trim();
530
+
531
+ // Check for X-ranges first: 4.x, 4.*, 4.17.x, 4.17.*, or just 4
532
+ // X-ranges use 'x', '*', or missing parts as wildcards
533
+ const xRangePattern = /^(\d+|\*|x)(\.(\d+|\*|x))?(\.(\d+|\*|x))?$/i;
534
+ const xMatch = xRangePattern.exec(trimmed);
535
+
536
+ if (xMatch) {
537
+ const majorStr = xMatch[1];
538
+ const minorStr = xMatch[3];
539
+ const patchStr = xMatch[5];
540
+
541
+ // Check if any part is wildcard or missing (making it an X-range)
542
+ const isXRange =
543
+ majorStr === '*' || majorStr.toLowerCase() === 'x' ||
544
+ minorStr === undefined || minorStr === '*' || minorStr.toLowerCase() === 'x' ||
545
+ patchStr === undefined || patchStr === '*' || patchStr.toLowerCase() === 'x';
546
+
547
+ if (isXRange) {
548
+ return {
549
+ prefix: '',
550
+ operator: 'x-range',
551
+ major: (majorStr === '*' || majorStr.toLowerCase() === 'x') ? null : parseInt(majorStr, 10),
552
+ minor: (!minorStr || minorStr === '*' || minorStr.toLowerCase() === 'x') ? null : parseInt(minorStr, 10),
553
+ patch: (!patchStr || patchStr === '*' || patchStr.toLowerCase() === 'x') ? null : parseInt(patchStr, 10),
554
+ original: range
555
+ };
556
+ }
557
+ }
558
+
559
+ // Extract prefix and version for other operators
560
+ let prefix = '';
561
+ let version = trimmed;
562
+ let operator = '=';
563
+
564
+ if (trimmed.startsWith('^')) {
565
+ prefix = '^';
566
+ version = trimmed.slice(1);
567
+ operator = '^';
568
+ } else if (trimmed.startsWith('~')) {
569
+ prefix = '~';
570
+ version = trimmed.slice(1);
571
+ operator = '~';
572
+ } else if (trimmed.startsWith('>=')) {
573
+ prefix = '>=';
574
+ version = trimmed.slice(2).trim();
575
+ operator = '>=';
576
+ } else if (trimmed.startsWith('>')) {
577
+ prefix = '>';
578
+ version = trimmed.slice(1).trim();
579
+ operator = '>';
580
+ } else if (trimmed.startsWith('<=')) {
581
+ prefix = '<=';
582
+ version = trimmed.slice(2).trim();
583
+ operator = '<=';
584
+ } else if (trimmed.startsWith('<')) {
585
+ prefix = '<';
586
+ version = trimmed.slice(1).trim();
587
+ operator = '<';
588
+ }
589
+
590
+ // Parse version X.Y.Z (including pre-release and build)
591
+ const parsed = this._parseVersion(version);
592
+
593
+ if (!parsed) {
594
+ return null;
595
+ }
596
+
597
+ return {
598
+ prefix,
599
+ operator,
600
+ major: parsed.major,
601
+ minor: parsed.minor,
602
+ patch: parsed.patch,
603
+ prerelease: parsed.prerelease,
604
+ build: parsed.build,
605
+ original: range
606
+ };
607
+ }
608
+
609
+ /**
610
+ * Check if update is available and compatible with range
611
+ * @param {Object} rangeInfo - Parsed range information
612
+ * @param {Object} latest - Parsed latest version
613
+ * @returns {boolean} True if update available
614
+ * @private
615
+ */
616
+ _isUpdateAvailable(rangeInfo, latest) {
617
+ const current = {
618
+ major: rangeInfo.major,
619
+ minor: rangeInfo.minor,
620
+ patch: rangeInfo.patch,
621
+ prerelease: rangeInfo.prerelease || null,
622
+ build: rangeInfo.build || null
623
+ };
624
+
625
+ // Check based on operator
626
+ switch (rangeInfo.operator) {
627
+ case '^':
628
+ return this._isCaretUpdateAvailable(current, latest);
629
+
630
+ case '~':
631
+ return this._isTildeUpdateAvailable(current, latest);
632
+
633
+ case '>=':
634
+ case '>':
635
+ return this._isSimpleUpdateAvailable(current, latest);
636
+
637
+ case '<':
638
+ case '<=':
639
+ return this._isLessThanUpdateAvailable(rangeInfo, latest);
640
+
641
+ case 'x-range':
642
+ return this._isXRangeUpdateAvailable(rangeInfo, latest);
643
+
644
+ case '=':
645
+ default:
646
+ return this._isExactUpdateAvailable(current, latest);
647
+ }
648
+ }
649
+
650
+ /**
651
+ * Check if update is available for caret range (^)
652
+ * Handles special cases:
653
+ * - ^0.0.X → Only patch updates in 0.0.*
654
+ * - ^0.X.Y → Only patch updates in 0.X.*
655
+ * - ^X.Y.Z → Minor and patch updates in X.*.*
656
+ * Also handles pre-release versions correctly
657
+ * @private
658
+ */
659
+ _isCaretUpdateAvailable(current, latest) {
660
+ // First check if latest is actually greater than current
661
+ const cmp = this._compareVersions(latest, current);
662
+ if (cmp <= 0) {
663
+ // latest is not greater than current
664
+ return false;
665
+ }
666
+
667
+ // ^0.0.X → Only patch updates in 0.0.*
668
+ if (current.major === 0 && current.minor === 0) {
669
+ return latest.major === 0 && latest.minor === 0;
670
+ }
671
+
672
+ // ^0.X.Y → Only patch updates in 0.X.*
673
+ if (current.major === 0) {
674
+ return latest.major === 0 && latest.minor === current.minor;
675
+ }
676
+
677
+ // ^X.Y.Z → Any minor/patch update in X.*.*
678
+ return latest.major === current.major;
679
+ }
680
+
681
+ /**
682
+ * Check if update is available for tilde range (~)
683
+ * ~X.Y.Z → Only patch updates in X.Y.*
684
+ * Also handles pre-release versions correctly
685
+ * @private
686
+ */
687
+ _isTildeUpdateAvailable(current, latest) {
688
+ // First check if latest is actually greater than current
689
+ const cmp = this._compareVersions(latest, current);
690
+ if (cmp <= 0) {
691
+ return false;
692
+ }
693
+
694
+ // Must be same major and minor
695
+ return latest.major === current.major && latest.minor === current.minor;
696
+ }
697
+
698
+ /**
699
+ * Check if update is available for simple comparison (>, >=)
700
+ * Also handles pre-release versions correctly
701
+ * @private
702
+ */
703
+ _isSimpleUpdateAvailable(current, latest) {
704
+ // Use proper version comparison that handles pre-release
705
+ const cmp = this._compareVersions(latest, current);
706
+ return cmp > 0;
707
+ }
708
+
709
+ /**
710
+ * Check if update is available for exact version
711
+ * Suggests update if latest is newer
712
+ * @private
713
+ */
714
+ _isExactUpdateAvailable(current, latest) {
715
+ return this._isSimpleUpdateAvailable(current, latest);
716
+ }
717
+
718
+ /**
719
+ * Check if update is available for less than operators (<, <=)
720
+ * <X.Y.Z → latest must be < range
721
+ * <=X.Y.Z → latest must be <= range
722
+ * Also handles pre-release versions correctly
723
+ * @param {Object} rangeInfo - Parsed range information
724
+ * @param {Object} latest - Parsed latest version
725
+ * @returns {boolean} True if update satisfies constraint
726
+ * @private
727
+ */
728
+ _isLessThanUpdateAvailable(rangeInfo, latest) {
729
+ // Use proper version comparison that handles pre-release
730
+ const cmp = this._compareVersions(latest, rangeInfo);
731
+
732
+ if (rangeInfo.operator === '<') {
733
+ // latest must be < range
734
+ return cmp < 0;
735
+ } else if (rangeInfo.operator === '<=') {
736
+ // latest must be <= range
737
+ return cmp <= 0;
738
+ }
739
+ return false;
740
+ }
741
+
742
+ /**
743
+ * Check if update is available for X-ranges (4.x, 4.*, 4.17.x, etc.)
744
+ * X-ranges match any version within the specified parts
745
+ * 4.x or 4.* → any version 4.Y.Z
746
+ * 4.17.x or 4.17.* → any version 4.17.Z
747
+ * *.*.* → any version
748
+ * @param {Object} rangeInfo - Parsed range information
749
+ * @param {Object} latest - Parsed latest version
750
+ * @returns {boolean} True if update is within range
751
+ * @private
752
+ */
753
+ _isXRangeUpdateAvailable(rangeInfo, latest) {
754
+ // Check major version if specified
755
+ if (rangeInfo.major !== null && latest.major !== rangeInfo.major) {
756
+ return false;
757
+ }
758
+
759
+ // Check minor version if specified
760
+ if (rangeInfo.minor !== null && latest.minor !== rangeInfo.minor) {
761
+ return false;
762
+ }
763
+
764
+ // Check patch version if specified
765
+ if (rangeInfo.patch !== null && latest.patch !== rangeInfo.patch) {
766
+ return false;
767
+ }
768
+
769
+ // All specified parts match, update is within range
770
+ return true;
771
+ }
772
+
773
+ /**
774
+ * Check if a range string is a complex range (contains AND/OR operators)
775
+ * Complex ranges include:
776
+ * - OR ranges: "^4.0.0 || ^5.0.0"
777
+ * - AND ranges: ">=4.0.0 <5.0.0" (space-separated, multiple constraints)
778
+ * @param {string} range - Version range string
779
+ * @returns {boolean} True if complex range
780
+ * @private
781
+ */
782
+ _isComplexRange(range) {
783
+ // Check for OR operator
784
+ if (range.includes('||')) {
785
+ return true;
786
+ }
787
+
788
+ // Check for AND (multiple space-separated ranges)
789
+ // Need to detect patterns like ">=4.0.0 <5.0.0"
790
+ // But NOT "^4.0.0" or "~4.0.0" (single ranges with spaces after)
791
+ const trimmed = range.trim();
792
+
793
+ // Remove single operator prefixes to see what's left
794
+ if (trimmed.startsWith('^') || trimmed.startsWith('~')) {
795
+ return false; // Single caret or tilde range
796
+ }
797
+
798
+ // Split by whitespace and check if there are multiple parts
799
+ const parts = trimmed.split(/\s+/).filter(p => p.length > 0);
800
+
801
+ // If we have multiple parts, it might be a complex AND range
802
+ // Examples: [">=4.0.0", "<5.0.0"], [">1.0.0", "<2.0.0"]
803
+ if (parts.length > 1) {
804
+ // Check if each part looks like a range operator
805
+ const rangeOperators = /^(>=?|<=?|\^|~|[0-9])/;
806
+ return parts.every(part => rangeOperators.test(part));
807
+ }
808
+
809
+ return false;
810
+ }
811
+
812
+ /**
813
+ * Parse a complex range expression into a structured format
814
+ * Handles:
815
+ * - OR: "^4.0.0 || ^5.0.0" → {type: 'or', ranges: [...]}
816
+ * - AND: ">=4.0.0 <5.0.0" → {type: 'and', ranges: [...]}
817
+ * - Simple: "^4.0.0" → {type: 'simple', range: {...}}
818
+ * @param {string} range - Complex range string
819
+ * @returns {Object} Parsed complex range structure
820
+ * @private
821
+ */
822
+ _parseComplexRange(range) {
823
+ // Split by OR first (|| has precedence)
824
+ if (range.includes('||')) {
825
+ const orParts = range.split('||').map(p => p.trim());
826
+ return {
827
+ type: 'or',
828
+ ranges: orParts.map(part => this._parseComplexRange(part))
829
+ };
830
+ }
831
+
832
+ // Split by AND (space-separated, no || present)
833
+ const andParts = range.trim().split(/\s+/).filter(p => p.length > 0);
834
+
835
+ if (andParts.length > 1) {
836
+ return {
837
+ type: 'and',
838
+ ranges: andParts.map(part => this._parseVersionRange(part))
839
+ };
840
+ }
841
+
842
+ // Simple range
843
+ return {
844
+ type: 'simple',
845
+ range: this._parseVersionRange(range)
846
+ };
847
+ }
848
+
849
+ /**
850
+ * Check if a version satisfies a single range
851
+ * @param {Object} rangeInfo - Parsed range information
852
+ * @param {Object} version - Parsed version to check
853
+ * @returns {boolean} True if version satisfies range
854
+ * @private
855
+ */
856
+ _satisfiesRange(rangeInfo, version) {
857
+ if (!rangeInfo || !version) {
858
+ return false;
859
+ }
860
+
861
+ // Use the existing _isUpdateAvailable logic which handles all operators
862
+ return this._isUpdateAvailable(rangeInfo, version);
863
+ }
864
+
865
+ /**
866
+ * Check if a version satisfies a complex range expression
867
+ * Handles AND/OR logic recursively
868
+ * @param {Object} complexRange - Parsed complex range structure
869
+ * @param {Object} version - Parsed version to check
870
+ * @returns {boolean} True if version satisfies the complex range
871
+ * @private
872
+ */
873
+ _satisfiesComplexRange(complexRange, version) {
874
+ if (!complexRange || !version) {
875
+ return false;
876
+ }
877
+
878
+ switch (complexRange.type) {
879
+ case 'simple':
880
+ return this._satisfiesRange(complexRange.range, version);
881
+
882
+ case 'and':
883
+ // ALL ranges must be satisfied
884
+ return complexRange.ranges.every(range => this._satisfiesRange(range, version));
885
+
886
+ case 'or':
887
+ // AT LEAST ONE range must be satisfied
888
+ return complexRange.ranges.some(range => this._satisfiesComplexRange(range, version));
889
+
890
+ default:
891
+ return false;
892
+ }
893
+ }
894
+
895
+ /**
896
+ * Check dependencies in batches to avoid overwhelming the registry
897
+ * @param {Object} dependencies - Map of package names to versions
898
+ * @returns {Promise<Object>} Map of packages with available updates
899
+ * @private
900
+ */
901
+ async _checkDependencies(dependencies) {
902
+ const updates = {};
903
+ const entries = Object.entries(dependencies);
904
+
905
+ // Process in batches
906
+ for (let i = 0; i < entries.length; i += RESOLVER_CONFIG.MAX_CONCURRENT_CHECKS) {
907
+ const batch = entries.slice(i, i + RESOLVER_CONFIG.MAX_CONCURRENT_CHECKS);
908
+
909
+ const promises = batch.map(async ([pkg, range]) => {
910
+ try {
911
+ const latest = await this._getLatestCompatibleVersion(pkg, range);
912
+
913
+ if (latest) {
914
+ // Preserve the range prefix (^, ~, etc.)
915
+ const prefix = range.match(/^[\^~]/)?.[0] || '^';
916
+ return { pkg, newVersion: `${prefix}${latest}`, oldVersion: range };
917
+ }
918
+
919
+ return null;
920
+ } catch (error) {
921
+ this.logger?.error(`Error checking ${pkg}:`, error.message);
922
+ return null;
923
+ }
924
+ });
925
+
926
+ const results = await Promise.all(promises);
927
+
928
+ results.forEach(result => {
929
+ if (result) {
930
+ updates[result.pkg] = result.newVersion;
931
+ }
932
+ });
933
+ }
934
+
935
+ return updates;
936
+ }
937
+
938
+ /**
939
+ * Execute tool with parsed parameters
940
+ * @param {Object} params - Parsed parameters
941
+ * @param {Object} context - Execution context
942
+ * @returns {Promise<Object>} Execution result
943
+ */
944
+ async execute(params, context = {}) {
945
+ try {
946
+ // Validate parameters
947
+ this._validateParameters(params);
948
+
949
+ const { path: targetPath, mode, includeDev } = params;
950
+ const { projectDir, agentId, directoryAccess } = context;
951
+
952
+ // Resolve and validate path
953
+ const resolvedPath = this._resolveAndValidatePath(targetPath, context);
954
+ const pkgPath = path.join(resolvedPath, 'package.json');
955
+
956
+ this.logger?.info('Dependency resolver executing', {
957
+ mode,
958
+ resolvedPath,
959
+ includeDev,
960
+ agentId
961
+ });
962
+
963
+ const output = [];
964
+ output.push(`🔍 Checking dependencies in: ${resolvedPath}`);
965
+ output.push(`Mode: ${mode}`);
966
+
967
+ // Check if package.json exists
968
+ try {
969
+ await fs.access(pkgPath);
970
+ } catch {
971
+ return {
972
+ success: false,
973
+ error: `No package.json found at: ${pkgPath}`,
974
+ output: output.join('\n')
975
+ };
976
+ }
977
+
978
+ // Read package.json
979
+ output.push('\n📦 Reading package.json...');
980
+ const pkgContent = await fs.readFile(pkgPath, 'utf-8');
981
+ const pkgData = JSON.parse(pkgContent);
982
+
983
+ // Collect dependencies
984
+ const allDeps = { ...pkgData.dependencies };
985
+
986
+ if (includeDev && pkgData.devDependencies) {
987
+ Object.assign(allDeps, pkgData.devDependencies);
988
+ }
989
+
990
+ if (Object.keys(allDeps).length === 0) {
991
+ return {
992
+ success: true,
993
+ mode,
994
+ message: 'No dependencies found in package.json',
995
+ statistics: {
996
+ totalDependencies: 0,
997
+ updatesAvailable: 0,
998
+ updatesApplied: 0,
999
+ errors: 0
1000
+ },
1001
+ output: output.join('\n')
1002
+ };
1003
+ }
1004
+
1005
+ // Safety check
1006
+ if (Object.keys(allDeps).length > RESOLVER_CONFIG.MAX_DEPENDENCIES) {
1007
+ return {
1008
+ success: false,
1009
+ error: `Too many dependencies (${Object.keys(allDeps).length}), max allowed: ${RESOLVER_CONFIG.MAX_DEPENDENCIES}`,
1010
+ output: output.join('\n')
1011
+ };
1012
+ }
1013
+
1014
+ output.push(`📊 Found ${Object.keys(allDeps).length} dependencies to check`);
1015
+ output.push('🌐 Querying npm registry for updates...');
1016
+
1017
+ // Check for updates
1018
+ const updates = await this._checkDependencies(allDeps);
1019
+
1020
+ output.push(`\n✅ Registry check complete`);
1021
+ output.push(`📈 Updates available: ${Object.keys(updates).length}`);
1022
+
1023
+ if (Object.keys(updates).length > 0) {
1024
+ output.push('\n📋 Available updates:');
1025
+ for (const [pkg, newVersion] of Object.entries(updates)) {
1026
+ const oldVersion = allDeps[pkg];
1027
+ output.push(` • ${pkg}: ${oldVersion} → ${newVersion}`);
1028
+ }
1029
+ } else {
1030
+ output.push('\n🎉 All dependencies are up-to-date!');
1031
+ }
1032
+
1033
+ // Handle modes
1034
+ if (mode === 'check') {
1035
+ // Check mode - just report
1036
+ if (Object.keys(updates).length > 0) {
1037
+ output.push('\n💡 Run with mode="fix" or mode="auto" to apply updates');
1038
+ }
1039
+
1040
+ return {
1041
+ success: true,
1042
+ mode: 'check',
1043
+ message: `Found ${Object.keys(updates).length} package(s) with available updates`,
1044
+ statistics: {
1045
+ totalDependencies: Object.keys(allDeps).length,
1046
+ updatesAvailable: Object.keys(updates).length,
1047
+ updatesApplied: 0,
1048
+ errors: 0
1049
+ },
1050
+ updates,
1051
+ output: output.join('\n')
1052
+ };
1053
+ }
1054
+
1055
+ // Fix or auto mode - apply updates
1056
+ if ((mode === 'fix' || mode === 'auto') && Object.keys(updates).length > 0) {
1057
+ // Create backup
1058
+ output.push('\n💾 Creating backup of package.json...');
1059
+ const backupPath = await this._createBackup(pkgPath);
1060
+
1061
+ if (backupPath) {
1062
+ output.push(`✅ Backup created: ${path.basename(backupPath)}`);
1063
+ } else {
1064
+ output.push('⚠️ Backup creation failed, continuing anyway...');
1065
+ }
1066
+
1067
+ // Update package.json
1068
+ output.push('\n🛠 Updating package.json...');
1069
+
1070
+ for (const [pkg, newVersion] of Object.entries(updates)) {
1071
+ if (pkgData.dependencies?.[pkg]) {
1072
+ pkgData.dependencies[pkg] = newVersion;
1073
+ }
1074
+ if (pkgData.devDependencies?.[pkg]) {
1075
+ pkgData.devDependencies[pkg] = newVersion;
1076
+ }
1077
+ }
1078
+
1079
+ // Write updated package.json
1080
+ await fs.writeFile(pkgPath, JSON.stringify(pkgData, null, 2) + '\n');
1081
+ output.push('✅ package.json updated');
1082
+
1083
+ // Run npm install
1084
+ output.push('\n📥 Installing dependencies (this may take a while)...');
1085
+
1086
+ try {
1087
+ const { stdout, stderr } = await exec('npm install', {
1088
+ cwd: resolvedPath,
1089
+ timeout: RESOLVER_CONFIG.NPM_COMMAND_TIMEOUT,
1090
+ maxBuffer: 1024 * 1024 * 10 // 10MB buffer
1091
+ });
1092
+
1093
+ if (stdout) {
1094
+ // Only show summary, not full output
1095
+ const lines = stdout.trim().split('\n');
1096
+ if (lines.length > 10) {
1097
+ output.push(' ' + lines.slice(-5).join('\n '));
1098
+ } else {
1099
+ output.push(' ' + stdout.trim());
1100
+ }
1101
+ }
1102
+
1103
+ if (stderr && !stderr.includes('npm WARN')) {
1104
+ output.push(`⚠️ ${stderr.trim()}`);
1105
+ }
1106
+
1107
+ output.push('✅ Installation complete');
1108
+
1109
+ // Show installed versions
1110
+ try {
1111
+ const { stdout: lsOutput } = await exec('npm ls --depth=0 --json', {
1112
+ cwd: resolvedPath,
1113
+ timeout: 30000
1114
+ });
1115
+
1116
+ const lsData = JSON.parse(lsOutput);
1117
+
1118
+ if (lsData.dependencies) {
1119
+ output.push('\n📦 Installed versions:');
1120
+ for (const pkg of Object.keys(updates)) {
1121
+ if (lsData.dependencies[pkg]) {
1122
+ output.push(` • ${pkg}@${lsData.dependencies[pkg].version}`);
1123
+ }
1124
+ }
1125
+ }
1126
+ } catch (lsError) {
1127
+ // npm ls might fail with peer dependency warnings - that's okay
1128
+ this.logger?.debug('npm ls failed:', lsError.message);
1129
+ }
1130
+
1131
+ return {
1132
+ success: true,
1133
+ mode,
1134
+ message: `Successfully updated ${Object.keys(updates).length} package(s)`,
1135
+ statistics: {
1136
+ totalDependencies: Object.keys(allDeps).length,
1137
+ updatesAvailable: Object.keys(updates).length,
1138
+ updatesApplied: Object.keys(updates).length,
1139
+ errors: 0
1140
+ },
1141
+ updates,
1142
+ backupCreated: backupPath !== null,
1143
+ backupPath,
1144
+ output: output.join('\n')
1145
+ };
1146
+
1147
+ } catch (installError) {
1148
+ output.push(`\n❌ npm install failed: ${installError.message}`);
1149
+
1150
+ // Try to restore from backup
1151
+ if (backupPath) {
1152
+ try {
1153
+ await fs.copyFile(backupPath, pkgPath);
1154
+ output.push('🔄 Restored package.json from backup');
1155
+ } catch (restoreError) {
1156
+ output.push('⚠️ Failed to restore backup');
1157
+ }
1158
+ }
1159
+
1160
+ return {
1161
+ success: false,
1162
+ mode,
1163
+ error: `npm install failed: ${installError.message}`,
1164
+ statistics: {
1165
+ totalDependencies: Object.keys(allDeps).length,
1166
+ updatesAvailable: Object.keys(updates).length,
1167
+ updatesApplied: 0,
1168
+ errors: 1
1169
+ },
1170
+ updates,
1171
+ backupCreated: backupPath !== null,
1172
+ output: output.join('\n')
1173
+ };
1174
+ }
1175
+ } else if (mode === 'fix' || mode === 'auto') {
1176
+ // No updates needed
1177
+ output.push('\n✨ No updates needed');
1178
+
1179
+ return {
1180
+ success: true,
1181
+ mode,
1182
+ message: 'All dependencies are up-to-date',
1183
+ statistics: {
1184
+ totalDependencies: Object.keys(allDeps).length,
1185
+ updatesAvailable: 0,
1186
+ updatesApplied: 0,
1187
+ errors: 0
1188
+ },
1189
+ updates: {},
1190
+ output: output.join('\n')
1191
+ };
1192
+ }
1193
+
1194
+ } catch (error) {
1195
+ this.logger?.error('Dependency resolver error:', error);
1196
+
1197
+ return {
1198
+ success: false,
1199
+ error: error.message,
1200
+ statistics: {
1201
+ totalDependencies: 0,
1202
+ updatesAvailable: 0,
1203
+ updatesApplied: 0,
1204
+ errors: 1
1205
+ },
1206
+ output: error.message
1207
+ };
1208
+ }
1209
+ }
1210
+ }
1211
+
1212
+ export default DependencyResolverTool;