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,603 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main Layout Component
|
|
3
|
+
* Integrates all state management hooks and renders the complete UI
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import React, { useState, useEffect } from 'react';
|
|
7
|
+
import { Box, useInput, useStdout } from 'ink';
|
|
8
|
+
import { debugLog } from '../utils/debugLogger.js';
|
|
9
|
+
|
|
10
|
+
// Import state management hooks
|
|
11
|
+
import { SessionManager } from '../api/session.js';
|
|
12
|
+
import { WebSocketManager } from '../api/websocket.js';
|
|
13
|
+
import { MessageRouter } from '../api/messageRouter.js';
|
|
14
|
+
import { useConnection } from '../state/useConnection.js';
|
|
15
|
+
import { useAgents } from '../state/useAgents.js';
|
|
16
|
+
import { useMessages } from '../state/useMessages.js';
|
|
17
|
+
import { useAgentControl } from '../state/useAgentControl.js';
|
|
18
|
+
import { useTools } from '../state/useTools.js';
|
|
19
|
+
|
|
20
|
+
// Import settings storage utility
|
|
21
|
+
import { loadSettings, saveSettings, hasLoxiaApiKey } from '../utils/settingsStorage.js';
|
|
22
|
+
|
|
23
|
+
// Import child components
|
|
24
|
+
import Header from './Header.js';
|
|
25
|
+
import StatusBar from './StatusBar.js';
|
|
26
|
+
import MessageList from './MessageList.js';
|
|
27
|
+
import InputBox from './InputBox.js';
|
|
28
|
+
|
|
29
|
+
// Import Phase 10 advanced components
|
|
30
|
+
import AgentSwitcher from './AgentSwitcher.js';
|
|
31
|
+
import AgentCreator from './AgentCreator.js';
|
|
32
|
+
import AgentEditor from './AgentEditor.js';
|
|
33
|
+
import SettingsPanel from './SettingsPanel.js';
|
|
34
|
+
import SearchPanel from './SearchPanel.js';
|
|
35
|
+
import HelpPanel from './HelpPanel.js';
|
|
36
|
+
import ErrorPanel from './ErrorPanel.js';
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Main Layout Component
|
|
40
|
+
*/
|
|
41
|
+
export function Layout({ host = 'localhost', port = 8080 }) {
|
|
42
|
+
// Get terminal dimensions for responsive layout
|
|
43
|
+
const { stdout } = useStdout();
|
|
44
|
+
const terminalHeight = stdout?.rows || 24; // Default to 24 rows if not available
|
|
45
|
+
const terminalWidth = stdout?.columns || 80; // Default to 80 columns if not available
|
|
46
|
+
|
|
47
|
+
// Calculate compact mode: hide header/statusbar if terminal is too small
|
|
48
|
+
// Minimum comfortable height: 15 rows (3 for input, 12+ for messages)
|
|
49
|
+
const compactMode = terminalHeight < 15;
|
|
50
|
+
|
|
51
|
+
// Phase 10: Settings state - Load from persistent storage (must load before creating managers)
|
|
52
|
+
const [settings, setSettings] = useState(() => loadSettings());
|
|
53
|
+
|
|
54
|
+
// Initialize managers (with settings)
|
|
55
|
+
const [sessionManager] = useState(() => new SessionManager(host, port));
|
|
56
|
+
const [wsManager] = useState(() => new WebSocketManager(host, port, {
|
|
57
|
+
reconnectDelay: settings.reconnectDelay,
|
|
58
|
+
heartbeatInterval: settings.heartbeatInterval,
|
|
59
|
+
}));
|
|
60
|
+
const [messageRouter] = useState(() => new MessageRouter(wsManager));
|
|
61
|
+
|
|
62
|
+
// Current agent state
|
|
63
|
+
const [currentAgent, setCurrentAgent] = useState(null);
|
|
64
|
+
|
|
65
|
+
// Phase 10: Overlay state
|
|
66
|
+
const [activeOverlay, setActiveOverlay] = useState(null); // 'switcher', 'creator', 'editor', 'settings', 'search', 'help', 'errors'
|
|
67
|
+
|
|
68
|
+
// Agent being edited
|
|
69
|
+
const [agentToEdit, setAgentToEdit] = useState(null);
|
|
70
|
+
|
|
71
|
+
// Error tracking state
|
|
72
|
+
const [errors, setErrors] = useState([]);
|
|
73
|
+
|
|
74
|
+
// Add error to the error log
|
|
75
|
+
const addError = (type, message, stack) => {
|
|
76
|
+
const error = {
|
|
77
|
+
timestamp: Date.now(),
|
|
78
|
+
type: type || 'ERROR',
|
|
79
|
+
message: message || 'Unknown error',
|
|
80
|
+
stack: stack || '',
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
setErrors(prev => {
|
|
84
|
+
// Keep max 50 errors
|
|
85
|
+
const newErrors = [error, ...prev].slice(0, 50);
|
|
86
|
+
return newErrors;
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
// Clear all errors
|
|
91
|
+
const clearErrors = () => {
|
|
92
|
+
setErrors([]);
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
// Dismiss a single error
|
|
96
|
+
const dismissError = (index) => {
|
|
97
|
+
setErrors(prev => prev.filter((_, i) => i !== index));
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
// Set up global error listeners
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
const handleError = (error) => {
|
|
103
|
+
addError('UNCAUGHT EXCEPTION', error.message, error.stack);
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const handleRejection = (reason) => {
|
|
107
|
+
const message = reason?.message || String(reason);
|
|
108
|
+
const stack = reason?.stack || '';
|
|
109
|
+
addError('UNHANDLED REJECTION', message, stack);
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// Capture console.error calls (suppress output to prevent UI corruption)
|
|
113
|
+
const originalConsoleError = console.error;
|
|
114
|
+
console.error = (...args) => {
|
|
115
|
+
const message = args.map(arg => typeof arg === 'object' ? JSON.stringify(arg) : String(arg)).join(' ');
|
|
116
|
+
addError('CONSOLE ERROR', message);
|
|
117
|
+
// DON'T call original console.error to prevent errors appearing above UI
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
process.on('uncaughtException', handleError);
|
|
121
|
+
process.on('unhandledRejection', handleRejection);
|
|
122
|
+
|
|
123
|
+
return () => {
|
|
124
|
+
process.removeListener('uncaughtException', handleError);
|
|
125
|
+
process.removeListener('unhandledRejection', handleRejection);
|
|
126
|
+
console.error = originalConsoleError;
|
|
127
|
+
};
|
|
128
|
+
}, []);
|
|
129
|
+
|
|
130
|
+
// Connection state
|
|
131
|
+
const connection = useConnection(sessionManager, wsManager);
|
|
132
|
+
|
|
133
|
+
// Agent management
|
|
134
|
+
const agents = useAgents(sessionManager, messageRouter);
|
|
135
|
+
|
|
136
|
+
// Messages management
|
|
137
|
+
const messages = useMessages(sessionManager, messageRouter, currentAgent?.agentId);
|
|
138
|
+
|
|
139
|
+
// Agent control (mode, model)
|
|
140
|
+
const agentControl = useAgentControl(sessionManager, messageRouter, currentAgent);
|
|
141
|
+
|
|
142
|
+
// Tools management
|
|
143
|
+
const tools = useTools(sessionManager, messageRouter, currentAgent?.agentId);
|
|
144
|
+
|
|
145
|
+
// Initialize connection on mount
|
|
146
|
+
useEffect(() => {
|
|
147
|
+
connection.connect();
|
|
148
|
+
|
|
149
|
+
return () => {
|
|
150
|
+
connection.disconnect();
|
|
151
|
+
};
|
|
152
|
+
}, []);
|
|
153
|
+
|
|
154
|
+
// Load agents when connected
|
|
155
|
+
useEffect(() => {
|
|
156
|
+
if (connection.isConnected && agents.agents.length === 0) {
|
|
157
|
+
agents.fetchAgents();
|
|
158
|
+
}
|
|
159
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
160
|
+
}, [connection.isConnected, agents.agents.length]);
|
|
161
|
+
|
|
162
|
+
// Set current agent when agents are loaded
|
|
163
|
+
useEffect(() => {
|
|
164
|
+
if (agents.agents.length > 0 && !currentAgent) {
|
|
165
|
+
setCurrentAgent(agents.agents[0]);
|
|
166
|
+
}
|
|
167
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
168
|
+
}, [agents.agents.length, currentAgent]);
|
|
169
|
+
|
|
170
|
+
// Onboarding: Auto-show settings if no Loxia API key is configured
|
|
171
|
+
useEffect(() => {
|
|
172
|
+
if (!hasLoxiaApiKey()) {
|
|
173
|
+
// Delay slightly to allow UI to initialize
|
|
174
|
+
const timer = setTimeout(() => {
|
|
175
|
+
setActiveOverlay('settings');
|
|
176
|
+
}, 500);
|
|
177
|
+
return () => clearTimeout(timer);
|
|
178
|
+
}
|
|
179
|
+
}, []);
|
|
180
|
+
|
|
181
|
+
// Register API keys with SessionManager on connection
|
|
182
|
+
useEffect(() => {
|
|
183
|
+
const registerApiKeys = async () => {
|
|
184
|
+
if (connection.isConnected && settings.apiKeys) {
|
|
185
|
+
try {
|
|
186
|
+
await sessionManager.setApiKeys(
|
|
187
|
+
settings.apiKeys.loxia,
|
|
188
|
+
{
|
|
189
|
+
anthropic: settings.apiKeys.anthropic,
|
|
190
|
+
openai: settings.apiKeys.openai,
|
|
191
|
+
deepseek: settings.apiKeys.deepseek,
|
|
192
|
+
}
|
|
193
|
+
);
|
|
194
|
+
} catch (error) {
|
|
195
|
+
// Silently fail - user will see errors when making requests
|
|
196
|
+
addError('API KEY ERROR', `Failed to register API keys on startup: ${error.message}`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
registerApiKeys();
|
|
202
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
203
|
+
}, [connection.isConnected]);
|
|
204
|
+
|
|
205
|
+
// Keyboard shortcuts - only enable if raw mode is supported
|
|
206
|
+
const isRawModeSupported = process.stdin.isTTY && typeof process.stdin.setRawMode === 'function';
|
|
207
|
+
|
|
208
|
+
useInput((char, key) => {
|
|
209
|
+
// Skip if raw mode is not supported
|
|
210
|
+
if (!isRawModeSupported) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Don't handle shortcuts if an overlay is active (overlays handle their own input)
|
|
215
|
+
if (activeOverlay) {
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// Phase 10: Advanced feature shortcuts
|
|
220
|
+
// Ctrl+S - Agent Switcher
|
|
221
|
+
if (key.ctrl && char === 's') {
|
|
222
|
+
setActiveOverlay('switcher');
|
|
223
|
+
}
|
|
224
|
+
// Ctrl+N - New Agent Creator
|
|
225
|
+
else if (key.ctrl && char === 'n') {
|
|
226
|
+
setActiveOverlay('creator');
|
|
227
|
+
}
|
|
228
|
+
// Alt+S - Settings Panel (changed from Ctrl+, to avoid Windows settings conflict)
|
|
229
|
+
else if (key.meta && char === 's') {
|
|
230
|
+
setActiveOverlay('settings');
|
|
231
|
+
}
|
|
232
|
+
// Ctrl+F - Search Panel
|
|
233
|
+
else if (key.ctrl && char === 'f') {
|
|
234
|
+
setActiveOverlay('search');
|
|
235
|
+
}
|
|
236
|
+
// Ctrl+E - Error Panel
|
|
237
|
+
else if (key.ctrl && char === 'e') {
|
|
238
|
+
setActiveOverlay('errors');
|
|
239
|
+
}
|
|
240
|
+
// Alt+H - Help Panel (Ctrl+H conflicts with backspace, F1 doesn't work in remote terminals)
|
|
241
|
+
else if (key.meta && char === 'h') {
|
|
242
|
+
setActiveOverlay('help');
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Phase 9: Existing shortcuts
|
|
246
|
+
// Ctrl+R - Refresh/Reconnect
|
|
247
|
+
else if (key.ctrl && char === 'r') {
|
|
248
|
+
if (connection.isConnected) {
|
|
249
|
+
connection.reconnect();
|
|
250
|
+
} else {
|
|
251
|
+
connection.connect();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Ctrl+L - Clear messages
|
|
255
|
+
else if (key.ctrl && char === 'l') {
|
|
256
|
+
messages.clearMessages();
|
|
257
|
+
}
|
|
258
|
+
// Ctrl+A - Reload agents
|
|
259
|
+
else if (key.ctrl && char === 'a') {
|
|
260
|
+
agents.fetchAgents();
|
|
261
|
+
}
|
|
262
|
+
// Ctrl+T - Reload tools
|
|
263
|
+
else if (key.ctrl && char === 't') {
|
|
264
|
+
if (currentAgent) {
|
|
265
|
+
tools.fetchTools();
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}, { isActive: isRawModeSupported });
|
|
269
|
+
|
|
270
|
+
// Send message handler
|
|
271
|
+
const handleSendMessage = async (content) => {
|
|
272
|
+
// DEBUG: Log received content
|
|
273
|
+
debugLog('Layout handleSendMessage', ' Called with content:', JSON.stringify(content));
|
|
274
|
+
debugLog('Layout handleSendMessage', ' content type:', typeof content);
|
|
275
|
+
debugLog('Layout handleSendMessage', ' content value:', content);
|
|
276
|
+
|
|
277
|
+
// Defensive validation: ensure content is a non-empty string
|
|
278
|
+
if (typeof content !== 'string' || !content || content.trim().length === 0) {
|
|
279
|
+
debugLog('Layout handleSendMessage', ' VALIDATION FAILED - content is invalid');
|
|
280
|
+
debugLog('Layout handleSendMessage', ' typeof content:', typeof content);
|
|
281
|
+
debugLog('Layout handleSendMessage', ' !content:', !content);
|
|
282
|
+
debugLog('Layout handleSendMessage', ' trim length:', typeof content === 'string' ? content.trim().length : 'N/A');
|
|
283
|
+
addError('MESSAGE ERROR', 'Cannot send message: content is empty or invalid');
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
debugLog('Layout handleSendMessage', ' Validation PASSED, currentAgent:', currentAgent?.name);
|
|
288
|
+
|
|
289
|
+
if (!currentAgent) {
|
|
290
|
+
debugLog('Layout handleSendMessage', ' BLOCKED: No current agent');
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
try {
|
|
295
|
+
debugLog('Layout handleSendMessage', ' Calling messages.sendMessage with:', JSON.stringify(content));
|
|
296
|
+
await messages.sendMessage(content);
|
|
297
|
+
debugLog('Layout handleSendMessage', ' messages.sendMessage completed successfully');
|
|
298
|
+
} catch (error) {
|
|
299
|
+
// Add to error panel instead of console
|
|
300
|
+
debugLog('Layout handleSendMessage', ' ERROR:', error.message);
|
|
301
|
+
addError('MESSAGE ERROR', `Failed to send message: ${error.message}`, error.stack);
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
|
|
305
|
+
// Handle errors from MessageList
|
|
306
|
+
const handleMessageError = (errorMessage) => {
|
|
307
|
+
addError('MESSAGE ERROR', errorMessage);
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
// Agent switching handler
|
|
311
|
+
const handleSwitchAgent = async (agent) => {
|
|
312
|
+
if (!agent) return;
|
|
313
|
+
|
|
314
|
+
setActiveOverlay(null);
|
|
315
|
+
|
|
316
|
+
// Check if agent is loaded - if not, use switchAgent to load it first
|
|
317
|
+
if (!agent.isLoaded) {
|
|
318
|
+
try {
|
|
319
|
+
const result = await agents.switchAgent(agent.agentId);
|
|
320
|
+
if (result.success) {
|
|
321
|
+
// Get the updated agent after import
|
|
322
|
+
const updatedAgent = agents.agents.find(a => a.agentId === agent.agentId) || agent;
|
|
323
|
+
setCurrentAgent({ ...updatedAgent, isLoaded: true });
|
|
324
|
+
} else {
|
|
325
|
+
addError('AGENT ERROR', `Failed to load agent: ${result.error || 'Unknown error'}`);
|
|
326
|
+
}
|
|
327
|
+
} catch (err) {
|
|
328
|
+
addError('AGENT ERROR', `Failed to load agent: ${err.message}`);
|
|
329
|
+
}
|
|
330
|
+
} else {
|
|
331
|
+
setCurrentAgent(agent);
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
// Agent editing handler
|
|
336
|
+
const handleEditAgent = (agent) => {
|
|
337
|
+
if (agent) {
|
|
338
|
+
setAgentToEdit(agent);
|
|
339
|
+
setActiveOverlay('editor');
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
|
|
343
|
+
// Agent save handler (from editor)
|
|
344
|
+
const handleSaveAgent = async (agentId, updates) => {
|
|
345
|
+
try {
|
|
346
|
+
// Call useAgents hook's updateAgentConfig method
|
|
347
|
+
await agents.updateAgentConfig(agentId, updates);
|
|
348
|
+
|
|
349
|
+
// Update currentAgent if it was the one being edited
|
|
350
|
+
if (currentAgent?.agentId === agentId) {
|
|
351
|
+
setCurrentAgent({ ...currentAgent, ...updates });
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// Refresh agent list to ensure consistency
|
|
355
|
+
await agents.fetchAgents();
|
|
356
|
+
|
|
357
|
+
// Close editor overlay
|
|
358
|
+
setActiveOverlay(null);
|
|
359
|
+
setAgentToEdit(null);
|
|
360
|
+
} catch (error) {
|
|
361
|
+
// Re-throw to let AgentEditor handle the error display
|
|
362
|
+
throw error;
|
|
363
|
+
}
|
|
364
|
+
};
|
|
365
|
+
|
|
366
|
+
// Agent deletion handler
|
|
367
|
+
const handleDeleteAgent = async (agent) => {
|
|
368
|
+
try {
|
|
369
|
+
// Call useAgents hook's deleteAgent method
|
|
370
|
+
await agents.deleteAgent(agent.agentId);
|
|
371
|
+
|
|
372
|
+
// If the deleted agent was current, update currentAgent to the new current one from agents hook
|
|
373
|
+
if (currentAgent?.agentId === agent.agentId) {
|
|
374
|
+
// useAgents already switched to another agent, just update local state
|
|
375
|
+
const remainingAgents = agents.agents.filter(a => a.agentId !== agent.agentId);
|
|
376
|
+
if (remainingAgents.length > 0) {
|
|
377
|
+
setCurrentAgent(remainingAgents[0]);
|
|
378
|
+
} else {
|
|
379
|
+
setCurrentAgent(null);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// Refresh agent list to ensure consistency
|
|
384
|
+
await agents.fetchAgents();
|
|
385
|
+
} catch (error) {
|
|
386
|
+
addError('AGENT DELETION ERROR', `Failed to delete agent: ${error.message}`, error.stack);
|
|
387
|
+
}
|
|
388
|
+
};
|
|
389
|
+
|
|
390
|
+
// Phase 10: Overlay handlers
|
|
391
|
+
const handleCreateAgent = async (formData) => {
|
|
392
|
+
console.log('[DEBUG handleCreateAgent] Called with formData:', formData);
|
|
393
|
+
try {
|
|
394
|
+
console.log('[DEBUG handleCreateAgent] Calling agents.createAgent...');
|
|
395
|
+
// Create agent using useAgents hook
|
|
396
|
+
const result = await agents.createAgent({
|
|
397
|
+
name: formData.name,
|
|
398
|
+
model: formData.model,
|
|
399
|
+
mode: formData.mode || 'AGENT',
|
|
400
|
+
systemPrompt: formData.systemPrompt || '',
|
|
401
|
+
dynamicModelRouting: formData.dynamicModelRouting !== undefined ? formData.dynamicModelRouting : true, // User choice or default to enabled
|
|
402
|
+
platformProvided: true, // Use platform routing (not direct API access)
|
|
403
|
+
capabilities: formData.capabilities || [], // User-selected capabilities
|
|
404
|
+
switchTo: true, // Automatically switch to newly created agent
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
console.log('[DEBUG handleCreateAgent] Result:', result);
|
|
408
|
+
console.log('[DEBUG handleCreateAgent] result.success:', result.success, 'result.agent:', result.agent);
|
|
409
|
+
|
|
410
|
+
if (result.success && result.agent) {
|
|
411
|
+
// Agent was created and added to the list automatically by useAgents hook
|
|
412
|
+
// The hook also set it as current agent (switchTo: true)
|
|
413
|
+
console.log('[DEBUG handleCreateAgent] SUCCESS! Setting current agent and closing overlay');
|
|
414
|
+
setCurrentAgent(result.agent);
|
|
415
|
+
setActiveOverlay(null);
|
|
416
|
+
console.log('[DEBUG handleCreateAgent] setActiveOverlay(null) called');
|
|
417
|
+
} else {
|
|
418
|
+
console.log('[DEBUG handleCreateAgent] FAILED! result.success or result.agent is falsy');
|
|
419
|
+
addError('AGENT CREATION ERROR', 'Failed to create agent: Unknown error');
|
|
420
|
+
// Close overlay anyway so user isn't stuck - they can see error in error panel (Ctrl+E)
|
|
421
|
+
setActiveOverlay(null);
|
|
422
|
+
}
|
|
423
|
+
} catch (error) {
|
|
424
|
+
console.log('[DEBUG handleCreateAgent] EXCEPTION:', error.message, error.stack);
|
|
425
|
+
addError('AGENT CREATION ERROR', `Failed to create agent: ${error.message}`, error.stack);
|
|
426
|
+
// Close overlay anyway so user isn't stuck - they can see error in error panel (Ctrl+E)
|
|
427
|
+
setActiveOverlay(null);
|
|
428
|
+
}
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
const handleSaveSettings = async (newSettings) => {
|
|
432
|
+
try {
|
|
433
|
+
// Persist settings to disk
|
|
434
|
+
const success = saveSettings(newSettings);
|
|
435
|
+
if (!success) {
|
|
436
|
+
addError('SETTINGS ERROR', 'Failed to save settings to disk');
|
|
437
|
+
return;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// Update local state
|
|
441
|
+
setSettings(newSettings);
|
|
442
|
+
|
|
443
|
+
// Register API keys with SessionManager if provided
|
|
444
|
+
if (newSettings.apiKeys) {
|
|
445
|
+
try {
|
|
446
|
+
await sessionManager.setApiKeys(
|
|
447
|
+
newSettings.apiKeys.loxia,
|
|
448
|
+
{
|
|
449
|
+
anthropic: newSettings.apiKeys.anthropic,
|
|
450
|
+
openai: newSettings.apiKeys.openai,
|
|
451
|
+
deepseek: newSettings.apiKeys.deepseek,
|
|
452
|
+
}
|
|
453
|
+
);
|
|
454
|
+
} catch (error) {
|
|
455
|
+
// API key registration failed, but settings were saved
|
|
456
|
+
addError('API KEY ERROR', `Settings saved but failed to register API keys: ${error.message}`);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
// Close settings overlay
|
|
461
|
+
setActiveOverlay(null);
|
|
462
|
+
} catch (error) {
|
|
463
|
+
addError('SETTINGS ERROR', `Failed to save settings: ${error.message}`, error.stack);
|
|
464
|
+
}
|
|
465
|
+
};
|
|
466
|
+
|
|
467
|
+
const handleSelectMessage = (message) => {
|
|
468
|
+
// Scroll to or highlight the selected message
|
|
469
|
+
console.log('Selected message:', message.id);
|
|
470
|
+
setActiveOverlay(null);
|
|
471
|
+
};
|
|
472
|
+
|
|
473
|
+
const handleCloseOverlay = () => {
|
|
474
|
+
setActiveOverlay(null);
|
|
475
|
+
setAgentToEdit(null); // Clear agent to edit when closing
|
|
476
|
+
};
|
|
477
|
+
|
|
478
|
+
// Conditional rendering: if overlay is active, render ONLY the overlay
|
|
479
|
+
// This is the Ink-native way to handle modals (no absolute positioning support)
|
|
480
|
+
if (activeOverlay === 'switcher') {
|
|
481
|
+
return React.createElement(AgentSwitcher, {
|
|
482
|
+
agents: agents.agents,
|
|
483
|
+
currentAgentId: currentAgent?.agentId,
|
|
484
|
+
onSelect: handleSwitchAgent,
|
|
485
|
+
onClose: handleCloseOverlay,
|
|
486
|
+
onDelete: handleDeleteAgent, // Pass delete handler
|
|
487
|
+
onEdit: handleEditAgent, // Pass edit handler
|
|
488
|
+
terminalHeight, // Pass terminal dimensions for fullscreen rendering
|
|
489
|
+
terminalWidth,
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
if (activeOverlay === 'editor') {
|
|
494
|
+
return React.createElement(AgentEditor, {
|
|
495
|
+
agent: agentToEdit,
|
|
496
|
+
onSave: handleSaveAgent,
|
|
497
|
+
onClose: handleCloseOverlay,
|
|
498
|
+
availableModels: ['anthropic-sonnet', 'anthropic-haiku', 'gpt-4', 'gpt-4-mini', 'gpt-5.1-codex-mini', 'deepseek-r1', 'phi-4', 'phi-4-reasoning'],
|
|
499
|
+
terminalHeight, // Pass terminal dimensions for fullscreen rendering
|
|
500
|
+
terminalWidth,
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
if (activeOverlay === 'creator') {
|
|
505
|
+
return React.createElement(AgentCreator, {
|
|
506
|
+
sessionManager,
|
|
507
|
+
onCancel: handleCloseOverlay,
|
|
508
|
+
onCreate: handleCreateAgent,
|
|
509
|
+
terminalHeight, // Pass terminal dimensions for fullscreen rendering
|
|
510
|
+
terminalWidth,
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
if (activeOverlay === 'settings') {
|
|
515
|
+
return React.createElement(SettingsPanel, {
|
|
516
|
+
settings,
|
|
517
|
+
onSave: handleSaveSettings,
|
|
518
|
+
onCancel: handleCloseOverlay,
|
|
519
|
+
terminalHeight, // Pass terminal dimensions for fullscreen rendering
|
|
520
|
+
terminalWidth,
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
if (activeOverlay === 'search') {
|
|
525
|
+
return React.createElement(SearchPanel, {
|
|
526
|
+
messages: messages.messages,
|
|
527
|
+
onSelect: handleSelectMessage,
|
|
528
|
+
onClose: handleCloseOverlay,
|
|
529
|
+
terminalHeight, // Pass terminal dimensions for fullscreen rendering
|
|
530
|
+
terminalWidth,
|
|
531
|
+
});
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
if (activeOverlay === 'help') {
|
|
535
|
+
return React.createElement(HelpPanel, {
|
|
536
|
+
onClose: handleCloseOverlay,
|
|
537
|
+
terminalHeight, // Pass terminal dimensions for fullscreen rendering
|
|
538
|
+
terminalWidth,
|
|
539
|
+
});
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
if (activeOverlay === 'errors') {
|
|
543
|
+
return React.createElement(ErrorPanel, {
|
|
544
|
+
errors,
|
|
545
|
+
onClose: handleCloseOverlay,
|
|
546
|
+
onClear: clearErrors,
|
|
547
|
+
onDismiss: dismissError,
|
|
548
|
+
terminalHeight, // Pass terminal dimensions for fullscreen rendering
|
|
549
|
+
terminalWidth,
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
// Default: render normal UI layout (responsive based on terminal height)
|
|
554
|
+
return React.createElement(
|
|
555
|
+
Box,
|
|
556
|
+
{ flexDirection: 'column', minHeight: terminalHeight, maxHeight: terminalHeight },
|
|
557
|
+
// Header (hidden in compact mode)
|
|
558
|
+
!compactMode && React.createElement(Header, {
|
|
559
|
+
currentAgent,
|
|
560
|
+
connectionStatus: connection.connectionStatus,
|
|
561
|
+
isConnected: connection.isConnected,
|
|
562
|
+
}),
|
|
563
|
+
|
|
564
|
+
// Main content area (message list) - fills remaining space
|
|
565
|
+
React.createElement(MessageList, {
|
|
566
|
+
messages: messages.messages,
|
|
567
|
+
loading: messages.loading,
|
|
568
|
+
error: messages.error,
|
|
569
|
+
onError: handleMessageError,
|
|
570
|
+
compactMode, // Pass compact mode flag
|
|
571
|
+
currentAgent, // Pass current agent for compact mode display
|
|
572
|
+
isConnected: connection.isConnected, // Pass connection status for compact mode
|
|
573
|
+
terminalHeight, // Pass terminal height for scroll calculation
|
|
574
|
+
terminalWidth, // Pass terminal width for responsive rendering
|
|
575
|
+
showTimestamps: settings.showTimestamps, // Pass showTimestamps setting
|
|
576
|
+
colorScheme: settings.colorScheme, // Pass colorScheme setting
|
|
577
|
+
}),
|
|
578
|
+
|
|
579
|
+
// Input box
|
|
580
|
+
React.createElement(InputBox, {
|
|
581
|
+
onSubmit: handleSendMessage,
|
|
582
|
+
disabled: !connection.isConnected || !currentAgent,
|
|
583
|
+
placeholder: currentAgent
|
|
584
|
+
? `Message ${currentAgent.name}...`
|
|
585
|
+
: 'No agent selected',
|
|
586
|
+
}),
|
|
587
|
+
|
|
588
|
+
// Status bar (hidden in compact mode)
|
|
589
|
+
!compactMode && React.createElement(StatusBar, {
|
|
590
|
+
connectionStatus: connection.connectionStatus,
|
|
591
|
+
connectionUptime: connection.connectionUptime,
|
|
592
|
+
currentAgent,
|
|
593
|
+
currentMode: agentControl.currentMode,
|
|
594
|
+
messageCount: messages.messages.length,
|
|
595
|
+
activeAgentCount: agents.agents.filter(a => a.isLoaded).length,
|
|
596
|
+
totalAgentCount: agents.agents.length,
|
|
597
|
+
toolCount: tools.tools.length,
|
|
598
|
+
errorCount: errors.length,
|
|
599
|
+
})
|
|
600
|
+
);
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
export default Layout;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LoadingSpinner Component
|
|
3
|
+
* Displays an animated spinner for loading states
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import React, { useState, useEffect } from 'react';
|
|
7
|
+
import { Box, Text } from 'ink';
|
|
8
|
+
|
|
9
|
+
const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
10
|
+
const DOTS_FRAMES = ['. ', '.. ', '...', ' '];
|
|
11
|
+
const BAR_FRAMES = ['▁', '▂', '▃', '▄', '▅', '▆', '▇', '█', '▇', '▆', '▅', '▄', '▃', '▂'];
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* LoadingSpinner Component
|
|
15
|
+
* @param {Object} props
|
|
16
|
+
* @param {string} props.label - Label text to display
|
|
17
|
+
* @param {string} props.type - Spinner type: 'spinner', 'dots', 'bar'
|
|
18
|
+
* @param {string} props.color - Text color
|
|
19
|
+
* @param {number} props.interval - Animation interval in ms
|
|
20
|
+
*/
|
|
21
|
+
export function LoadingSpinner({
|
|
22
|
+
label = 'Loading',
|
|
23
|
+
type = 'spinner',
|
|
24
|
+
color = 'cyan',
|
|
25
|
+
interval = 80,
|
|
26
|
+
}) {
|
|
27
|
+
const [frame, setFrame] = useState(0);
|
|
28
|
+
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
const timer = setInterval(() => {
|
|
31
|
+
setFrame((prev) => {
|
|
32
|
+
const frames = type === 'spinner' ? SPINNER_FRAMES : type === 'bar' ? BAR_FRAMES : DOTS_FRAMES;
|
|
33
|
+
return (prev + 1) % frames.length;
|
|
34
|
+
});
|
|
35
|
+
}, interval);
|
|
36
|
+
|
|
37
|
+
return () => clearInterval(timer);
|
|
38
|
+
}, [type, interval]);
|
|
39
|
+
|
|
40
|
+
const frames = type === 'spinner' ? SPINNER_FRAMES : type === 'bar' ? BAR_FRAMES : DOTS_FRAMES;
|
|
41
|
+
const currentFrame = frames[frame];
|
|
42
|
+
|
|
43
|
+
return React.createElement(
|
|
44
|
+
Box,
|
|
45
|
+
{},
|
|
46
|
+
React.createElement(Text, { color }, currentFrame + ' ' + label)
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Inline loading indicator (no box wrapper)
|
|
52
|
+
*/
|
|
53
|
+
export function InlineSpinner({ type = 'spinner', color = 'cyan' }) {
|
|
54
|
+
const [frame, setFrame] = useState(0);
|
|
55
|
+
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
const timer = setInterval(() => {
|
|
58
|
+
setFrame((prev) => {
|
|
59
|
+
const frames = type === 'spinner' ? SPINNER_FRAMES : type === 'bar' ? BAR_FRAMES : DOTS_FRAMES;
|
|
60
|
+
return (prev + 1) % frames.length;
|
|
61
|
+
});
|
|
62
|
+
}, 80);
|
|
63
|
+
|
|
64
|
+
return () => clearInterval(timer);
|
|
65
|
+
}, [type]);
|
|
66
|
+
|
|
67
|
+
const frames = type === 'spinner' ? SPINNER_FRAMES : type === 'bar' ? BAR_FRAMES : DOTS_FRAMES;
|
|
68
|
+
return React.createElement(Text, { color }, frames[frame]);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export default LoadingSpinner;
|