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,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component Management - Smoke Tests
|
|
3
|
+
* Verifies that UI components can be imported and basic structure is correct
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, test, expect } from '@jest/globals';
|
|
7
|
+
|
|
8
|
+
describe('Component Management - Imports', () => {
|
|
9
|
+
test('Layout component can be imported', async () => {
|
|
10
|
+
const { Layout } = await import('../../components/Layout.js');
|
|
11
|
+
|
|
12
|
+
expect(Layout).toBeDefined();
|
|
13
|
+
expect(typeof Layout).toBe('function');
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
test('Layout is default export', async () => {
|
|
17
|
+
const module = await import('../../components/Layout.js');
|
|
18
|
+
|
|
19
|
+
expect(module.default).toBeDefined();
|
|
20
|
+
expect(typeof module.default).toBe('function');
|
|
21
|
+
expect(module.default).toBe(module.Layout);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test('Header component can be imported', async () => {
|
|
25
|
+
const { Header } = await import('../../components/Header.js');
|
|
26
|
+
|
|
27
|
+
expect(Header).toBeDefined();
|
|
28
|
+
expect(typeof Header).toBe('function');
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('Header is default export', async () => {
|
|
32
|
+
const module = await import('../../components/Header.js');
|
|
33
|
+
|
|
34
|
+
expect(module.default).toBeDefined();
|
|
35
|
+
expect(module.default).toBe(module.Header);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test('StatusBar component can be imported', async () => {
|
|
39
|
+
const { StatusBar } = await import('../../components/StatusBar.js');
|
|
40
|
+
|
|
41
|
+
expect(StatusBar).toBeDefined();
|
|
42
|
+
expect(typeof StatusBar).toBe('function');
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('StatusBar is default export', async () => {
|
|
46
|
+
const module = await import('../../components/StatusBar.js');
|
|
47
|
+
|
|
48
|
+
expect(module.default).toBeDefined();
|
|
49
|
+
expect(module.default).toBe(module.StatusBar);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test('MessageList component can be imported', async () => {
|
|
53
|
+
const { MessageList } = await import('../../components/MessageList.js');
|
|
54
|
+
|
|
55
|
+
expect(MessageList).toBeDefined();
|
|
56
|
+
expect(typeof MessageList).toBe('function');
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test('MessageList is default export', async () => {
|
|
60
|
+
const module = await import('../../components/MessageList.js');
|
|
61
|
+
|
|
62
|
+
expect(module.default).toBeDefined();
|
|
63
|
+
expect(module.default).toBe(module.MessageList);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
test('InputBox component can be imported', async () => {
|
|
67
|
+
const { InputBox } = await import('../../components/InputBox.js');
|
|
68
|
+
|
|
69
|
+
expect(InputBox).toBeDefined();
|
|
70
|
+
expect(typeof InputBox).toBe('function');
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
test('InputBox is default export', async () => {
|
|
74
|
+
const module = await import('../../components/InputBox.js');
|
|
75
|
+
|
|
76
|
+
expect(module.default).toBeDefined();
|
|
77
|
+
expect(module.default).toBe(module.InputBox);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
describe('Component Management - Integration', () => {
|
|
82
|
+
test('All components can be imported together', async () => {
|
|
83
|
+
const [
|
|
84
|
+
layoutModule,
|
|
85
|
+
headerModule,
|
|
86
|
+
statusBarModule,
|
|
87
|
+
messageListModule,
|
|
88
|
+
inputBoxModule,
|
|
89
|
+
] = await Promise.all([
|
|
90
|
+
import('../../components/Layout.js'),
|
|
91
|
+
import('../../components/Header.js'),
|
|
92
|
+
import('../../components/StatusBar.js'),
|
|
93
|
+
import('../../components/MessageList.js'),
|
|
94
|
+
import('../../components/InputBox.js'),
|
|
95
|
+
]);
|
|
96
|
+
|
|
97
|
+
expect(layoutModule.Layout).toBeDefined();
|
|
98
|
+
expect(headerModule.Header).toBeDefined();
|
|
99
|
+
expect(statusBarModule.StatusBar).toBeDefined();
|
|
100
|
+
expect(messageListModule.MessageList).toBeDefined();
|
|
101
|
+
expect(inputBoxModule.InputBox).toBeDefined();
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test('Layout component integrates with all state hooks', async () => {
|
|
105
|
+
const { Layout } = await import('../../components/Layout.js');
|
|
106
|
+
const { useConnection } = await import('../../state/useConnection.js');
|
|
107
|
+
const { useAgents } = await import('../../state/useAgents.js');
|
|
108
|
+
const { useMessages } = await import('../../state/useMessages.js');
|
|
109
|
+
const { useAgentControl } = await import('../../state/useAgentControl.js');
|
|
110
|
+
const { useTools } = await import('../../state/useTools.js');
|
|
111
|
+
|
|
112
|
+
// Verify all dependencies exist
|
|
113
|
+
expect(Layout).toBeDefined();
|
|
114
|
+
expect(useConnection).toBeDefined();
|
|
115
|
+
expect(useAgents).toBeDefined();
|
|
116
|
+
expect(useMessages).toBeDefined();
|
|
117
|
+
expect(useAgentControl).toBeDefined();
|
|
118
|
+
expect(useTools).toBeDefined();
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
describe('Component Management - React/Ink Dependencies', () => {
|
|
123
|
+
test('Ink components can be imported', async () => {
|
|
124
|
+
const { Box, Text } = await import('ink');
|
|
125
|
+
|
|
126
|
+
expect(Box).toBeDefined();
|
|
127
|
+
expect(Text).toBeDefined();
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
test('React can be imported', async () => {
|
|
131
|
+
const React = await import('react');
|
|
132
|
+
|
|
133
|
+
expect(React.default).toBeDefined();
|
|
134
|
+
expect(React.useState).toBeDefined();
|
|
135
|
+
expect(React.useEffect).toBeDefined();
|
|
136
|
+
});
|
|
137
|
+
});
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connection Management - Smoke Tests
|
|
3
|
+
* Verifies that connection management modules can be imported and basic functionality works
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, test, expect } from '@jest/globals';
|
|
7
|
+
|
|
8
|
+
describe('Connection Management - Imports', () => {
|
|
9
|
+
test('useConnection hook can be imported', async () => {
|
|
10
|
+
const { useConnection } = await import('../../state/useConnection.js');
|
|
11
|
+
|
|
12
|
+
expect(useConnection).toBeDefined();
|
|
13
|
+
expect(typeof useConnection).toBe('function');
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
test('useConnection is default export', async () => {
|
|
17
|
+
const module = await import('../../state/useConnection.js');
|
|
18
|
+
|
|
19
|
+
expect(module.default).toBeDefined();
|
|
20
|
+
expect(typeof module.default).toBe('function');
|
|
21
|
+
expect(module.default).toBe(module.useConnection);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
describe('Connection Management - Constants', () => {
|
|
26
|
+
test('CONNECTION_STATUS constants are defined', async () => {
|
|
27
|
+
const { CONNECTION_STATUS } = await import('../../config/constants.js');
|
|
28
|
+
|
|
29
|
+
expect(CONNECTION_STATUS).toBeDefined();
|
|
30
|
+
expect(CONNECTION_STATUS.CONNECTING).toBe('connecting');
|
|
31
|
+
expect(CONNECTION_STATUS.CONNECTED).toBe('connected');
|
|
32
|
+
expect(CONNECTION_STATUS.DISCONNECTED).toBe('disconnected');
|
|
33
|
+
expect(CONNECTION_STATUS.RECONNECTING).toBe('reconnecting');
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test('CONNECTION_STATUS is alias for CONNECTION_STATE', async () => {
|
|
37
|
+
const { CONNECTION_STATUS, CONNECTION_STATE } = await import('../../config/constants.js');
|
|
38
|
+
|
|
39
|
+
expect(CONNECTION_STATUS).toBe(CONNECTION_STATE);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test('RECONNECT_CONFIG constants are defined', async () => {
|
|
43
|
+
const { RECONNECT_CONFIG } = await import('../../config/constants.js');
|
|
44
|
+
|
|
45
|
+
expect(RECONNECT_CONFIG).toBeDefined();
|
|
46
|
+
expect(RECONNECT_CONFIG.INITIAL_DELAY).toBeDefined();
|
|
47
|
+
expect(RECONNECT_CONFIG.MAX_DELAY).toBeDefined();
|
|
48
|
+
expect(RECONNECT_CONFIG.BACKOFF_MULTIPLIER).toBeDefined();
|
|
49
|
+
expect(RECONNECT_CONFIG.MAX_ATTEMPTS).toBeDefined();
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
test('RECONNECT_CONFIG values are reasonable', async () => {
|
|
53
|
+
const { RECONNECT_CONFIG } = await import('../../config/constants.js');
|
|
54
|
+
|
|
55
|
+
// Initial delay should be > 0
|
|
56
|
+
expect(RECONNECT_CONFIG.INITIAL_DELAY).toBeGreaterThan(0);
|
|
57
|
+
|
|
58
|
+
// Max delay should be > initial delay
|
|
59
|
+
expect(RECONNECT_CONFIG.MAX_DELAY).toBeGreaterThan(RECONNECT_CONFIG.INITIAL_DELAY);
|
|
60
|
+
|
|
61
|
+
// Backoff multiplier should be > 1 for exponential growth
|
|
62
|
+
expect(RECONNECT_CONFIG.BACKOFF_MULTIPLIER).toBeGreaterThan(1);
|
|
63
|
+
|
|
64
|
+
// Max attempts should be reasonable (not 0 or negative)
|
|
65
|
+
expect(RECONNECT_CONFIG.MAX_ATTEMPTS).toBeGreaterThan(0);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
describe('Connection Management - Integration', () => {
|
|
70
|
+
test('useConnection hook integrates with SessionManager and WebSocketManager', async () => {
|
|
71
|
+
const { useConnection } = await import('../../state/useConnection.js');
|
|
72
|
+
const { SessionManager } = await import('../../api/session.js');
|
|
73
|
+
const { WebSocketManager } = await import('../../api/websocket.js');
|
|
74
|
+
|
|
75
|
+
// Create dependencies
|
|
76
|
+
const sessionManager = new SessionManager('localhost', 8080);
|
|
77
|
+
const wsManager = new WebSocketManager('localhost', 8080);
|
|
78
|
+
|
|
79
|
+
// Verify all components exist
|
|
80
|
+
expect(sessionManager).toBeDefined();
|
|
81
|
+
expect(wsManager).toBeDefined();
|
|
82
|
+
|
|
83
|
+
// useConnection expects these as parameters
|
|
84
|
+
// (we can't actually call the hook outside React, but we verify the interface)
|
|
85
|
+
expect(typeof useConnection).toBe('function');
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
test('Full connection stack can be imported together', async () => {
|
|
89
|
+
const [
|
|
90
|
+
constantsModule,
|
|
91
|
+
sessionModule,
|
|
92
|
+
websocketModule,
|
|
93
|
+
connectionModule,
|
|
94
|
+
] = await Promise.all([
|
|
95
|
+
import('../../config/constants.js'),
|
|
96
|
+
import('../../api/session.js'),
|
|
97
|
+
import('../../api/websocket.js'),
|
|
98
|
+
import('../../state/useConnection.js'),
|
|
99
|
+
]);
|
|
100
|
+
|
|
101
|
+
// Verify all modules loaded
|
|
102
|
+
expect(constantsModule.CONNECTION_STATUS).toBeDefined();
|
|
103
|
+
expect(constantsModule.RECONNECT_CONFIG).toBeDefined();
|
|
104
|
+
expect(sessionModule.SessionManager).toBeDefined();
|
|
105
|
+
expect(websocketModule.WebSocketManager).toBeDefined();
|
|
106
|
+
expect(connectionModule.useConnection).toBeDefined();
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
describe('Connection Management - Hook Interface Verification', () => {
|
|
111
|
+
test('useConnection returns expected interface shape', async () => {
|
|
112
|
+
const { useConnection } = await import('../../state/useConnection.js');
|
|
113
|
+
|
|
114
|
+
// We can verify the function signature
|
|
115
|
+
expect(useConnection.length).toBe(2); // sessionManager, wsManager
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
describe('Connection Management - Status Values', () => {
|
|
120
|
+
test('CONNECTION_STATUS values are lowercase strings', async () => {
|
|
121
|
+
const { CONNECTION_STATUS } = await import('../../config/constants.js');
|
|
122
|
+
|
|
123
|
+
expect(typeof CONNECTION_STATUS.CONNECTING).toBe('string');
|
|
124
|
+
expect(typeof CONNECTION_STATUS.CONNECTED).toBe('string');
|
|
125
|
+
expect(typeof CONNECTION_STATUS.DISCONNECTED).toBe('string');
|
|
126
|
+
expect(typeof CONNECTION_STATUS.RECONNECTING).toBe('string');
|
|
127
|
+
|
|
128
|
+
expect(CONNECTION_STATUS.CONNECTING).toBe(CONNECTION_STATUS.CONNECTING.toLowerCase());
|
|
129
|
+
expect(CONNECTION_STATUS.CONNECTED).toBe(CONNECTION_STATUS.CONNECTED.toLowerCase());
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
test('CONNECTION_STATUS has all required states', async () => {
|
|
133
|
+
const { CONNECTION_STATUS } = await import('../../config/constants.js');
|
|
134
|
+
|
|
135
|
+
const states = Object.keys(CONNECTION_STATUS);
|
|
136
|
+
expect(states).toContain('CONNECTING');
|
|
137
|
+
expect(states).toContain('CONNECTED');
|
|
138
|
+
expect(states).toContain('DISCONNECTED');
|
|
139
|
+
expect(states).toContain('RECONNECTING');
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
describe('Connection Management - Exponential Backoff Logic', () => {
|
|
144
|
+
test('Exponential backoff delay calculation works correctly', async () => {
|
|
145
|
+
const { RECONNECT_CONFIG } = await import('../../config/constants.js');
|
|
146
|
+
|
|
147
|
+
// Simulate exponential backoff calculation
|
|
148
|
+
const getReconnectDelay = (attempt) => {
|
|
149
|
+
return Math.min(
|
|
150
|
+
RECONNECT_CONFIG.INITIAL_DELAY * Math.pow(RECONNECT_CONFIG.BACKOFF_MULTIPLIER, attempt),
|
|
151
|
+
RECONNECT_CONFIG.MAX_DELAY
|
|
152
|
+
);
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
// Test increasing delays
|
|
156
|
+
const delay0 = getReconnectDelay(0);
|
|
157
|
+
const delay1 = getReconnectDelay(1);
|
|
158
|
+
const delay2 = getReconnectDelay(2);
|
|
159
|
+
|
|
160
|
+
expect(delay0).toBe(RECONNECT_CONFIG.INITIAL_DELAY);
|
|
161
|
+
expect(delay1).toBeGreaterThan(delay0);
|
|
162
|
+
expect(delay2).toBeGreaterThan(delay1);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
test('Exponential backoff respects max delay', async () => {
|
|
166
|
+
const { RECONNECT_CONFIG } = await import('../../config/constants.js');
|
|
167
|
+
|
|
168
|
+
// Simulate exponential backoff calculation
|
|
169
|
+
const getReconnectDelay = (attempt) => {
|
|
170
|
+
return Math.min(
|
|
171
|
+
RECONNECT_CONFIG.INITIAL_DELAY * Math.pow(RECONNECT_CONFIG.BACKOFF_MULTIPLIER, attempt),
|
|
172
|
+
RECONNECT_CONFIG.MAX_DELAY
|
|
173
|
+
);
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
// Test with very large attempt number
|
|
177
|
+
const delayLarge = getReconnectDelay(100);
|
|
178
|
+
|
|
179
|
+
// Should be capped at MAX_DELAY
|
|
180
|
+
expect(delayLarge).toBe(RECONNECT_CONFIG.MAX_DELAY);
|
|
181
|
+
expect(delayLarge).toBeLessThanOrEqual(RECONNECT_CONFIG.MAX_DELAY);
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
describe('Connection Management - Session State', () => {
|
|
186
|
+
test('Session state should track validity', async () => {
|
|
187
|
+
// Mock session state
|
|
188
|
+
let sessionId = null;
|
|
189
|
+
let sessionValid = false;
|
|
190
|
+
let sessionExpiration = null;
|
|
191
|
+
|
|
192
|
+
// Simulate session initialization
|
|
193
|
+
sessionId = 'test-session-123';
|
|
194
|
+
sessionValid = true;
|
|
195
|
+
sessionExpiration = Date.now() + 3600000; // 1 hour from now
|
|
196
|
+
|
|
197
|
+
expect(sessionId).toBeDefined();
|
|
198
|
+
expect(sessionValid).toBe(true);
|
|
199
|
+
expect(sessionExpiration).toBeGreaterThan(Date.now());
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
test('Session state should invalidate', async () => {
|
|
203
|
+
// Mock session state
|
|
204
|
+
let sessionId = 'test-session-123';
|
|
205
|
+
let sessionValid = true;
|
|
206
|
+
|
|
207
|
+
// Simulate session invalidation
|
|
208
|
+
sessionId = null;
|
|
209
|
+
sessionValid = false;
|
|
210
|
+
|
|
211
|
+
expect(sessionId).toBeNull();
|
|
212
|
+
expect(sessionValid).toBe(false);
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
describe('Connection Management - Connection Metrics', () => {
|
|
217
|
+
test('Connection uptime can be tracked', async () => {
|
|
218
|
+
// Mock uptime tracking
|
|
219
|
+
const connectionStartTime = Date.now();
|
|
220
|
+
|
|
221
|
+
// Wait a bit
|
|
222
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
223
|
+
|
|
224
|
+
const uptime = Date.now() - connectionStartTime;
|
|
225
|
+
|
|
226
|
+
expect(uptime).toBeGreaterThan(0);
|
|
227
|
+
expect(uptime).toBeGreaterThanOrEqual(100);
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
test('Connection metrics track timestamps', async () => {
|
|
231
|
+
// Mock connection metrics
|
|
232
|
+
const lastConnectedAt = Date.now();
|
|
233
|
+
|
|
234
|
+
// Wait a bit
|
|
235
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
236
|
+
|
|
237
|
+
const lastDisconnectedAt = Date.now();
|
|
238
|
+
|
|
239
|
+
expect(lastConnectedAt).toBeDefined();
|
|
240
|
+
expect(lastDisconnectedAt).toBeDefined();
|
|
241
|
+
expect(lastDisconnectedAt).toBeGreaterThan(lastConnectedAt);
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
test('Reconnection attempts can be tracked', async () => {
|
|
245
|
+
// Mock reconnection attempt tracking
|
|
246
|
+
let reconnectAttempts = 0;
|
|
247
|
+
|
|
248
|
+
// Simulate failed attempts
|
|
249
|
+
reconnectAttempts += 1;
|
|
250
|
+
expect(reconnectAttempts).toBe(1);
|
|
251
|
+
|
|
252
|
+
reconnectAttempts += 1;
|
|
253
|
+
expect(reconnectAttempts).toBe(2);
|
|
254
|
+
|
|
255
|
+
// Reset on successful connection
|
|
256
|
+
reconnectAttempts = 0;
|
|
257
|
+
expect(reconnectAttempts).toBe(0);
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
describe('Connection Management - Connection Status Transitions', () => {
|
|
262
|
+
test('Connection status transitions follow valid flow', async () => {
|
|
263
|
+
const { CONNECTION_STATUS } = await import('../../config/constants.js');
|
|
264
|
+
|
|
265
|
+
// Valid transition: DISCONNECTED -> CONNECTING -> CONNECTED
|
|
266
|
+
let status = CONNECTION_STATUS.DISCONNECTED;
|
|
267
|
+
expect(status).toBe('disconnected');
|
|
268
|
+
|
|
269
|
+
status = CONNECTION_STATUS.CONNECTING;
|
|
270
|
+
expect(status).toBe('connecting');
|
|
271
|
+
|
|
272
|
+
status = CONNECTION_STATUS.CONNECTED;
|
|
273
|
+
expect(status).toBe('connected');
|
|
274
|
+
|
|
275
|
+
// Valid transition: CONNECTED -> DISCONNECTED -> RECONNECTING -> CONNECTED
|
|
276
|
+
status = CONNECTION_STATUS.DISCONNECTED;
|
|
277
|
+
expect(status).toBe('disconnected');
|
|
278
|
+
|
|
279
|
+
status = CONNECTION_STATUS.RECONNECTING;
|
|
280
|
+
expect(status).toBe('reconnecting');
|
|
281
|
+
|
|
282
|
+
status = CONNECTION_STATUS.CONNECTED;
|
|
283
|
+
expect(status).toBe('connected');
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
describe('Connection Management - WebSocket Event Integration', () => {
|
|
288
|
+
test('WebSocketManager has event emitter methods', async () => {
|
|
289
|
+
const { WebSocketManager } = await import('../../api/websocket.js');
|
|
290
|
+
|
|
291
|
+
const wsManager = new WebSocketManager('localhost', 8080);
|
|
292
|
+
|
|
293
|
+
// Verify event emitter methods exist
|
|
294
|
+
expect(wsManager.on).toBeDefined();
|
|
295
|
+
expect(wsManager.off).toBeDefined();
|
|
296
|
+
expect(typeof wsManager.on).toBe('function');
|
|
297
|
+
expect(typeof wsManager.off).toBe('function');
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
describe('Connection Management - Max Attempts Limit', () => {
|
|
302
|
+
test('Reconnection should stop after max attempts', async () => {
|
|
303
|
+
const { RECONNECT_CONFIG } = await import('../../config/constants.js');
|
|
304
|
+
|
|
305
|
+
// Mock reconnection attempt tracking
|
|
306
|
+
let reconnectAttempts = 0;
|
|
307
|
+
|
|
308
|
+
// Simulate reconnection attempts
|
|
309
|
+
for (let i = 0; i < RECONNECT_CONFIG.MAX_ATTEMPTS + 5; i++) {
|
|
310
|
+
if (reconnectAttempts < RECONNECT_CONFIG.MAX_ATTEMPTS) {
|
|
311
|
+
reconnectAttempts += 1;
|
|
312
|
+
} else {
|
|
313
|
+
// Should stop incrementing
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
// Should not exceed max attempts
|
|
319
|
+
expect(reconnectAttempts).toBe(RECONNECT_CONFIG.MAX_ATTEMPTS);
|
|
320
|
+
expect(reconnectAttempts).toBeLessThanOrEqual(RECONNECT_CONFIG.MAX_ATTEMPTS);
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
|
|
324
|
+
describe('Connection Management - Connection Info', () => {
|
|
325
|
+
test('Connection info should contain all metrics', async () => {
|
|
326
|
+
const { CONNECTION_STATUS } = await import('../../config/constants.js');
|
|
327
|
+
|
|
328
|
+
// Mock connection info
|
|
329
|
+
const connectionInfo = {
|
|
330
|
+
status: CONNECTION_STATUS.CONNECTED,
|
|
331
|
+
isConnected: true,
|
|
332
|
+
isReconnecting: false,
|
|
333
|
+
sessionId: 'test-session-123',
|
|
334
|
+
sessionValid: true,
|
|
335
|
+
sessionExpiration: Date.now() + 3600000,
|
|
336
|
+
uptime: 5000,
|
|
337
|
+
lastConnectedAt: Date.now() - 5000,
|
|
338
|
+
lastDisconnectedAt: null,
|
|
339
|
+
reconnectAttempts: 0,
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
// Verify all fields present
|
|
343
|
+
expect(connectionInfo.status).toBeDefined();
|
|
344
|
+
expect(connectionInfo.isConnected).toBe(true);
|
|
345
|
+
expect(connectionInfo.isReconnecting).toBe(false);
|
|
346
|
+
expect(connectionInfo.sessionId).toBeDefined();
|
|
347
|
+
expect(connectionInfo.sessionValid).toBe(true);
|
|
348
|
+
expect(connectionInfo.uptime).toBeGreaterThan(0);
|
|
349
|
+
});
|
|
350
|
+
});
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Phase 9 Enhancements - Smoke Tests
|
|
3
|
+
* Verifies ErrorBoundary, LoadingSpinner, and enhanced InputBox components
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { describe, test, expect } from '@jest/globals';
|
|
7
|
+
|
|
8
|
+
describe('Phase 9 - Enhanced Components - Imports', () => {
|
|
9
|
+
test('ErrorBoundary component can be imported', async () => {
|
|
10
|
+
const { ErrorBoundary } = await import('../../components/ErrorBoundary.js');
|
|
11
|
+
|
|
12
|
+
expect(ErrorBoundary).toBeDefined();
|
|
13
|
+
expect(typeof ErrorBoundary).toBe('function');
|
|
14
|
+
}, 30000); // Increase timeout for import
|
|
15
|
+
|
|
16
|
+
test('ErrorBoundary is a class component', async () => {
|
|
17
|
+
const { ErrorBoundary } = await import('../../components/ErrorBoundary.js');
|
|
18
|
+
|
|
19
|
+
// Verify it's a class with correct methods
|
|
20
|
+
expect(ErrorBoundary.prototype).toBeDefined();
|
|
21
|
+
expect(typeof ErrorBoundary.prototype.render).toBe('function');
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test('LoadingSpinner component can be imported', async () => {
|
|
25
|
+
const { LoadingSpinner } = await import('../../components/LoadingSpinner.js');
|
|
26
|
+
|
|
27
|
+
expect(LoadingSpinner).toBeDefined();
|
|
28
|
+
expect(typeof LoadingSpinner).toBe('function');
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
test('InlineSpinner component can be imported', async () => {
|
|
32
|
+
const { InlineSpinner } = await import('../../components/LoadingSpinner.js');
|
|
33
|
+
|
|
34
|
+
expect(InlineSpinner).toBeDefined();
|
|
35
|
+
expect(typeof InlineSpinner).toBe('function');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test('LoadingSpinner is default export', async () => {
|
|
39
|
+
const module = await import('../../components/LoadingSpinner.js');
|
|
40
|
+
|
|
41
|
+
expect(module.default).toBeDefined();
|
|
42
|
+
expect(module.default).toBe(module.LoadingSpinner);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('Enhanced InputBox maintains backward compatibility', async () => {
|
|
46
|
+
const { InputBox } = await import('../../components/InputBox.js');
|
|
47
|
+
|
|
48
|
+
expect(InputBox).toBeDefined();
|
|
49
|
+
expect(typeof InputBox).toBe('function');
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
describe('Phase 9 - ErrorBoundary - Structure', () => {
|
|
54
|
+
test('ErrorBoundary is a React Component class', async () => {
|
|
55
|
+
const { ErrorBoundary } = await import('../../components/ErrorBoundary.js');
|
|
56
|
+
const React = await import('react');
|
|
57
|
+
|
|
58
|
+
// Check that it extends React.Component
|
|
59
|
+
expect(ErrorBoundary.prototype).toBeDefined();
|
|
60
|
+
expect(typeof ErrorBoundary.prototype.render).toBe('function');
|
|
61
|
+
expect(typeof ErrorBoundary.prototype.componentDidCatch).toBe('function');
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test('ErrorBoundary has getDerivedStateFromError static method', async () => {
|
|
65
|
+
const { ErrorBoundary } = await import('../../components/ErrorBoundary.js');
|
|
66
|
+
|
|
67
|
+
expect(typeof ErrorBoundary.getDerivedStateFromError).toBe('function');
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test('ErrorBoundary componentDidCatch is defined', async () => {
|
|
71
|
+
const { ErrorBoundary } = await import('../../components/ErrorBoundary.js');
|
|
72
|
+
|
|
73
|
+
expect(typeof ErrorBoundary.prototype.componentDidCatch).toBe('function');
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
describe('Phase 9 - LoadingSpinner - Structure', () => {
|
|
78
|
+
test('LoadingSpinner is a function component', async () => {
|
|
79
|
+
const { LoadingSpinner } = await import('../../components/LoadingSpinner.js');
|
|
80
|
+
|
|
81
|
+
// Verify it's a function component
|
|
82
|
+
expect(typeof LoadingSpinner).toBe('function');
|
|
83
|
+
|
|
84
|
+
// It should not be a class (no prototype.render)
|
|
85
|
+
expect(LoadingSpinner.prototype?.render).toBeUndefined();
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
test('InlineSpinner is a function component', async () => {
|
|
89
|
+
const { InlineSpinner } = await import('../../components/LoadingSpinner.js');
|
|
90
|
+
|
|
91
|
+
expect(typeof InlineSpinner).toBe('function');
|
|
92
|
+
|
|
93
|
+
// It should not be a class (no prototype.render)
|
|
94
|
+
expect(InlineSpinner.prototype?.render).toBeUndefined();
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
describe('Phase 9 - Enhanced InputBox - History Support', () => {
|
|
99
|
+
test('Enhanced InputBox imports useRef for history', async () => {
|
|
100
|
+
const inputBoxSource = await import('../../components/InputBox.js');
|
|
101
|
+
const React = await import('react');
|
|
102
|
+
|
|
103
|
+
// Verify React hooks are available (used for history)
|
|
104
|
+
expect(React.useState).toBeDefined();
|
|
105
|
+
expect(React.useRef).toBeDefined();
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
test('InputBox component maintains exports', async () => {
|
|
109
|
+
const module = await import('../../components/InputBox.js');
|
|
110
|
+
|
|
111
|
+
expect(module.InputBox).toBeDefined();
|
|
112
|
+
expect(module.default).toBeDefined();
|
|
113
|
+
expect(module.default).toBe(module.InputBox);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
describe('Phase 9 - Integration', () => {
|
|
118
|
+
test('All enhanced components can be imported together', async () => {
|
|
119
|
+
const [errorBoundaryModule, spinnerModule, inputBoxModule] = await Promise.all([
|
|
120
|
+
import('../../components/ErrorBoundary.js'),
|
|
121
|
+
import('../../components/LoadingSpinner.js'),
|
|
122
|
+
import('../../components/InputBox.js'),
|
|
123
|
+
]);
|
|
124
|
+
|
|
125
|
+
expect(errorBoundaryModule.ErrorBoundary).toBeDefined();
|
|
126
|
+
expect(spinnerModule.LoadingSpinner).toBeDefined();
|
|
127
|
+
expect(spinnerModule.InlineSpinner).toBeDefined();
|
|
128
|
+
expect(inputBoxModule.InputBox).toBeDefined();
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test('Enhanced Layout component imports useInput for keyboard shortcuts', async () => {
|
|
132
|
+
const React = await import('react');
|
|
133
|
+
const ink = await import('ink');
|
|
134
|
+
|
|
135
|
+
// Verify useInput is available (used for keyboard shortcuts)
|
|
136
|
+
expect(ink.useInput).toBeDefined();
|
|
137
|
+
expect(typeof ink.useInput).toBe('function');
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
test('Layout component can still be imported after enhancements', async () => {
|
|
141
|
+
const { Layout } = await import('../../components/Layout.js');
|
|
142
|
+
|
|
143
|
+
expect(Layout).toBeDefined();
|
|
144
|
+
expect(typeof Layout).toBe('function');
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
describe('Phase 9 - Enhanced Features - Constants', () => {
|
|
149
|
+
test('InputBox defines MAX_HISTORY constant', async () => {
|
|
150
|
+
// We can't directly access the constant, but we can verify the module loads
|
|
151
|
+
const module = await import('../../components/InputBox.js');
|
|
152
|
+
|
|
153
|
+
expect(module.InputBox).toBeDefined();
|
|
154
|
+
// The constant is used internally for history management
|
|
155
|
+
});
|
|
156
|
+
});
|