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.
- package/LICENSE +267 -0
- package/README.md +425 -0
- package/bin/cli.js +556 -0
- package/bin/loxia-terminal-v2.js +162 -0
- package/bin/loxia-terminal.js +90 -0
- package/bin/start-with-terminal.js +200 -0
- package/node_modules/@isaacs/balanced-match/LICENSE.md +23 -0
- package/node_modules/@isaacs/balanced-match/README.md +60 -0
- package/node_modules/@isaacs/balanced-match/dist/commonjs/index.d.ts +9 -0
- package/node_modules/@isaacs/balanced-match/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/@isaacs/balanced-match/dist/commonjs/index.js +59 -0
- package/node_modules/@isaacs/balanced-match/dist/commonjs/index.js.map +1 -0
- package/node_modules/@isaacs/balanced-match/dist/commonjs/package.json +3 -0
- package/node_modules/@isaacs/balanced-match/dist/esm/index.d.ts +9 -0
- package/node_modules/@isaacs/balanced-match/dist/esm/index.d.ts.map +1 -0
- package/node_modules/@isaacs/balanced-match/dist/esm/index.js +54 -0
- package/node_modules/@isaacs/balanced-match/dist/esm/index.js.map +1 -0
- package/node_modules/@isaacs/balanced-match/dist/esm/package.json +3 -0
- package/node_modules/@isaacs/balanced-match/package.json +79 -0
- package/node_modules/@isaacs/brace-expansion/LICENSE +23 -0
- package/node_modules/@isaacs/brace-expansion/README.md +97 -0
- package/node_modules/@isaacs/brace-expansion/dist/commonjs/index.d.ts +6 -0
- package/node_modules/@isaacs/brace-expansion/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/@isaacs/brace-expansion/dist/commonjs/index.js +199 -0
- package/node_modules/@isaacs/brace-expansion/dist/commonjs/index.js.map +1 -0
- package/node_modules/@isaacs/brace-expansion/dist/commonjs/package.json +3 -0
- package/node_modules/@isaacs/brace-expansion/dist/esm/index.d.ts +6 -0
- package/node_modules/@isaacs/brace-expansion/dist/esm/index.d.ts.map +1 -0
- package/node_modules/@isaacs/brace-expansion/dist/esm/index.js +195 -0
- package/node_modules/@isaacs/brace-expansion/dist/esm/index.js.map +1 -0
- package/node_modules/@isaacs/brace-expansion/dist/esm/package.json +3 -0
- package/node_modules/@isaacs/brace-expansion/package.json +60 -0
- package/node_modules/glob/LICENSE.md +63 -0
- package/node_modules/glob/README.md +1177 -0
- package/node_modules/glob/dist/commonjs/glob.d.ts +388 -0
- package/node_modules/glob/dist/commonjs/glob.d.ts.map +1 -0
- package/node_modules/glob/dist/commonjs/glob.js +247 -0
- package/node_modules/glob/dist/commonjs/glob.js.map +1 -0
- package/node_modules/glob/dist/commonjs/has-magic.d.ts +14 -0
- package/node_modules/glob/dist/commonjs/has-magic.d.ts.map +1 -0
- package/node_modules/glob/dist/commonjs/has-magic.js +27 -0
- package/node_modules/glob/dist/commonjs/has-magic.js.map +1 -0
- package/node_modules/glob/dist/commonjs/ignore.d.ts +24 -0
- package/node_modules/glob/dist/commonjs/ignore.d.ts.map +1 -0
- package/node_modules/glob/dist/commonjs/ignore.js +119 -0
- package/node_modules/glob/dist/commonjs/ignore.js.map +1 -0
- package/node_modules/glob/dist/commonjs/index.d.ts +97 -0
- package/node_modules/glob/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/glob/dist/commonjs/index.js +68 -0
- package/node_modules/glob/dist/commonjs/index.js.map +1 -0
- package/node_modules/glob/dist/commonjs/index.min.js +4 -0
- package/node_modules/glob/dist/commonjs/index.min.js.map +7 -0
- package/node_modules/glob/dist/commonjs/package.json +3 -0
- package/node_modules/glob/dist/commonjs/pattern.d.ts +76 -0
- package/node_modules/glob/dist/commonjs/pattern.d.ts.map +1 -0
- package/node_modules/glob/dist/commonjs/pattern.js +219 -0
- package/node_modules/glob/dist/commonjs/pattern.js.map +1 -0
- package/node_modules/glob/dist/commonjs/processor.d.ts +59 -0
- package/node_modules/glob/dist/commonjs/processor.d.ts.map +1 -0
- package/node_modules/glob/dist/commonjs/processor.js +301 -0
- package/node_modules/glob/dist/commonjs/processor.js.map +1 -0
- package/node_modules/glob/dist/commonjs/walker.d.ts +97 -0
- package/node_modules/glob/dist/commonjs/walker.d.ts.map +1 -0
- package/node_modules/glob/dist/commonjs/walker.js +387 -0
- package/node_modules/glob/dist/commonjs/walker.js.map +1 -0
- package/node_modules/glob/dist/esm/glob.d.ts +388 -0
- package/node_modules/glob/dist/esm/glob.d.ts.map +1 -0
- package/node_modules/glob/dist/esm/glob.js +243 -0
- package/node_modules/glob/dist/esm/glob.js.map +1 -0
- package/node_modules/glob/dist/esm/has-magic.d.ts +14 -0
- package/node_modules/glob/dist/esm/has-magic.d.ts.map +1 -0
- package/node_modules/glob/dist/esm/has-magic.js +23 -0
- package/node_modules/glob/dist/esm/has-magic.js.map +1 -0
- package/node_modules/glob/dist/esm/ignore.d.ts +24 -0
- package/node_modules/glob/dist/esm/ignore.d.ts.map +1 -0
- package/node_modules/glob/dist/esm/ignore.js +115 -0
- package/node_modules/glob/dist/esm/ignore.js.map +1 -0
- package/node_modules/glob/dist/esm/index.d.ts +97 -0
- package/node_modules/glob/dist/esm/index.d.ts.map +1 -0
- package/node_modules/glob/dist/esm/index.js +55 -0
- package/node_modules/glob/dist/esm/index.js.map +1 -0
- package/node_modules/glob/dist/esm/index.min.js +4 -0
- package/node_modules/glob/dist/esm/index.min.js.map +7 -0
- package/node_modules/glob/dist/esm/package.json +3 -0
- package/node_modules/glob/dist/esm/pattern.d.ts +76 -0
- package/node_modules/glob/dist/esm/pattern.d.ts.map +1 -0
- package/node_modules/glob/dist/esm/pattern.js +215 -0
- package/node_modules/glob/dist/esm/pattern.js.map +1 -0
- package/node_modules/glob/dist/esm/processor.d.ts +59 -0
- package/node_modules/glob/dist/esm/processor.d.ts.map +1 -0
- package/node_modules/glob/dist/esm/processor.js +294 -0
- package/node_modules/glob/dist/esm/processor.js.map +1 -0
- package/node_modules/glob/dist/esm/walker.d.ts +97 -0
- package/node_modules/glob/dist/esm/walker.d.ts.map +1 -0
- package/node_modules/glob/dist/esm/walker.js +381 -0
- package/node_modules/glob/dist/esm/walker.js.map +1 -0
- package/node_modules/glob/node_modules/minimatch/LICENSE.md +55 -0
- package/node_modules/glob/node_modules/minimatch/README.md +453 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts +2 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.d.ts.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js +14 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/assert-valid-pattern.js.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.d.ts +20 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.d.ts.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.js +591 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/ast.js.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts +8 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.d.ts.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.js +152 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/brace-expressions.js.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.d.ts +15 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.d.ts.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.js +30 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/escape.js.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.d.ts +94 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.js +1029 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/index.js.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/package.json +3 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.d.ts +22 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.d.ts.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.js +38 -0
- package/node_modules/glob/node_modules/minimatch/dist/commonjs/unescape.js.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts +2 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/assert-valid-pattern.d.ts.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/assert-valid-pattern.js +10 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/assert-valid-pattern.js.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/ast.d.ts +20 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/ast.d.ts.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/ast.js +587 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/ast.js.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/brace-expressions.d.ts +8 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/brace-expressions.d.ts.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/brace-expressions.js +148 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/brace-expressions.js.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/escape.d.ts +15 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/escape.d.ts.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/escape.js +26 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/escape.js.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/index.d.ts +94 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/index.d.ts.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/index.js +1016 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/index.js.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/package.json +3 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.d.ts +22 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.d.ts.map +1 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.js +34 -0
- package/node_modules/glob/node_modules/minimatch/dist/esm/unescape.js.map +1 -0
- package/node_modules/glob/node_modules/minimatch/package.json +67 -0
- package/node_modules/glob/package.json +101 -0
- package/node_modules/minipass/LICENSE +15 -0
- package/node_modules/minipass/README.md +825 -0
- package/node_modules/minipass/dist/commonjs/index.d.ts +549 -0
- package/node_modules/minipass/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/minipass/dist/commonjs/index.js +1028 -0
- package/node_modules/minipass/dist/commonjs/index.js.map +1 -0
- package/node_modules/minipass/dist/commonjs/package.json +3 -0
- package/node_modules/minipass/dist/esm/index.d.ts +549 -0
- package/node_modules/minipass/dist/esm/index.d.ts.map +1 -0
- package/node_modules/minipass/dist/esm/index.js +1018 -0
- package/node_modules/minipass/dist/esm/index.js.map +1 -0
- package/node_modules/minipass/dist/esm/package.json +3 -0
- package/node_modules/minipass/package.json +82 -0
- package/node_modules/package-json-from-dist/LICENSE.md +63 -0
- package/node_modules/package-json-from-dist/README.md +110 -0
- package/node_modules/package-json-from-dist/dist/commonjs/index.d.ts +89 -0
- package/node_modules/package-json-from-dist/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/package-json-from-dist/dist/commonjs/index.js +134 -0
- package/node_modules/package-json-from-dist/dist/commonjs/index.js.map +1 -0
- package/node_modules/package-json-from-dist/dist/commonjs/package.json +3 -0
- package/node_modules/package-json-from-dist/dist/esm/index.d.ts +89 -0
- package/node_modules/package-json-from-dist/dist/esm/index.d.ts.map +1 -0
- package/node_modules/package-json-from-dist/dist/esm/index.js +129 -0
- package/node_modules/package-json-from-dist/dist/esm/index.js.map +1 -0
- package/node_modules/package-json-from-dist/dist/esm/package.json +3 -0
- package/node_modules/package-json-from-dist/package.json +68 -0
- package/node_modules/path-scurry/LICENSE.md +55 -0
- package/node_modules/path-scurry/README.md +636 -0
- package/node_modules/path-scurry/dist/commonjs/index.d.ts +1115 -0
- package/node_modules/path-scurry/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/path-scurry/dist/commonjs/index.js +2018 -0
- package/node_modules/path-scurry/dist/commonjs/index.js.map +1 -0
- package/node_modules/path-scurry/dist/commonjs/package.json +3 -0
- package/node_modules/path-scurry/dist/esm/index.d.ts +1115 -0
- package/node_modules/path-scurry/dist/esm/index.d.ts.map +1 -0
- package/node_modules/path-scurry/dist/esm/index.js +1983 -0
- package/node_modules/path-scurry/dist/esm/index.js.map +1 -0
- package/node_modules/path-scurry/dist/esm/package.json +3 -0
- package/node_modules/path-scurry/node_modules/lru-cache/LICENSE.md +55 -0
- package/node_modules/path-scurry/node_modules/lru-cache/README.md +383 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.d.ts +1323 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.js +1589 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.min.js +2 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/index.min.js.map +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/commonjs/package.json +3 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.d.ts +1323 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.d.ts.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.js +1585 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.js.map +1 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.min.js +2 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/index.min.js.map +7 -0
- package/node_modules/path-scurry/node_modules/lru-cache/dist/esm/package.json +3 -0
- package/node_modules/path-scurry/node_modules/lru-cache/package.json +101 -0
- package/node_modules/path-scurry/package.json +88 -0
- package/node_modules/rimraf/LICENSE.md +55 -0
- package/node_modules/rimraf/README.md +226 -0
- package/node_modules/rimraf/dist/commonjs/default-tmp.d.ts +3 -0
- package/node_modules/rimraf/dist/commonjs/default-tmp.d.ts.map +1 -0
- package/node_modules/rimraf/dist/commonjs/default-tmp.js +58 -0
- package/node_modules/rimraf/dist/commonjs/default-tmp.js.map +1 -0
- package/node_modules/rimraf/dist/commonjs/error.d.ts +6 -0
- package/node_modules/rimraf/dist/commonjs/error.d.ts.map +1 -0
- package/node_modules/rimraf/dist/commonjs/error.js +10 -0
- package/node_modules/rimraf/dist/commonjs/error.js.map +1 -0
- package/node_modules/rimraf/dist/commonjs/fix-eperm.d.ts +3 -0
- package/node_modules/rimraf/dist/commonjs/fix-eperm.d.ts.map +1 -0
- package/node_modules/rimraf/dist/commonjs/fix-eperm.js +38 -0
- package/node_modules/rimraf/dist/commonjs/fix-eperm.js.map +1 -0
- package/node_modules/rimraf/dist/commonjs/fs.d.ts +15 -0
- package/node_modules/rimraf/dist/commonjs/fs.d.ts.map +1 -0
- package/node_modules/rimraf/dist/commonjs/fs.js +33 -0
- package/node_modules/rimraf/dist/commonjs/fs.js.map +1 -0
- package/node_modules/rimraf/dist/commonjs/ignore-enoent.d.ts +3 -0
- package/node_modules/rimraf/dist/commonjs/ignore-enoent.d.ts.map +1 -0
- package/node_modules/rimraf/dist/commonjs/ignore-enoent.js +24 -0
- package/node_modules/rimraf/dist/commonjs/ignore-enoent.js.map +1 -0
- package/node_modules/rimraf/dist/commonjs/index.d.ts +50 -0
- package/node_modules/rimraf/dist/commonjs/index.d.ts.map +1 -0
- package/node_modules/rimraf/dist/commonjs/index.js +78 -0
- package/node_modules/rimraf/dist/commonjs/index.js.map +1 -0
- package/node_modules/rimraf/dist/commonjs/opt-arg.d.ts +34 -0
- package/node_modules/rimraf/dist/commonjs/opt-arg.d.ts.map +1 -0
- package/node_modules/rimraf/dist/commonjs/opt-arg.js +53 -0
- package/node_modules/rimraf/dist/commonjs/opt-arg.js.map +1 -0
- package/node_modules/rimraf/dist/commonjs/package.json +3 -0
- package/node_modules/rimraf/dist/commonjs/path-arg.d.ts +4 -0
- package/node_modules/rimraf/dist/commonjs/path-arg.d.ts.map +1 -0
- package/node_modules/rimraf/dist/commonjs/path-arg.js +48 -0
- package/node_modules/rimraf/dist/commonjs/path-arg.js.map +1 -0
- package/node_modules/rimraf/dist/commonjs/readdir-or-error.d.ts +3 -0
- package/node_modules/rimraf/dist/commonjs/readdir-or-error.d.ts.map +1 -0
- package/node_modules/rimraf/dist/commonjs/readdir-or-error.js +19 -0
- package/node_modules/rimraf/dist/commonjs/readdir-or-error.js.map +1 -0
- package/node_modules/rimraf/dist/commonjs/retry-busy.d.ts +8 -0
- package/node_modules/rimraf/dist/commonjs/retry-busy.d.ts.map +1 -0
- package/node_modules/rimraf/dist/commonjs/retry-busy.js +65 -0
- package/node_modules/rimraf/dist/commonjs/retry-busy.js.map +1 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-manual.d.ts +3 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-manual.d.ts.map +1 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-manual.js +8 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-manual.js.map +1 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-move-remove.d.ts +4 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-move-remove.d.ts.map +1 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-move-remove.js +138 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-move-remove.js.map +1 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-native.d.ts +4 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-native.d.ts.map +1 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-native.js +24 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-native.js.map +1 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-posix.d.ts +4 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-posix.d.ts.map +1 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-posix.js +103 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-posix.js.map +1 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-windows.d.ts +4 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-windows.d.ts.map +1 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-windows.js +159 -0
- package/node_modules/rimraf/dist/commonjs/rimraf-windows.js.map +1 -0
- package/node_modules/rimraf/dist/commonjs/use-native.d.ts +4 -0
- package/node_modules/rimraf/dist/commonjs/use-native.d.ts.map +1 -0
- package/node_modules/rimraf/dist/commonjs/use-native.js +18 -0
- package/node_modules/rimraf/dist/commonjs/use-native.js.map +1 -0
- package/node_modules/rimraf/dist/esm/bin.d.mts +3 -0
- package/node_modules/rimraf/dist/esm/bin.d.mts.map +1 -0
- package/node_modules/rimraf/dist/esm/bin.mjs +250 -0
- package/node_modules/rimraf/dist/esm/bin.mjs.map +1 -0
- package/node_modules/rimraf/dist/esm/default-tmp.d.ts +3 -0
- package/node_modules/rimraf/dist/esm/default-tmp.d.ts.map +1 -0
- package/node_modules/rimraf/dist/esm/default-tmp.js +55 -0
- package/node_modules/rimraf/dist/esm/default-tmp.js.map +1 -0
- package/node_modules/rimraf/dist/esm/error.d.ts +6 -0
- package/node_modules/rimraf/dist/esm/error.d.ts.map +1 -0
- package/node_modules/rimraf/dist/esm/error.js +5 -0
- package/node_modules/rimraf/dist/esm/error.js.map +1 -0
- package/node_modules/rimraf/dist/esm/fix-eperm.d.ts +3 -0
- package/node_modules/rimraf/dist/esm/fix-eperm.d.ts.map +1 -0
- package/node_modules/rimraf/dist/esm/fix-eperm.js +33 -0
- package/node_modules/rimraf/dist/esm/fix-eperm.js.map +1 -0
- package/node_modules/rimraf/dist/esm/fs.d.ts +15 -0
- package/node_modules/rimraf/dist/esm/fs.d.ts.map +1 -0
- package/node_modules/rimraf/dist/esm/fs.js +18 -0
- package/node_modules/rimraf/dist/esm/fs.js.map +1 -0
- package/node_modules/rimraf/dist/esm/ignore-enoent.d.ts +3 -0
- package/node_modules/rimraf/dist/esm/ignore-enoent.d.ts.map +1 -0
- package/node_modules/rimraf/dist/esm/ignore-enoent.js +19 -0
- package/node_modules/rimraf/dist/esm/ignore-enoent.js.map +1 -0
- package/node_modules/rimraf/dist/esm/index.d.ts +50 -0
- package/node_modules/rimraf/dist/esm/index.d.ts.map +1 -0
- package/node_modules/rimraf/dist/esm/index.js +70 -0
- package/node_modules/rimraf/dist/esm/index.js.map +1 -0
- package/node_modules/rimraf/dist/esm/opt-arg.d.ts +34 -0
- package/node_modules/rimraf/dist/esm/opt-arg.d.ts.map +1 -0
- package/node_modules/rimraf/dist/esm/opt-arg.js +46 -0
- package/node_modules/rimraf/dist/esm/opt-arg.js.map +1 -0
- package/node_modules/rimraf/dist/esm/package.json +3 -0
- package/node_modules/rimraf/dist/esm/path-arg.d.ts +4 -0
- package/node_modules/rimraf/dist/esm/path-arg.d.ts.map +1 -0
- package/node_modules/rimraf/dist/esm/path-arg.js +46 -0
- package/node_modules/rimraf/dist/esm/path-arg.js.map +1 -0
- package/node_modules/rimraf/dist/esm/readdir-or-error.d.ts +3 -0
- package/node_modules/rimraf/dist/esm/readdir-or-error.d.ts.map +1 -0
- package/node_modules/rimraf/dist/esm/readdir-or-error.js +14 -0
- package/node_modules/rimraf/dist/esm/readdir-or-error.js.map +1 -0
- package/node_modules/rimraf/dist/esm/retry-busy.d.ts +8 -0
- package/node_modules/rimraf/dist/esm/retry-busy.d.ts.map +1 -0
- package/node_modules/rimraf/dist/esm/retry-busy.js +60 -0
- package/node_modules/rimraf/dist/esm/retry-busy.js.map +1 -0
- package/node_modules/rimraf/dist/esm/rimraf-manual.d.ts +3 -0
- package/node_modules/rimraf/dist/esm/rimraf-manual.d.ts.map +1 -0
- package/node_modules/rimraf/dist/esm/rimraf-manual.js +5 -0
- package/node_modules/rimraf/dist/esm/rimraf-manual.js.map +1 -0
- package/node_modules/rimraf/dist/esm/rimraf-move-remove.d.ts +4 -0
- package/node_modules/rimraf/dist/esm/rimraf-move-remove.d.ts.map +1 -0
- package/node_modules/rimraf/dist/esm/rimraf-move-remove.js +133 -0
- package/node_modules/rimraf/dist/esm/rimraf-move-remove.js.map +1 -0
- package/node_modules/rimraf/dist/esm/rimraf-native.d.ts +4 -0
- package/node_modules/rimraf/dist/esm/rimraf-native.d.ts.map +1 -0
- package/node_modules/rimraf/dist/esm/rimraf-native.js +19 -0
- package/node_modules/rimraf/dist/esm/rimraf-native.js.map +1 -0
- package/node_modules/rimraf/dist/esm/rimraf-posix.d.ts +4 -0
- package/node_modules/rimraf/dist/esm/rimraf-posix.d.ts.map +1 -0
- package/node_modules/rimraf/dist/esm/rimraf-posix.js +98 -0
- package/node_modules/rimraf/dist/esm/rimraf-posix.js.map +1 -0
- package/node_modules/rimraf/dist/esm/rimraf-windows.d.ts +4 -0
- package/node_modules/rimraf/dist/esm/rimraf-windows.d.ts.map +1 -0
- package/node_modules/rimraf/dist/esm/rimraf-windows.js +154 -0
- package/node_modules/rimraf/dist/esm/rimraf-windows.js.map +1 -0
- package/node_modules/rimraf/dist/esm/use-native.d.ts +4 -0
- package/node_modules/rimraf/dist/esm/use-native.d.ts.map +1 -0
- package/node_modules/rimraf/dist/esm/use-native.js +15 -0
- package/node_modules/rimraf/dist/esm/use-native.js.map +1 -0
- package/node_modules/rimraf/package.json +92 -0
- package/package.json +152 -0
- package/scripts/install-scanners.js +258 -0
- package/scripts/watchdog.js +147 -0
- package/src/analyzers/CSSAnalyzer.js +297 -0
- package/src/analyzers/ConfigValidator.js +690 -0
- package/src/analyzers/ESLintAnalyzer.js +320 -0
- package/src/analyzers/JavaScriptAnalyzer.js +261 -0
- package/src/analyzers/PrettierFormatter.js +247 -0
- package/src/analyzers/PythonAnalyzer.js +283 -0
- package/src/analyzers/SecurityAnalyzer.js +729 -0
- package/src/analyzers/SparrowAnalyzer.js +341 -0
- package/src/analyzers/TypeScriptAnalyzer.js +247 -0
- package/src/analyzers/codeCloneDetector/analyzer.js +344 -0
- package/src/analyzers/codeCloneDetector/detector.js +250 -0
- package/src/analyzers/codeCloneDetector/index.js +192 -0
- package/src/analyzers/codeCloneDetector/parser.js +199 -0
- package/src/analyzers/codeCloneDetector/reporter.js +148 -0
- package/src/analyzers/codeCloneDetector/scanner.js +88 -0
- package/src/core/agentPool.js +1957 -0
- package/src/core/agentScheduler.js +3212 -0
- package/src/core/contextManager.js +709 -0
- package/src/core/flowExecutor.js +928 -0
- package/src/core/messageProcessor.js +808 -0
- package/src/core/orchestrator.js +584 -0
- package/src/core/stateManager.js +1500 -0
- package/src/index.js +972 -0
- package/src/interfaces/cli.js +553 -0
- package/src/interfaces/terminal/__tests__/smoke/advancedFeatures.test.js +208 -0
- package/src/interfaces/terminal/__tests__/smoke/agentControl.test.js +236 -0
- package/src/interfaces/terminal/__tests__/smoke/agents.test.js +138 -0
- package/src/interfaces/terminal/__tests__/smoke/components.test.js +137 -0
- package/src/interfaces/terminal/__tests__/smoke/connection.test.js +350 -0
- package/src/interfaces/terminal/__tests__/smoke/enhancements.test.js +156 -0
- package/src/interfaces/terminal/__tests__/smoke/imports.test.js +332 -0
- package/src/interfaces/terminal/__tests__/smoke/messages.test.js +256 -0
- package/src/interfaces/terminal/__tests__/smoke/tools.test.js +388 -0
- package/src/interfaces/terminal/api/apiClient.js +299 -0
- package/src/interfaces/terminal/api/messageRouter.js +262 -0
- package/src/interfaces/terminal/api/session.js +266 -0
- package/src/interfaces/terminal/api/websocket.js +497 -0
- package/src/interfaces/terminal/components/AgentCreator.js +705 -0
- package/src/interfaces/terminal/components/AgentEditor.js +678 -0
- package/src/interfaces/terminal/components/AgentSwitcher.js +330 -0
- package/src/interfaces/terminal/components/ErrorBoundary.js +92 -0
- package/src/interfaces/terminal/components/ErrorPanel.js +264 -0
- package/src/interfaces/terminal/components/Header.js +28 -0
- package/src/interfaces/terminal/components/HelpPanel.js +231 -0
- package/src/interfaces/terminal/components/InputBox.js +118 -0
- package/src/interfaces/terminal/components/Layout.js +603 -0
- package/src/interfaces/terminal/components/LoadingSpinner.js +71 -0
- package/src/interfaces/terminal/components/MessageList.js +281 -0
- package/src/interfaces/terminal/components/MultilineTextInput.js +251 -0
- package/src/interfaces/terminal/components/SearchPanel.js +265 -0
- package/src/interfaces/terminal/components/SettingsPanel.js +415 -0
- package/src/interfaces/terminal/components/StatusBar.js +65 -0
- package/src/interfaces/terminal/components/TextInput.js +127 -0
- package/src/interfaces/terminal/config/agentEditorConstants.js +227 -0
- package/src/interfaces/terminal/config/constants.js +393 -0
- package/src/interfaces/terminal/index.js +168 -0
- package/src/interfaces/terminal/state/useAgentControl.js +496 -0
- package/src/interfaces/terminal/state/useAgents.js +537 -0
- package/src/interfaces/terminal/state/useConnection.js +444 -0
- package/src/interfaces/terminal/state/useMessages.js +630 -0
- package/src/interfaces/terminal/state/useTools.js +554 -0
- package/src/interfaces/terminal/utils/debugLogger.js +44 -0
- package/src/interfaces/terminal/utils/settingsStorage.js +232 -0
- package/src/interfaces/terminal/utils/theme.js +85 -0
- package/src/interfaces/webServer.js +5457 -0
- package/src/modules/fileExplorer/controller.js +413 -0
- package/src/modules/fileExplorer/index.js +37 -0
- package/src/modules/fileExplorer/middleware.js +92 -0
- package/src/modules/fileExplorer/routes.js +158 -0
- package/src/modules/fileExplorer/types.js +44 -0
- package/src/services/agentActivityService.js +399 -0
- package/src/services/aiService.js +2618 -0
- package/src/services/apiKeyManager.js +334 -0
- package/src/services/benchmarkService.js +196 -0
- package/src/services/budgetService.js +565 -0
- package/src/services/contextInjectionService.js +268 -0
- package/src/services/conversationCompactionService.js +1103 -0
- package/src/services/credentialVault.js +685 -0
- package/src/services/errorHandler.js +810 -0
- package/src/services/fileAttachmentService.js +547 -0
- package/src/services/flowContextService.js +189 -0
- package/src/services/memoryService.js +521 -0
- package/src/services/modelRouterService.js +365 -0
- package/src/services/modelsService.js +323 -0
- package/src/services/ollamaService.js +452 -0
- package/src/services/portRegistry.js +336 -0
- package/src/services/portTracker.js +223 -0
- package/src/services/projectDetector.js +404 -0
- package/src/services/promptService.js +372 -0
- package/src/services/qualityInspector.js +796 -0
- package/src/services/scheduleService.js +725 -0
- package/src/services/serviceRegistry.js +386 -0
- package/src/services/skillsService.js +486 -0
- package/src/services/telegramService.js +920 -0
- package/src/services/tokenCountingService.js +316 -0
- package/src/services/visualEditorBridge.js +1033 -0
- package/src/services/visualEditorServer.js +1727 -0
- package/src/services/whatsappService.js +663 -0
- package/src/tools/__tests__/webTool.e2e.test.js +569 -0
- package/src/tools/__tests__/webTool.unit.test.js +195 -0
- package/src/tools/agentCommunicationTool.js +1343 -0
- package/src/tools/agentDelayTool.js +498 -0
- package/src/tools/asyncToolManager.js +604 -0
- package/src/tools/baseTool.js +887 -0
- package/src/tools/browserTool.js +897 -0
- package/src/tools/cloneDetectionTool.js +581 -0
- package/src/tools/codeMapTool.js +857 -0
- package/src/tools/dependencyResolverTool.js +1212 -0
- package/src/tools/docxTool.js +623 -0
- package/src/tools/excelTool.js +636 -0
- package/src/tools/fileContentReplaceTool.js +840 -0
- package/src/tools/fileTreeTool.js +833 -0
- package/src/tools/filesystemTool.js +1217 -0
- package/src/tools/helpTool.js +198 -0
- package/src/tools/imageTool.js +1034 -0
- package/src/tools/importAnalyzerTool.js +1056 -0
- package/src/tools/jobDoneTool.js +388 -0
- package/src/tools/memoryTool.js +554 -0
- package/src/tools/pdfTool.js +627 -0
- package/src/tools/seekTool.js +883 -0
- package/src/tools/skillsTool.js +276 -0
- package/src/tools/staticAnalysisTool.js +2146 -0
- package/src/tools/taskManagerTool.js +2836 -0
- package/src/tools/terminalTool.js +2486 -0
- package/src/tools/userPromptTool.js +474 -0
- package/src/tools/videoTool.js +1139 -0
- package/src/tools/visionTool.js +507 -0
- package/src/tools/visualEditorTool.js +1175 -0
- package/src/tools/webTool.js +3114 -0
- package/src/tools/whatsappTool.js +457 -0
- package/src/types/agent.js +519 -0
- package/src/types/contextReference.js +972 -0
- package/src/types/conversation.js +730 -0
- package/src/types/toolCommand.js +747 -0
- package/src/utilities/attachmentValidator.js +288 -0
- package/src/utilities/browserStealth.js +630 -0
- package/src/utilities/configManager.js +618 -0
- package/src/utilities/constants.js +870 -0
- package/src/utilities/directoryAccessManager.js +566 -0
- package/src/utilities/fileProcessor.js +307 -0
- package/src/utilities/humanBehavior.js +453 -0
- package/src/utilities/jsonRepair.js +242 -0
- package/src/utilities/logger.js +436 -0
- package/src/utilities/platformUtils.js +255 -0
- package/src/utilities/platformUtils.test.js +98 -0
- package/src/utilities/stealthConstants.js +377 -0
- package/src/utilities/structuredFileValidator.js +699 -0
- package/src/utilities/tagParser.js +878 -0
- package/src/utilities/toolConstants.js +415 -0
- package/src/utilities/userDataDir.js +300 -0
- package/web-ui/build/brands/autopilot/favicon.svg +1 -0
- package/web-ui/build/brands/autopilot/logo.webp +0 -0
- package/web-ui/build/brands/onbuzz/favicon.svg +1 -0
- package/web-ui/build/brands/onbuzz/logo-text.webp +0 -0
- package/web-ui/build/brands/onbuzz/logo.webp +0 -0
- package/web-ui/build/index.html +15 -0
- package/web-ui/build/logo.png +0 -0
- package/web-ui/build/logo2.png +0 -0
- package/web-ui/build/static/index-SmQFfvBs.js +746 -0
- package/web-ui/build/static/index-V2ySwjHp.css +1 -0
|
@@ -0,0 +1,887 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BaseTool - Abstract base class for all tools in the Loxia AI Agents System
|
|
3
|
+
*
|
|
4
|
+
* Purpose:
|
|
5
|
+
* - Define standardized tool interface
|
|
6
|
+
* - Provide common tool functionality
|
|
7
|
+
* - Handle parameter validation
|
|
8
|
+
* - Manage tool execution lifecycle
|
|
9
|
+
* - Support both sync and async operations
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import {
|
|
13
|
+
TOOL_STATUS,
|
|
14
|
+
OPERATION_STATUS,
|
|
15
|
+
ERROR_TYPES,
|
|
16
|
+
SYSTEM_DEFAULTS
|
|
17
|
+
} from '../utilities/constants.js';
|
|
18
|
+
|
|
19
|
+
class BaseTool {
|
|
20
|
+
constructor(config = {}, logger = null) {
|
|
21
|
+
this.id = this.constructor.name.toLowerCase().replace('tool', '');
|
|
22
|
+
this.config = config;
|
|
23
|
+
this.logger = logger;
|
|
24
|
+
|
|
25
|
+
// Tool capabilities
|
|
26
|
+
this.requiresProject = false;
|
|
27
|
+
this.isAsync = false;
|
|
28
|
+
this.timeout = config.timeout || SYSTEM_DEFAULTS.MAX_TOOL_EXECUTION_TIME;
|
|
29
|
+
this.maxConcurrentOperations = config.maxConcurrentOperations || 1;
|
|
30
|
+
|
|
31
|
+
// Built-in delay (ms) after tool execution before agent continues
|
|
32
|
+
// Most tools: 0 (no delay), WebTool: 1000ms (allow browser operations to complete)
|
|
33
|
+
this.builtinDelay = 0;
|
|
34
|
+
|
|
35
|
+
// Operation tracking
|
|
36
|
+
this.activeOperations = new Map();
|
|
37
|
+
this.operationHistory = [];
|
|
38
|
+
|
|
39
|
+
// Tool state
|
|
40
|
+
this.isEnabled = config.enabled !== false;
|
|
41
|
+
this.lastUsed = null;
|
|
42
|
+
this.usageCount = 0;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Get tool description for LLM consumption
|
|
47
|
+
* Must be implemented by subclasses
|
|
48
|
+
* @returns {string} Tool description
|
|
49
|
+
*/
|
|
50
|
+
getDescription() {
|
|
51
|
+
throw new Error(`Tool ${this.id} must implement getDescription()`);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Get a one-line summary of the tool for compact/layered prompts.
|
|
56
|
+
* Auto-extracts the first non-empty line from getDescription().
|
|
57
|
+
* @returns {string} Brief tool summary
|
|
58
|
+
*/
|
|
59
|
+
getSummary() {
|
|
60
|
+
try {
|
|
61
|
+
const desc = this.getDescription();
|
|
62
|
+
const firstLine = desc.split('\n').find(l => l.trim().length > 0);
|
|
63
|
+
return firstLine ? firstLine.trim() : `${this.id} tool`;
|
|
64
|
+
} catch {
|
|
65
|
+
return `${this.id} tool`;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Parse parameters from tool command content
|
|
71
|
+
* Must be implemented by subclasses
|
|
72
|
+
* @param {string} content - Raw tool command content
|
|
73
|
+
* @returns {Object} Parsed parameters object
|
|
74
|
+
*/
|
|
75
|
+
parseParameters(content) {
|
|
76
|
+
throw new Error(`Tool ${this.id} must implement parseParameters()`);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Execute tool with parsed parameters
|
|
81
|
+
* Must be implemented by subclasses
|
|
82
|
+
* @param {Object} params - Parsed parameters
|
|
83
|
+
* @param {Object} context - Execution context
|
|
84
|
+
* @returns {Promise<*>} Execution result
|
|
85
|
+
*/
|
|
86
|
+
async execute(params, context) {
|
|
87
|
+
throw new Error(`Tool ${this.id} must implement execute()`);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Get tool capabilities metadata
|
|
92
|
+
* @returns {Object} Capabilities object
|
|
93
|
+
*/
|
|
94
|
+
getCapabilities() {
|
|
95
|
+
return {
|
|
96
|
+
id: this.id,
|
|
97
|
+
async: this.isAsync,
|
|
98
|
+
requiresProject: this.requiresProject,
|
|
99
|
+
builtinDelay: this.builtinDelay,
|
|
100
|
+
timeout: this.timeout,
|
|
101
|
+
maxConcurrentOperations: this.maxConcurrentOperations,
|
|
102
|
+
enabled: this.isEnabled,
|
|
103
|
+
supportedActions: this.getSupportedActions(),
|
|
104
|
+
parameterSchema: this.getParameterSchema()
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Validate tool parameters
|
|
110
|
+
* Can be overridden by subclasses for custom validation
|
|
111
|
+
* @param {Object} params - Parameters to validate
|
|
112
|
+
* @returns {Object} Validation result with valid flag and error message
|
|
113
|
+
*/
|
|
114
|
+
validateParameters(params) {
|
|
115
|
+
try {
|
|
116
|
+
if (!params || typeof params !== 'object') {
|
|
117
|
+
return {
|
|
118
|
+
valid: false,
|
|
119
|
+
error: 'Parameters must be an object'
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Check required parameters
|
|
124
|
+
const requiredParams = this.getRequiredParameters();
|
|
125
|
+
for (const required of requiredParams) {
|
|
126
|
+
if (!(required in params)) {
|
|
127
|
+
return {
|
|
128
|
+
valid: false,
|
|
129
|
+
error: `Missing required parameter: ${required}`
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Validate parameter types
|
|
135
|
+
const typeValidation = this.validateParameterTypes(params);
|
|
136
|
+
if (!typeValidation.valid) {
|
|
137
|
+
return typeValidation;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Custom validation
|
|
141
|
+
const customValidation = this.customValidateParameters(params);
|
|
142
|
+
if (!customValidation.valid) {
|
|
143
|
+
return customValidation;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return { valid: true };
|
|
147
|
+
|
|
148
|
+
} catch (error) {
|
|
149
|
+
return {
|
|
150
|
+
valid: false,
|
|
151
|
+
error: `Parameter validation failed: ${error.message}`
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Execute tool with full lifecycle management
|
|
158
|
+
* @param {Object} params - Tool parameters
|
|
159
|
+
* @param {Object} context - Execution context
|
|
160
|
+
* @returns {Promise<Object>} Execution result with metadata
|
|
161
|
+
*/
|
|
162
|
+
async executeWithLifecycle(params, context) {
|
|
163
|
+
const operationId = this.generateOperationId();
|
|
164
|
+
const startTime = Date.now();
|
|
165
|
+
|
|
166
|
+
// Check if tool is enabled
|
|
167
|
+
if (!this.isEnabled) {
|
|
168
|
+
throw new Error(`Tool ${this.id} is disabled`);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Check concurrent operation limits
|
|
172
|
+
if (this.activeOperations.size >= this.maxConcurrentOperations) {
|
|
173
|
+
throw new Error(`Tool ${this.id} has reached maximum concurrent operations limit`);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Validate parameters
|
|
177
|
+
const validation = this.validateParameters(params);
|
|
178
|
+
if (!validation.valid) {
|
|
179
|
+
throw new Error(`Parameter validation failed: ${validation.error}`);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Create operation record
|
|
183
|
+
const operation = {
|
|
184
|
+
id: operationId,
|
|
185
|
+
toolId: this.id,
|
|
186
|
+
status: TOOL_STATUS.EXECUTING,
|
|
187
|
+
startTime: new Date().toISOString(),
|
|
188
|
+
params,
|
|
189
|
+
context: this.sanitizeContext(context)
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
this.activeOperations.set(operationId, operation);
|
|
193
|
+
|
|
194
|
+
try {
|
|
195
|
+
this.logger?.info(`Tool execution started: ${this.id}`, {
|
|
196
|
+
operationId,
|
|
197
|
+
toolId: this.id,
|
|
198
|
+
context: operation.context
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
// Execute with timeout
|
|
202
|
+
const result = await this.executeWithTimeout(params, context);
|
|
203
|
+
|
|
204
|
+
// Update operation status
|
|
205
|
+
operation.status = TOOL_STATUS.COMPLETED;
|
|
206
|
+
operation.result = result;
|
|
207
|
+
operation.endTime = new Date().toISOString();
|
|
208
|
+
operation.executionTime = Date.now() - startTime;
|
|
209
|
+
|
|
210
|
+
// Update tool statistics
|
|
211
|
+
this.lastUsed = new Date().toISOString();
|
|
212
|
+
this.usageCount++;
|
|
213
|
+
|
|
214
|
+
this.logger?.info(`Tool execution completed: ${this.id}`, {
|
|
215
|
+
operationId,
|
|
216
|
+
executionTime: operation.executionTime,
|
|
217
|
+
success: true
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
return {
|
|
221
|
+
success: true,
|
|
222
|
+
operationId,
|
|
223
|
+
result,
|
|
224
|
+
executionTime: operation.executionTime,
|
|
225
|
+
toolId: this.id
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
} catch (error) {
|
|
229
|
+
// Update operation status
|
|
230
|
+
operation.status = TOOL_STATUS.FAILED;
|
|
231
|
+
operation.error = error.message;
|
|
232
|
+
operation.endTime = new Date().toISOString();
|
|
233
|
+
operation.executionTime = Date.now() - startTime;
|
|
234
|
+
|
|
235
|
+
this.logger?.error(`Tool execution failed: ${this.id}`, {
|
|
236
|
+
operationId,
|
|
237
|
+
error: error.message,
|
|
238
|
+
executionTime: operation.executionTime
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
throw error;
|
|
242
|
+
|
|
243
|
+
} finally {
|
|
244
|
+
// Move to history and cleanup
|
|
245
|
+
this.operationHistory.push({ ...operation });
|
|
246
|
+
this.activeOperations.delete(operationId);
|
|
247
|
+
|
|
248
|
+
// Cleanup old history entries
|
|
249
|
+
this.cleanupHistory();
|
|
250
|
+
|
|
251
|
+
// Perform tool-specific cleanup
|
|
252
|
+
await this.cleanup(operationId);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Get status of async operation
|
|
258
|
+
* @param {string} operationId - Operation identifier
|
|
259
|
+
* @returns {Promise<Object>} Operation status
|
|
260
|
+
*/
|
|
261
|
+
async getStatus(operationId) {
|
|
262
|
+
const operation = this.activeOperations.get(operationId);
|
|
263
|
+
|
|
264
|
+
if (!operation) {
|
|
265
|
+
// Check history
|
|
266
|
+
const historyEntry = this.operationHistory.find(op => op.id === operationId);
|
|
267
|
+
if (historyEntry) {
|
|
268
|
+
return {
|
|
269
|
+
operationId,
|
|
270
|
+
status: historyEntry.status,
|
|
271
|
+
result: historyEntry.result,
|
|
272
|
+
error: historyEntry.error,
|
|
273
|
+
executionTime: historyEntry.executionTime
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
return {
|
|
278
|
+
operationId,
|
|
279
|
+
status: OPERATION_STATUS.NOT_FOUND,
|
|
280
|
+
error: 'Operation not found'
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
return {
|
|
285
|
+
operationId,
|
|
286
|
+
status: operation.status,
|
|
287
|
+
startTime: operation.startTime,
|
|
288
|
+
executionTime: operation.endTime ?
|
|
289
|
+
new Date(operation.endTime).getTime() - new Date(operation.startTime).getTime() :
|
|
290
|
+
Date.now() - new Date(operation.startTime).getTime()
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Resource cleanup after tool execution
|
|
296
|
+
* Can be overridden by subclasses
|
|
297
|
+
* @param {string} operationId - Operation identifier
|
|
298
|
+
* @returns {Promise<void>}
|
|
299
|
+
*/
|
|
300
|
+
async cleanup(operationId) {
|
|
301
|
+
// Default implementation - no cleanup needed
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
/**
|
|
305
|
+
* Get supported actions for this tool
|
|
306
|
+
* Can be overridden by subclasses
|
|
307
|
+
* @returns {Array<string>} Array of supported action names
|
|
308
|
+
*/
|
|
309
|
+
getSupportedActions() {
|
|
310
|
+
return ['execute'];
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Get parameter schema for validation
|
|
315
|
+
* Can be overridden by subclasses
|
|
316
|
+
* @returns {Object} Parameter schema
|
|
317
|
+
*/
|
|
318
|
+
getParameterSchema() {
|
|
319
|
+
return {
|
|
320
|
+
type: 'object',
|
|
321
|
+
properties: {},
|
|
322
|
+
required: []
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Get required parameters
|
|
328
|
+
* Can be overridden by subclasses
|
|
329
|
+
* @returns {Array<string>} Array of required parameter names
|
|
330
|
+
*/
|
|
331
|
+
getRequiredParameters() {
|
|
332
|
+
return [];
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* Validate parameter types
|
|
337
|
+
* Can be overridden by subclasses
|
|
338
|
+
* @param {Object} params - Parameters to validate
|
|
339
|
+
* @returns {Object} Validation result
|
|
340
|
+
*/
|
|
341
|
+
validateParameterTypes(params) {
|
|
342
|
+
// Default implementation - all parameters are valid
|
|
343
|
+
return { valid: true };
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Custom parameter validation
|
|
348
|
+
* Can be overridden by subclasses
|
|
349
|
+
* @param {Object} params - Parameters to validate
|
|
350
|
+
* @returns {Object} Validation result
|
|
351
|
+
*/
|
|
352
|
+
customValidateParameters(params) {
|
|
353
|
+
// Default implementation - no custom validation
|
|
354
|
+
return { valid: true };
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Execute tool with timeout protection
|
|
359
|
+
* @private
|
|
360
|
+
*/
|
|
361
|
+
async executeWithTimeout(params, context) {
|
|
362
|
+
return new Promise(async (resolve, reject) => {
|
|
363
|
+
const timeoutId = setTimeout(() => {
|
|
364
|
+
reject(new Error(`Tool execution timed out after ${this.timeout}ms`));
|
|
365
|
+
}, this.timeout);
|
|
366
|
+
|
|
367
|
+
try {
|
|
368
|
+
const result = await this.execute(params, context);
|
|
369
|
+
clearTimeout(timeoutId);
|
|
370
|
+
resolve(result);
|
|
371
|
+
} catch (error) {
|
|
372
|
+
clearTimeout(timeoutId);
|
|
373
|
+
reject(error);
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
/**
|
|
379
|
+
* Generate unique operation ID
|
|
380
|
+
* @private
|
|
381
|
+
*/
|
|
382
|
+
generateOperationId() {
|
|
383
|
+
return `${this.id}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Sanitize context for logging
|
|
388
|
+
* @private
|
|
389
|
+
*/
|
|
390
|
+
sanitizeContext(context) {
|
|
391
|
+
const sanitized = { ...context };
|
|
392
|
+
|
|
393
|
+
// Remove sensitive information
|
|
394
|
+
delete sanitized.apiKeys;
|
|
395
|
+
delete sanitized.secrets;
|
|
396
|
+
delete sanitized.passwords;
|
|
397
|
+
|
|
398
|
+
// Truncate large content
|
|
399
|
+
if (sanitized.content && sanitized.content.length > 500) {
|
|
400
|
+
sanitized.content = sanitized.content.substring(0, 500) + '... [truncated]';
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
return sanitized;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Cleanup old history entries
|
|
408
|
+
* @private
|
|
409
|
+
*/
|
|
410
|
+
cleanupHistory() {
|
|
411
|
+
const maxHistoryEntries = 100;
|
|
412
|
+
if (this.operationHistory.length > maxHistoryEntries) {
|
|
413
|
+
this.operationHistory = this.operationHistory.slice(-maxHistoryEntries);
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* Get tool usage statistics
|
|
419
|
+
* @returns {Object} Usage statistics
|
|
420
|
+
*/
|
|
421
|
+
getUsageStats() {
|
|
422
|
+
return {
|
|
423
|
+
toolId: this.id,
|
|
424
|
+
usageCount: this.usageCount,
|
|
425
|
+
lastUsed: this.lastUsed,
|
|
426
|
+
activeOperations: this.activeOperations.size,
|
|
427
|
+
totalOperations: this.operationHistory.length,
|
|
428
|
+
averageExecutionTime: this.calculateAverageExecutionTime(),
|
|
429
|
+
successRate: this.calculateSuccessRate(),
|
|
430
|
+
isEnabled: this.isEnabled
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* Calculate average execution time
|
|
436
|
+
* @private
|
|
437
|
+
*/
|
|
438
|
+
calculateAverageExecutionTime() {
|
|
439
|
+
const completedOps = this.operationHistory.filter(op =>
|
|
440
|
+
op.status === TOOL_STATUS.COMPLETED && op.executionTime
|
|
441
|
+
);
|
|
442
|
+
|
|
443
|
+
if (completedOps.length === 0) return 0;
|
|
444
|
+
|
|
445
|
+
const totalTime = completedOps.reduce((sum, op) => sum + op.executionTime, 0);
|
|
446
|
+
return Math.round(totalTime / completedOps.length);
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
/**
|
|
450
|
+
* Calculate success rate
|
|
451
|
+
* @private
|
|
452
|
+
*/
|
|
453
|
+
calculateSuccessRate() {
|
|
454
|
+
if (this.operationHistory.length === 0) return 0;
|
|
455
|
+
|
|
456
|
+
const successfulOps = this.operationHistory.filter(op =>
|
|
457
|
+
op.status === TOOL_STATUS.COMPLETED
|
|
458
|
+
);
|
|
459
|
+
|
|
460
|
+
return (successfulOps.length / this.operationHistory.length) * 100;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* Enable tool
|
|
465
|
+
*/
|
|
466
|
+
enable() {
|
|
467
|
+
this.isEnabled = true;
|
|
468
|
+
this.logger?.info(`Tool enabled: ${this.id}`);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
/**
|
|
472
|
+
* Disable tool
|
|
473
|
+
*/
|
|
474
|
+
disable() {
|
|
475
|
+
this.isEnabled = false;
|
|
476
|
+
this.logger?.info(`Tool disabled: ${this.id}`);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* Reset tool statistics
|
|
481
|
+
*/
|
|
482
|
+
resetStats() {
|
|
483
|
+
this.usageCount = 0;
|
|
484
|
+
this.lastUsed = null;
|
|
485
|
+
this.operationHistory = [];
|
|
486
|
+
this.logger?.info(`Tool statistics reset: ${this.id}`);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
/**
|
|
491
|
+
* ToolsRegistry - Manages registration and discovery of tools
|
|
492
|
+
*/
|
|
493
|
+
class ToolsRegistry {
|
|
494
|
+
constructor(logger = null) {
|
|
495
|
+
this.logger = logger;
|
|
496
|
+
this.tools = new Map();
|
|
497
|
+
this.toolDescriptions = new Map();
|
|
498
|
+
this.toolSummaries = new Map();
|
|
499
|
+
this.toolCapabilities = new Map();
|
|
500
|
+
this.asyncOperations = new Map();
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/**
|
|
504
|
+
* Register a tool class
|
|
505
|
+
* @param {Class} toolClass - Tool class to register
|
|
506
|
+
* @returns {Promise<void>}
|
|
507
|
+
*/
|
|
508
|
+
async registerTool(toolClass) {
|
|
509
|
+
try {
|
|
510
|
+
const tool = new toolClass();
|
|
511
|
+
|
|
512
|
+
if (!(tool instanceof BaseTool)) {
|
|
513
|
+
throw new Error(`Tool ${toolClass.name} must extend BaseTool`);
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
const capabilities = tool.getCapabilities();
|
|
517
|
+
|
|
518
|
+
// Validate tool implementation
|
|
519
|
+
await this.validateTool(tool);
|
|
520
|
+
|
|
521
|
+
this.tools.set(tool.id, tool);
|
|
522
|
+
this.toolDescriptions.set(tool.id, tool.getDescription());
|
|
523
|
+
this.toolSummaries.set(tool.id, tool.getSummary());
|
|
524
|
+
this.toolCapabilities.set(tool.id, capabilities);
|
|
525
|
+
|
|
526
|
+
this.logger?.info(`Tool registered: ${tool.id}`, {
|
|
527
|
+
capabilities: capabilities.supportedActions,
|
|
528
|
+
async: capabilities.async,
|
|
529
|
+
requiresProject: capabilities.requiresProject
|
|
530
|
+
});
|
|
531
|
+
|
|
532
|
+
} catch (error) {
|
|
533
|
+
this.logger?.error(`Tool registration failed: ${error.message}`, {
|
|
534
|
+
toolClass: toolClass.name
|
|
535
|
+
});
|
|
536
|
+
throw error;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
/**
|
|
541
|
+
* Auto-discover tools in directory
|
|
542
|
+
* @param {string} directory - Directory path to scan
|
|
543
|
+
* @returns {Promise<number>} Number of tools discovered
|
|
544
|
+
*/
|
|
545
|
+
async discoverTools(directory) {
|
|
546
|
+
// Implementation would scan directory for tool files
|
|
547
|
+
// For now, return 0
|
|
548
|
+
return 0;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* Validate tool implementation
|
|
553
|
+
* @param {BaseTool} tool - Tool instance to validate
|
|
554
|
+
* @returns {Promise<void>}
|
|
555
|
+
*/
|
|
556
|
+
async validateTool(tool) {
|
|
557
|
+
// Check required methods
|
|
558
|
+
const requiredMethods = ['getDescription', 'parseParameters', 'execute'];
|
|
559
|
+
|
|
560
|
+
for (const method of requiredMethods) {
|
|
561
|
+
if (typeof tool[method] !== 'function') {
|
|
562
|
+
throw new Error(`Tool ${tool.id} missing required method: ${method}`);
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
// Test parameter parsing
|
|
567
|
+
try {
|
|
568
|
+
const testParams = tool.parseParameters('test content');
|
|
569
|
+
if (typeof testParams !== 'object') {
|
|
570
|
+
throw new Error(`Tool ${tool.id} parseParameters must return an object`);
|
|
571
|
+
}
|
|
572
|
+
} catch (error) {
|
|
573
|
+
// Parsing may fail for test content, that's okay
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
// Validate capabilities
|
|
577
|
+
const capabilities = tool.getCapabilities();
|
|
578
|
+
if (!capabilities || typeof capabilities !== 'object') {
|
|
579
|
+
throw new Error(`Tool ${tool.id} getCapabilities must return an object`);
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
/**
|
|
584
|
+
* Get tool by ID
|
|
585
|
+
* @param {string} toolId - Tool identifier
|
|
586
|
+
* @returns {BaseTool|null} Tool instance or null
|
|
587
|
+
*/
|
|
588
|
+
getTool(toolId) {
|
|
589
|
+
return this.tools.get(toolId) || null;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
/**
|
|
593
|
+
* Get all tool capabilities for LLM consumption
|
|
594
|
+
* @returns {Object} All tool capabilities
|
|
595
|
+
*/
|
|
596
|
+
getToolCapabilities() {
|
|
597
|
+
const capabilities = {};
|
|
598
|
+
|
|
599
|
+
for (const [toolId, tool] of this.tools.entries()) {
|
|
600
|
+
if (tool.isEnabled) {
|
|
601
|
+
capabilities[toolId] = {
|
|
602
|
+
description: this.toolDescriptions.get(toolId),
|
|
603
|
+
capabilities: this.toolCapabilities.get(toolId),
|
|
604
|
+
usageStats: tool.getUsageStats()
|
|
605
|
+
};
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
return capabilities;
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
/**
|
|
613
|
+
* Execute tool securely with validation
|
|
614
|
+
* @param {string} toolId - Tool identifier
|
|
615
|
+
* @param {Object} params - Tool parameters
|
|
616
|
+
* @param {Object} context - Execution context
|
|
617
|
+
* @returns {Promise<*>} Execution result
|
|
618
|
+
*/
|
|
619
|
+
async executeToolSecurely(toolId, params, context) {
|
|
620
|
+
const tool = this.getTool(toolId);
|
|
621
|
+
if (!tool) {
|
|
622
|
+
throw new Error(`Tool not found: ${toolId}`);
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
if (!tool.isEnabled) {
|
|
626
|
+
throw new Error(`Tool is disabled: ${toolId}`);
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
return await tool.executeWithLifecycle(params, context);
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
/**
|
|
633
|
+
* List all registered tools
|
|
634
|
+
* @returns {Array<string>} Array of tool IDs
|
|
635
|
+
*/
|
|
636
|
+
listTools() {
|
|
637
|
+
return Array.from(this.tools.keys());
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/**
|
|
641
|
+
* Generate comprehensive tool descriptions for agent system prompts
|
|
642
|
+
* @param {Array<string>} capabilities - Specific tool IDs to include (empty = all)
|
|
643
|
+
* @param {Object} options - Generation options
|
|
644
|
+
* @returns {string} Formatted tool descriptions section
|
|
645
|
+
*/
|
|
646
|
+
generateToolDescriptionsForPrompt(capabilities = [], options = {}) {
|
|
647
|
+
const {
|
|
648
|
+
includeExamples = true,
|
|
649
|
+
includeUsageGuidelines = true,
|
|
650
|
+
includeSecurityNotes = true,
|
|
651
|
+
compact = false,
|
|
652
|
+
layered = false
|
|
653
|
+
} = options;
|
|
654
|
+
|
|
655
|
+
// Get tools to include — always inject 'help' so agents can query tool docs
|
|
656
|
+
let toolIds = capabilities.length > 0
|
|
657
|
+
? capabilities.filter(cap => this.tools.has(cap))
|
|
658
|
+
: Array.from(this.tools.keys());
|
|
659
|
+
|
|
660
|
+
if (!toolIds.includes('help') && this.tools.has('help')) {
|
|
661
|
+
toolIds.push('help');
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
if (toolIds.length === 0) {
|
|
665
|
+
return '';
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
let description = '';
|
|
669
|
+
|
|
670
|
+
// === LAYERED MODE: Compact index + help tool guidance ===
|
|
671
|
+
if (layered) {
|
|
672
|
+
description += '\n## AVAILABLE TOOLS\n\n';
|
|
673
|
+
description += 'You have access to the following tools. Use the **help** tool to get full documentation before first use of any tool.\n\n';
|
|
674
|
+
|
|
675
|
+
for (const toolId of toolIds) {
|
|
676
|
+
const tool = this.tools.get(toolId);
|
|
677
|
+
if (!tool || !tool.isEnabled) continue;
|
|
678
|
+
const summary = this.toolSummaries.get(toolId) || `${toolId} tool`;
|
|
679
|
+
description += `- **${toolId}**: ${summary}\n`;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
// Always include help tool in the list even if not in capabilities
|
|
683
|
+
if (!toolIds.includes('help') && this.tools.has('help')) {
|
|
684
|
+
const helpSummary = this.toolSummaries.get('help') || 'Get full documentation for any tool';
|
|
685
|
+
description += `- **help**: ${helpSummary}\n`;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
description += '\n## HOW TO GET TOOL DOCUMENTATION\n\n';
|
|
689
|
+
description += 'Before using a tool for the first time, retrieve its full documentation:\n\n';
|
|
690
|
+
description += '```json\n';
|
|
691
|
+
description += '{\n';
|
|
692
|
+
description += ' "toolId": "help",\n';
|
|
693
|
+
description += ' "parameters": { "tool": "toolname" }\n';
|
|
694
|
+
description += '}\n';
|
|
695
|
+
description += '```\n\n';
|
|
696
|
+
description += 'To list all available tools with summaries:\n';
|
|
697
|
+
description += '```json\n';
|
|
698
|
+
description += '{\n';
|
|
699
|
+
description += ' "toolId": "help",\n';
|
|
700
|
+
description += ' "parameters": { "list": true }\n';
|
|
701
|
+
description += '}\n';
|
|
702
|
+
description += '```\n\n';
|
|
703
|
+
|
|
704
|
+
} else {
|
|
705
|
+
// === STANDARD MODE: Full descriptions ===
|
|
706
|
+
description += '\n## AVAILABLE TOOLS\n\n';
|
|
707
|
+
description += 'You have access to the following tools to perform operations and tasks:\n\n';
|
|
708
|
+
|
|
709
|
+
for (const toolId of toolIds) {
|
|
710
|
+
const tool = this.tools.get(toolId);
|
|
711
|
+
if (!tool || !tool.isEnabled) continue;
|
|
712
|
+
|
|
713
|
+
try {
|
|
714
|
+
if (compact) {
|
|
715
|
+
// Compact format - just tool name and brief description
|
|
716
|
+
const caps = tool.getCapabilities();
|
|
717
|
+
const actions = caps.supportedActions || ['execute'];
|
|
718
|
+
description += `**${toolId}**: ${actions.join(', ')}\n`;
|
|
719
|
+
} else {
|
|
720
|
+
// Full format - complete tool description
|
|
721
|
+
description += `### ${toolId.toUpperCase()} TOOL\n\n`;
|
|
722
|
+
description += tool.getDescription();
|
|
723
|
+
description += '\n\n---\n\n';
|
|
724
|
+
}
|
|
725
|
+
} catch (error) {
|
|
726
|
+
this.logger?.warn(`Failed to get description for tool: ${toolId}`, {
|
|
727
|
+
error: error.message
|
|
728
|
+
});
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
if (compact) {
|
|
733
|
+
description += '\nUse JSON format in markdown code blocks to invoke tools.\n\n';
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
// Add comprehensive tool invocation instructions - JSON as the standard format
|
|
738
|
+
description += '## TOOL INVOCATION SYNTAX\n\n';
|
|
739
|
+
description += '**IMPORTANT**: Use JSON format in markdown code blocks to invoke tools:\n\n';
|
|
740
|
+
description += '### Standard Format: JSON in Markdown Code Block\n';
|
|
741
|
+
description += '```\n';
|
|
742
|
+
description += '```json\n';
|
|
743
|
+
description += '{\n';
|
|
744
|
+
description += ' "toolId": "toolname",\n';
|
|
745
|
+
description += ' "parameters": { ... }\n';
|
|
746
|
+
description += '}\n';
|
|
747
|
+
description += '```\n';
|
|
748
|
+
description += '```\n\n';
|
|
749
|
+
description += '**Rules:**\n';
|
|
750
|
+
description += '- Always wrap JSON tool commands in ```json ... ``` blocks\n';
|
|
751
|
+
description += '- Use "toolId" to specify the tool name\n';
|
|
752
|
+
description += '- Use "parameters" object for tool-specific parameters\n';
|
|
753
|
+
description += '- Use "actions" array for tools that support multiple operations\n';
|
|
754
|
+
description += '- **TOOL RESULTS ARE AVAILABLE ONLY AFTER YOUR MESSAGE ENDS**: Tools execute after your entire message is sent. You will NOT see any tool results until your next turn. This means: if the next tool call depends on results from a previous one, they MUST be in separate messages. You may batch independent tool calls in a single message, but never assume or guess the output of a tool — always wait for the actual result in the next turn before proceeding.\n\n';
|
|
755
|
+
description += 'After invoking a tool, WAIT for the actual response. Do NOT generate imaginary responses.\n\n';
|
|
756
|
+
|
|
757
|
+
// Add exploration strategy if code-map is available
|
|
758
|
+
if (toolIds.includes('code-map')) {
|
|
759
|
+
description += '## CODE EXPLORATION STRATEGY\n\n';
|
|
760
|
+
description += 'When exploring or understanding code, prefer this efficient workflow over reading entire files:\n\n';
|
|
761
|
+
description += '1. **Discover structure** — Use `file-tree` to see the project layout\n';
|
|
762
|
+
description += '2. **Understand code** — Use `code-map` skeleton to extract signatures, classes, and functions with line numbers\n';
|
|
763
|
+
description += '3. **Zoom in** — Use `code-map` read-range to read only the specific lines you need\n';
|
|
764
|
+
description += '4. **Search** — Use `seek` to find specific terms, then `code-map` read-range to view context around matches\n\n';
|
|
765
|
+
description += 'This avoids wasting context on entire file reads. Reserve `filesystem` read for small files or when you need the complete content.\n';
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
return description;
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
/**
|
|
772
|
+
* Enhance existing system prompt with tool descriptions
|
|
773
|
+
* @param {string} existingPrompt - Current system prompt
|
|
774
|
+
* @param {Array<string>} capabilities - Agent capabilities
|
|
775
|
+
* @param {Object} options - Enhancement options
|
|
776
|
+
* @returns {string} Enhanced system prompt
|
|
777
|
+
*/
|
|
778
|
+
enhanceSystemPrompt(existingPrompt, capabilities = [], options = {}) {
|
|
779
|
+
const toolSection = this.generateToolDescriptionsForPrompt(capabilities, options);
|
|
780
|
+
|
|
781
|
+
if (!toolSection.trim()) {
|
|
782
|
+
return existingPrompt || '';
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
const prompt = existingPrompt || '';
|
|
786
|
+
|
|
787
|
+
// If prompt already contains tool section, replace it
|
|
788
|
+
if (prompt.includes('## AVAILABLE TOOLS')) {
|
|
789
|
+
return prompt.replace(
|
|
790
|
+
/## AVAILABLE TOOLS[\s\S]*?(?=##|$)/,
|
|
791
|
+
toolSection + '\n'
|
|
792
|
+
);
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
const orientationParagraph = `IMPORTANT: Tools execute only after your full message is sent — you cannot see results mid-message. If a tool call depends on the result of another, put them in separate messages. You may batch independent tool calls in one message. Never guess or fabricate tool output — always wait for actual results before continuing.`;
|
|
796
|
+
|
|
797
|
+
// Otherwise, append to the end
|
|
798
|
+
return prompt + (prompt.endsWith('\n') ? '' : '\n') + toolSection + orientationParagraph + '\n';
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
/**
|
|
802
|
+
* Get available tools with metadata for web UI
|
|
803
|
+
* @returns {Array} Array of tool information objects
|
|
804
|
+
*/
|
|
805
|
+
getAvailableToolsForUI() {
|
|
806
|
+
const tools = [];
|
|
807
|
+
|
|
808
|
+
for (const [toolId, tool] of this.tools.entries()) {
|
|
809
|
+
const capabilities = tool.getCapabilities();
|
|
810
|
+
|
|
811
|
+
// Extract tool name and description from the tool's description
|
|
812
|
+
const fullDescription = tool.getDescription();
|
|
813
|
+
const firstLine = fullDescription.split('\n').find(line => line.trim().length > 0) || '';
|
|
814
|
+
const toolName = firstLine.replace(/^.*Tool:\s*/i, '').replace(/\s*-.*$/, '').trim();
|
|
815
|
+
|
|
816
|
+
tools.push({
|
|
817
|
+
id: toolId, // This is the correct ID to use in capabilities
|
|
818
|
+
name: toolName || toolId.charAt(0).toUpperCase() + toolId.slice(1),
|
|
819
|
+
description: firstLine,
|
|
820
|
+
category: this._getToolCategory(toolId),
|
|
821
|
+
enabled: capabilities.enabled,
|
|
822
|
+
async: capabilities.async,
|
|
823
|
+
requiresProject: capabilities.requiresProject,
|
|
824
|
+
className: tool.constructor.name
|
|
825
|
+
});
|
|
826
|
+
}
|
|
827
|
+
|
|
828
|
+
return tools.sort((a, b) => a.name.localeCompare(b.name));
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
/**
|
|
832
|
+
* Get tool category for organization
|
|
833
|
+
* @param {string} toolId - Tool identifier
|
|
834
|
+
* @returns {string} Tool category
|
|
835
|
+
* @private
|
|
836
|
+
*/
|
|
837
|
+
_getToolCategory(toolId) {
|
|
838
|
+
const categories = {
|
|
839
|
+
'terminal': 'System',
|
|
840
|
+
'filesystem': 'File Operations',
|
|
841
|
+
'file-content-replace': 'File Operations',
|
|
842
|
+
'seek': 'File Operations',
|
|
843
|
+
'file-tree': 'File Operations',
|
|
844
|
+
'pdf': 'File Operations',
|
|
845
|
+
'web': 'Automation',
|
|
846
|
+
'visual-editor': 'Automation',
|
|
847
|
+
'staticanalysis': 'Analysis',
|
|
848
|
+
'clonedetection': 'Analysis',
|
|
849
|
+
'import-analyzer': 'Analysis',
|
|
850
|
+
'dependency-resolver': 'Analysis',
|
|
851
|
+
'image-gen': 'AI Tools',
|
|
852
|
+
// TODO: Re-enable once Sora replacement is available
|
|
853
|
+
// 'video-gen': 'AI Tools',
|
|
854
|
+
'taskmanager': 'Utility',
|
|
855
|
+
'jobdone': 'Utility',
|
|
856
|
+
'agentdelay': 'Utility',
|
|
857
|
+
'agentcommunication': 'Collaboration',
|
|
858
|
+
'help': 'System',
|
|
859
|
+
'doc': 'File Operations',
|
|
860
|
+
'spreadsheet': 'File Operations',
|
|
861
|
+
'whatsapp': 'Communication',
|
|
862
|
+
'skills': 'Knowledge',
|
|
863
|
+
'vision': 'AI Tools'
|
|
864
|
+
};
|
|
865
|
+
|
|
866
|
+
return categories[toolId] || 'Other';
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
/**
|
|
870
|
+
* Get registry statistics
|
|
871
|
+
* @returns {Object} Registry statistics
|
|
872
|
+
*/
|
|
873
|
+
getRegistryStats() {
|
|
874
|
+
const enabledTools = Array.from(this.tools.values()).filter(tool => tool.isEnabled);
|
|
875
|
+
const totalOperations = Array.from(this.tools.values())
|
|
876
|
+
.reduce((sum, tool) => sum + tool.usageCount, 0);
|
|
877
|
+
|
|
878
|
+
return {
|
|
879
|
+
totalTools: this.tools.size,
|
|
880
|
+
enabledTools: enabledTools.length,
|
|
881
|
+
totalOperations,
|
|
882
|
+
activeOperations: this.asyncOperations.size
|
|
883
|
+
};
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
export { BaseTool, ToolsRegistry };
|