diff --git a/term/pkg/hotkeys-js/LICENSE b/term/pkg/hotkeys-js/LICENSE
new file mode 100644
index 0000000..8e072bd
--- /dev/null
+++ b/term/pkg/hotkeys-js/LICENSE
@@ -0,0 +1,23 @@
+MIT License
+
+Copyright (c) 2015-present, Kenny Wong.
+
+Copyright (c) 2011-2013 Thomas Fuchs (https://github.com/madrobby/keymaster)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/term/pkg/hotkeys-js/README.md b/term/pkg/hotkeys-js/README.md
new file mode 100644
index 0000000..9794b5a
--- /dev/null
+++ b/term/pkg/hotkeys-js/README.md
@@ -0,0 +1,441 @@
+# Hotkeys
+
+
+
+[![Buy me a coffee](https://img.shields.io/badge/Buy%20me%20a%20coffee-048754?logo=buymeacoffee)](https://jaywcjlove.github.io/#/sponsor)
+[![](https://img.shields.io/npm/dm/hotkeys-js?logo=npm)](https://www.npmjs.com/package/hotkeys-js)
+[![](https://img.shields.io/github/stars/jaywcjlove/hotkeys-js.svg)](https://github.com/jaywcjlove/hotkeys/stargazers)
+![no dependencies](http://jaywcjlove.github.io/sb/status/no-dependencies.svg)
+[![GitHub Actions CI](https://github.com/jaywcjlove/hotkeys-js/actions/workflows/ci.yml/badge.svg)](https://github.com/jaywcjlove/hotkeys-js/actions/workflows/ci.yml)
+[![Coverage Status](https://coveralls.io/repos/github/jaywcjlove/hotkeys/badge.svg?branch=master)](https://coveralls.io/github/jaywcjlove/hotkeys?branch=master)
+[![jaywcjlove/hotkeys-js](https://jaywcjlove.github.io/sb/lang/chinese.svg)](https://github.com/jaywcjlove/hotkeys-js/blob/master/README-zh.md)
+[![jaywcjlove/hotkeys-js](https://jaywcjlove.github.io/sb/ico/gitee.svg)](https://gitee.com/jaywcjlove/hotkeys)
+
+HotKeys.js is an input capture library with some very special features, it is easy to pick up and use, has a reasonable footprint ([~6kB](https://bundlephobia.com/result?p=hotkeys-js)) (gzipped: **`2.8kB`**), and has no dependencies. It should not interfere with any JavaScript libraries or frameworks. Official document [demo preview](https://jaywcjlove.github.io/hotkeys-js). [More examples](https://github.com/jaywcjlove/hotkeys-js/issues?q=label%3ADemo+).
+
+```bash
+╭┈┈╮ ╭┈┈╮ ╭┈┈╮
+┆ ├┈┈..┈┈┈┈┈.┆ └┈╮┆ ├┈┈..┈┈┈┈┈..┈┈.┈┈..┈┈┈┈┈.
+┆ ┆┆ □ ┆┆ ┈┤┆ < ┆ -__┘┆ ┆ ┆┆__ ┈┈┤
+╰┈┈┴┈┈╯╰┈┈┈┈┈╯╰┈┈┈┈╯╰┈┈┴┈┈╯╰┈┈┈┈┈╯╰┈┈┈ ┆╰┈┈┈┈┈╯
+ ╰┈┈┈┈┈╯
+```
+
+## Usage
+
+You will need `Node.js` installed on your system.
+
+```bash
+npm install hotkeys-js --save
+```
+
+```js
+import hotkeys from 'hotkeys-js';
+
+hotkeys('f5', function(event, handler){
+ // Prevent the default refresh event under WINDOWS system
+ event.preventDefault()
+ alert('you pressed F5!')
+});
+```
+
+Or manually download and link **hotkeys.js** in your HTML, It can also be downloaded via [UNPKG](https://unpkg.com/hotkeys-js/dist/):
+
+CDN: [UNPKG](https://unpkg.com/hotkeys-js/dist/) | [jsDelivr](https://cdn.jsdelivr.net/npm/hotkeys-js@3.7.3/) | [Githack](https://raw.githack.com/jaywcjlove/hotkeys/master/dist/hotkeys.min.js) | [Statically](https://cdn.statically.io/gh/jaywcjlove/hotkeys/master/dist/hotkeys.min.js) | [bundle.run](https://bundle.run/hotkeys-js@3.7.3)
+
+```html
+
+
+```
+
+### Used in React
+
+[react-hotkeys](https://github.com/jaywcjlove/react-hotkeys) is the React component that listen to keydown and keyup keyboard events, defining and dispatching keyboard shortcuts. Detailed use method please see its documentation [react-hotkeys](https://github.com/jaywcjlove/react-hotkeys).
+
+[react-hotkeys-hook](https://github.com/JohannesKlauss/react-hotkeys-hook) - React hook for using keyboard shortcuts in components. Make sure that you have at least version 16.8 of react and react-dom installed, or otherwise hooks won't work for you.
+
+## Browser Support
+
+Hotkeys.js has been tested and should work in.
+
+```shell
+Internet Explorer 6+
+Safari
+Firefox
+Chrome
+```
+
+## Supported Keys
+
+HotKeys understands the following modifiers: `⇧`, `shift`, `option`, `⌥`, `alt`, `ctrl`, `control`, `command`, and `⌘`.
+
+The following special keys can be used for shortcuts: backspace, tab, clear, enter, return, esc, escape, space, up, down, left, right, home, end, pageup, pagedown, del, delete, f1 through f19, num_0 through num_9, num_multiply, num_add, num_enter, num_subtract, num_decimal, num_divide.
+
+`⌘` Command()
+`⌃` Control
+`⌥` Option(alt)
+`⇧` Shift
+`⇪` Caps Lock(Capital)
+~~`fn` Does not support fn~~
+`↩︎` return/Enter space
+
+## Defining Shortcuts
+
+One global method is exposed, key which defines shortcuts when called directly.
+
+```js
+hotkeys([keys:], [option:[string|object|function]], [callback:])
+```
+
+
+```js
+hotkeys('f5', function(event, handler) {
+ // Prevent the default refresh event under WINDOWS system
+ event.preventDefault();
+ alert('you pressed F5!');
+});
+
+// Returning false stops the event and prevents default browser events
+// Mac OS system defines `command + r` as a refresh shortcut
+hotkeys('ctrl+r, command+r', function() {
+ alert('stopped reload!');
+ return false;
+});
+
+// Single key
+hotkeys('a', function(event,handler){
+ //event.srcElement: input
+ //event.target: input
+ if(event.target === "input"){
+ alert('you pressed a!')
+ }
+ alert('you pressed a!')
+});
+
+// Key Combination
+hotkeys('ctrl+a,ctrl+b,r,f', function (event, handler){
+ switch (handler.key) {
+ case 'ctrl+a': alert('you pressed ctrl+a!');
+ break;
+ case 'ctrl+b': alert('you pressed ctrl+b!');
+ break;
+ case 'r': alert('you pressed r!');
+ break;
+ case 'f': alert('you pressed f!');
+ break;
+ default: alert(event);
+ }
+});
+
+hotkeys('ctrl+a+s', function() {
+ alert('you pressed ctrl+a+s!');
+});
+
+// Using a scope
+hotkeys('*','wcj', function(event){
+ console.log('do something', event);
+});
+```
+
+#### option
+
+- `scope`
+- `element`
+- `keyup`
+- `keydown`
+- `splitKey` (default is `+`)
+- `capture`
+- `single`
+
+```js
+hotkeys('o, enter', {
+ scope: 'wcj',
+ element: document.getElementById('wrapper'),
+}, function() {
+ console.log('do something else');
+});
+
+hotkeys('ctrl-+', { splitKey: '-' }, function(e) {
+ console.log('you pressed ctrl and +');
+});
+
+hotkeys('+', { splitKey: '-' }, function(e){
+ console.log('you pressed +');
+})
+```
+
+**keyup**
+
+**key down** and **key up** both perform callback events.
+
+```js
+hotkeys('ctrl+a,alt+a+s', {keyup: true}, function(event, handler) {
+ if (event.type === 'keydown') {
+ console.log('keydown:', event.type, handler, handler.key);
+ }
+
+ if (event.type === 'keyup') {
+ console.log('keyup:', event.type, handler, handler.key);
+ }
+});
+```
+
+## API REFERENCE
+
+Asterisk "*"
+
+Modifier key judgments
+
+```js
+hotkeys('*', function() {
+ if (hotkeys.shift) {
+ console.log('shift is pressed!');
+ }
+
+ if (hotkeys.ctrl) {
+ console.log('ctrl is pressed!');
+ }
+
+ if (hotkeys.alt) {
+ console.log('alt is pressed!');
+ }
+
+ if (hotkeys.option) {
+ console.log('option is pressed!');
+ }
+
+ if (hotkeys.control) {
+ console.log('control is pressed!');
+ }
+
+ if (hotkeys.cmd) {
+ console.log('cmd is pressed!');
+ }
+
+ if (hotkeys.command) {
+ console.log('command is pressed!');
+ }
+});
+```
+
+### setScope
+
+Use the `hotkeys.setScope` method to set scope. There can only be one active scope besides 'all'. By default 'all' is always active.
+
+```js
+// Define shortcuts with a scope
+hotkeys('ctrl+o, ctrl+alt+enter', 'issues', function() {
+ console.log('do something');
+});
+hotkeys('o, enter', 'files', function() {
+ console.log('do something else');
+});
+
+// Set the scope (only 'all' and 'issues' shortcuts will be honored)
+hotkeys.setScope('issues'); // default scope is 'all'
+```
+
+### getScope
+
+Use the `hotkeys.getScope` method to get scope.
+
+```js
+hotkeys.getScope();
+```
+
+### deleteScope
+
+Use the `hotkeys.deleteScope` method to delete a scope. This will also remove all associated hotkeys with it.
+
+```js
+hotkeys.deleteScope('issues');
+```
+You can use second argument, if need set new scope after deleting.
+
+```js
+hotkeys.deleteScope('issues', 'newScopeName');
+```
+
+### unbind
+
+Similar to defining shortcuts, they can be unbound using `hotkeys.unbind`.
+
+```js
+// unbind 'a' handler
+hotkeys.unbind('a');
+
+// Unbind a hotkeys only for a single scope
+// If no scope is specified it defaults to the current scope (hotkeys.getScope())
+hotkeys.unbind('o, enter', 'issues');
+hotkeys.unbind('o, enter', 'files');
+```
+
+Unbind events through functions.
+
+```js
+function example() {
+ hotkeys('a', example);
+ hotkeys.unbind('a', example);
+
+ hotkeys('a', 'issues', example);
+ hotkeys.unbind('a', 'issues', example);
+}
+```
+
+To unbind everything.
+
+```js
+hotkeys.unbind();
+```
+
+### isPressed
+
+For example, `hotkeys.isPressed(77)` is true if the `M` key is currently pressed.
+
+```js
+hotkeys('a', function() {
+ console.log(hotkeys.isPressed('a')); //=> true
+ console.log(hotkeys.isPressed('A')); //=> true
+ console.log(hotkeys.isPressed(65)); //=> true
+});
+```
+
+### trigger
+
+trigger shortcut key event
+
+```js
+hotkeys.trigger('ctrl+o');
+hotkeys.trigger('ctrl+o', 'scope2');
+```
+
+### getPressedKeyCodes
+
+Returns an array of key codes currently pressed.
+
+```js
+hotkeys('command+ctrl+shift+a,f', function() {
+ console.log(hotkeys.getPressedKeyCodes()); //=> [17, 65] or [70]
+})
+```
+
+### getPressedKeyString
+
+Returns an array of key codes currently pressed.
+
+```js
+hotkeys('command+ctrl+shift+a,f', function() {
+ console.log(hotkeys.getPressedKeyString()); //=> ['⌘', '⌃', '⇧', 'A', 'F']
+})
+```
+
+### getAllKeyCodes
+
+Get a list of all registration codes.
+
+```js
+hotkeys('command+ctrl+shift+a,f', function() {
+ console.log(hotkeys.getAllKeyCodes());
+ // [
+ // { scope: 'all', shortcut: 'command+ctrl+shift+a', mods: [91, 17, 16], keys: [91, 17, 16, 65] },
+ // { scope: 'all', shortcut: 'f', mods: [], keys: [42] }
+ // ]
+})
+```
+
+### filter
+
+By default hotkeys are not enabled for `INPUT` `SELECT` `TEXTAREA` elements. `Hotkeys.filter` to return to the `true` shortcut keys set to play a role, `false` shortcut keys set up failure.
+
+```js
+hotkeys.filter = function(event){
+ return true;
+}
+//How to add the filter to edit labels.
+//"contentEditable" Older browsers that do not support drops
+hotkeys.filter = function(event) {
+ var target = event.target || event.srcElement;
+ var tagName = target.tagName;
+ return !(target.isContentEditable || tagName == 'INPUT' || tagName == 'SELECT' || tagName == 'TEXTAREA');
+}
+
+hotkeys.filter = function(event){
+ var tagName = (event.target || event.srcElement).tagName;
+ hotkeys.setScope(/^(INPUT|TEXTAREA|SELECT)$/.test(tagName) ? 'input' : 'other');
+ return true;
+}
+```
+
+### noConflict
+
+Relinquish HotKeys’s control of the `hotkeys` variable.
+
+```js
+var k = hotkeys.noConflict();
+k('a', function() {
+ console.log("do something")
+});
+
+hotkeys()
+// -->Uncaught TypeError: hotkeys is not a function(anonymous function)
+// @ VM2170:2InjectedScript._evaluateOn
+// @ VM2165:883InjectedScript._evaluateAndWrap
+// @ VM2165:816InjectedScript.evaluate @ VM2165:682
+```
+
+## Development
+
+To develop, Install dependencies, Get the code:
+
+```shell
+$ git https://github.com/jaywcjlove/hotkeys.git
+$ cd hotkeys # Into the directory
+$ npm install # or yarn install
+```
+
+To develop, run the self-reloading build:
+
+```shell
+$ npm run watch
+```
+
+Run Document Website Environment.
+
+```shell
+$ npm run doc
+```
+
+To contribute, please fork Hotkeys.js, add your patch and tests for it (in the `test/` folder) and submit a pull request.
+
+```shell
+$ npm run test
+$ npm run test:watch # Development model
+```
+
+## Contributors
+
+As always, thanks to our amazing contributors!
+
+
+
+
+
+Made with [github-action-contributors](https://github.com/jaywcjlove/github-action-contributors).
+
+## License
+
+[MIT © Kenny Wong](./LICENSE)
diff --git a/term/pkg/hotkeys-js/dist/README.md b/term/pkg/hotkeys-js/dist/README.md
new file mode 100644
index 0000000..bd982a3
--- /dev/null
+++ b/term/pkg/hotkeys-js/dist/README.md
@@ -0,0 +1,13 @@
+
+
+Explanation of Build Files
+---
+
+| UMD | Size | CommonJS | Size | ES Module | Size |
+| ---- | ---- | ---- | ---- | ---- | ---- |
+| hotkeys.js | 8.37kb | hotkeys.common.js | 8.13kb | hotkeys.esm.js | 8.12kb |
+| hotkeys.min.js | 3.62kb (gzipped: 1.73kb) | hotkeys.common.min.js | (gzipped: 1.84kb) | - | - |
+
+- [UMD](https://github.com/umdjs/umd): UMD builds can be used directly in the browser via a `