Compare commits

..

15 Commits

65 changed files with 398 additions and 171 deletions

View File

@@ -6,12 +6,12 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Installing Node - name: Installing Node
uses: actions/setup-node@v3.7.0 uses: actions/setup-node@v4.4.0
with: with:
node-version: 22 node-version: 22
@@ -49,12 +49,12 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Installing Node - name: Installing Node
uses: actions/setup-node@v3.7.0 uses: actions/setup-node@v4.4.0
with: with:
node-version: 22 node-version: 22
@@ -161,12 +161,12 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Install Node - name: Install Node
uses: actions/setup-node@v3.7.0 uses: actions/setup-node@v4.4.0
with: with:
node-version: 22 node-version: 22
@@ -315,7 +315,7 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
@@ -324,7 +324,7 @@ jobs:
if: github.event_name == 'push' && (startsWith(github.ref, 'refs/tags')) if: github.event_name == 'push' && (startsWith(github.ref, 'refs/tags'))
- name: Installing Node - name: Installing Node
uses: actions/setup-node@v3.7.0 uses: actions/setup-node@v4.4.0
with: with:
node-version: 22 node-version: 22

View File

@@ -38,7 +38,7 @@ jobs:
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v3 uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning. # Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL - name: Initialize CodeQL

View File

@@ -7,14 +7,14 @@ jobs:
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v3 uses: actions/checkout@v4
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Installing Node - name: Installing Node
uses: actions/setup-node@v3.7.0 uses: actions/setup-node@v4.4.0
with: with:
node-version: 20 node-version: 22
- name: Build - name: Build
run: | run: |

View File

@@ -60,7 +60,7 @@ tabby
| ├─ src # Electron renderer code | ├─ src # Electron renderer code
| └─ main.js # Electron main entry point | └─ main.js # Electron main entry point
├─ build ├─ build
├─ clink # Clink distributive, for Windows ├─ clink # Clink distribution, for Windows
├─ scripts # Maintenance scripts ├─ scripts # Maintenance scripts
├─ tabby-community-color-schemes # Plugin that provides color schemes ├─ tabby-community-color-schemes # Plugin that provides color schemes
├─ tabby-core # Plugin that provides base UI and tab management ├─ tabby-core # Plugin that provides base UI and tab management

View File

@@ -1,6 +1,6 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2017 Eugene Pankov Copyright (c) 2017 Tabby Developers
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@@ -349,7 +349,6 @@ Dank geht an diese wunderbaren Menschen ([emoji key](https://allcontributors.org
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://thuanpham582002.github.io/"><img src="https://avatars.githubusercontent.com/u/95533596?v=4?s=100" width="100px;" alt="thuanpham582002"/><br /><sub><b>thuanpham582002</b></sub></a><br /><a href="#plugin-thuanpham582002" title="Plugin/utility libraries">🔌</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -343,7 +343,6 @@ Grazie a queste persone meravigliose ([emoji key](https://allcontributors.org/do
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://thuanpham582002.github.io/"><img src="https://avatars.githubusercontent.com/u/95533596?v=4?s=100" width="100px;" alt="thuanpham582002"/><br /><sub><b>thuanpham582002</b></sub></a><br /><a href="#plugin-thuanpham582002" title="Plugin/utility libraries">🔌</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -107,7 +107,7 @@ This README is also available in: <a href="./README.md">:gb: English</a> · <a
플러그인과 테마는 Tabby 내부의 설정에서 직접 설치할 수 있습니다. 플러그인과 테마는 Tabby 내부의 설정에서 직접 설치할 수 있습니다.
* [clickable-links](https://github.com/Eugeny/tabby-clickable-links) - m터미널의 경로 및 URL을 클릭 가능하게 * [clickable-links](https://github.com/Eugeny/tabby-clickable-links) - 터미널의 경로 및 URL을 클릭 가능하게
* [docker](https://github.com/Eugeny/tabby-docker) - Docker 컨테이너에 연결 * [docker](https://github.com/Eugeny/tabby-docker) - Docker 컨테이너에 연결
* [title-control](https://github.com/kbjr/terminus-title-control) - 접두사, 접미사 및/또는 문자열 제거를 제공하여 터미널 탭의 제목을 수정 * [title-control](https://github.com/kbjr/terminus-title-control) - 접두사, 접미사 및/또는 문자열 제거를 제공하여 터미널 탭의 제목을 수정
* [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - 하나 또는 모든 터미널 탭에 신속한 명령 전송 * [quick-cmds](https://github.com/Domain/terminus-quick-cmds) - 하나 또는 모든 터미널 탭에 신속한 명령 전송
@@ -144,7 +144,7 @@ Pull requests and plugins are welcome!
--- ---
<a name="contributors"></a> <a name="contributors"></a>
여기있는 멋진 사람들에게 진심으로 감사합니다. ([emoji key](https://allcontributors.org/docs/en/emoji-key)): 여기 있는 멋진 사람들에게 진심으로 감사합니다. ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
<!-- prettier-ignore-start --> <!-- prettier-ignore-start -->
@@ -342,7 +342,6 @@ Pull requests and plugins are welcome!
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://thuanpham582002.github.io/"><img src="https://avatars.githubusercontent.com/u/95533596?v=4?s=100" width="100px;" alt="thuanpham582002"/><br /><sub><b>thuanpham582002</b></sub></a><br /><a href="#plugin-thuanpham582002" title="Plugin/utility libraries">🔌</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -366,7 +366,6 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://thuanpham582002.github.io/"><img src="https://avatars.githubusercontent.com/u/95533596?v=4?s=100" width="100px;" alt="thuanpham582002"/><br /><sub><b>thuanpham582002</b></sub></a><br /><a href="#plugin-thuanpham582002" title="Plugin/utility libraries">🔌</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -343,7 +343,6 @@ Pull-запросы и плагины приветствуются!
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://thuanpham582002.github.io/"><img src="https://avatars.githubusercontent.com/u/95533596?v=4?s=100" width="100px;" alt="thuanpham582002"/><br /><sub><b>thuanpham582002</b></sub></a><br /><a href="#plugin-thuanpham582002" title="Plugin/utility libraries">🔌</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -342,7 +342,6 @@
</tr> </tr>
<tr> <tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td> <td align="center" valign="top" width="14.28%"><a href="https://github.com/geodic"><img src="https://avatars.githubusercontent.com/u/64704703?v=4?s=100" width="100px;" alt="geodic"/><br /><sub><b>geodic</b></sub></a><br /><a href="https://github.com/Eugeny/tabby/commits?author=geodic" title="Code">💻</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://thuanpham582002.github.io/"><img src="https://avatars.githubusercontent.com/u/95533596?v=4?s=100" width="100px;" alt="thuanpham582002"/><br /><sub><b>thuanpham582002</b></sub></a><br /><a href="#plugin-thuanpham582002" title="Plugin/utility libraries">🔌</a></td>
</tr> </tr>
</tbody> </tbody>
</table> </table>

View File

@@ -4,7 +4,7 @@
"private": true, "private": true,
"repository": "https://github.com/Eugeny/tabby", "repository": "https://github.com/Eugeny/tabby",
"author": { "author": {
"name": "Eugene Pankov", "name": "Tabby Developers",
"email": "e@ajenti.org" "email": "e@ajenti.org"
}, },
"main": "dist/main.js", "main": "dist/main.js",
@@ -64,9 +64,9 @@
"tabby-terminal": "*" "tabby-terminal": "*"
}, },
"resolutions": { "resolutions": {
"*/node-abi": "^3", "node-abi": "4.9.0",
"node-gyp": "^10.0.0", "node-gyp": "^10.0.0",
"nan": "2.22.0", "nan": "2.22.2",
"node-addon-api": "^8.3.0" "node-addon-api": "^8.3.0"
} }
} }

View File

@@ -6,4 +6,6 @@ export const PLUGIN_BLACKLIST = [
'terminus-clickable-ips', // broken, functionality now bundled with Tabby 'terminus-clickable-ips', // broken, functionality now bundled with Tabby
'terminus-elastic-quick-commands', // broken and abandoned, fork of quick-commands 'terminus-elastic-quick-commands', // broken and abandoned, fork of quick-commands
'terminus-elastic-quick-cmds', // broken and abandoned, fork of quick-commands 'terminus-elastic-quick-cmds', // broken and abandoned, fork of quick-commands
'tabby-fig', // abandoned,
'tabby-plugin-fig-integration', // abandoned,
] ]

View File

@@ -2607,10 +2607,10 @@ mz@^2.7.0:
object-assign "^4.0.1" object-assign "^4.0.1"
thenify-all "^1.0.0" thenify-all "^1.0.0"
nan@2.22.0, nan@^2.17.0: nan@2.22.2, nan@^2.17.0:
version "2.22.0" version "2.22.2"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.2.tgz#6b504fd029fb8f38c0990e52ad5c26772fdacfbb"
integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== integrity sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==
napi-build-utils@^1.0.1: napi-build-utils@^1.0.1:
version "1.0.2" version "1.0.2"
@@ -2641,19 +2641,12 @@ nice-try@^1.0.4:
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
node-abi@^3: node-abi@4.9.0, node-abi@^3.3.0:
version "3.65.0" version "4.9.0"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.65.0.tgz#ca92d559388e1e9cab1680a18c1a18757cdac9d3" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-4.9.0.tgz#ca6dabf7991e54bf3ba6d8d32641e1b84f305263"
integrity sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA== integrity sha512-0isb3h+AXUblx5Iv0mnYy2WsErH+dk2e9iXJXdKAtS076Q5hP+scQhp6P4tvDeVlOBlG3ROKvkpQHtbORllq2A==
dependencies: dependencies:
semver "^7.3.5" semver "^7.6.3"
node-abi@^3.3.0:
version "3.8.0"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.8.0.tgz#679957dc8e7aa47b0a02589dbfde4f77b29ccb32"
integrity sha512-tzua9qWWi7iW4I42vUPKM+SfaF0vQSLAm4yO5J83mSwB7GeoWrDKC/K+8YCnYNwqP5duwazbw2X9l4m8SC2cUw==
dependencies:
semver "^7.3.5"
node-addon-api@3.1.0, node-addon-api@6.1.0, node-addon-api@7.1.0, node-addon-api@^3.0.2, node-addon-api@^3.1.0, node-addon-api@^4.0.0, node-addon-api@^4.3.0, node-addon-api@^8.3.0: node-addon-api@3.1.0, node-addon-api@6.1.0, node-addon-api@7.1.0, node-addon-api@^3.0.2, node-addon-api@^3.1.0, node-addon-api@^4.0.0, node-addon-api@^4.3.0, node-addon-api@^8.3.0:
version "8.3.0" version "8.3.0"
@@ -3681,6 +3674,11 @@ semver@^7.3.5:
dependencies: dependencies:
lru-cache "^6.0.0" lru-cache "^6.0.0"
semver@^7.6.3:
version "7.7.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58"
integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
serialize-error@^5.0.0: serialize-error@^5.0.0:
version "5.0.0" version "5.0.0"
resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-5.0.0.tgz#a7ebbcdb03a5d71a6ed8461ffe0fc1a1afed62ac" resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-5.0.0.tgz#a7ebbcdb03a5d71a6ed8461ffe0fc1a1afed62ac"

View File

@@ -8,7 +8,7 @@
<true/> <true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key> <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/> <true/>
<key>com.apple.security.device.microphone</key> <key>com.apple.security.device.audio-input</key>
<true/> <true/>
<key>com.apple.security.device.camera</key> <key>com.apple.security.device.camera</key>
<true/> <true/>

View File

@@ -12,6 +12,7 @@
"@angular/platform-browser-dynamic": "^15.2.6", "@angular/platform-browser-dynamic": "^15.2.6",
"@biesbjerg/ngx-translate-extract-marker": "^1.0.0", "@biesbjerg/ngx-translate-extract-marker": "^1.0.0",
"@electron/notarize": "^1.2.3", "@electron/notarize": "^1.2.3",
"@electron/rebuild": "^4",
"@fortawesome/fontawesome-free": "^6.4.0", "@fortawesome/fontawesome-free": "^6.4.0",
"@ng-bootstrap/ng-bootstrap": "^14.1.0", "@ng-bootstrap/ng-bootstrap": "^14.1.0",
"@ngtools/webpack": "^15.2.5", "@ngtools/webpack": "^15.2.5",
@@ -39,11 +40,10 @@
"cross-env": "7.0.3", "cross-env": "7.0.3",
"css-loader": "^6.7.3", "css-loader": "^6.7.3",
"deep-equal": "2.0.5", "deep-equal": "2.0.5",
"electron": "^32.2.7", "electron": "^36.3",
"electron-builder": "^26.0.0-alpha.10", "electron-builder": "^26.0",
"electron-download": "^4.1.1", "electron-download": "^4.1.1",
"electron-installer-snap": "^5.1.0", "electron-installer-snap": "^5.1.0",
"@electron/rebuild": "^3.7.1",
"eslint": "^8.48.0", "eslint": "^8.48.0",
"eslint-import-resolver-typescript": "^3.6.0", "eslint-import-resolver-typescript": "^3.6.0",
"eslint-plugin-import": "^2.28.1", "eslint-plugin-import": "^2.28.1",
@@ -55,7 +55,7 @@
"lru-cache": "^6.0.0", "lru-cache": "^6.0.0",
"macos-release": "^3.3.0", "macos-release": "^3.3.0",
"ngx-toastr": "^16.0.2", "ngx-toastr": "^16.0.2",
"node-abi": "^3.71.0", "node-abi": "^4",
"npmlog": "6.0.2", "npmlog": "6.0.2",
"npx": "^10.2.2", "npx": "^10.2.2",
"patch-package": "^6.4.7", "patch-package": "^6.4.7",
@@ -96,7 +96,8 @@
"*/pug": "^3", "*/pug": "^3",
"lzma-native": "^8.0.6", "lzma-native": "^8.0.6",
"**/graceful-fs": "^4.2.4", "**/graceful-fs": "^4.2.4",
"nan": "2.22.0", "nan": "2.22.2",
"node-abi": "4.9.0",
"node-gyp": "^10.0.0" "node-gyp": "^10.0.0"
}, },
"scripts": { "scripts": {

View File

@@ -1,5 +1,5 @@
diff --git a/node_modules/app-builder-lib/out/appInfo.js b/node_modules/app-builder-lib/out/appInfo.js diff --git a/node_modules/app-builder-lib/out/appInfo.js b/node_modules/app-builder-lib/out/appInfo.js
index 7fbbef7..0821807 100644 index d159c17..eb48466 100644
--- a/node_modules/app-builder-lib/out/appInfo.js --- a/node_modules/app-builder-lib/out/appInfo.js
+++ b/node_modules/app-builder-lib/out/appInfo.js +++ b/node_modules/app-builder-lib/out/appInfo.js
@@ -116,9 +116,7 @@ class AppInfo { @@ -116,9 +116,7 @@ class AppInfo {

View File

@@ -31,6 +31,7 @@ export const builtinPlugins = [
'tabby-electron', 'tabby-electron',
'tabby-plugin-manager', 'tabby-plugin-manager',
'tabby-linkifier', 'tabby-linkifier',
'tabby-auto-sudo-password',
] ]
export const packagesWithDocs = [ export const packagesWithDocs = [

View File

@@ -0,0 +1,23 @@
{
"name": "tabby-auto-sudo-password",
"version": "1.0.197-nightly.1",
"description": "Offers to automatically paste saved sudo password in SSH sessions",
"keywords": [
"tabby-builtin-plugin"
],
"main": "dist/index.js",
"typings": "typings/index.d.ts",
"scripts": {
"build": "webpack --progress --color --display-modules",
"watch": "webpack --progress --color --watch"
},
"files": [
"dist",
"typings"
],
"devDependencies": {
"ansi-colors": "^4.1.1"
},
"author": "Tabby Developers",
"license": "MIT"
}

View File

@@ -0,0 +1,89 @@
import colors from 'ansi-colors'
import { Injectable } from '@angular/core'
import { TerminalDecorator, BaseTerminalTabComponent, XTermFrontend, SessionMiddleware } from 'tabby-terminal'
import { SSHProfile, SSHTabComponent, PasswordStorageService } from 'tabby-ssh'
const SUDO_PROMPT_REGEX = /^\[sudo\] password for ([^:]+):\s*$/im
export class AutoSudoPasswordMiddleware extends SessionMiddleware {
private pendingPasswordToPaste: string | null = null
private pasteHint = `${colors.black.bgBlackBright(' Tabby ')} ${colors.gray('Press Enter to paste saved password')}`
private pasteHintLength = colors.stripColor(this.pasteHint).length
constructor (
private profile: SSHProfile,
private ps: PasswordStorageService,
) { super() }
feedFromSession (data: Buffer): void {
const text = data.toString('utf-8')
const match = SUDO_PROMPT_REGEX.exec(text)
if (match) {
const username = match[1]
this.handlePrompt(username)
}
this.outputToTerminal.next(data)
}
feedFromTerminal (data: Buffer): void {
if (this.pendingPasswordToPaste) {
const backspaces = Buffer.alloc(this.pasteHintLength, 8) // backspace
const spaces = Buffer.alloc(this.pasteHintLength, 32) // space
const clear = Buffer.concat([backspaces, spaces, backspaces])
this.outputToTerminal.next(clear)
if (data.length === 1 && data[0] === 13) { // Enter key
this.outputToSession.next(Buffer.from(this.pendingPasswordToPaste + '\n'))
this.pendingPasswordToPaste = null
return
} else {
this.pendingPasswordToPaste = null
}
}
this.outputToSession.next(data)
}
async handlePrompt (username: string): Promise<void> {
console.log(`Detected sudo prompt for user: ${username}`)
const pw = await this.ps.loadPassword(this.profile)
if (pw) {
this.outputToTerminal.next(Buffer.from(this.pasteHint))
this.pendingPasswordToPaste = pw
}
}
async loadPassword (username: string): Promise<string| null> {
if (this.profile.options.user !== username) {
return null
}
return this.ps.loadPassword(this.profile)
}
}
@Injectable()
export class AutoSudoPasswordDecorator extends TerminalDecorator {
constructor (
private ps: PasswordStorageService,
) {
super()
}
private attachToSession (tab: SSHTabComponent) {
if (!tab.session) {
return
}
tab.session.middleware.unshift(new AutoSudoPasswordMiddleware(tab.profile, this.ps))
}
attach (tab: BaseTerminalTabComponent<any>): void {
if (!(tab.frontend instanceof XTermFrontend) || !(tab instanceof SSHTabComponent)) {
return
}
setTimeout(() => {
this.attachToSession(tab)
this.subscribeUntilDetached(tab, tab.sessionChanged$.subscribe(() => {
this.attachToSession(tab)
}))
})
}
}

View File

@@ -0,0 +1,16 @@
/* eslint-disable @typescript-eslint/no-extraneous-class */
import { NgModule } from '@angular/core'
import { ToastrModule } from 'ngx-toastr'
import { TerminalDecorator } from 'tabby-terminal'
import { AutoSudoPasswordDecorator } from './decorator'
@NgModule({
imports: [
ToastrModule,
],
providers: [
{ provide: TerminalDecorator, useClass: AutoSudoPasswordDecorator, multi: true },
],
})
export default class AutoSudoPasswordModule { }

View File

@@ -0,0 +1,7 @@
{
"extends": "../tsconfig.json",
"exclude": ["node_modules", "dist"],
"compilerOptions": {
"baseUrl": "src",
}
}

View File

@@ -0,0 +1,14 @@
{
"extends": "../tsconfig.json",
"exclude": ["node_modules", "dist", "typings"],
"compilerOptions": {
"baseUrl": "src",
"emitDeclarationOnly": true,
"declaration": true,
"declarationDir": "./typings",
"paths": {
"tabby-*": ["../../tabby-*"],
"*": ["../../app/node_modules/*"]
}
}
}

View File

@@ -0,0 +1,10 @@
import * as path from 'path'
import * as url from 'url'
const __dirname = url.fileURLToPath(new URL('.', import.meta.url))
import config from '../webpack.plugin.config.mjs'
export default () => config({
name: 'auto-sudo-password',
dirname: __dirname,
})

View File

@@ -0,0 +1,8 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
ansi-colors@^4.1.1:
version "4.1.3"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b"
integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==

View File

@@ -14,7 +14,7 @@
"files": [ "files": [
"dist" "dist"
], ],
"author": "Eugene Pankov", "author": "Tabby Developers",
"license": "MIT", "license": "MIT",
"peerDependencies": { "peerDependencies": {
"@angular/core": "^15", "@angular/core": "^15",

View File

@@ -15,7 +15,7 @@
"dist", "dist",
"typings" "typings"
], ],
"author": "Eugene Pankov", "author": "Tabby Developers",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"bootstrap": "^5.3.0-alpha.1", "bootstrap": "^5.3.0-alpha.1",

View File

@@ -36,7 +36,7 @@ export { TabsService, NewTabParameters, TabComponentType } from '../services/tab
export { UpdaterService } from '../services/updater.service' export { UpdaterService } from '../services/updater.service'
export { VaultService, Vault, VaultSecret, VaultFileSecret, VAULT_SECRET_TYPE_FILE, StoredVault, VaultSecretKey } from '../services/vault.service' export { VaultService, Vault, VaultSecret, VaultFileSecret, VAULT_SECRET_TYPE_FILE, StoredVault, VaultSecretKey } from '../services/vault.service'
export { FileProvidersService } from '../services/fileProviders.service' export { FileProvidersService } from '../services/fileProviders.service'
export { LocaleService } from '../services/locale.service' export { LocaleService, TabbyFormatedDatePipe } from '../services/locale.service'
export { TranslateService } from '@ngx-translate/core' export { TranslateService } from '@ngx-translate/core'
export * from '../utils' export * from '../utils'
export { UTF8Splitter } from '../utfSplitter' export { UTF8Splitter } from '../utfSplitter'

View File

@@ -35,7 +35,8 @@ title-bar(
[@animateTab]='{value: "in", params: {size: targetTabSize}}', [@animateTab]='{value: "in", params: {size: targetTabSize}}',
[@.disabled]='hasVerticalTabs() || !config.store.accessibility.animations', [@.disabled]='hasVerticalTabs() || !config.store.accessibility.animations',
(click)='app.selectTab(tab)', (click)='app.selectTab(tab)',
[class.fully-draggable]='hostApp.platform !== Platform.macOS' [class.fully-draggable]='hostApp.platform !== Platform.macOS',
[ngbTooltip]='tab.customTitle || tab.title'
) )
.btn-group.background .btn-group.background
@@ -43,7 +44,7 @@ title-bar(
*ngFor='let button of leftToolbarButtons' *ngFor='let button of leftToolbarButtons'
) )
button.btn.btn-secondary.btn-tab-bar( button.btn.btn-secondary.btn-tab-bar(
[title]='button.label', [ngbTooltip]='button.label',
(click)='button.run && button.run()', (click)='button.run && button.run()',
[fastHtmlBind]='button.icon' [fastHtmlBind]='button.icon'
) )
@@ -55,7 +56,7 @@ title-bar(
) )
button.btn.btn-secondary.btn-tab-bar( button.btn.btn-secondary.btn-tab-bar(
[hidden]='activeTransfers.length == 0', [hidden]='activeTransfers.length == 0',
title='File transfers', [ngbTooltip]='"File transfers"|translate',
ngbDropdownToggle ngbDropdownToggle
) !{require('../icons/transfers.svg')} ) !{require('../icons/transfers.svg')}
transfers-menu( transfers-menu(
@@ -75,14 +76,14 @@ title-bar(
*ngFor='let button of rightToolbarButtons' *ngFor='let button of rightToolbarButtons'
) )
button.btn.btn-secondary.btn-tab-bar( button.btn.btn-secondary.btn-tab-bar(
[title]='button.label', [ngbTooltip]='button.label',
(click)='button.run && button.run()', (click)='button.run && button.run()',
[fastHtmlBind]='button.icon' [fastHtmlBind]='button.icon'
) )
button.btn.btn-secondary.btn-tab-bar.btn-update( button.btn.btn-secondary.btn-tab-bar.btn-update(
*ngIf='updatesAvailable', *ngIf='updatesAvailable',
title='Update available - Click to install', [ngbTooltip]='"Update available - Click to install"|translate',
(click)='updater.update()' (click)='updater.update()'
) !{require('../icons/gift.svg')} ) !{require('../icons/gift.svg')}

View File

@@ -13,7 +13,6 @@ profile-icon(
) )
.name( .name(
[title]='tab.customTitle || tab.title',
[class.no-hover]='config.store.terminal.hideCloseButton && config.store.terminal.hideTabOptionsButton' [class.no-hover]='config.store.terminal.hideCloseButton && config.store.terminal.hideTabOptionsButton'
cdkDrag, cdkDrag,
cdkDragRootElement='tab-header', cdkDragRootElement='tab-header',

View File

@@ -5,7 +5,7 @@
.icon(*ngIf='isDownload(transfer)') !{require('../icons/download.svg')} .icon(*ngIf='isDownload(transfer)') !{require('../icons/download.svg')}
.icon(*ngIf='!isDownload(transfer)') !{require('../icons/upload.svg')} .icon(*ngIf='!isDownload(transfer)') !{require('../icons/upload.svg')}
.main .main
label.no-wrap([title]='transfer.getName()') {{transfer.getName()}} label.no-wrap([ngbTooltip]='transfer.getName()') {{transfer.getName()}}
ngb-progressbar([type]='transfer.isComplete() ? "success" : transfer.isCancelled() ? "danger" : "info"', [value]='getProgress(transfer)') ngb-progressbar([type]='transfer.isComplete() ? "success" : transfer.isCancelled() ? "danger" : "info"', [value]='getProgress(transfer)')
.metadata .metadata
.size {{transfer.getSize()|filesize}} .size {{transfer.getSize()|filesize}}

View File

@@ -2,7 +2,7 @@ import { NgModule, ModuleWithProviders, LOCALE_ID } from '@angular/core'
import { BrowserAnimationsModule } from '@angular/platform-browser/animations' import { BrowserAnimationsModule } from '@angular/platform-browser/animations'
import { CommonModule } from '@angular/common' import { CommonModule } from '@angular/common'
import { FormsModule } from '@angular/forms' import { FormsModule } from '@angular/forms'
import { NgbModule } from '@ng-bootstrap/ng-bootstrap' import { NgbModule, NgbTooltipConfig } from '@ng-bootstrap/ng-bootstrap'
import { NgxFilesizeModule } from 'ngx-filesize' import { NgxFilesizeModule } from 'ngx-filesize'
import { DragDropModule } from '@angular/cdk/drag-drop' import { DragDropModule } from '@angular/cdk/drag-drop'
import { TranslateModule, TranslateCompiler, TranslateService, MissingTranslationHandler } from '@ngx-translate/core' import { TranslateModule, TranslateCompiler, TranslateService, MissingTranslationHandler } from '@ngx-translate/core'
@@ -43,7 +43,7 @@ import { AppService } from './services/app.service'
import { ConfigService } from './services/config.service' import { ConfigService } from './services/config.service'
import { VaultFileProvider } from './services/vault.service' import { VaultFileProvider } from './services/vault.service'
import { HotkeysService } from './services/hotkeys.service' import { HotkeysService } from './services/hotkeys.service'
import { CustomMissingTranslationHandler, LocaleService } from './services/locale.service' import { CustomMissingTranslationHandler, LocaleService, TabbyFormatedDatePipe } from './services/locale.service'
import { CommandService } from './services/commands.service' import { CommandService } from './services/commands.service'
import { NewTheme } from './theme' import { NewTheme } from './theme'
@@ -130,6 +130,7 @@ const PROVIDERS = [
DropZoneDirective, DropZoneDirective,
CdkAutoDropGroup, CdkAutoDropGroup,
ProfileIconComponent, ProfileIconComponent,
TabbyFormatedDatePipe,
], ],
exports: [ exports: [
AppRootComponent, AppRootComponent,
@@ -144,6 +145,7 @@ const PROVIDERS = [
TranslateModule, TranslateModule,
CdkAutoDropGroup, CdkAutoDropGroup,
ProfileIconComponent, ProfileIconComponent,
TabbyFormatedDatePipe,
], ],
}) })
export default class AppModule { // eslint-disable-line @typescript-eslint/no-extraneous-class export default class AppModule { // eslint-disable-line @typescript-eslint/no-extraneous-class
@@ -153,6 +155,7 @@ export default class AppModule { // eslint-disable-line @typescript-eslint/no-ex
platform: PlatformService, platform: PlatformService,
hotkeys: HotkeysService, hotkeys: HotkeysService,
commands: CommandService, commands: CommandService,
ngbTooltipConfig: NgbTooltipConfig,
public locale: LocaleService, public locale: LocaleService,
private translate: TranslateService, private translate: TranslateService,
private profilesService: ProfilesService, private profilesService: ProfilesService,
@@ -199,6 +202,10 @@ export default class AppModule { // eslint-disable-line @typescript-eslint/no-ex
commands.run('core:profile-selector', {}) commands.run('core:profile-selector', {})
} }
}) })
ngbTooltipConfig.openDelay = 750
ngbTooltipConfig.placement = 'top bottom auto'
ngbTooltipConfig.container = 'body'
} }
async showSelector (provider: ProfileProvider<Profile>): Promise<void> { async showSelector (provider: ProfileProvider<Profile>): Promise<void> {

View File

@@ -1,5 +1,5 @@
import { Injectable } from '@angular/core' import { Injectable, Pipe, PipeTransform } from '@angular/core'
import { registerLocaleData } from '@angular/common' import { formatDate, registerLocaleData } from '@angular/common'
import { TranslateService, MissingTranslationHandler } from '@ngx-translate/core' import { TranslateService, MissingTranslationHandler } from '@ngx-translate/core'
import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler' import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler'
@@ -257,3 +257,15 @@ export class LocaleService {
return this.locale return this.locale
} }
} }
@Pipe({
name: 'tabbyDate',
})
export class TabbyFormatedDatePipe implements PipeTransform {
constructor (private locale: LocaleService) {}
transform (date: string): string {
return formatDate(date, 'medium', this.locale.getLocale())
}
}

View File

@@ -15,7 +15,7 @@
"dist", "dist",
"typings" "typings"
], ],
"author": "Eugene Pankov", "author": "Tabby Developers",
"license": "MIT", "license": "MIT",
"peerDependencies": { "peerDependencies": {
"@angular/core": "^15", "@angular/core": "^15",

View File

@@ -50,7 +50,7 @@ export class DockMenuService {
]) ])
} }
if (this.hostApp.platform === Platform.macOS) { if (this.hostApp.platform === Platform.macOS) {
this.electron.app.dock.setMenu(this.electron.Menu.buildFromTemplate( this.electron.app.dock?.setMenu(this.electron.Menu.buildFromTemplate(
[ [
...[...this.profilesService.getRecentProfiles(), ...profiles].map(profile => ({ ...[...this.profilesService.getRecentProfiles(), ...profiles].map(profile => ({
label: profile.name, label: profile.name,

View File

@@ -15,7 +15,7 @@
"dist", "dist",
"typings" "typings"
], ],
"author": "Eugene Pankov", "author": "Tabby Developers",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"@xterm/addon-web-links": "^0.10.0", "@xterm/addon-web-links": "^0.10.0",

View File

@@ -13,4 +13,12 @@ export abstract class LinkHandler {
} }
abstract handle (uri: string, tab?: BaseTerminalTabComponent<any>): void abstract handle (uri: string, tab?: BaseTerminalTabComponent<any>): void
private _fullMatchRegex: RegExp | null = null
get fullMatchRegex (): RegExp {
if (!this._fullMatchRegex) {
this._fullMatchRegex = new RegExp(`^${this.regex.source}$`)
}
return this._fullMatchRegex
}
} }

View File

@@ -31,7 +31,7 @@ export class LinkHighlighterDecorator extends TerminalDecorator {
const openLink = async uri => { const openLink = async uri => {
for (const handler of this.handlers) { for (const handler of this.handlers) {
if (!handler.regex.test(uri)) { if (!handler.fullMatchRegex.test(uri)) {
continue continue
} }
if (!await handler.verify(await handler.convert(uri, tab), tab)) { if (!await handler.verify(await handler.convert(uri, tab), tab)) {

View File

@@ -15,7 +15,7 @@
"dist", "dist",
"typings" "typings"
], ],
"author": "Eugene Pankov", "author": "Tabby Developers",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"ansi-colors": "^4.1.1", "ansi-colors": "^4.1.1",

View File

@@ -15,7 +15,7 @@
"dist", "dist",
"typings" "typings"
], ],
"author": "Eugene Pankov", "author": "Tabby Developers",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"@types/semver": "^7.1.0", "@types/semver": "^7.1.0",

View File

@@ -100,6 +100,7 @@ export class PluginsSettingsTabComponent {
this.busy.delete(plugin.name) this.busy.delete(plugin.name)
this.config.requestRestart() this.config.requestRestart()
} catch (err) { } catch (err) {
console.error('Error installing plugin', plugin.name, err)
this.erroredPlugin = plugin.name this.erroredPlugin = plugin.name
this.errorMessage = err this.errorMessage = err
this.busy.delete(plugin.name) this.busy.delete(plugin.name)
@@ -114,6 +115,7 @@ export class PluginsSettingsTabComponent {
this.busy.delete(plugin.name) this.busy.delete(plugin.name)
this.config.requestRestart() this.config.requestRestart()
} catch (err) { } catch (err) {
console.error('Error uninstalling plugin', plugin.name, err)
this.erroredPlugin = plugin.name this.erroredPlugin = plugin.name
this.errorMessage = err this.errorMessage = err
this.busy.delete(plugin.name) this.busy.delete(plugin.name)

View File

@@ -15,7 +15,7 @@
"dist", "dist",
"typings" "typings"
], ],
"author": "Eugene Pankov", "author": "Tabby Developers",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"@types/node": "14.14.14", "@types/node": "14.14.14",

View File

@@ -15,7 +15,7 @@
"dist", "dist",
"typings" "typings"
], ],
"author": "Eugene Pankov", "author": "Tabby Developers",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"@types/marked": "^5.0.1", "@types/marked": "^5.0.1",

View File

@@ -67,7 +67,7 @@ ul.nav-tabs(ngbNav, #nav='ngbNav')
div {{cfg.name}} div {{cfg.name}}
small.text-muted( small.text-muted(
translate='Modified on {date}', translate='Modified on {date}',
[translateParams]='{date: cfg.modified_at|date:"medium"}' [translateParams]='{date: cfg.modified_at|tabbyDate}'
) )
.me-auto .me-auto
button.btn.btn-link.ms-1( button.btn.btn-link.ms-1(

View File

@@ -145,4 +145,5 @@ export class ConfigSyncSettingsTabComponent extends BaseComponent {
openTabbyWebInfo () { openTabbyWebInfo () {
this.platform.openExternal('https://github.com/Eugeny/tabby-web') this.platform.openExternal('https://github.com/Eugeny/tabby-web')
} }
} }

View File

@@ -8,5 +8,5 @@
) )
div(*ngFor='let release of releases') div(*ngFor='let release of releases')
h1 {{release.name}} h1 {{release.name}}
.text-muted {{release.version}} / {{release.date|date:'mediumDate'}} .text-muted {{release.version}} / {{release.date|tabbyDate}}
section([fastHtmlBind]='release.content') section([fastHtmlBind]='release.content')

View File

@@ -45,4 +45,5 @@ export class ReleaseNotesComponent extends BaseTabComponent {
onScrolled () { onScrolled () {
this.loadReleases(this.lastPage + 1) this.loadReleases(this.lastPage + 1)
} }
} }

View File

@@ -17,7 +17,7 @@
"dist", "dist",
"typings" "typings"
], ],
"author": "Eugene Pankov", "author": "Tabby Developers",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"@types/node": "20.3.1", "@types/node": "20.3.1",

View File

@@ -6,6 +6,7 @@ export const supportedAlgorithms = {
[SSHAlgorithmType.HOSTKEY]: russh.getSupportedKeyTypes().filter(x => x !== 'none'), [SSHAlgorithmType.HOSTKEY]: russh.getSupportedKeyTypes().filter(x => x !== 'none'),
[SSHAlgorithmType.CIPHER]: russh.getSupportedCiphers().filter(x => x !== 'clear'), [SSHAlgorithmType.CIPHER]: russh.getSupportedCiphers().filter(x => x !== 'clear'),
[SSHAlgorithmType.HMAC]: russh.getSupportedMACs().filter(x => x !== 'none'), [SSHAlgorithmType.HMAC]: russh.getSupportedMACs().filter(x => x !== 'none'),
[SSHAlgorithmType.COMPRESSION]: russh.getSupportedCompressionAlgorithms().reverse(),
} }
export const defaultAlgorithms = { export const defaultAlgorithms = {
@@ -42,4 +43,9 @@ export const defaultAlgorithms = {
'hmac-sha1-etm@openssh.com', 'hmac-sha1-etm@openssh.com',
'hmac-sha1', 'hmac-sha1',
], ],
[SSHAlgorithmType.COMPRESSION]: [
'zlib@openssh.com',
'zlib',
'none',
],
} }

View File

@@ -5,6 +5,8 @@ export enum SSHAlgorithmType {
KEX = 'kex', KEX = 'kex',
CIPHER = 'cipher', CIPHER = 'cipher',
HOSTKEY = 'serverHostKey', HOSTKEY = 'serverHostKey',
COMPRESSION = 'compression',
} }
export interface SSHProfile extends ConnectableTerminalProfile { export interface SSHProfile extends ConnectableTerminalProfile {

View File

@@ -61,5 +61,5 @@
div {{item.name}} div {{item.name}}
.me-auto .me-auto
.size(*ngIf='!item.isDirectory') {{item.size|filesize}} .size(*ngIf='!item.isDirectory') {{item.size|filesize}}
.date {{item.modified|date:'medium'}} .date {{item.modified|tabbyDate}}
.mode {{getModeString(item)}} .mode {{getModeString(item)}}

View File

@@ -273,4 +273,5 @@ export class SFTPPanelComponent {
close (): void { close (): void {
this.closed.emit() this.closed.emit()
} }
} }

View File

@@ -285,7 +285,13 @@ ul.nav-tabs(ngbNav, #nav='ngbNav')
.w-75 .w-75
div(*ngFor='let alg of supportedAlgorithms.serverHostKey') div(*ngFor='let alg of supportedAlgorithms.serverHostKey')
checkbox([text]='alg', [(ngModel)]='algorithms.serverHostKey[alg]') checkbox([text]='alg', [(ngModel)]='algorithms.serverHostKey[alg]')
.form-line.align-items-start
.header
.title Compression
.w-75
div(*ngFor='let alg of supportedAlgorithms.compression')
checkbox([text]='alg', [(ngModel)]='algorithms.compression[alg]')
li(ngbNavItem) li(ngbNavItem)
a(ngbNavLink, translate) Colors a(ngbNavLink, translate) Colors
ng-template(ngbNavContent) ng-template(ngbNavContent)

View File

@@ -107,7 +107,7 @@ export class SSHProfileSettingsComponent {
this.profile.options.algorithms![k] = Object.entries(this.algorithms[k]) this.profile.options.algorithms![k] = Object.entries(this.algorithms[k])
.filter(([_, v]) => !!v) .filter(([_, v]) => !!v)
.map(([key, _]) => key) .map(([key, _]) => key)
this.profile.options.algorithms![k].sort() if(k !== SSHAlgorithmType.COMPRESSION) { this.profile.options.algorithms![k].sort() }
} }
if (this.connectionMode !== 'jumpHost') { if (this.connectionMode !== 'jumpHost') {

View File

@@ -179,6 +179,7 @@ export class SSHTabComponent extends ConnectableTerminalTabComponent<SSHProfile>
try { try {
await this.initializeSessionMaybeMultiplex(false) await this.initializeSessionMaybeMultiplex(false)
} catch (e) { } catch (e) {
console.error('SSH session initialization failed', e)
this.write(colors.black.bgRed(' X ') + ' ' + colors.red(e.message) + '\r\n') this.write(colors.black.bgRed(' X ') + ' ' + colors.red(e.message) + '\r\n')
return return
} }

View File

@@ -66,4 +66,5 @@ export default class SSHModule { }
export * from './api' export * from './api'
export { SFTPFile, SFTPSession } from './session/sftp' export { SFTPFile, SFTPSession } from './session/sftp'
export { SFTPPanelComponent } export { SFTPPanelComponent, SSHTabComponent }
export { PasswordStorageService } from './services/passwordStorage.service'

View File

@@ -55,7 +55,7 @@ export class SSHProfilesService extends QuickConnectProfileProvider<SSHProfile>
super() super()
for (const k of Object.values(SSHAlgorithmType)) { for (const k of Object.values(SSHAlgorithmType)) {
this.configDefaults.options.algorithms[k] = [...defaultAlgorithms[k]] this.configDefaults.options.algorithms[k] = [...defaultAlgorithms[k]]
this.configDefaults.options.algorithms[k].sort() if (k !== SSHAlgorithmType.COMPRESSION) { this.configDefaults.options.algorithms[k].sort() }
} }
} }

View File

@@ -315,6 +315,7 @@ export class SSHSession {
kex: this.profile.options.algorithms?.[SSHAlgorithmType.KEX]?.filter(x => supportedAlgorithms[SSHAlgorithmType.KEX].includes(x)), kex: this.profile.options.algorithms?.[SSHAlgorithmType.KEX]?.filter(x => supportedAlgorithms[SSHAlgorithmType.KEX].includes(x)),
mac: this.profile.options.algorithms?.[SSHAlgorithmType.HMAC]?.filter(x => supportedAlgorithms[SSHAlgorithmType.HMAC].includes(x)), mac: this.profile.options.algorithms?.[SSHAlgorithmType.HMAC]?.filter(x => supportedAlgorithms[SSHAlgorithmType.HMAC].includes(x)),
key: this.profile.options.algorithms?.[SSHAlgorithmType.HOSTKEY]?.filter(x => supportedAlgorithms[SSHAlgorithmType.HOSTKEY].includes(x)), key: this.profile.options.algorithms?.[SSHAlgorithmType.HOSTKEY]?.filter(x => supportedAlgorithms[SSHAlgorithmType.HOSTKEY].includes(x)),
compression: this.profile.options.algorithms?.[SSHAlgorithmType.COMPRESSION]?.filter(x => supportedAlgorithms[SSHAlgorithmType.COMPRESSION].includes(x)),
}, },
keepaliveIntervalSeconds: Math.round((this.profile.options.keepaliveInterval ?? 15000) / 1000), keepaliveIntervalSeconds: Math.round((this.profile.options.keepaliveInterval ?? 15000) / 1000),
keepaliveCountMax: this.profile.options.keepaliveCountMax, keepaliveCountMax: this.profile.options.keepaliveCountMax,

View File

@@ -15,7 +15,7 @@
"dist", "dist",
"typings" "typings"
], ],
"author": "Eugene Pankov", "author": "Tabby Developers",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"ansi-colors": "^4.1.1", "ansi-colors": "^4.1.1",

View File

@@ -16,7 +16,7 @@
"dist", "dist",
"typings" "typings"
], ],
"author": "Eugene Pankov", "author": "Tabby Developers",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"@xterm/addon-canvas": "^0.6.0", "@xterm/addon-canvas": "^0.6.0",

View File

@@ -17,6 +17,8 @@ import { getTerminalBackgroundColor } from '../helpers'
const INACTIVE_TAB_UNLOAD_DELAY = 1000 * 30 const INACTIVE_TAB_UNLOAD_DELAY = 1000 * 30
const OSC_FOCUS_IN = Buffer.from('\x1b[I')
const OSC_FOCUS_OUT = Buffer.from('\x1b[O')
/** /**
* A class to base your custom terminal tabs on * A class to base your custom terminal tabs on
@@ -494,7 +496,7 @@ export class BaseTerminalTabComponent<P extends BaseTerminalProfile> extends Bas
data = Buffer.from(data, 'utf-8') data = Buffer.from(data, 'utf-8')
} }
this.session?.feedFromTerminal(data) this.session?.feedFromTerminal(data)
if (this.config.store.terminal.scrollOnInput) { if (this.config.store.terminal.scrollOnInput && !data.equals(OSC_FOCUS_IN) && !data.equals(OSC_FOCUS_OUT)) {
this.frontend?.scrollToBottom() this.frontend?.scrollToBottom()
} }
} }
@@ -542,7 +544,7 @@ export class BaseTerminalTabComponent<P extends BaseTerminalProfile> extends Bas
} }
if (!this.alternateScreenActive) { if (!this.alternateScreenActive) {
if (data.includes('\r') && this.config.store.terminal.warnOnMultilinePaste) { if ((data.includes('\r') || data.includes('\n')) && this.config.store.terminal.warnOnMultilinePaste) {
const buttons = [ const buttons = [
this.translate.instant('Paste'), this.translate.instant('Paste'),
this.translate.instant('Cancel'), this.translate.instant('Cancel'),

View File

@@ -16,14 +16,14 @@
ng-container(*ngIf='state.resultCount > 0') ng-container(*ngIf='state.resultCount > 0')
button.btn.btn-link( button.btn.btn-link(
(click)='findPrevious()', (click)='findPrevious()',
ngbTooltip='Search up', [ngbTooltip]='"Search up"|translate',
placement='bottom', placement='bottom',
[fastHtmlBind]='icons.arrowUp' [fastHtmlBind]='icons.arrowUp'
) )
button.btn.btn-link( button.btn.btn-link(
(click)='findNext()', (click)='findNext()',
ngbTooltip='Search down', [ngbTooltip]='"Search down"|translate',
placement='bottom', placement='bottom',
[fastHtmlBind]='icons.arrowDown' [fastHtmlBind]='icons.arrowDown'
) )
@@ -34,7 +34,7 @@ button.btn(
(click)='options.caseSensitive = !options.caseSensitive; saveSearchOptions()', (click)='options.caseSensitive = !options.caseSensitive; saveSearchOptions()',
[class.btn-link]='!options.caseSensitive', [class.btn-link]='!options.caseSensitive',
[class.btn-info]='options.caseSensitive', [class.btn-info]='options.caseSensitive',
ngbTooltip='Case sensitivity', [ngbTooltip]='"Case sensitivity"|translate',
placement='bottom', placement='bottom',
[fastHtmlBind]='icons.case' [fastHtmlBind]='icons.case'
) )
@@ -43,7 +43,7 @@ button.btn(
(click)='options.regex = !options.regex; saveSearchOptions()', (click)='options.regex = !options.regex; saveSearchOptions()',
[class.btn-link]='!options.regex', [class.btn-link]='!options.regex',
[class.btn-info]='options.regex', [class.btn-info]='options.regex',
ngbTooltip='Regular expression', [ngbTooltip]='"Regular expression"|translate',
placement='bottom', placement='bottom',
[fastHtmlBind]='icons.regexp' [fastHtmlBind]='icons.regexp'
) )
@@ -52,7 +52,7 @@ button.btn(
(click)='options.wholeWord = !options.wholeWord; saveSearchOptions()', (click)='options.wholeWord = !options.wholeWord; saveSearchOptions()',
[class.btn-link]='!options.wholeWord', [class.btn-link]='!options.wholeWord',
[class.btn-info]='options.wholeWord', [class.btn-info]='options.wholeWord',
ngbTooltip='Whole word', [ngbTooltip]='"Whole word"|translate',
placement='bottom', placement='bottom',
[fastHtmlBind]='icons.wholeWord' [fastHtmlBind]='icons.wholeWord'
) )

View File

@@ -11,7 +11,7 @@
"data", "data",
"dist" "dist"
], ],
"author": "Eugene Pankov", "author": "Tabby Developers",
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"@types/webpack-env": "^1.16.0" "@types/webpack-env": "^1.16.0"

View File

@@ -15,7 +15,7 @@
"dist", "dist",
"typings" "typings"
], ],
"author": "Eugene Pankov", "author": "Tabby Developers",
"license": "MIT", "license": "MIT",
"peerDependencies": { "peerDependencies": {
"@angular/core": "^15" "@angular/core": "^15"

177
yarn.lock
View File

@@ -418,20 +418,20 @@
tar "^6.0.5" tar "^6.0.5"
yargs "^17.0.1" yargs "^17.0.1"
"@electron/rebuild@^3.7.1": "@electron/rebuild@^4":
version "3.7.1" version "4.0.1"
resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-3.7.1.tgz#27ed124f7f1dbed92b222aabe68c0e4a3e6c5cea" resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-4.0.1.tgz#0620d5bb71a0b8b09a86fb9fa979244e1fcc10bf"
integrity sha512-sKGD+xav4Gh25+LcLY0rjIwcCFTw+f/HU1pB48UVbwxXXRGaXEqIH0AaYKN46dgd/7+6kuiDXzoyAEvx1zCsdw== integrity sha512-iMGXb6Ib7H/Q3v+BKZJoETgF9g6KMNZVbsO4b7Dmpgb5qTFqyFTzqW9F3TOSHdybv2vKYKzSS9OiZL+dcJb+1Q==
dependencies: dependencies:
"@electron/node-gyp" "https://github.com/electron/node-gyp#06b29aafb7708acef8b3669835c8a7857ebc92d2"
"@malept/cross-spawn-promise" "^2.0.0" "@malept/cross-spawn-promise" "^2.0.0"
chalk "^4.0.0" chalk "^4.0.0"
debug "^4.1.1" debug "^4.1.1"
detect-libc "^2.0.1" detect-libc "^2.0.1"
fs-extra "^10.0.0"
got "^11.7.0" got "^11.7.0"
node-abi "^3.45.0" graceful-fs "^4.2.11"
node-api-version "^0.2.0" node-abi "^4.2.0"
node-api-version "^0.2.1"
node-gyp "^11.2.0"
ora "^5.1.0" ora "^5.1.0"
read-binary-file-arch "^1.0.6" read-binary-file-arch "^1.0.6"
semver "^7.3.5" semver "^7.3.5"
@@ -961,12 +961,12 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.3.1.tgz#e8a83f1aa8b649377bb1fb5d7bac5cb90e784dfe"
integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg== integrity sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==
"@types/node@^20.9.0": "@types/node@^22.7.7":
version "20.14.14" version "22.15.21"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.14.tgz#6b655d4a88623b0edb98300bb9dd2107225f885e" resolved "https://registry.yarnpkg.com/@types/node/-/node-22.15.21.tgz#196ef14fe20d87f7caf1e7b39832767f9a995b77"
integrity sha512-d64f00982fS9YoOgJkAMolK7MN8Iq3TDdVjchbYHdEmjth/DHowx82GnoA+tVUAN+7vxfYUgAzi+JXbKNd2SDQ== integrity sha512-EV/37Td6c+MgKAbkcLG6vqZ2zEYHD7bvSrzqqs2RIhbA6w3x+Dqz8MZM3sP6kGTeLrdoOgKZe+Xja7tUB2DNkQ==
dependencies: dependencies:
undici-types "~5.26.4" undici-types "~6.21.0"
"@types/parse5@^5": "@types/parse5@^5":
version "5.0.3" version "5.0.3"
@@ -1476,10 +1476,10 @@ app-builder-bin@5.0.0-alpha.12:
resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz#2daf82f8badc698e0adcc95ba36af4ff0650dc80" resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-5.0.0-alpha.12.tgz#2daf82f8badc698e0adcc95ba36af4ff0650dc80"
integrity sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w== integrity sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==
app-builder-lib@26.0.0-alpha.10: app-builder-lib@26.0.12:
version "26.0.0-alpha.10" version "26.0.12"
resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-26.0.0-alpha.10.tgz#3eb3f64ffa5e995595ad61497c5e7a0c2d64b817" resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-26.0.12.tgz#2e33df936e0f78d4266b058ece90308ea981eefb"
integrity sha512-9K3MulGK7j+En4KjH3aq7AzDqe8nn35x7O9l5kwl16nWFdBthcdy1IKsx9CgjMSF+eTNctOZlXwnYiPiGzY+GQ== integrity sha512-+/CEPH1fVKf6HowBUs6LcAIoRcjeqgvAeoSE+cl7Y7LndyQ9ViGPYibNk7wmhMHzNgHIuIbw4nWADPO+4mjgWw==
dependencies: dependencies:
"@develar/schema-utils" "~2.6.5" "@develar/schema-utils" "~2.6.5"
"@electron/asar" "3.2.18" "@electron/asar" "3.2.18"
@@ -1491,16 +1491,15 @@ app-builder-lib@26.0.0-alpha.10:
"@malept/flatpak-bundler" "^0.4.0" "@malept/flatpak-bundler" "^0.4.0"
"@types/fs-extra" "9.0.13" "@types/fs-extra" "9.0.13"
async-exit-hook "^2.0.1" async-exit-hook "^2.0.1"
bluebird-lst "^1.0.9" builder-util "26.0.11"
builder-util "26.0.0-alpha.10" builder-util-runtime "9.3.1"
builder-util-runtime "9.3.0-alpha.0"
chromium-pickle-js "^0.2.0" chromium-pickle-js "^0.2.0"
config-file-ts "0.2.8-rc1" config-file-ts "0.2.8-rc1"
debug "^4.3.4" debug "^4.3.4"
dotenv "^16.4.5" dotenv "^16.4.5"
dotenv-expand "^11.0.6" dotenv-expand "^11.0.6"
ejs "^3.1.8" ejs "^3.1.8"
electron-publish "26.0.0-alpha.10" electron-publish "26.0.11"
fs-extra "^10.1.0" fs-extra "^10.1.0"
hosted-git-info "^4.1.0" hosted-git-info "^4.1.0"
is-ci "^3.0.0" is-ci "^3.0.0"
@@ -1509,10 +1508,12 @@ app-builder-lib@26.0.0-alpha.10:
json5 "^2.2.3" json5 "^2.2.3"
lazy-val "^1.0.5" lazy-val "^1.0.5"
minimatch "^10.0.0" minimatch "^10.0.0"
plist "3.1.0"
resedit "^1.7.0" resedit "^1.7.0"
semver "^7.3.8" semver "^7.3.8"
tar "^6.1.12" tar "^6.1.12"
temp-file "^3.4.0" temp-file "^3.4.0"
tiny-async-pool "1.3.0"
apply-loader@2.0.0: apply-loader@2.0.0:
version "2.0.0" version "2.0.0"
@@ -1844,14 +1845,7 @@ block-stream@*:
dependencies: dependencies:
inherits "~2.0.0" inherits "~2.0.0"
bluebird-lst@^1.0.9: bluebird@^3.5.0:
version "1.0.9"
resolved "https://registry.yarnpkg.com/bluebird-lst/-/bluebird-lst-1.0.9.tgz#a64a0e4365658b9ab5fe875eb9dfb694189bb41c"
integrity sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==
dependencies:
bluebird "^3.5.5"
bluebird@^3.5.0, bluebird@^3.5.5:
version "3.7.2" version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
@@ -2022,24 +2016,23 @@ buffer@^5.1.0:
base64-js "^1.3.1" base64-js "^1.3.1"
ieee754 "^1.1.13" ieee754 "^1.1.13"
builder-util-runtime@9.3.0-alpha.0: builder-util-runtime@9.3.1:
version "9.3.0-alpha.0" version "9.3.1"
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.3.0-alpha.0.tgz#c4639ae24a74d2e0f4eb324100af3040300bae62" resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.3.1.tgz#0daedde0f6d381f2a00a50a407b166fe7dca1a67"
integrity sha512-EriE6Uf15niqdkyjBOS09OrXlhEV0HKhnATlI9n63vCoisnvvRTQNgoR2MV9vnBmNGhavBPZXPWPItv4QMDVfw== integrity sha512-2/egrNDDnRaxVwK3A+cJq6UOlqOdedGA7JPqCeJjN2Zjk1/QB/6QUi3b714ScIGS7HafFXTyzJEOr5b44I3kvQ==
dependencies: dependencies:
debug "^4.3.4" debug "^4.3.4"
sax "^1.2.4" sax "^1.2.4"
builder-util@26.0.0-alpha.10: builder-util@26.0.11:
version "26.0.0-alpha.10" version "26.0.11"
resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-26.0.0-alpha.10.tgz#f445a530c28da6e3650b93e92263c06c6f89a2cc" resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-26.0.11.tgz#ad85b92c93f2b976b973e1d87337e0c6813fcb8f"
integrity sha512-RMVOAgdd+tzwpyF5C8gx9KjzwdUvkUEubpsHTvb2JwlQnBcyBc6hyVCU2gt2MivQCLbjCOEgsUX1/zHrWDqGfg== integrity sha512-xNjXfsldUEe153h1DraD0XvDOpqGR0L5eKFkdReB7eFW5HqysDZFfly4rckda6y9dF39N3pkPlOblcfHKGw+uA==
dependencies: dependencies:
"7zip-bin" "~5.2.0" "7zip-bin" "~5.2.0"
"@types/debug" "^4.1.6" "@types/debug" "^4.1.6"
app-builder-bin "5.0.0-alpha.12" app-builder-bin "5.0.0-alpha.12"
bluebird-lst "^1.0.9" builder-util-runtime "9.3.1"
builder-util-runtime "9.3.0-alpha.0"
chalk "^4.1.2" chalk "^4.1.2"
cross-spawn "^7.0.6" cross-spawn "^7.0.6"
debug "^4.3.4" debug "^4.3.4"
@@ -2052,6 +2045,7 @@ builder-util@26.0.0-alpha.10:
source-map-support "^0.5.19" source-map-support "^0.5.19"
stat-mode "^1.0.0" stat-mode "^1.0.0"
temp-file "^3.4.0" temp-file "^3.4.0"
tiny-async-pool "1.3.0"
builtin-modules@^1.0.0: builtin-modules@^1.0.0:
version "1.1.1" version "1.1.1"
@@ -2938,14 +2932,14 @@ dir-glob@^3.0.1:
dependencies: dependencies:
path-type "^4.0.0" path-type "^4.0.0"
dmg-builder@26.0.0-alpha.10: dmg-builder@26.0.12:
version "26.0.0-alpha.10" version "26.0.12"
resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-26.0.0-alpha.10.tgz#d4d908922005a0c852d0919a7dd0b8f77d3c4bd0" resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-26.0.12.tgz#6996ad0bab80a861c9a7b33ee9734d4f60566b46"
integrity sha512-RWzCNLLu4dGIvBf8kBzjF/zI5aMOSA149S1V2NgAA4La8f8ghdJAm/DI5crSb2zDijFLyTNmUGTtvU6eHgiZyQ== integrity sha512-59CAAjAhTaIMCN8y9kD573vDkxbs1uhDcrFLHSgutYdPcGOU35Rf95725snvzEOy4BFB7+eLJ8djCNPmGwG67w==
dependencies: dependencies:
app-builder-lib "26.0.0-alpha.10" app-builder-lib "26.0.12"
builder-util "26.0.0-alpha.10" builder-util "26.0.11"
builder-util-runtime "9.3.0-alpha.0" builder-util-runtime "9.3.1"
fs-extra "^10.1.0" fs-extra "^10.1.0"
iconv-lite "^0.6.2" iconv-lite "^0.6.2"
js-yaml "^4.1.0" js-yaml "^4.1.0"
@@ -3067,16 +3061,16 @@ ejs@^3.1.8:
dependencies: dependencies:
jake "^10.8.5" jake "^10.8.5"
electron-builder@^26.0.0-alpha.10: electron-builder@^26.0:
version "26.0.0-alpha.10" version "26.0.12"
resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-26.0.0-alpha.10.tgz#6f629f5f1f3340286af71cabd12d94edc53f15ea" resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-26.0.12.tgz#797af2e70efdd96c9ea5d8a8164b8728c90d65ff"
integrity sha512-QTitqOlP5aZ/8zhnxqjRb6BxSR7Kvwv07PoBGeIXADwSPHQhKhZ+S+GRFzUSYQrMTTJLGzUHbnAes6fZ3uThEA== integrity sha512-cD1kz5g2sgPTMFHjLxfMjUK5JABq3//J4jPswi93tOPFz6btzXYtK5NrDt717NRbukCUDOrrvmYVOWERlqoiXA==
dependencies: dependencies:
app-builder-lib "26.0.0-alpha.10" app-builder-lib "26.0.12"
builder-util "26.0.0-alpha.10" builder-util "26.0.11"
builder-util-runtime "9.3.0-alpha.0" builder-util-runtime "9.3.1"
chalk "^4.1.2" chalk "^4.1.2"
dmg-builder "26.0.0-alpha.10" dmg-builder "26.0.12"
fs-extra "^10.1.0" fs-extra "^10.1.0"
is-ci "^3.0.0" is-ci "^3.0.0"
lazy-val "^1.0.5" lazy-val "^1.0.5"
@@ -3166,14 +3160,14 @@ electron-localshortcut@^3.1.0:
keyboardevent-from-electron-accelerator "^2.0.0" keyboardevent-from-electron-accelerator "^2.0.0"
keyboardevents-areequal "^0.2.1" keyboardevents-areequal "^0.2.1"
electron-publish@26.0.0-alpha.10: electron-publish@26.0.11:
version "26.0.0-alpha.10" version "26.0.11"
resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-26.0.0-alpha.10.tgz#16ac95acca2d796ca00c7a90ca27ebf31855f284" resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-26.0.11.tgz#92c9329a101af2836d9d228c82966eca1eee9a7b"
integrity sha512-yUkCJD7MLN57d6PJ8PMcBCR35xytA+jHyrOiS/H0hlmTOWq1sXN+tIBylX4h0dD/C6mn75/y5eE156Pe2nccPw== integrity sha512-a8QRH0rAPIWH9WyyS5LbNvW9Ark6qe63/LqDB7vu2JXYpi0Gma5Q60Dh4tmTqhOBQt0xsrzD8qE7C+D7j+B24A==
dependencies: dependencies:
"@types/fs-extra" "^9.0.11" "@types/fs-extra" "^9.0.11"
builder-util "26.0.0-alpha.10" builder-util "26.0.11"
builder-util-runtime "9.3.0-alpha.0" builder-util-runtime "9.3.1"
chalk "^4.1.2" chalk "^4.1.2"
form-data "^4.0.0" form-data "^4.0.0"
fs-extra "^10.1.0" fs-extra "^10.1.0"
@@ -3185,13 +3179,13 @@ electron-to-chromium@^1.4.284:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.286.tgz#0e039de59135f44ab9a8ec9025e53a9135eba11f" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.286.tgz#0e039de59135f44ab9a8ec9025e53a9135eba11f"
integrity sha512-Vp3CVhmYpgf4iXNKAucoQUDcCrBQX3XLBtwgFqP9BUXuucgvAV9zWp1kYU7LL9j4++s9O+12cb3wMtN4SJy6UQ== integrity sha512-Vp3CVhmYpgf4iXNKAucoQUDcCrBQX3XLBtwgFqP9BUXuucgvAV9zWp1kYU7LL9j4++s9O+12cb3wMtN4SJy6UQ==
electron@^32.2.7: electron@^36.3:
version "32.2.7" version "36.3.1"
resolved "https://registry.yarnpkg.com/electron/-/electron-32.2.7.tgz#4eaf78534c99ba060da5bb002c737206be33f225" resolved "https://registry.yarnpkg.com/electron/-/electron-36.3.1.tgz#12a8c1b1cd9163a4bd0cb60f89816243b26ab788"
integrity sha512-y8jbQRG3xogF70XPlk5c+dWe5iRfUBo28o2NMpKd/CcW7ENIaWtBlGima8/8nmRdAaYTy1+yIt6KB0Lon9H8cA== integrity sha512-LeOZ+tVahmctHaAssLCGRRUa2SAO09GXua3pKdG+WzkbSDMh+3iOPONNVPTqGp8HlWnzGj4r6mhsIbM2RgH+eQ==
dependencies: dependencies:
"@electron/get" "^2.0.0" "@electron/get" "^2.0.0"
"@types/node" "^20.9.0" "@types/node" "^22.7.7"
extract-zip "^2.0.1" extract-zip "^2.0.1"
elliptic@^6.5.3: elliptic@^6.5.3:
@@ -4439,7 +4433,7 @@ got@^6.7.1:
unzip-response "^2.0.1" unzip-response "^2.0.1"
url-parse-lax "^1.0.0" url-parse-lax "^1.0.0"
graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9, graceful-fs@~4.1.11: graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.10, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9, graceful-fs@~4.1.11:
version "4.2.10" version "4.2.10"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
@@ -6222,10 +6216,10 @@ mute-stream@~0.0.4:
resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz" resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz"
integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
nan@2.22.0: nan@2.22.2:
version "2.22.0" version "2.22.2"
resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.0.tgz#31bc433fc33213c97bad36404bb68063de604de3" resolved "https://registry.yarnpkg.com/nan/-/nan-2.22.2.tgz#6b504fd029fb8f38c0990e52ad5c26772fdacfbb"
integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== integrity sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==
nanoid@^3.3.4: nanoid@^3.3.4:
version "3.3.4" version "3.3.4"
@@ -6267,12 +6261,12 @@ no-case@^3.0.4:
lower-case "^2.0.2" lower-case "^2.0.2"
tslib "^2.0.3" tslib "^2.0.3"
node-abi@^3.45.0, node-abi@^3.71.0: node-abi@4.9.0, node-abi@^3.45.0, node-abi@^4, node-abi@^4.2.0:
version "3.71.0" version "4.9.0"
resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.71.0.tgz#52d84bbcd8575efb71468fbaa1f9a49b2c242038" resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-4.9.0.tgz#ca6dabf7991e54bf3ba6d8d32641e1b84f305263"
integrity sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw== integrity sha512-0isb3h+AXUblx5Iv0mnYy2WsErH+dk2e9iXJXdKAtS076Q5hP+scQhp6P4tvDeVlOBlG3ROKvkpQHtbORllq2A==
dependencies: dependencies:
semver "^7.3.5" semver "^7.6.3"
node-addon-api@^1.6.3: node-addon-api@^1.6.3:
version "1.7.2" version "1.7.2"
@@ -6291,6 +6285,13 @@ node-api-version@^0.2.0:
dependencies: dependencies:
semver "^7.3.5" semver "^7.3.5"
node-api-version@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/node-api-version/-/node-api-version-0.2.1.tgz#19bad54f6d65628cbee4e607a325e4488ace2de9"
integrity sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==
dependencies:
semver "^7.3.5"
node-fetch-npm@^2.0.1: node-fetch-npm@^2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.1.tgz" resolved "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.1.tgz"
@@ -6312,7 +6313,7 @@ node-gyp-build@^4.2.1:
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739"
integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==
node-gyp@^10.0.0, node-gyp@~3.6.2: node-gyp@^10.0.0, node-gyp@^11.2.0, node-gyp@~3.6.2:
version "10.3.1" version "10.3.1"
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-10.3.1.tgz#1dd1a1a1c6c5c59da1a76aea06a062786b2c8a1a" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-10.3.1.tgz#1dd1a1a1c6c5c59da1a76aea06a062786b2c8a1a"
integrity sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ== integrity sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ==
@@ -7153,7 +7154,7 @@ pkg-up@^2.0.0:
dependencies: dependencies:
find-up "^2.1.0" find-up "^2.1.0"
plist@^3.0.4, plist@^3.0.5, plist@^3.1.0: plist@3.1.0, plist@^3.0.4, plist@^3.0.5, plist@^3.1.0:
version "3.1.0" version "3.1.0"
resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9"
integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==
@@ -8143,7 +8144,7 @@ semver@^6.2.0, semver@^6.3.1:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
semver@^7.0.0, semver@^7.1.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.8: semver@^7.0.0, semver@^7.1.1, semver@^7.3.4, semver@^7.3.8:
version "7.3.8" version "7.3.8"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798"
integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==
@@ -8157,6 +8158,11 @@ semver@^7.3.2, semver@^7.5.3, semver@^7.5.4:
dependencies: dependencies:
lru-cache "^6.0.0" lru-cache "^6.0.0"
semver@^7.3.5, semver@^7.6.3:
version "7.7.2"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58"
integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==
semver@~5.3.0: semver@~5.3.0:
version "5.3.0" version "5.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
@@ -8941,6 +8947,13 @@ timed-out@^4.0.0:
resolved "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz" resolved "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz"
integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
tiny-async-pool@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz#c013e1b369095e7005db5595f95e646cca6ef8a5"
integrity sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==
dependencies:
semver "^5.5.0"
tinyqueue@^2.0.3: tinyqueue@^2.0.3:
version "2.0.3" version "2.0.3"
resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08"
@@ -9226,10 +9239,10 @@ unbox-primitive@^1.0.2:
has-symbols "^1.0.3" has-symbols "^1.0.3"
which-boxed-primitive "^1.0.2" which-boxed-primitive "^1.0.2"
undici-types@~5.26.4: undici-types@~6.21.0:
version "5.26.5" version "6.21.0"
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb"
integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==
unique-filename@^1.1.0, unique-filename@~1.1.0: unique-filename@^1.1.0, unique-filename@~1.1.0:
version "1.1.0" version "1.1.0"