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
package/bin/cli.js
ADDED
|
@@ -0,0 +1,556 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Loxia Autopilot One - CLI Entry Point
|
|
5
|
+
*
|
|
6
|
+
* Commands:
|
|
7
|
+
* loxia web - Start server (serves Web UI) + open browser
|
|
8
|
+
* loxia serve - Start server only (no UI)
|
|
9
|
+
* loxia terminal - Start Terminal UI only (server must be running)
|
|
10
|
+
* loxia plus-web - Alias for 'web'
|
|
11
|
+
* loxia plus-terminal - Start server (background) + Terminal UI (foreground)
|
|
12
|
+
* loxia trigger-schedule <id> - Trigger a scheduled task (wakes server if needed)
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { fileURLToPath } from 'url';
|
|
16
|
+
import { dirname, join } from 'path';
|
|
17
|
+
import { spawn } from 'child_process';
|
|
18
|
+
import { readFileSync } from 'fs';
|
|
19
|
+
import http from 'http';
|
|
20
|
+
|
|
21
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
22
|
+
const __dirname = dirname(__filename);
|
|
23
|
+
|
|
24
|
+
// Default configuration
|
|
25
|
+
const DEFAULT_PORT = 8080;
|
|
26
|
+
// Use 127.0.0.1 instead of 'localhost' to avoid IPv6 issues in WSL2
|
|
27
|
+
const DEFAULT_HOST = '127.0.0.1';
|
|
28
|
+
const SERVER_STARTUP_TIMEOUT = 15000;
|
|
29
|
+
const SERVER_CHECK_INTERVAL = 500;
|
|
30
|
+
|
|
31
|
+
// Parse CLI arguments
|
|
32
|
+
const args = process.argv.slice(2);
|
|
33
|
+
const command = args[0] && !args[0].startsWith('--') ? args[0] : null;
|
|
34
|
+
const flags = {
|
|
35
|
+
port: null,
|
|
36
|
+
host: null,
|
|
37
|
+
help: args.includes('--help') || args.includes('-h'),
|
|
38
|
+
version: args.includes('--version') || args.includes('-v')
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
// Extract port and host if provided
|
|
42
|
+
for (let i = 0; i < args.length; i++) {
|
|
43
|
+
if (args[i] === '--port' && args[i + 1]) {
|
|
44
|
+
flags.port = parseInt(args[i + 1], 10);
|
|
45
|
+
}
|
|
46
|
+
if (args[i] === '--host' && args[i + 1]) {
|
|
47
|
+
flags.host = args[i + 1];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Only use default port if explicitly specified, otherwise let server choose
|
|
52
|
+
const explicitPort = flags.port;
|
|
53
|
+
const host = flags.host || DEFAULT_HOST;
|
|
54
|
+
|
|
55
|
+
// Show version
|
|
56
|
+
if (flags.version) {
|
|
57
|
+
const pkgPath = join(__dirname, '..', 'package.json');
|
|
58
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
|
|
59
|
+
console.log(`Loxia Autopilot One v${pkg.version}`);
|
|
60
|
+
process.exit(0);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Show help
|
|
64
|
+
if (flags.help || !command) {
|
|
65
|
+
const pkgPath = join(__dirname, '..', 'package.json');
|
|
66
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
|
|
67
|
+
|
|
68
|
+
console.log(`
|
|
69
|
+
Loxia Autopilot One v${pkg.version} - AI Agent System
|
|
70
|
+
|
|
71
|
+
Usage:
|
|
72
|
+
loxia <command> [options]
|
|
73
|
+
|
|
74
|
+
Commands:
|
|
75
|
+
web Start server + open Web UI in browser
|
|
76
|
+
serve Start server only (no UI opened)
|
|
77
|
+
terminal Start Terminal UI (server must be running)
|
|
78
|
+
plus-web Alias for 'web'
|
|
79
|
+
plus-terminal Start server + Terminal UI together
|
|
80
|
+
trigger-schedule <id> Trigger a scheduled task (wakes server if needed)
|
|
81
|
+
|
|
82
|
+
Options:
|
|
83
|
+
--port <number> Specify port (default: auto-select starting from ${DEFAULT_PORT})
|
|
84
|
+
--host <host> Specify host (default: ${DEFAULT_HOST})
|
|
85
|
+
-h, --help Show this help message
|
|
86
|
+
-v, --version Show version number
|
|
87
|
+
|
|
88
|
+
Examples:
|
|
89
|
+
loxia web # Start server + open browser
|
|
90
|
+
loxia serve # Start server only (headless)
|
|
91
|
+
loxia terminal # Connect Terminal UI to running server
|
|
92
|
+
loxia plus-terminal # Start server + Terminal UI
|
|
93
|
+
loxia web --port 3000 # Use specific port
|
|
94
|
+
|
|
95
|
+
Quick Start:
|
|
96
|
+
1. Run 'loxia web' to start with Web UI
|
|
97
|
+
2. Or run 'loxia plus-terminal' for Terminal UI experience
|
|
98
|
+
3. Or run 'loxia serve' for headless server (connect remotely)
|
|
99
|
+
|
|
100
|
+
Note: If no port is specified, the server will automatically find
|
|
101
|
+
an available port. The Terminal UI will discover the server port
|
|
102
|
+
automatically from the port registry.
|
|
103
|
+
|
|
104
|
+
Documentation:
|
|
105
|
+
https://autopilot.loxia.ai
|
|
106
|
+
|
|
107
|
+
`);
|
|
108
|
+
process.exit(0);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Dynamically import the port registry
|
|
113
|
+
*/
|
|
114
|
+
async function getPortRegistry() {
|
|
115
|
+
const { getPortRegistry } = await import('../src/services/portRegistry.js');
|
|
116
|
+
return getPortRegistry();
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Discover backend from port registry
|
|
121
|
+
* @returns {Promise<{host: string, port: number}|null>}
|
|
122
|
+
*/
|
|
123
|
+
async function discoverBackend() {
|
|
124
|
+
try {
|
|
125
|
+
const portRegistry = await getPortRegistry();
|
|
126
|
+
await portRegistry.cleanupStaleEntries();
|
|
127
|
+
const backendInfo = await portRegistry.getService('backend');
|
|
128
|
+
|
|
129
|
+
if (backendInfo) {
|
|
130
|
+
return {
|
|
131
|
+
host: backendInfo.host || 'localhost',
|
|
132
|
+
port: backendInfo.port,
|
|
133
|
+
pid: backendInfo.pid
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
return null;
|
|
137
|
+
} catch (error) {
|
|
138
|
+
// Registry may not exist yet
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Check if server is running at the specified host:port
|
|
145
|
+
*/
|
|
146
|
+
async function checkServerRunning(host, port, maxAttempts = 1) {
|
|
147
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
148
|
+
const isRunning = await new Promise((resolve) => {
|
|
149
|
+
const req = http.get(`http://${host}:${port}/api/health`, (res) => {
|
|
150
|
+
resolve(res.statusCode === 200);
|
|
151
|
+
});
|
|
152
|
+
req.on('error', () => resolve(false));
|
|
153
|
+
req.setTimeout(2000, () => {
|
|
154
|
+
req.destroy();
|
|
155
|
+
resolve(false);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
if (isRunning) return true;
|
|
160
|
+
|
|
161
|
+
if (i < maxAttempts - 1) {
|
|
162
|
+
await new Promise(resolve => setTimeout(resolve, SERVER_CHECK_INTERVAL));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Wait for server to become ready by polling the port registry
|
|
170
|
+
* @returns {Promise<{host: string, port: number}|null>}
|
|
171
|
+
*/
|
|
172
|
+
async function waitForServerWithDiscovery(timeout = SERVER_STARTUP_TIMEOUT) {
|
|
173
|
+
const startTime = Date.now();
|
|
174
|
+
|
|
175
|
+
while (Date.now() - startTime < timeout) {
|
|
176
|
+
// Try to discover backend from registry
|
|
177
|
+
const backend = await discoverBackend();
|
|
178
|
+
|
|
179
|
+
if (backend) {
|
|
180
|
+
// Verify with health check
|
|
181
|
+
const isHealthy = await checkServerRunning(backend.host, backend.port);
|
|
182
|
+
if (isHealthy) {
|
|
183
|
+
return backend;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
await new Promise(resolve => setTimeout(resolve, SERVER_CHECK_INTERVAL));
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Wait for server at specific port (when port is explicitly specified)
|
|
195
|
+
*/
|
|
196
|
+
async function waitForServerAtPort(host, port, timeout = SERVER_STARTUP_TIMEOUT) {
|
|
197
|
+
const maxAttempts = Math.ceil(timeout / SERVER_CHECK_INTERVAL);
|
|
198
|
+
const isReady = await checkServerRunning(host, port, maxAttempts);
|
|
199
|
+
return isReady ? { host, port } : null;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Open URL in default browser
|
|
204
|
+
* Uses spawn instead of exec for better security (no shell interpolation)
|
|
205
|
+
*/
|
|
206
|
+
function openBrowser(url) {
|
|
207
|
+
let cmd, args;
|
|
208
|
+
|
|
209
|
+
if (process.platform === 'darwin') {
|
|
210
|
+
cmd = 'open';
|
|
211
|
+
args = [url];
|
|
212
|
+
} else if (process.platform === 'win32') {
|
|
213
|
+
cmd = 'cmd';
|
|
214
|
+
args = ['/c', 'start', '""', url];
|
|
215
|
+
} else {
|
|
216
|
+
cmd = 'xdg-open';
|
|
217
|
+
args = [url];
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const child = spawn(cmd, args, {
|
|
221
|
+
detached: true,
|
|
222
|
+
stdio: 'ignore'
|
|
223
|
+
});
|
|
224
|
+
child.unref();
|
|
225
|
+
|
|
226
|
+
child.on('error', () => {
|
|
227
|
+
console.log(`Could not open browser automatically.`);
|
|
228
|
+
console.log(`Please open manually: ${url}`);
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Start the backend server
|
|
234
|
+
* @param {boolean} silent - If true, suppress server output
|
|
235
|
+
* @returns {ChildProcess}
|
|
236
|
+
*/
|
|
237
|
+
function startServer(silent = false) {
|
|
238
|
+
const env = { ...process.env };
|
|
239
|
+
|
|
240
|
+
// Only set port environment variables if explicitly specified
|
|
241
|
+
// Otherwise, let the server dynamically allocate a port
|
|
242
|
+
if (explicitPort) {
|
|
243
|
+
env.LOXIA_PORT = explicitPort.toString();
|
|
244
|
+
env.PORT = explicitPort.toString();
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
if (flags.host) {
|
|
248
|
+
env.LOXIA_HOST = flags.host;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const mainScript = join(__dirname, '..', 'src', 'index.js');
|
|
252
|
+
|
|
253
|
+
const child = spawn('node', [mainScript], {
|
|
254
|
+
cwd: join(__dirname, '..'),
|
|
255
|
+
env,
|
|
256
|
+
stdio: silent ? ['ignore', 'ignore', 'ignore'] : 'inherit',
|
|
257
|
+
detached: silent
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
if (silent) {
|
|
261
|
+
child.unref();
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return child;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Start Terminal UI with discovered port
|
|
269
|
+
*/
|
|
270
|
+
function startTerminalUIProcess(discoveredHost, discoveredPort) {
|
|
271
|
+
const terminalScript = join(__dirname, 'loxia-terminal.js');
|
|
272
|
+
|
|
273
|
+
const env = {
|
|
274
|
+
...process.env,
|
|
275
|
+
LOXIA_PORT: discoveredPort.toString(),
|
|
276
|
+
LOXIA_HOST: discoveredHost
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
const child = spawn('node', [terminalScript], {
|
|
280
|
+
cwd: join(__dirname, '..'),
|
|
281
|
+
env,
|
|
282
|
+
stdio: 'inherit'
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
return child;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// Command handlers
|
|
289
|
+
const commands = {
|
|
290
|
+
// 'web' and 'plus-web': Start server + open browser
|
|
291
|
+
'web': async () => {
|
|
292
|
+
console.log('Starting Loxia server...\n');
|
|
293
|
+
|
|
294
|
+
const serverProcess = startServer(false);
|
|
295
|
+
|
|
296
|
+
// Wait for server to be ready
|
|
297
|
+
console.log('Waiting for server to start...');
|
|
298
|
+
|
|
299
|
+
let backend;
|
|
300
|
+
if (explicitPort) {
|
|
301
|
+
backend = await waitForServerAtPort(host, explicitPort);
|
|
302
|
+
} else {
|
|
303
|
+
backend = await waitForServerWithDiscovery();
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (backend) {
|
|
307
|
+
const serverUrl = `http://${backend.host}:${backend.port}`;
|
|
308
|
+
console.log(`\nOpening Web UI at ${serverUrl}`);
|
|
309
|
+
openBrowser(serverUrl);
|
|
310
|
+
} else {
|
|
311
|
+
console.log(`\nServer may still be starting. Check the port registry or logs.`);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Forward signals
|
|
315
|
+
process.on('SIGINT', () => serverProcess.kill('SIGINT'));
|
|
316
|
+
process.on('SIGTERM', () => serverProcess.kill('SIGTERM'));
|
|
317
|
+
|
|
318
|
+
serverProcess.on('exit', (code) => process.exit(code || 0));
|
|
319
|
+
},
|
|
320
|
+
|
|
321
|
+
'plus-web': async () => {
|
|
322
|
+
// Alias for 'web'
|
|
323
|
+
await commands['web']();
|
|
324
|
+
},
|
|
325
|
+
|
|
326
|
+
// 'serve': Start server only (no UI)
|
|
327
|
+
'serve': async () => {
|
|
328
|
+
console.log('Starting Loxia server...\n');
|
|
329
|
+
|
|
330
|
+
const serverProcess = startServer(false);
|
|
331
|
+
|
|
332
|
+
// Wait for server to be ready
|
|
333
|
+
console.log('Waiting for server to start...');
|
|
334
|
+
|
|
335
|
+
let backend;
|
|
336
|
+
if (explicitPort) {
|
|
337
|
+
backend = await waitForServerAtPort(host, explicitPort);
|
|
338
|
+
} else {
|
|
339
|
+
backend = await waitForServerWithDiscovery();
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
if (backend) {
|
|
343
|
+
const serverUrl = `http://${backend.host}:${backend.port}`;
|
|
344
|
+
console.log(`\n✓ Server running at ${serverUrl}`);
|
|
345
|
+
console.log(`\n Web UI: ${serverUrl}`);
|
|
346
|
+
console.log(` Terminal UI: loxia terminal`);
|
|
347
|
+
console.log(` API Health: ${serverUrl}/api/health\n`);
|
|
348
|
+
} else {
|
|
349
|
+
console.log(`\nServer started but may still be initializing.`);
|
|
350
|
+
console.log(`Run 'loxia terminal' to connect when ready.`);
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Forward signals for graceful shutdown
|
|
354
|
+
process.on('SIGINT', () => serverProcess.kill('SIGINT'));
|
|
355
|
+
process.on('SIGTERM', () => serverProcess.kill('SIGTERM'));
|
|
356
|
+
|
|
357
|
+
serverProcess.on('exit', (code) => process.exit(code || 0));
|
|
358
|
+
},
|
|
359
|
+
|
|
360
|
+
// 'terminal': Start Terminal UI only (server must be running)
|
|
361
|
+
'terminal': async () => {
|
|
362
|
+
console.log('Looking for running server...');
|
|
363
|
+
|
|
364
|
+
// First try to discover from registry
|
|
365
|
+
let backend = await discoverBackend();
|
|
366
|
+
|
|
367
|
+
// If explicit port specified, use that instead
|
|
368
|
+
if (explicitPort) {
|
|
369
|
+
backend = { host, port: explicitPort };
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
if (!backend) {
|
|
373
|
+
console.error(`\nNo running server found in the port registry.`);
|
|
374
|
+
console.error('\nPlease start the server first:');
|
|
375
|
+
console.error(' loxia web # Start server + Web UI');
|
|
376
|
+
console.error(' loxia serve # Start server only');
|
|
377
|
+
console.error(' loxia plus-terminal # Start server + Terminal UI\n');
|
|
378
|
+
process.exit(1);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// Verify server is actually running
|
|
382
|
+
const isRunning = await checkServerRunning(backend.host, backend.port);
|
|
383
|
+
|
|
384
|
+
if (!isRunning) {
|
|
385
|
+
console.error(`\nServer registered at ${backend.host}:${backend.port} but not responding.`);
|
|
386
|
+
console.error('It may have crashed. Please restart it.');
|
|
387
|
+
process.exit(1);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
console.log(`Server discovered at ${backend.host}:${backend.port}`);
|
|
391
|
+
console.log('Starting Terminal UI...\n');
|
|
392
|
+
|
|
393
|
+
const terminalProcess = startTerminalUIProcess(backend.host, backend.port);
|
|
394
|
+
|
|
395
|
+
process.on('SIGINT', () => terminalProcess.kill('SIGINT'));
|
|
396
|
+
process.on('SIGTERM', () => terminalProcess.kill('SIGTERM'));
|
|
397
|
+
|
|
398
|
+
terminalProcess.on('exit', (code) => process.exit(code || 0));
|
|
399
|
+
},
|
|
400
|
+
|
|
401
|
+
// 'plus-terminal': Start server (silent background) + Terminal UI (foreground)
|
|
402
|
+
'plus-terminal': async () => {
|
|
403
|
+
console.log('Starting Loxia server in background...');
|
|
404
|
+
|
|
405
|
+
// Start server silently in background
|
|
406
|
+
const serverProcess = startServer(true);
|
|
407
|
+
|
|
408
|
+
// Wait for server to be ready
|
|
409
|
+
let backend;
|
|
410
|
+
if (explicitPort) {
|
|
411
|
+
backend = await waitForServerAtPort(host, explicitPort);
|
|
412
|
+
} else {
|
|
413
|
+
backend = await waitForServerWithDiscovery();
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
if (!backend) {
|
|
417
|
+
console.error('\nServer failed to start. Please check logs.');
|
|
418
|
+
process.exit(1);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
console.log(`Server running at http://${backend.host}:${backend.port}`);
|
|
422
|
+
console.log('Starting Terminal UI...\n');
|
|
423
|
+
|
|
424
|
+
const terminalProcess = startTerminalUIProcess(backend.host, backend.port);
|
|
425
|
+
|
|
426
|
+
// When Terminal UI exits, also kill the server
|
|
427
|
+
terminalProcess.on('exit', (code) => {
|
|
428
|
+
console.log('\nShutting down server...');
|
|
429
|
+
|
|
430
|
+
// Try to kill the server process
|
|
431
|
+
try {
|
|
432
|
+
process.kill(serverProcess.pid, 'SIGTERM');
|
|
433
|
+
} catch (e) {
|
|
434
|
+
// Server may have already exited
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
process.exit(code || 0);
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
process.on('SIGINT', () => {
|
|
441
|
+
terminalProcess.kill('SIGINT');
|
|
442
|
+
});
|
|
443
|
+
|
|
444
|
+
process.on('SIGTERM', () => {
|
|
445
|
+
terminalProcess.kill('SIGTERM');
|
|
446
|
+
});
|
|
447
|
+
},
|
|
448
|
+
|
|
449
|
+
// 'trigger-schedule': Trigger a scheduled task, waking server if needed
|
|
450
|
+
'trigger-schedule': async () => {
|
|
451
|
+
const scheduleId = args[1];
|
|
452
|
+
if (!scheduleId) {
|
|
453
|
+
console.error('Usage: loxia trigger-schedule <schedule-id>');
|
|
454
|
+
process.exit(1);
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// Try to find a running server
|
|
458
|
+
let backend = await discoverBackend();
|
|
459
|
+
let weStartedServer = false;
|
|
460
|
+
|
|
461
|
+
if (backend) {
|
|
462
|
+
const isRunning = await checkServerRunning(backend.host, backend.port);
|
|
463
|
+
if (!isRunning) backend = null;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
if (!backend) {
|
|
467
|
+
// No running server — wake one up silently
|
|
468
|
+
console.log('No running server found. Starting Loxia in background...');
|
|
469
|
+
startServer(true);
|
|
470
|
+
weStartedServer = true;
|
|
471
|
+
|
|
472
|
+
// Wait for it to come up
|
|
473
|
+
if (explicitPort) {
|
|
474
|
+
backend = await waitForServerAtPort(host, explicitPort, 30000);
|
|
475
|
+
} else {
|
|
476
|
+
backend = await waitForServerWithDiscovery(30000);
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
if (!backend) {
|
|
480
|
+
console.error('Failed to start server within 30s. Check logs.');
|
|
481
|
+
process.exit(1);
|
|
482
|
+
}
|
|
483
|
+
console.log(`Server started at ${backend.host}:${backend.port}`);
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
// Trigger the schedule via API
|
|
487
|
+
const triggerUrl = `http://${backend.host}:${backend.port}/api/schedules/${encodeURIComponent(scheduleId)}/trigger`;
|
|
488
|
+
|
|
489
|
+
try {
|
|
490
|
+
const result = await new Promise((resolve, reject) => {
|
|
491
|
+
const postData = JSON.stringify({});
|
|
492
|
+
const req = http.request(triggerUrl, {
|
|
493
|
+
method: 'POST',
|
|
494
|
+
headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(postData) }
|
|
495
|
+
}, (res) => {
|
|
496
|
+
let data = '';
|
|
497
|
+
res.on('data', chunk => data += chunk);
|
|
498
|
+
res.on('end', () => {
|
|
499
|
+
try {
|
|
500
|
+
resolve(JSON.parse(data));
|
|
501
|
+
} catch {
|
|
502
|
+
reject(new Error(`Invalid response: ${data}`));
|
|
503
|
+
}
|
|
504
|
+
});
|
|
505
|
+
});
|
|
506
|
+
req.on('error', reject);
|
|
507
|
+
req.setTimeout(60000, () => { req.destroy(); reject(new Error('Request timed out')); });
|
|
508
|
+
req.write(postData);
|
|
509
|
+
req.end();
|
|
510
|
+
});
|
|
511
|
+
|
|
512
|
+
if (result.success) {
|
|
513
|
+
console.log(`Schedule "${result.scheduleName || scheduleId}" triggered successfully.`);
|
|
514
|
+
} else {
|
|
515
|
+
console.error(`Failed to trigger schedule: ${result.error}`);
|
|
516
|
+
process.exit(1);
|
|
517
|
+
}
|
|
518
|
+
} catch (err) {
|
|
519
|
+
console.error(`Failed to trigger schedule: ${err.message}`);
|
|
520
|
+
process.exit(1);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
// If we started the server, set idle shutdown timer
|
|
524
|
+
if (weStartedServer) {
|
|
525
|
+
const idleUrl = `http://${backend.host}:${backend.port}/api/system/idle-shutdown`;
|
|
526
|
+
try {
|
|
527
|
+
const postData = JSON.stringify({ timeoutMinutes: 10 });
|
|
528
|
+
await new Promise((resolve) => {
|
|
529
|
+
const req = http.request(idleUrl, {
|
|
530
|
+
method: 'POST',
|
|
531
|
+
headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(postData) }
|
|
532
|
+
}, (res) => { res.on('data', () => {}); res.on('end', resolve); });
|
|
533
|
+
req.on('error', resolve); // Non-critical, ignore errors
|
|
534
|
+
req.write(postData);
|
|
535
|
+
req.end();
|
|
536
|
+
});
|
|
537
|
+
} catch {
|
|
538
|
+
// Non-critical
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
process.exit(0);
|
|
543
|
+
}
|
|
544
|
+
};
|
|
545
|
+
|
|
546
|
+
// Execute command
|
|
547
|
+
if (commands[command]) {
|
|
548
|
+
commands[command]().catch((error) => {
|
|
549
|
+
console.error('Error:', error.message);
|
|
550
|
+
process.exit(1);
|
|
551
|
+
});
|
|
552
|
+
} else {
|
|
553
|
+
console.error(`Unknown command: ${command}`);
|
|
554
|
+
console.error('Run "loxia --help" for usage information.');
|
|
555
|
+
process.exit(1);
|
|
556
|
+
}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Loxia Terminal UI Launcher (Ink-based)
|
|
5
|
+
* Cross-platform compatible including Windows
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { spawn } from 'child_process';
|
|
9
|
+
import net from 'net';
|
|
10
|
+
import path from 'path';
|
|
11
|
+
import { fileURLToPath } from 'url';
|
|
12
|
+
|
|
13
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
14
|
+
const __dirname = path.dirname(__filename);
|
|
15
|
+
const projectRoot = path.dirname(__dirname);
|
|
16
|
+
|
|
17
|
+
// Configuration
|
|
18
|
+
const DEFAULT_PORT = 8080;
|
|
19
|
+
const DEFAULT_HOST = 'localhost';
|
|
20
|
+
const SERVER_STARTUP_TIMEOUT = 10000;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Check if server is running
|
|
24
|
+
*/
|
|
25
|
+
async function isServerRunning(host, port) {
|
|
26
|
+
return new Promise((resolve) => {
|
|
27
|
+
const socket = new net.Socket();
|
|
28
|
+
socket.setTimeout(2000);
|
|
29
|
+
|
|
30
|
+
socket.on('connect', () => {
|
|
31
|
+
socket.destroy();
|
|
32
|
+
resolve(true);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
socket.on('timeout', () => {
|
|
36
|
+
socket.destroy();
|
|
37
|
+
resolve(false);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
socket.on('error', () => {
|
|
41
|
+
socket.destroy();
|
|
42
|
+
resolve(false);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
socket.connect(port, host);
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Start the Loxia server
|
|
51
|
+
*/
|
|
52
|
+
async function startServer(host, port) {
|
|
53
|
+
console.log('🚀 Starting Loxia server...');
|
|
54
|
+
|
|
55
|
+
return new Promise((resolve, reject) => {
|
|
56
|
+
const serverProcess = spawn('node', [
|
|
57
|
+
path.join(projectRoot, 'bin/cli.js'),
|
|
58
|
+
'--ui', 'web',
|
|
59
|
+
'--host', host,
|
|
60
|
+
'--port', port.toString()
|
|
61
|
+
], {
|
|
62
|
+
detached: false,
|
|
63
|
+
stdio: ['ignore', 'pipe', 'pipe']
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
serverProcess.stdout.on('data', () => {
|
|
67
|
+
// Silently consume
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
serverProcess.stderr.on('data', () => {
|
|
71
|
+
// Silently consume
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
serverProcess.on('error', (error) => {
|
|
75
|
+
console.error('Failed to start server:', error.message);
|
|
76
|
+
reject(error);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
// Wait for server to start
|
|
80
|
+
const startTime = Date.now();
|
|
81
|
+
const checkInterval = setInterval(async () => {
|
|
82
|
+
const running = await isServerRunning(host, port);
|
|
83
|
+
|
|
84
|
+
if (running) {
|
|
85
|
+
clearInterval(checkInterval);
|
|
86
|
+
console.log(`✓ Server started at ${host}:${port}`);
|
|
87
|
+
resolve();
|
|
88
|
+
} else if (Date.now() - startTime > SERVER_STARTUP_TIMEOUT) {
|
|
89
|
+
clearInterval(checkInterval);
|
|
90
|
+
serverProcess.kill();
|
|
91
|
+
reject(new Error('Server startup timeout'));
|
|
92
|
+
}
|
|
93
|
+
}, 500);
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Main entry point
|
|
99
|
+
*/
|
|
100
|
+
async function main() {
|
|
101
|
+
try {
|
|
102
|
+
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
103
|
+
console.log(' Loxia Autopilot One - Terminal UI');
|
|
104
|
+
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━');
|
|
105
|
+
console.log('');
|
|
106
|
+
|
|
107
|
+
// Parse command line arguments
|
|
108
|
+
const args = process.argv.slice(2);
|
|
109
|
+
let host = DEFAULT_HOST;
|
|
110
|
+
let port = DEFAULT_PORT;
|
|
111
|
+
|
|
112
|
+
for (let i = 0; i < args.length; i++) {
|
|
113
|
+
if (args[i] === '--host' && args[i + 1]) {
|
|
114
|
+
host = args[i + 1];
|
|
115
|
+
i++;
|
|
116
|
+
} else if (args[i] === '--port' && args[i + 1]) {
|
|
117
|
+
port = parseInt(args[i + 1], 10);
|
|
118
|
+
i++;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Check if server is running
|
|
123
|
+
console.log(`🔍 Checking if server is running at ${host}:${port}...`);
|
|
124
|
+
const serverRunning = await isServerRunning(host, port);
|
|
125
|
+
|
|
126
|
+
if (!serverRunning) {
|
|
127
|
+
console.log('✗ Server is not running');
|
|
128
|
+
await startServer(host, port);
|
|
129
|
+
} else {
|
|
130
|
+
console.log(`✓ Server is already running at ${host}:${port}`);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
console.log('');
|
|
134
|
+
console.log('🎨 Launching Ink-based Terminal UI...');
|
|
135
|
+
console.log('');
|
|
136
|
+
|
|
137
|
+
// Small delay
|
|
138
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
139
|
+
|
|
140
|
+
// Set environment variables for Ink app
|
|
141
|
+
process.env.LOXIA_HOST = host;
|
|
142
|
+
process.env.LOXIA_PORT = port.toString();
|
|
143
|
+
|
|
144
|
+
// Launch Terminal UI
|
|
145
|
+
await import('../src/interfaces/terminal/index.js');
|
|
146
|
+
|
|
147
|
+
} catch (error) {
|
|
148
|
+
console.error('');
|
|
149
|
+
console.error('❌ Failed to start Terminal UI:');
|
|
150
|
+
console.error(' ', error.message);
|
|
151
|
+
console.error('');
|
|
152
|
+
console.error('💡 Troubleshooting:');
|
|
153
|
+
console.error(' 1. Make sure no other process is using port 8080');
|
|
154
|
+
console.error(' 2. Try running the server manually: node bin/cli.js');
|
|
155
|
+
console.error(' 3. Check logs for more details');
|
|
156
|
+
console.error('');
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Run
|
|
162
|
+
main();
|