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,453 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Human Behavior Simulation Utility
|
|
3
|
+
*
|
|
4
|
+
* Provides human-like mouse movements, typing patterns, and action delays
|
|
5
|
+
* to make browser automation less detectable by anti-bot systems.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { createCursor } from 'ghost-cursor';
|
|
9
|
+
import {
|
|
10
|
+
TYPING_CONFIG,
|
|
11
|
+
MOUSE_CONFIG,
|
|
12
|
+
ACTION_DELAYS
|
|
13
|
+
} from './stealthConstants.js';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Generate a random number within a range
|
|
17
|
+
* @param {number} min - Minimum value
|
|
18
|
+
* @param {number} max - Maximum value
|
|
19
|
+
* @returns {number} Random number between min and max
|
|
20
|
+
*/
|
|
21
|
+
function randomInRange(min, max) {
|
|
22
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Sleep for a specified duration
|
|
27
|
+
* @param {number} ms - Milliseconds to sleep
|
|
28
|
+
* @returns {Promise<void>}
|
|
29
|
+
*/
|
|
30
|
+
function sleep(ms) {
|
|
31
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Create a human-like cursor controller for a page
|
|
36
|
+
* @param {Page} page - Puppeteer page instance
|
|
37
|
+
* @param {Object} options - Cursor options
|
|
38
|
+
* @returns {Object} Ghost cursor instance with enhanced methods
|
|
39
|
+
*/
|
|
40
|
+
export function createHumanCursor(page, options = {}) {
|
|
41
|
+
const cursor = createCursor(page, {
|
|
42
|
+
// Start position (center of viewport)
|
|
43
|
+
start: {
|
|
44
|
+
x: Math.floor(page.viewport()?.width || 1920) / 2,
|
|
45
|
+
y: Math.floor(page.viewport()?.height || 1080) / 2
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Wrap cursor with human-like enhancements
|
|
50
|
+
return {
|
|
51
|
+
/**
|
|
52
|
+
* Move cursor to element with human-like motion
|
|
53
|
+
* @param {string} selector - CSS selector
|
|
54
|
+
* @param {Object} moveOptions - Movement options
|
|
55
|
+
*/
|
|
56
|
+
async moveTo(selector, moveOptions = {}) {
|
|
57
|
+
const {
|
|
58
|
+
hesitate = true,
|
|
59
|
+
hesitateMs = randomInRange(
|
|
60
|
+
MOUSE_CONFIG.HESITATE_BEFORE_CLICK.MIN_MS,
|
|
61
|
+
MOUSE_CONFIG.HESITATE_BEFORE_CLICK.MAX_MS
|
|
62
|
+
)
|
|
63
|
+
} = moveOptions;
|
|
64
|
+
|
|
65
|
+
await cursor.move(selector);
|
|
66
|
+
|
|
67
|
+
if (hesitate) {
|
|
68
|
+
await sleep(hesitateMs);
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Click element with human-like behavior
|
|
74
|
+
* @param {string} selector - CSS selector
|
|
75
|
+
* @param {Object} clickOptions - Click options
|
|
76
|
+
*/
|
|
77
|
+
async click(selector, clickOptions = {}) {
|
|
78
|
+
const {
|
|
79
|
+
hesitate = true,
|
|
80
|
+
moveFirst = true
|
|
81
|
+
} = clickOptions;
|
|
82
|
+
|
|
83
|
+
if (moveFirst) {
|
|
84
|
+
await this.moveTo(selector, { hesitate });
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Random click duration
|
|
88
|
+
const clickDelay = randomInRange(
|
|
89
|
+
MOUSE_CONFIG.CLICK_DURATION.MIN_MS,
|
|
90
|
+
MOUSE_CONFIG.CLICK_DURATION.MAX_MS
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
await cursor.click(selector, {
|
|
94
|
+
hesitate: hesitate ? randomInRange(
|
|
95
|
+
MOUSE_CONFIG.HESITATE_BEFORE_CLICK.MIN_MS,
|
|
96
|
+
MOUSE_CONFIG.HESITATE_BEFORE_CLICK.MAX_MS
|
|
97
|
+
) : 0,
|
|
98
|
+
waitForClick: clickDelay
|
|
99
|
+
});
|
|
100
|
+
},
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Double click element with human-like behavior
|
|
104
|
+
* @param {string} selector - CSS selector
|
|
105
|
+
*/
|
|
106
|
+
async doubleClick(selector) {
|
|
107
|
+
await this.moveTo(selector);
|
|
108
|
+
await cursor.click(selector, { waitForClick: 50 });
|
|
109
|
+
await sleep(randomInRange(50, 150));
|
|
110
|
+
await cursor.click(selector, { waitForClick: 50 });
|
|
111
|
+
},
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Hover over element
|
|
115
|
+
* @param {string} selector - CSS selector
|
|
116
|
+
*/
|
|
117
|
+
async hover(selector) {
|
|
118
|
+
await this.moveTo(selector, { hesitate: true });
|
|
119
|
+
},
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Random mouse movement within viewport (simulates idle behavior)
|
|
123
|
+
* @param {number} duration - Duration in ms for random movements
|
|
124
|
+
*/
|
|
125
|
+
async randomMovement(duration = 2000) {
|
|
126
|
+
const startTime = Date.now();
|
|
127
|
+
const viewport = page.viewport() || { width: 1920, height: 1080 };
|
|
128
|
+
|
|
129
|
+
while (Date.now() - startTime < duration) {
|
|
130
|
+
const x = randomInRange(100, viewport.width - 100);
|
|
131
|
+
const y = randomInRange(100, viewport.height - 100);
|
|
132
|
+
|
|
133
|
+
await cursor.moveTo({ x, y });
|
|
134
|
+
await sleep(randomInRange(200, 500));
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
|
|
138
|
+
// Expose original cursor for advanced use
|
|
139
|
+
_cursor: cursor
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Type text with human-like patterns
|
|
145
|
+
* @param {Page} page - Puppeteer page instance
|
|
146
|
+
* @param {string} selector - CSS selector for input field
|
|
147
|
+
* @param {string} text - Text to type
|
|
148
|
+
* @param {Object} options - Typing options
|
|
149
|
+
*/
|
|
150
|
+
export async function humanType(page, selector, text, options = {}) {
|
|
151
|
+
const {
|
|
152
|
+
clearFirst = true,
|
|
153
|
+
clickFirst = true,
|
|
154
|
+
baseDelay = TYPING_CONFIG.BASE_DELAY_MS,
|
|
155
|
+
randomDelay = TYPING_CONFIG.RANDOM_DELAY_MAX_MS,
|
|
156
|
+
pauseProbability = TYPING_CONFIG.PAUSE_PROBABILITY,
|
|
157
|
+
simulateTypos = false,
|
|
158
|
+
typoProbability = TYPING_CONFIG.TYPO_PROBABILITY
|
|
159
|
+
} = options;
|
|
160
|
+
|
|
161
|
+
// Click to focus the field
|
|
162
|
+
if (clickFirst) {
|
|
163
|
+
await page.click(selector);
|
|
164
|
+
await sleep(randomInRange(100, 200));
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Clear existing content using keyboard commands (triggers proper input events)
|
|
168
|
+
// IMPORTANT: Setting element.value = '' directly does NOT trigger input events,
|
|
169
|
+
// which breaks React/Vue/Angular forms and can be detected as bot behavior.
|
|
170
|
+
if (clearFirst) {
|
|
171
|
+
// Triple-click to select all text in the field (more human-like than Ctrl+A)
|
|
172
|
+
await page.click(selector, { clickCount: 3 });
|
|
173
|
+
await sleep(randomInRange(50, 100));
|
|
174
|
+
|
|
175
|
+
// Delete selected text with Backspace (triggers input events)
|
|
176
|
+
await page.keyboard.press('Backspace');
|
|
177
|
+
await sleep(randomInRange(50, 100));
|
|
178
|
+
|
|
179
|
+
// Dispatch input event to ensure framework state updates
|
|
180
|
+
await page.evaluate((sel) => {
|
|
181
|
+
const element = document.querySelector(sel);
|
|
182
|
+
if (element) {
|
|
183
|
+
element.dispatchEvent(new Event('input', { bubbles: true }));
|
|
184
|
+
element.dispatchEvent(new Event('change', { bubbles: true }));
|
|
185
|
+
}
|
|
186
|
+
}, selector);
|
|
187
|
+
await sleep(randomInRange(30, 80));
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Type each character with human-like timing
|
|
191
|
+
for (let i = 0; i < text.length; i++) {
|
|
192
|
+
const char = text[i];
|
|
193
|
+
|
|
194
|
+
// Occasional typo simulation
|
|
195
|
+
if (simulateTypos && Math.random() < typoProbability && char.match(/[a-z]/i)) {
|
|
196
|
+
// Type wrong key
|
|
197
|
+
const wrongChar = getAdjacentKey(char);
|
|
198
|
+
await page.keyboard.type(wrongChar);
|
|
199
|
+
await sleep(randomInRange(100, 200));
|
|
200
|
+
|
|
201
|
+
// Pause (realize mistake)
|
|
202
|
+
await sleep(randomInRange(200, 400));
|
|
203
|
+
|
|
204
|
+
// Delete wrong character
|
|
205
|
+
await page.keyboard.press('Backspace');
|
|
206
|
+
await sleep(TYPING_CONFIG.TYPO_CORRECTION_DELAY_MS);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Type the correct character
|
|
210
|
+
await page.keyboard.type(char);
|
|
211
|
+
|
|
212
|
+
// Calculate delay for next character
|
|
213
|
+
let delay = baseDelay + randomInRange(0, randomDelay);
|
|
214
|
+
|
|
215
|
+
// Add occasional pauses (thinking)
|
|
216
|
+
if (Math.random() < pauseProbability) {
|
|
217
|
+
delay += randomInRange(
|
|
218
|
+
TYPING_CONFIG.PAUSE_DURATION.MIN_MS,
|
|
219
|
+
TYPING_CONFIG.PAUSE_DURATION.MAX_MS
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Slightly longer delay after punctuation or spaces
|
|
224
|
+
if (['.', ',', '!', '?', ' ', '@'].includes(char)) {
|
|
225
|
+
delay += randomInRange(30, 80);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
await sleep(delay);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Final event dispatch to ensure framework state is fully updated
|
|
232
|
+
// Some frameworks (especially React with controlled inputs) need explicit events
|
|
233
|
+
await page.evaluate((sel) => {
|
|
234
|
+
const element = document.querySelector(sel);
|
|
235
|
+
if (element) {
|
|
236
|
+
// Dispatch events that frameworks listen for
|
|
237
|
+
element.dispatchEvent(new Event('input', { bubbles: true }));
|
|
238
|
+
element.dispatchEvent(new Event('change', { bubbles: true }));
|
|
239
|
+
// Also dispatch blur and focus to trigger validation
|
|
240
|
+
element.dispatchEvent(new FocusEvent('blur', { bubbles: true }));
|
|
241
|
+
element.dispatchEvent(new FocusEvent('focus', { bubbles: true }));
|
|
242
|
+
}
|
|
243
|
+
}, selector);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Get an adjacent key on QWERTY keyboard for typo simulation
|
|
248
|
+
* @param {string} char - Original character
|
|
249
|
+
* @returns {string} Adjacent character
|
|
250
|
+
*/
|
|
251
|
+
function getAdjacentKey(char) {
|
|
252
|
+
const keyboard = {
|
|
253
|
+
'q': ['w', 'a'], 'w': ['q', 'e', 's'], 'e': ['w', 'r', 'd'], 'r': ['e', 't', 'f'],
|
|
254
|
+
't': ['r', 'y', 'g'], 'y': ['t', 'u', 'h'], 'u': ['y', 'i', 'j'], 'i': ['u', 'o', 'k'],
|
|
255
|
+
'o': ['i', 'p', 'l'], 'p': ['o', 'l'],
|
|
256
|
+
'a': ['q', 's', 'z'], 's': ['a', 'w', 'd', 'x'], 'd': ['s', 'e', 'f', 'c'],
|
|
257
|
+
'f': ['d', 'r', 'g', 'v'], 'g': ['f', 't', 'h', 'b'], 'h': ['g', 'y', 'j', 'n'],
|
|
258
|
+
'j': ['h', 'u', 'k', 'm'], 'k': ['j', 'i', 'l'], 'l': ['k', 'o', 'p'],
|
|
259
|
+
'z': ['a', 's', 'x'], 'x': ['z', 's', 'd', 'c'], 'c': ['x', 'd', 'f', 'v'],
|
|
260
|
+
'v': ['c', 'f', 'g', 'b'], 'b': ['v', 'g', 'h', 'n'], 'n': ['b', 'h', 'j', 'm'],
|
|
261
|
+
'm': ['n', 'j', 'k']
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
const lowerChar = char.toLowerCase();
|
|
265
|
+
const adjacent = keyboard[lowerChar];
|
|
266
|
+
|
|
267
|
+
if (!adjacent) return char;
|
|
268
|
+
|
|
269
|
+
const wrongChar = adjacent[Math.floor(Math.random() * adjacent.length)];
|
|
270
|
+
return char === char.toUpperCase() ? wrongChar.toUpperCase() : wrongChar;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Wait with human-like timing after an action
|
|
275
|
+
* @param {string} actionType - Type of action (navigation, action, submit)
|
|
276
|
+
* @returns {Promise<void>}
|
|
277
|
+
*/
|
|
278
|
+
export async function humanWait(actionType = 'action') {
|
|
279
|
+
let delay;
|
|
280
|
+
|
|
281
|
+
switch (actionType) {
|
|
282
|
+
case 'navigation':
|
|
283
|
+
delay = randomInRange(
|
|
284
|
+
ACTION_DELAYS.AFTER_NAVIGATION_MS.MIN,
|
|
285
|
+
ACTION_DELAYS.AFTER_NAVIGATION_MS.MAX
|
|
286
|
+
);
|
|
287
|
+
break;
|
|
288
|
+
case 'submit':
|
|
289
|
+
case 'beforeSubmit':
|
|
290
|
+
delay = randomInRange(
|
|
291
|
+
ACTION_DELAYS.BEFORE_SUBMIT_MS.MIN,
|
|
292
|
+
ACTION_DELAYS.BEFORE_SUBMIT_MS.MAX
|
|
293
|
+
);
|
|
294
|
+
break;
|
|
295
|
+
case 'afterSubmit':
|
|
296
|
+
delay = randomInRange(
|
|
297
|
+
ACTION_DELAYS.AFTER_SUBMIT_MS.MIN,
|
|
298
|
+
ACTION_DELAYS.AFTER_SUBMIT_MS.MAX
|
|
299
|
+
);
|
|
300
|
+
break;
|
|
301
|
+
case 'scroll':
|
|
302
|
+
delay = randomInRange(
|
|
303
|
+
ACTION_DELAYS.SCROLL_PAUSE_MS.MIN,
|
|
304
|
+
ACTION_DELAYS.SCROLL_PAUSE_MS.MAX
|
|
305
|
+
);
|
|
306
|
+
break;
|
|
307
|
+
case 'action':
|
|
308
|
+
default:
|
|
309
|
+
delay = randomInRange(
|
|
310
|
+
ACTION_DELAYS.BETWEEN_ACTIONS_MS.MIN,
|
|
311
|
+
ACTION_DELAYS.BETWEEN_ACTIONS_MS.MAX
|
|
312
|
+
);
|
|
313
|
+
break;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
await sleep(delay);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Scroll page with human-like behavior
|
|
321
|
+
* @param {Page} page - Puppeteer page instance
|
|
322
|
+
* @param {Object} options - Scroll options
|
|
323
|
+
*/
|
|
324
|
+
export async function humanScroll(page, options = {}) {
|
|
325
|
+
const {
|
|
326
|
+
direction = 'down',
|
|
327
|
+
distance = 300,
|
|
328
|
+
steps = 5
|
|
329
|
+
} = options;
|
|
330
|
+
|
|
331
|
+
const stepDistance = Math.floor(distance / steps);
|
|
332
|
+
const scrollMultiplier = direction === 'up' ? -1 : 1;
|
|
333
|
+
|
|
334
|
+
for (let i = 0; i < steps; i++) {
|
|
335
|
+
// Add slight variation to each step
|
|
336
|
+
const actualStep = stepDistance + randomInRange(-20, 20);
|
|
337
|
+
|
|
338
|
+
await page.evaluate((y) => {
|
|
339
|
+
window.scrollBy({ top: y, behavior: 'smooth' });
|
|
340
|
+
}, actualStep * scrollMultiplier);
|
|
341
|
+
|
|
342
|
+
// Random pause between scroll steps
|
|
343
|
+
await sleep(randomInRange(50, 150));
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// Pause after scrolling
|
|
347
|
+
await humanWait('scroll');
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Scroll element into view with human-like behavior
|
|
352
|
+
* @param {Page} page - Puppeteer page instance
|
|
353
|
+
* @param {string} selector - CSS selector
|
|
354
|
+
*/
|
|
355
|
+
export async function scrollToElement(page, selector) {
|
|
356
|
+
await page.evaluate((sel) => {
|
|
357
|
+
const element = document.querySelector(sel);
|
|
358
|
+
if (element) {
|
|
359
|
+
element.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
|
360
|
+
}
|
|
361
|
+
}, selector);
|
|
362
|
+
|
|
363
|
+
await humanWait('scroll');
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Fill a form with human-like behavior
|
|
368
|
+
* @param {Page} page - Puppeteer page instance
|
|
369
|
+
* @param {Object} fields - Form fields { selector: value }
|
|
370
|
+
* @param {Object} options - Fill options
|
|
371
|
+
*/
|
|
372
|
+
export async function humanFillForm(page, fields, options = {}) {
|
|
373
|
+
const {
|
|
374
|
+
cursor = null,
|
|
375
|
+
tabBetweenFields = false
|
|
376
|
+
} = options;
|
|
377
|
+
|
|
378
|
+
const fieldEntries = Object.entries(fields);
|
|
379
|
+
|
|
380
|
+
for (let i = 0; i < fieldEntries.length; i++) {
|
|
381
|
+
const [selector, value] = fieldEntries[i];
|
|
382
|
+
|
|
383
|
+
// Move to field (if cursor provided)
|
|
384
|
+
if (cursor) {
|
|
385
|
+
await cursor.click(selector);
|
|
386
|
+
} else {
|
|
387
|
+
await page.click(selector);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
await humanWait('action');
|
|
391
|
+
|
|
392
|
+
// Type the value
|
|
393
|
+
await humanType(page, selector, value, {
|
|
394
|
+
clearFirst: true,
|
|
395
|
+
clickFirst: false // Already clicked
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
// Wait between fields
|
|
399
|
+
if (i < fieldEntries.length - 1) {
|
|
400
|
+
await humanWait('action');
|
|
401
|
+
|
|
402
|
+
// Optionally use Tab to move to next field
|
|
403
|
+
if (tabBetweenFields) {
|
|
404
|
+
await page.keyboard.press('Tab');
|
|
405
|
+
await sleep(randomInRange(100, 200));
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/**
|
|
412
|
+
* Submit a form with human-like behavior
|
|
413
|
+
* @param {Page} page - Puppeteer page instance
|
|
414
|
+
* @param {string} submitSelector - CSS selector for submit button
|
|
415
|
+
* @param {Object} options - Submit options
|
|
416
|
+
*/
|
|
417
|
+
export async function humanSubmit(page, submitSelector, options = {}) {
|
|
418
|
+
const { cursor = null, waitForNavigation = true } = options;
|
|
419
|
+
|
|
420
|
+
// Pause before submit (human would review)
|
|
421
|
+
await humanWait('beforeSubmit');
|
|
422
|
+
|
|
423
|
+
// Click submit
|
|
424
|
+
if (cursor) {
|
|
425
|
+
await cursor.click(submitSelector);
|
|
426
|
+
} else {
|
|
427
|
+
await page.click(submitSelector);
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// Wait for navigation if expected
|
|
431
|
+
if (waitForNavigation) {
|
|
432
|
+
try {
|
|
433
|
+
await page.waitForNavigation({
|
|
434
|
+
timeout: 10000,
|
|
435
|
+
waitUntil: 'networkidle2'
|
|
436
|
+
});
|
|
437
|
+
} catch (e) {
|
|
438
|
+
// Navigation might not happen (AJAX form)
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
await humanWait('afterSubmit');
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
export default {
|
|
446
|
+
createHumanCursor,
|
|
447
|
+
humanType,
|
|
448
|
+
humanWait,
|
|
449
|
+
humanScroll,
|
|
450
|
+
scrollToElement,
|
|
451
|
+
humanFillForm,
|
|
452
|
+
humanSubmit
|
|
453
|
+
};
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON Repair Utility
|
|
3
|
+
*
|
|
4
|
+
* Handles parsing of potentially truncated or malformed JSON from AI responses.
|
|
5
|
+
* Uses jsonrepair library to fix common issues like:
|
|
6
|
+
* - Missing closing brackets/braces
|
|
7
|
+
* - Truncated strings
|
|
8
|
+
* - Missing commas
|
|
9
|
+
* - Trailing commas
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { jsonrepair } from 'jsonrepair';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Parse JSON with automatic repair for truncated/malformed content
|
|
16
|
+
* @param {string} jsonString - The JSON string to parse
|
|
17
|
+
* @param {Object} options - Options
|
|
18
|
+
* @param {boolean} options.silent - If true, don't log warnings
|
|
19
|
+
* @returns {Object} { data, wasRepaired, original, repaired, error }
|
|
20
|
+
*/
|
|
21
|
+
export function parseJSONWithRepair(jsonString, options = {}) {
|
|
22
|
+
const result = {
|
|
23
|
+
data: null,
|
|
24
|
+
wasRepaired: false,
|
|
25
|
+
wasTruncated: false,
|
|
26
|
+
original: jsonString,
|
|
27
|
+
repaired: null,
|
|
28
|
+
error: null
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// First, try standard JSON.parse
|
|
32
|
+
try {
|
|
33
|
+
result.data = JSON.parse(jsonString);
|
|
34
|
+
return result;
|
|
35
|
+
} catch (originalError) {
|
|
36
|
+
// Standard parse failed, try repair
|
|
37
|
+
try {
|
|
38
|
+
const repairedString = jsonrepair(jsonString);
|
|
39
|
+
result.repaired = repairedString;
|
|
40
|
+
result.data = JSON.parse(repairedString);
|
|
41
|
+
result.wasRepaired = true;
|
|
42
|
+
|
|
43
|
+
// Detect if it was likely truncated (common patterns)
|
|
44
|
+
result.wasTruncated = detectTruncation(jsonString, repairedString);
|
|
45
|
+
|
|
46
|
+
if (!options.silent) {
|
|
47
|
+
console.warn('[JSONRepair] Repaired malformed JSON:', {
|
|
48
|
+
originalLength: jsonString.length,
|
|
49
|
+
repairedLength: repairedString.length,
|
|
50
|
+
wasTruncated: result.wasTruncated
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return result;
|
|
55
|
+
} catch (repairError) {
|
|
56
|
+
// Even repair failed
|
|
57
|
+
result.error = {
|
|
58
|
+
originalError: originalError.message,
|
|
59
|
+
repairError: repairError.message
|
|
60
|
+
};
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Detect if JSON was truncated (vs just malformed)
|
|
68
|
+
* Uses state machine approach for accurate string tracking
|
|
69
|
+
* @param {string} original - Original JSON string
|
|
70
|
+
* @param {string} repaired - Repaired JSON string
|
|
71
|
+
* @returns {boolean} True if likely truncated
|
|
72
|
+
*/
|
|
73
|
+
function detectTruncation(original, repaired) {
|
|
74
|
+
const trimmed = original.trim();
|
|
75
|
+
|
|
76
|
+
// State machine to accurately track JSON structure
|
|
77
|
+
let depth = 0; // Bracket nesting depth
|
|
78
|
+
let inString = false; // Currently inside a string
|
|
79
|
+
let escaped = false; // Previous char was escape
|
|
80
|
+
|
|
81
|
+
for (const char of trimmed) {
|
|
82
|
+
if (escaped) {
|
|
83
|
+
escaped = false;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (char === '\\' && inString) {
|
|
87
|
+
escaped = true;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
if (char === '"') {
|
|
91
|
+
inString = !inString;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
if (inString) continue;
|
|
95
|
+
|
|
96
|
+
if (char === '{' || char === '[') depth++;
|
|
97
|
+
if (char === '}' || char === ']') depth--;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// PRIMARY CHECK: If we end mid-string, definitely truncated
|
|
101
|
+
// This catches the common case where content was cut off mid-sentence
|
|
102
|
+
if (inString) {
|
|
103
|
+
console.log('[JSONRepair] Truncation detected: ended mid-string');
|
|
104
|
+
return true;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// If we have unclosed brackets, truncated
|
|
108
|
+
if (depth > 0) {
|
|
109
|
+
console.log('[JSONRepair] Truncation detected: unclosed brackets, depth=' + depth);
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// If we end mid-escape sequence, truncated
|
|
114
|
+
if (escaped) {
|
|
115
|
+
console.log('[JSONRepair] Truncation detected: ended mid-escape');
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Count bracket differences between original and repaired
|
|
120
|
+
const countBrackets = (str) => {
|
|
121
|
+
let open = 0, close = 0;
|
|
122
|
+
let inStr = false, esc = false;
|
|
123
|
+
for (const char of str) {
|
|
124
|
+
if (esc) { esc = false; continue; }
|
|
125
|
+
if (char === '\\' && inStr) { esc = true; continue; }
|
|
126
|
+
if (char === '"') { inStr = !inStr; continue; }
|
|
127
|
+
if (inStr) continue;
|
|
128
|
+
if (char === '{' || char === '[') open++;
|
|
129
|
+
if (char === '}' || char === ']') close++;
|
|
130
|
+
}
|
|
131
|
+
return { open, close };
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
const originalBrackets = countBrackets(original);
|
|
135
|
+
const repairedBrackets = countBrackets(repaired);
|
|
136
|
+
|
|
137
|
+
// If repair added closing brackets, it was truncated
|
|
138
|
+
if (repairedBrackets.close > originalBrackets.close) {
|
|
139
|
+
console.log('[JSONRepair] Truncation detected: repair added closing brackets');
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Check for common truncation patterns in the ending
|
|
144
|
+
const lastChars = trimmed.slice(-20);
|
|
145
|
+
const truncationPatterns = [
|
|
146
|
+
/,\s*$/, // Ends with comma (expecting more)
|
|
147
|
+
/:\s*$/, // Ends with colon (expecting value)
|
|
148
|
+
/\[\s*$/, // Ends with open bracket
|
|
149
|
+
/\{\s*$/, // Ends with open brace
|
|
150
|
+
];
|
|
151
|
+
|
|
152
|
+
for (const pattern of truncationPatterns) {
|
|
153
|
+
if (pattern.test(lastChars)) {
|
|
154
|
+
console.log('[JSONRepair] Truncation detected: suspicious ending pattern');
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Check if a string looks like it might be truncated JSON
|
|
164
|
+
* Useful for pre-checking before attempting parse
|
|
165
|
+
* @param {string} str - String to check
|
|
166
|
+
* @returns {boolean} True if likely truncated
|
|
167
|
+
*/
|
|
168
|
+
export function looksLikeTruncatedJSON(str) {
|
|
169
|
+
const trimmed = str.trim();
|
|
170
|
+
|
|
171
|
+
// Must start with { or [ to be JSON
|
|
172
|
+
if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Check for balanced brackets
|
|
177
|
+
let depth = 0;
|
|
178
|
+
let inString = false;
|
|
179
|
+
let escaped = false;
|
|
180
|
+
|
|
181
|
+
for (const char of trimmed) {
|
|
182
|
+
if (escaped) {
|
|
183
|
+
escaped = false;
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
if (char === '\\' && inString) {
|
|
187
|
+
escaped = true;
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (char === '"') {
|
|
191
|
+
inString = !inString;
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
if (inString) continue;
|
|
195
|
+
|
|
196
|
+
if (char === '{' || char === '[') depth++;
|
|
197
|
+
if (char === '}' || char === ']') depth--;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// If depth > 0, we have unclosed brackets (truncated)
|
|
201
|
+
// If inString is true, we're mid-string (truncated)
|
|
202
|
+
return depth > 0 || inString;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Create a truncation notice for file content
|
|
207
|
+
* @param {string} fileType - Type of file (md, js, etc.)
|
|
208
|
+
* @returns {string} Truncation notice
|
|
209
|
+
*/
|
|
210
|
+
export function createTruncationNotice(fileType) {
|
|
211
|
+
const notices = {
|
|
212
|
+
md: '\n\n---\n**[CONTENT TRUNCATED]** - AI response exceeded token limit. Content above this line may be incomplete.\n',
|
|
213
|
+
js: '\n\n// [CONTENT TRUNCATED] - AI response exceeded token limit. Content above this line may be incomplete.\n',
|
|
214
|
+
ts: '\n\n// [CONTENT TRUNCATED] - AI response exceeded token limit. Content above this line may be incomplete.\n',
|
|
215
|
+
jsx: '\n\n// [CONTENT TRUNCATED] - AI response exceeded token limit. Content above this line may be incomplete.\n',
|
|
216
|
+
tsx: '\n\n// [CONTENT TRUNCATED] - AI response exceeded token limit. Content above this line may be incomplete.\n',
|
|
217
|
+
json: '', // Can't add comments to JSON
|
|
218
|
+
css: '\n\n/* [CONTENT TRUNCATED] - AI response exceeded token limit. Content above this line may be incomplete. */\n',
|
|
219
|
+
html: '\n\n<!-- [CONTENT TRUNCATED] - AI response exceeded token limit. Content above this line may be incomplete. -->\n',
|
|
220
|
+
py: '\n\n# [CONTENT TRUNCATED] - AI response exceeded token limit. Content above this line may be incomplete.\n',
|
|
221
|
+
default: '\n\n[CONTENT TRUNCATED] - AI response exceeded token limit.\n'
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
return notices[fileType] || notices.default;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Get file extension from path
|
|
229
|
+
* @param {string} filePath - File path
|
|
230
|
+
* @returns {string} Extension without dot
|
|
231
|
+
*/
|
|
232
|
+
export function getFileExtension(filePath) {
|
|
233
|
+
const match = filePath.match(/\.([^.]+)$/);
|
|
234
|
+
return match ? match[1].toLowerCase() : '';
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
export default {
|
|
238
|
+
parseJSONWithRepair,
|
|
239
|
+
looksLikeTruncatedJSON,
|
|
240
|
+
createTruncationNotice,
|
|
241
|
+
getFileExtension
|
|
242
|
+
};
|