tabby-quick-scripts-chenlei 1.0.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 +21 -0
- package/dist/configProvider.d.ts +34 -0
- package/dist/i18n.d.ts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +4633 -0
- package/dist/index.js.map +1 -0
- package/dist/scriptEditModal.d.ts +23 -0
- package/dist/sftp/local-transfers.d.ts +26 -0
- package/dist/sftp/sftp-manager-tab.component.d.ts +255 -0
- package/dist/sftp/sftp-ui.service.d.ts +13 -0
- package/dist/sftp/sftp.service.d.ts +24 -0
- package/dist/terminalDecorator.d.ts +52 -0
- package/package.json +47 -0
- package/readme.md +79 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","mappings":"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;;;;;;ACZtB;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA;AACA,wDAAwD;;AAExD;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,CAAC;;AAED;;AAEA;AACA;;AAEA,kBAAkB,wBAAwB;AAC1C;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,kBAAkB,iBAAiB;AACnC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,gBAAgB,KAAwC,GAAG,sBAAiB,GAAG,CAAI;;AAEnF;AACA;AACA;AACA;;AAEA;AACA;AACA,GAAG;;AAEH;AACA;AACA,IAAI;AACJ;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;;AAED;AACA,qEAAqE,qBAAqB,cAAc;;AAExG;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA,yDAAyD;AACzD,IAAI;;AAEJ;;;AAGA;AACA;AACA,IAAI;AACJ;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,MAAM;AACN;AACA;AACA;AACA;;AAEA;AACA,2BAA2B;AAC3B;;AAEA;AACA;AACA;;AAEA;AACA;AACA;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","sources":["webpack-tabby-quick-scripts:///webpack/universalModuleDefinition","webpack-tabby-quick-scripts:///./src/quickScriptsBar.scss","webpack-tabby-quick-scripts:///./node_modules/css-loader/dist/runtime/api.js","webpack-tabby-quick-scripts:///./node_modules/css-loader/dist/runtime/cssWithMappingToString.js","webpack://tabby-quick-scripts-chenlei/./src/quickScriptsBar.scss?30cd","webpack-tabby-quick-scripts:///./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js","webpack-tabby-quick-scripts:///./src/configProvider.ts","webpack-tabby-quick-scripts:///./src/i18n.ts","webpack-tabby-quick-scripts:///./src/scriptEditModal.ts","webpack-tabby-quick-scripts:///./src/sftp/local-transfers.ts","webpack-tabby-quick-scripts:///./src/sftp/sftp-manager-tab.component.ts","webpack-tabby-quick-scripts:///./src/sftp/sftp-ui.service.ts","webpack-tabby-quick-scripts:///./src/sftp/sftp.service.ts","webpack-tabby-quick-scripts:///./src/terminalDecorator.ts","webpack-tabby-quick-scripts:///external node-commonjs \"crypto\"","webpack-tabby-quick-scripts:///external node-commonjs \"fs/promises\"","webpack-tabby-quick-scripts:///external node-commonjs \"os\"","webpack-tabby-quick-scripts:///external node-commonjs \"path\"","webpack-tabby-quick-scripts:///external umd \"@angular/common\"","webpack-tabby-quick-scripts:///external umd \"@angular/core\"","webpack-tabby-quick-scripts:///external umd \"@angular/forms\"","webpack-tabby-quick-scripts:///external umd \"@ng-bootstrap/ng-bootstrap\"","webpack-tabby-quick-scripts:///external umd \"fs\"","webpack-tabby-quick-scripts:///external umd \"tabby-core\"","webpack-tabby-quick-scripts:///external umd \"tabby-terminal\"","webpack-tabby-quick-scripts:///webpack/bootstrap","webpack-tabby-quick-scripts:///webpack/runtime/compat get default export","webpack-tabby-quick-scripts:///webpack/runtime/define property getters","webpack-tabby-quick-scripts:///webpack/runtime/hasOwnProperty shorthand","webpack-tabby-quick-scripts:///webpack/runtime/make namespace object","webpack-tabby-quick-scripts:///webpack/runtime/nonce","webpack-tabby-quick-scripts:///./src/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"@angular/core\"), require(\"@angular/common\"), require(\"@angular/forms\"), require(\"tabby-core\"), require(\"tabby-terminal\"), require(\"@ng-bootstrap/ng-bootstrap\"), require(\"fs\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"@angular/core\", \"@angular/common\", \"@angular/forms\", \"tabby-core\", \"tabby-terminal\", \"@ng-bootstrap/ng-bootstrap\", \"fs\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"@angular/core\"), require(\"@angular/common\"), require(\"@angular/forms\"), require(\"tabby-core\"), require(\"tabby-terminal\"), require(\"@ng-bootstrap/ng-bootstrap\"), require(\"fs\")) : factory(root[\"@angular/core\"], root[\"@angular/common\"], root[\"@angular/forms\"], root[\"tabby-core\"], root[\"tabby-terminal\"], root[\"@ng-bootstrap/ng-bootstrap\"], root[\"fs\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(global, (__WEBPACK_EXTERNAL_MODULE__angular_core__, __WEBPACK_EXTERNAL_MODULE__angular_common__, __WEBPACK_EXTERNAL_MODULE__angular_forms__, __WEBPACK_EXTERNAL_MODULE_tabby_core__, __WEBPACK_EXTERNAL_MODULE_tabby_terminal__, __WEBPACK_EXTERNAL_MODULE__ng_bootstrap_ng_bootstrap__, __WEBPACK_EXTERNAL_MODULE_fs__) => {\nreturn ","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../node_modules/css-loader/dist/runtime/cssWithMappingToString.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"@charset \\\"UTF-8\\\";\\n/* 快捷脚本按钮栏样式 */\\n.quick-scripts-bar {\\n display: flex;\\n align-items: center;\\n padding: 2px 8px;\\n background: rgba(0, 0, 0, 0.15);\\n border-bottom: 1px solid rgba(255, 255, 255, 0.06);\\n gap: 4px;\\n flex-shrink: 0;\\n overflow-x: auto;\\n min-height: 30px;\\n /* 脚本按钮通用样式 */\\n}\\n.quick-scripts-bar .script-btn {\\n display: inline-flex;\\n align-items: center;\\n padding: 2px 10px;\\n font-size: 12px;\\n line-height: 1.4;\\n color: #ccc;\\n background: rgba(255, 255, 255, 0.08);\\n border: 1px solid rgba(255, 255, 255, 0.12);\\n border-radius: 3px;\\n cursor: pointer;\\n white-space: nowrap;\\n user-select: none;\\n transition: all 0.15s ease;\\n}\\n.quick-scripts-bar .script-btn:hover {\\n color: #fff;\\n background: rgba(255, 255, 255, 0.15);\\n border-color: rgba(255, 255, 255, 0.25);\\n}\\n.quick-scripts-bar .script-btn:active {\\n background: rgba(255, 255, 255, 0.2);\\n}\\n.quick-scripts-bar .script-btn {\\n /* 正在执行中的按钮状态 */\\n}\\n.quick-scripts-bar .script-btn.running {\\n color: #4fc3f7;\\n border-color: #4fc3f7;\\n background: rgba(79, 195, 247, 0.12);\\n cursor: not-allowed;\\n animation: pulse 1.5s infinite;\\n}\\n.quick-scripts-bar {\\n /* 新建按钮 - 固定为红色 */\\n}\\n.quick-scripts-bar .script-btn-add {\\n display: inline-flex;\\n align-items: center;\\n justify-content: center;\\n width: 24px;\\n height: 22px;\\n padding: 0;\\n font-size: 16px;\\n font-weight: bold;\\n color: #fff;\\n background: #e74c3c;\\n border: 1px solid rgba(0, 0, 0, 0.1);\\n border-radius: 3px;\\n cursor: pointer;\\n transition: all 0.15s ease;\\n flex-shrink: 0;\\n}\\n.quick-scripts-bar .script-btn-add:hover {\\n background: #c0392b;\\n border-color: rgba(0, 0, 0, 0.2);\\n}\\n\\n/* 执行中的脉冲动画 */\\n@keyframes pulse {\\n 0%, 100% {\\n opacity: 1;\\n }\\n 50% {\\n opacity: 0.6;\\n }\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/quickScriptsBar.scss\"],\"names\":[],\"mappings\":\"AAAA,gBAAgB;AAAhB,cAAA;AACA;EACI,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,+BAAA;EACA,kDAAA;EACA,QAAA;EACA,cAAA;EACA,gBAAA;EACA,gBAAA;EAEA,aAAA;AACJ;AAAI;EACI,oBAAA;EACA,mBAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,WAAA;EACA,qCAAA;EACA,2CAAA;EACA,kBAAA;EACA,eAAA;EACA,mBAAA;EACA,iBAAA;EACA,0BAAA;AAER;AAAQ;EACI,WAAA;EACA,qCAAA;EACA,uCAAA;AAEZ;AACQ;EACI,oCAAA;AACZ;AAvBI;EAyBI,eAAA;AACR;AAAQ;EACI,cAAA;EACA,qBAAA;EACA,oCAAA;EACA,mBAAA;EACA,8BAAA;AAEZ;AA7CA;EA+CI,iBAAA;AACJ;AAAI;EACI,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,WAAA;EACA,YAAA;EACA,UAAA;EACA,eAAA;EACA,iBAAA;EACA,WAAA;EACA,mBAAA;EACA,oCAAA;EACA,kBAAA;EACA,eAAA;EACA,0BAAA;EACA,cAAA;AAER;AAAQ;EACI,mBAAA;EACA,gCAAA;AAEZ;;AAGA,aAAA;AACA;EACI;IAAW,UAAA;EACb;EAAE;IAAM,YAAA;EAGR;AACF\",\"sourcesContent\":[\"/* 快捷脚本按钮栏样式 */\\r\\n.quick-scripts-bar {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n padding: 2px 8px;\\r\\n background: rgba(0, 0, 0, 0.15);\\r\\n border-bottom: 1px solid rgba(255, 255, 255, 0.06);\\r\\n gap: 4px;\\r\\n flex-shrink: 0;\\r\\n overflow-x: auto;\\r\\n min-height: 30px;\\r\\n\\r\\n /* 脚本按钮通用样式 */\\r\\n .script-btn {\\r\\n display: inline-flex;\\r\\n align-items: center;\\r\\n padding: 2px 10px;\\r\\n font-size: 12px;\\r\\n line-height: 1.4;\\r\\n color: #ccc;\\r\\n background: rgba(255, 255, 255, 0.08);\\r\\n border: 1px solid rgba(255, 255, 255, 0.12);\\r\\n border-radius: 3px;\\r\\n cursor: pointer;\\r\\n white-space: nowrap;\\r\\n user-select: none;\\r\\n transition: all 0.15s ease;\\r\\n\\r\\n &:hover {\\r\\n color: #fff;\\r\\n background: rgba(255, 255, 255, 0.15);\\r\\n border-color: rgba(255, 255, 255, 0.25);\\r\\n }\\r\\n\\r\\n &:active {\\r\\n background: rgba(255, 255, 255, 0.2);\\r\\n }\\r\\n\\r\\n /* 正在执行中的按钮状态 */\\r\\n &.running {\\r\\n color: #4fc3f7;\\r\\n border-color: #4fc3f7;\\r\\n background: rgba(79, 195, 247, 0.12);\\r\\n cursor: not-allowed;\\r\\n animation: pulse 1.5s infinite;\\r\\n }\\r\\n }\\r\\n\\r\\n /* 新建按钮 - 固定为红色 */\\r\\n .script-btn-add {\\r\\n display: inline-flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n width: 24px;\\r\\n height: 22px;\\r\\n padding: 0;\\r\\n font-size: 16px;\\r\\n font-weight: bold;\\r\\n color: #fff;\\r\\n background: #e74c3c;\\r\\n border: 1px solid rgba(0, 0, 0, 0.1);\\r\\n border-radius: 3px;\\r\\n cursor: pointer;\\r\\n transition: all 0.15s ease;\\r\\n flex-shrink: 0;\\r\\n\\r\\n &:hover {\\r\\n background: #c0392b;\\r\\n border-color: rgba(0, 0, 0, 0.2);\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n/* 执行中的脉冲动画 */\\r\\n@keyframes pulse {\\r\\n 0%, 100% { opacity: 1; }\\r\\n 50% { opacity: 0.6; }\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\n// css base code, injected by the css-loader\n// eslint-disable-next-line func-names\nmodule.exports = function (cssWithMappingToString) {\n var list = []; // return the list of modules as css string\n\n list.toString = function toString() {\n return this.map(function (item) {\n var content = cssWithMappingToString(item);\n\n if (item[2]) {\n return \"@media \".concat(item[2], \" {\").concat(content, \"}\");\n }\n\n return content;\n }).join(\"\");\n }; // import a list of modules into the list\n // eslint-disable-next-line func-names\n\n\n list.i = function (modules, mediaQuery, dedupe) {\n if (typeof modules === \"string\") {\n // eslint-disable-next-line no-param-reassign\n modules = [[null, modules, \"\"]];\n }\n\n var alreadyImportedModules = {};\n\n if (dedupe) {\n for (var i = 0; i < this.length; i++) {\n // eslint-disable-next-line prefer-destructuring\n var id = this[i][0];\n\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n\n for (var _i = 0; _i < modules.length; _i++) {\n var item = [].concat(modules[_i]);\n\n if (dedupe && alreadyImportedModules[item[0]]) {\n // eslint-disable-next-line no-continue\n continue;\n }\n\n if (mediaQuery) {\n if (!item[2]) {\n item[2] = mediaQuery;\n } else {\n item[2] = \"\".concat(mediaQuery, \" and \").concat(item[2]);\n }\n }\n\n list.push(item);\n }\n };\n\n return list;\n};","\"use strict\";\n\nfunction _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }\n\nfunction _nonIterableRest() { throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\n\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\n\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }\n\nfunction _iterableToArrayLimit(arr, i) { var _i = arr && (typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"]); if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"] != null) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; }\n\nfunction _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }\n\nmodule.exports = function cssWithMappingToString(item) {\n var _item = _slicedToArray(item, 4),\n content = _item[1],\n cssMapping = _item[3];\n\n if (!cssMapping) {\n return content;\n }\n\n if (typeof btoa === \"function\") {\n // eslint-disable-next-line no-undef\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n var sourceURLs = cssMapping.sources.map(function (source) {\n return \"/*# sourceURL=\".concat(cssMapping.sourceRoot || \"\").concat(source, \" */\");\n });\n return [content].concat(sourceURLs).concat([sourceMapping]).join(\"\\n\");\n }\n\n return [content].join(\"\\n\");\n};","import api from \"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import content from \"!!../node_modules/css-loader/dist/cjs.js!../node_modules/sass-loader/dist/cjs.js!./quickScriptsBar.scss\";\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nexport default content.locals || {};","\"use strict\";\n\nvar isOldIE = function isOldIE() {\n var memo;\n return function memorize() {\n if (typeof memo === 'undefined') {\n // Test for IE <= 9 as proposed by Browserhacks\n // @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805\n // Tests for existence of standard globals is to allow style-loader\n // to operate correctly into non-standard environments\n // @see https://github.com/webpack-contrib/style-loader/issues/177\n memo = Boolean(window && document && document.all && !window.atob);\n }\n\n return memo;\n };\n}();\n\nvar getTarget = function getTarget() {\n var memo = {};\n return function memorize(target) {\n if (typeof memo[target] === 'undefined') {\n var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself\n\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n\n memo[target] = styleTarget;\n }\n\n return memo[target];\n };\n}();\n\nvar stylesInDom = [];\n\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n\n for (var i = 0; i < stylesInDom.length; i++) {\n if (stylesInDom[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n\n return result;\n}\n\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var index = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3]\n };\n\n if (index !== -1) {\n stylesInDom[index].references++;\n stylesInDom[index].updater(obj);\n } else {\n stylesInDom.push({\n identifier: identifier,\n updater: addStyle(obj, options),\n references: 1\n });\n }\n\n identifiers.push(identifier);\n }\n\n return identifiers;\n}\n\nfunction insertStyleElement(options) {\n var style = document.createElement('style');\n var attributes = options.attributes || {};\n\n if (typeof attributes.nonce === 'undefined') {\n var nonce = typeof __webpack_nonce__ !== 'undefined' ? __webpack_nonce__ : null;\n\n if (nonce) {\n attributes.nonce = nonce;\n }\n }\n\n Object.keys(attributes).forEach(function (key) {\n style.setAttribute(key, attributes[key]);\n });\n\n if (typeof options.insert === 'function') {\n options.insert(style);\n } else {\n var target = getTarget(options.insert || 'head');\n\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n\n target.appendChild(style);\n }\n\n return style;\n}\n\nfunction removeStyleElement(style) {\n // istanbul ignore if\n if (style.parentNode === null) {\n return false;\n }\n\n style.parentNode.removeChild(style);\n}\n/* istanbul ignore next */\n\n\nvar replaceText = function replaceText() {\n var textStore = [];\n return function replace(index, replacement) {\n textStore[index] = replacement;\n return textStore.filter(Boolean).join('\\n');\n };\n}();\n\nfunction applyToSingletonTag(style, index, remove, obj) {\n var css = remove ? '' : obj.media ? \"@media \".concat(obj.media, \" {\").concat(obj.css, \"}\") : obj.css; // For old IE\n\n /* istanbul ignore if */\n\n if (style.styleSheet) {\n style.styleSheet.cssText = replaceText(index, css);\n } else {\n var cssNode = document.createTextNode(css);\n var childNodes = style.childNodes;\n\n if (childNodes[index]) {\n style.removeChild(childNodes[index]);\n }\n\n if (childNodes.length) {\n style.insertBefore(cssNode, childNodes[index]);\n } else {\n style.appendChild(cssNode);\n }\n }\n}\n\nfunction applyToTag(style, options, obj) {\n var css = obj.css;\n var media = obj.media;\n var sourceMap = obj.sourceMap;\n\n if (media) {\n style.setAttribute('media', media);\n } else {\n style.removeAttribute('media');\n }\n\n if (sourceMap && typeof btoa !== 'undefined') {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n } // For old IE\n\n /* istanbul ignore if */\n\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n while (style.firstChild) {\n style.removeChild(style.firstChild);\n }\n\n style.appendChild(document.createTextNode(css));\n }\n}\n\nvar singleton = null;\nvar singletonCounter = 0;\n\nfunction addStyle(obj, options) {\n var style;\n var update;\n var remove;\n\n if (options.singleton) {\n var styleIndex = singletonCounter++;\n style = singleton || (singleton = insertStyleElement(options));\n update = applyToSingletonTag.bind(null, style, styleIndex, false);\n remove = applyToSingletonTag.bind(null, style, styleIndex, true);\n } else {\n style = insertStyleElement(options);\n update = applyToTag.bind(null, style, options);\n\n remove = function remove() {\n removeStyleElement(style);\n };\n }\n\n update(obj);\n return function updateStyle(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap) {\n return;\n }\n\n update(obj = newObj);\n } else {\n remove();\n }\n };\n}\n\nmodule.exports = function (list, options) {\n options = options || {}; // Force single-tag solution on IE6-9, which has a hard limit on the # of <style>\n // tags it will allow on a page\n\n if (!options.singleton && typeof options.singleton !== 'boolean') {\n options.singleton = isOldIE();\n }\n\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n\n if (Object.prototype.toString.call(newList) !== '[object Array]') {\n return;\n }\n\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDom[index].references--;\n }\n\n var newLastIdentifiers = modulesToDom(newList, options);\n\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n\n var _index = getIndexByIdentifier(_identifier);\n\n if (stylesInDom[_index].references === 0) {\n stylesInDom[_index].updater();\n\n stylesInDom.splice(_index, 1);\n }\n }\n\n lastIdentifiers = newLastIdentifiers;\n };\n};","import { ConfigProvider } from 'tabby-core'\r\n\r\n/** 快捷脚本接口定义 */\r\nexport interface QuickScript {\r\n name: string\r\n commands: string[]\r\n color?: string\r\n}\r\n\r\n/** 插件配置默认值 */\r\nexport class QuickScriptsConfigProvider extends ConfigProvider {\r\n defaults = {\r\n quickScriptsPlugin: {\r\n /** 全局备份脚本列表 */\r\n scripts: [] as QuickScript[],\r\n /** 站点隔离的脚本列表映射 (profileId -> scripts) */\r\n profileScripts: {} as Record<string, QuickScript[]>,\r\n /** 命令提示符正则(用于判断上一条命令执行完毕) */\r\n promptPattern: '(\\\\$|#|>|%)\\\\s*$',\r\n /** 超时时间(毫秒),超过此时间强制执行下一条命令 */\r\n commandTimeout: 30000,\r\n /** 发送命令前的最小延时(毫秒) */\r\n minDelay: 500,\r\n },\r\n sftpLocalFavorites: [] as Array<{ id: string, label: string, path: string }>,\r\n sftpRemoteFavorites: {} as Record<string, Array<{ id: string, label: string, path: string }>>,\r\n }\r\n\r\n\r\n}\r\n","let isChinese = false\ntry {\n const lang = (navigator?.language || process.env.LANG || '').toLowerCase()\n isChinese = lang.startsWith('zh')\n} catch {\n // ignore\n}\n\nexport function t(zhText: string, enText: string): string {\n return isChinese ? zhText : enText\n}\n\nexport function isZh(): boolean {\n return isChinese\n}\n","import { Component } from '@angular/core'\r\nimport { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'\r\n\r\n/**\r\n * 脚本编辑弹窗组件\r\n * 用于新建和编辑快捷脚本\r\n */\r\n@Component({\r\n template: `\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title\">{{ isNew ? '新建脚本' : '编辑脚本' }}</h5>\r\n <button type=\"button\" class=\"close\" (click)=\"cancel()\">\r\n <span>×</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"form-group\">\r\n <label>脚本名称</label>\r\n <input\r\n type=\"text\"\r\n class=\"form-control\"\r\n [(ngModel)]=\"scriptName\"\r\n placeholder=\"输入脚本名称\"\r\n autofocus\r\n />\r\n </div>\r\n <div class=\"form-group mt-3 d-flex align-items-center\">\r\n <label class=\"mb-0 mr-3\">标签颜色</label>\r\n <input\r\n type=\"color\"\r\n [(ngModel)]=\"scriptColor\"\r\n style=\"width: 40px; height: 28px; padding: 0; border: 1px solid rgba(255,255,255,0.2); cursor: pointer; background: transparent; border-radius: 3px;\"\r\n />\r\n </div>\r\n <div class=\"form-group mt-3\">\r\n <label>命令列表 <small class=\"text-muted\">(一行一条命令,按顺序执行)</small></label>\r\n <textarea\r\n class=\"form-control\"\r\n [(ngModel)]=\"commandsText\"\r\n rows=\"10\"\r\n placeholder=\"cd /tmp ls -la whoami\"\r\n style=\"font-family: monospace; font-size: 13px;\"\r\n ></textarea>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button *ngIf=\"!isNew\" class=\"btn btn-danger mr-auto\" (click)=\"deleteScript()\">\r\n 删除脚本\r\n </button>\r\n <button class=\"btn btn-outline-secondary\" (click)=\"cancel()\">取消</button>\r\n <button class=\"btn btn-primary\" (click)=\"save()\" [disabled]=\"!scriptName.trim()\">\r\n 保存\r\n </button>\r\n </div>\r\n `,\r\n})\r\nexport class ScriptEditModalComponent {\r\n /** 脚本名称 */\r\n scriptName = ''\r\n\r\n /** 命令文本(换行分隔) */\r\n commandsText = ''\r\n\r\n /** 标签颜色 */\r\n scriptColor = '#5588cc'\r\n\r\n /** 是否为新建模式 */\r\n isNew = true\r\n\r\n constructor (private modalInstance: NgbActiveModal) {}\r\n\r\n /** 保存并关闭弹窗 */\r\n save (): void {\r\n const commands = this.commandsText\r\n .split('\\n')\r\n .map(line => line.trimEnd())\r\n .filter(line => line.length > 0)\r\n\r\n this.modalInstance.close({\r\n action: 'save',\r\n name: this.scriptName.trim(),\r\n commands,\r\n color: this.scriptColor,\r\n })\r\n }\r\n\r\n /** 删除脚本 */\r\n deleteScript (): void {\r\n this.modalInstance.close({\r\n action: 'delete',\r\n })\r\n }\r\n\r\n /** 取消操作 */\r\n cancel (): void {\r\n this.modalInstance.dismiss()\r\n }\r\n}\r\n","import * as fs from 'fs'\r\nimport * as path from 'path'\r\n\r\nimport { FileDownload, FileUpload } from 'tabby-core'\r\n\r\nexport class LocalPathFileUpload extends FileUpload {\r\n private fd: number | null = null\r\n private position = 0\r\n\r\n constructor (private filePath: string) {\r\n super()\r\n }\r\n\r\n getName (): string {\r\n return path.basename(this.filePath)\r\n }\r\n\r\n getMode (): number {\r\n return 0o644\r\n }\r\n\r\n getSize (): number {\r\n try {\r\n return fs.statSync(this.filePath).size\r\n } catch {\r\n return 0\r\n }\r\n }\r\n\r\n async read (): Promise<Buffer> {\r\n if (this.isCancelled()) {\r\n return Buffer.alloc(0)\r\n }\r\n if (this.fd === null) {\r\n this.fd = fs.openSync(this.filePath, 'r')\r\n }\r\n const buf = Buffer.allocUnsafe(256 * 1024)\r\n const bytesRead = fs.readSync(this.fd, buf, 0, buf.length, this.position)\r\n if (!bytesRead) {\r\n return Buffer.alloc(0)\r\n }\r\n this.position += bytesRead\r\n this.increaseProgress(bytesRead)\r\n return buf.subarray(0, bytesRead)\r\n }\r\n\r\n close (): void {\r\n if (this.fd !== null) {\r\n try {\r\n fs.closeSync(this.fd)\r\n } catch {\r\n // ignore\r\n }\r\n this.fd = null\r\n }\r\n }\r\n}\r\n\r\nexport class LocalPathFileDownload extends FileDownload {\r\n private fd: number | null = null\r\n\r\n constructor (private targetPath: string, private mode: number, private size: number) {\r\n super()\r\n }\r\n\r\n getName (): string {\r\n return path.basename(this.targetPath)\r\n }\r\n\r\n getMode (): number {\r\n return this.mode\r\n }\r\n\r\n getSize (): number {\r\n return this.size\r\n }\r\n\r\n async write (buffer: Buffer): Promise<void> {\r\n if (this.isCancelled()) {\r\n return\r\n }\r\n if (this.fd === null) {\r\n this.fd = fs.openSync(this.targetPath, 'w')\r\n }\r\n fs.writeSync(this.fd, buffer)\r\n this.increaseProgress(buffer.length)\r\n }\r\n\r\n close (): void {\r\n if (this.fd !== null) {\r\n try {\r\n fs.closeSync(this.fd)\r\n } catch {\r\n // ignore\r\n }\r\n this.fd = null\r\n }\r\n }\r\n}\r\n\r\n","import * as path from 'path'\r\nimport * as os from 'os'\r\nimport * as fs from 'fs/promises'\r\nimport * as fsSync from 'fs'\r\nimport * as crypto from 'crypto'\r\n\r\nimport { Component, Injector, OnInit, HostListener } from '@angular/core'\r\nimport { AppService, BaseTabComponent, ConfigService, FileTransfer, FileUpload, NotificationsService, PlatformService, ProfilesService } from 'tabby-core'\r\n\r\n\r\nimport { t } from '../i18n'\r\nimport { LocalPathFileDownload, LocalPathFileUpload } from './local-transfers'\r\nimport { SftpConnectionService, SFTPFile, SFTPSessionLike, SSHSessionLike } from './sftp.service'\r\n\r\ntype LocalEntry = {\r\n name: string\r\n fullPath: string\r\n isDirectory: boolean\r\n size?: number\r\n mtimeMs?: number\r\n}\r\n\r\ntype DragPayload = {\r\n kind: 'local-file' | 'local-paths' | 'remote-file' | 'remote-dir' | 'remote-paths'\r\n fullPath?: string\r\n name?: string\r\n size?: number\r\n mode?: number\r\n remotePath?: string\r\n paths?: Array<{ fullPath?: string, remotePath?: string, name: string, isDirectory: boolean, size?: number, mode?: number }>\r\n}\r\n\r\n\r\n@Component({\r\n selector: 'tabby-sftp-manager-tab',\r\n template: `\r\n <div class=\"sftp-root\" tabindex=\"0\" (keydown)=\"onKeyDown($event)\">\r\n <div class=\"top-profiles\" *ngIf=\"profile || recentProfiles.length\">\r\n <div class=\"current\" *ngIf=\"profile\">\r\n <span class=\"label\">Device:</span>\r\n <span class=\"value\">{{ getProfileLabel(profile) }}</span>\r\n </div>\r\n <div class=\"recent\" *ngIf=\"recentProfiles.length\">\r\n <span class=\"label\">Recent:</span>\r\n <button\r\n class=\"profile-chip\"\r\n *ngFor=\"let p of recentProfiles\"\r\n (click)=\"launchProfileFromSFTP(p)\"\r\n >\r\n {{ getProfileLabel(p) }}\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"sftp-body\">\r\n <div class=\"pane\">\r\n <div class=\"pane-title\">\r\n <div class=\"pane-label\">Local</div>\r\n <div class=\"pane-path\">\r\n <input\r\n [(ngModel)]=\"localPathInput\"\r\n (keyup.enter)=\"goToLocalPathInput()\"\r\n />\r\n </div>\r\n <div class=\"pane-actions\">\r\n <button\r\n class=\"fav-toggle\"\r\n [class.active]=\"isCurrentFavorite()\"\r\n (click)=\"toggleCurrentFavorite()\"\r\n title=\"Toggle favorite for this path\"\r\n >\r\n ★\r\n </button>\r\n\r\n <div class=\"fav-dropdown\" style=\"position: relative; display: inline-block;\">\r\n <button class=\"fav-dropdown-btn\" (click)=\"toggleFavDropdown()\" style=\"padding: 2px 20px 2px 10px; font-size: 12px; background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.12); border-radius: 3px; color: #ccc; cursor: pointer; min-width: 240px; text-align: left; position: relative;\">\r\n {{ getSelectedFavLabel() }}\r\n <span style=\"position: absolute; right: 6px; top: 50%; transform: translateY(-50%);\">▾</span>\r\n </button>\r\n <div class=\"fav-dropdown-menu\" *ngIf=\"favDropdownOpen\" style=\"position: absolute; top: 100%; left: 0; z-index: 1000; background: #1e1e1e; border: 1px solid #333; border-radius: 3px; min-width: 240px; box-shadow: 0 4px 8px rgba(0,0,0,0.5); max-height: 200px; overflow-y: auto;\">\r\n <div class=\"fav-dropdown-item\" style=\"padding: 5px 10px; font-size: 12px; color: #ccc; cursor: pointer; background: #1e1e1e;\" (click)=\"toggleFavDropdown()\">\r\n <em>====</em>\r\n </div>\r\n\r\n <div class=\"fav-dropdown-item\" *ngFor=\"let f of localFavorites\" \r\n style=\"padding: 5px 10px; font-size: 12px; color: #ccc; cursor: pointer; display: flex; justify-content: space-between; align-items: center;\"\r\n (click)=\"onLocalFavoriteSelect(f.id); toggleFavDropdown()\">\r\n <span>{{ f.label }}</span>\r\n <span style=\"color: #ffc107; border: 1px solid rgba(255, 193, 7, 0.5); border-radius: 4px; padding: 1px 6px; font-size: 11px; cursor: pointer; transition: all 0.2s;\" \r\n (click)=\"onFavEditNameClick($event, f)\"\r\n (mouseover)=\"$event.target.style.borderColor='#ffc107'; $event.target.style.background='rgba(255, 193, 7, 0.15)'\"\r\n (mouseout)=\"$event.target.style.borderColor='rgba(255, 193, 7, 0.5)'; $event.target.style.background='transparent'\">✎</span>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n\r\n <button (click)=\"refreshLocal()\">Refresh</button>\r\n </div>\r\n\r\n </div>\r\n <div class=\"pane-filters\">\r\n <div class=\"breadcrumbs\">\r\n <ng-container *ngFor=\"let part of getLocalBreadcrumbs(); let i = index; let last = last\">\r\n <button\r\n class=\"crumb-button\"\r\n (click)=\"navigateLocalBreadcrumb(i)\"\r\n (contextmenu)=\"onLocalBreadcrumbContextMenu(i, $event)\"\r\n >\r\n {{ part.label }}\r\n </button>\r\n <span class=\"crumb-separator\" *ngIf=\"!last\">›</span>\r\n </ng-container>\r\n </div>\r\n <input [(ngModel)]=\"localFilter\" placeholder=\"Filter files...\" />\r\n <label class=\"show-hidden-toggle\">\r\n <input type=\"checkbox\" [(ngModel)]=\"showHiddenLocal\" />\r\n <span>Show hidden</span>\r\n </label>\r\n </div>\r\n <div class=\"pane-list\"\r\n (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDropOnLocal($event)\"\r\n >\r\n <div class=\"entry header\">\r\n <span class=\"icon\"></span>\r\n <span class=\"name sortable\" (click)=\"setLocalSort('name')\">{{ t('名称', 'Name') }}</span>\r\n <span class=\"size sortable\" (click)=\"setLocalSort('size')\">{{ t('大小', 'Size') }}</span>\r\n <span class=\"date sortable\" (click)=\"setLocalSort('modified')\">{{ t('修改时间', 'Modified') }}</span>\r\n </div>\r\n <div\r\n class=\"entry\"\r\n *ngIf=\"canLocalUp()\"\r\n (dblclick)=\"localUp()\"\r\n >\r\n <span class=\"icon\">⬆</span>\r\n <span class=\"name\">{{ t('返回上级', 'Go up') }}</span>\r\n <span class=\"size\"></span>\r\n <span class=\"date\"></span>\r\n </div>\r\n <div\r\n class=\"entry\"\r\n *ngFor=\"let e of getFilteredLocalEntries()\"\r\n (click)=\"selectLocal(e, $event)\"\r\n (dblclick)=\"openLocal(e)\"\r\n (mousedown)=\"onLocalMouseDown(e, $event)\"\r\n (contextmenu)=\"onLocalContextMenu(e, $event)\"\r\n (dragover)=\"onLocalEntryDragOver(e, $event)\"\r\n (drop)=\"onLocalEntryDrop(e, $event)\"\r\n [class.drop-target]=\"localDropActive\"\r\n [class.selected]=\"isLocalSelected(e)\"\r\n [draggable]=\"true\"\r\n (dragstart)=\"onDragStartLocal($event, e)\"\r\n >\r\n <span class=\"icon\">{{ e.isDirectory ? '📁' : '📄' }}</span>\r\n <span class=\"name\">{{ e.name }}</span>\r\n <span class=\"size\">{{ getLocalSizeDisplay(e) }}</span>\r\n <span class=\"date\">\r\n <ng-container *ngIf=\"getDateColorParts(e.mtimeMs) as parts\">\r\n <span [style.color]=\"parts.dateMatch ? '#FBF732' : 'inherit'\">{{ parts.date }}</span>\r\n <span>_</span>\r\n <span [style.color]=\"parts.hourMatch ? '#FBF732' : 'inherit'\">{{ parts.hour }}</span>\r\n <span [style.color]=\"parts.minuteMatch ? '#FBF732' : 'inherit'\">:{{ parts.minute }}</span>\r\n </ng-container>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"pane-actions-bar\">\r\n <div class=\"selection\" *ngIf=\"selectedLocal.length\">\r\n Selected: {{ selectedLocal.length === 1 ? selectedLocal[0].name : (selectedLocal.length + ' items') }}\r\n </div>\r\n <div class=\"action-inputs\">\r\n <input [(ngModel)]=\"localActionName\" placeholder=\"Name / new name\" />\r\n <input [(ngModel)]=\"localActionPerms\" placeholder=\"Perms (e.g. 755)\" />\r\n </div>\r\n <div class=\"action-buttons\">\r\n <button (click)=\"localRename()\" [disabled]=\"selectedLocal.length !== 1\">{{ t('重命名', 'Rename') }}</button>\r\n <button (click)=\"refreshLocal()\">{{ t('刷新', 'Refresh') }}</button>\r\n <button (click)=\"localDelete()\" [disabled]=\"!selectedLocal.length\">{{ t('删除', 'Delete') }}</button>\r\n <button (click)=\"localNewFolder()\">{{ t('新建文件夹', 'New Folder') }}</button>\r\n <button (click)=\"localEditPermissions()\" [disabled]=\"selectedLocal.length !== 1\">{{ t('修改权限', 'Edit Permissions') }}</button>\r\n <button (click)=\"localShowSize()\" [disabled]=\"selectedLocal.length !== 1 || !selectedLocal[0].isDirectory\">{{ t('查看大小', 'Show Size') }}</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"pane remote-pane\">\r\n <div class=\"pane-title\">\r\n <div class=\"pane-label\">\r\n Remote\r\n <span *ngIf=\"connected && profile?.options?.host\" class=\"pane-sub\">\r\n — {{ profile.options.host }}\r\n </span>\r\n </div>\r\n <div class=\"pane-path\">\r\n <input\r\n [(ngModel)]=\"remotePathInput\"\r\n (keyup.enter)=\"goToRemotePathInput()\"\r\n [disabled]=\"!connected\"\r\n />\r\n </div>\r\n <div class=\"pane-actions\">\r\n <button\r\n class=\"fav-toggle\"\r\n [disabled]=\"!connected\"\r\n [class.active]=\"isCurrentRemoteFavorite()\"\r\n (click)=\"toggleCurrentRemoteFavorite()\"\r\n title=\"Toggle favorite for this path\"\r\n >\r\n ★\r\n </button>\r\n\r\n <div class=\"fav-dropdown\" *ngIf=\"connected\" style=\"position: relative; display: inline-block;\">\r\n <button class=\"fav-dropdown-btn\" (click)=\"toggleRemoteFavDropdown()\" style=\"padding: 2px 20px 2px 10px; font-size: 12px; background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.12); border-radius: 3px; color: #ccc; cursor: pointer; min-width: 240px; text-align: left; position: relative;\">\r\n {{ getSelectedRemoteFavLabel() }}\r\n <span style=\"position: absolute; right: 6px; top: 50%; transform: translateY(-50%);\">▾</span>\r\n </button>\r\n <div class=\"fav-dropdown-menu\" *ngIf=\"remoteDropdownOpen\" style=\"position: absolute; top: 100%; left: 0; z-index: 1000; background: #1e1e1e; border: 1px solid #333; border-radius: 3px; min-width: 240px; box-shadow: 0 4px 8px rgba(0,0,0,0.5); max-height: 200px; overflow-y: auto;\">\r\n <div class=\"fav-dropdown-item\" style=\"padding: 5px 10px; font-size: 12px; color: #ccc; cursor: pointer; background: #1e1e1e;\" (click)=\"toggleRemoteFavDropdown()\">\r\n <em>====</em>\r\n </div>\r\n\r\n <div class=\"fav-dropdown-item\" *ngFor=\"let f of remoteFavorites\" \r\n style=\"padding: 5px 10px; font-size: 12px; color: #ccc; cursor: pointer; display: flex; justify-content: space-between; align-items: center;\"\r\n (click)=\"onRemoteFavoriteSelect(f.id); toggleRemoteFavDropdown()\">\r\n <span>{{ f.label }}</span>\r\n <span style=\"color: #ffc107; border: 1px solid rgba(255, 193, 7, 0.5); border-radius: 4px; padding: 1px 6px; font-size: 11px; cursor: pointer; transition: all 0.2s;\" \r\n (click)=\"onRemoteFavEditNameClick($event, f)\"\r\n (mouseover)=\"$event.target.style.borderColor='#ffc107'; $event.target.style.background='rgba(255, 193, 7, 0.15)'\"\r\n (mouseout)=\"$event.target.style.borderColor='rgba(255, 193, 7, 0.5)'; $event.target.style.background='transparent'\">✎</span>\r\n </div>\r\n\r\n </div>\r\n </div>\r\n\r\n <button (click)=\"refreshRemote()\" [disabled]=\"!connected\">Refresh</button>\r\n </div>\r\n\r\n </div>\r\n <div class=\"pane-filters\">\r\n <div class=\"breadcrumbs\" *ngIf=\"connected\">\r\n <ng-container *ngFor=\"let part of getRemoteBreadcrumbs(); let i = index; let last = last\">\r\n <button\r\n class=\"crumb-button\"\r\n (click)=\"navigateRemoteBreadcrumb(i)\"\r\n >\r\n {{ part.label }}\r\n </button>\r\n <span class=\"crumb-separator\" *ngIf=\"!last\">›</span>\r\n </ng-container>\r\n </div>\r\n <input [(ngModel)]=\"remoteFilter\" placeholder=\"Filter files...\" />\r\n <label class=\"show-hidden-toggle\">\r\n <input type=\"checkbox\" [(ngModel)]=\"showHiddenRemote\" />\r\n <span>Show hidden</span>\r\n </label>\r\n </div>\r\n <div class=\"pane-list\"\r\n (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDropOnRemote($event)\"\r\n >\r\n <div class=\"entry dim\" *ngIf=\"!connected\">\r\n <span class=\"name\">Not connected</span>\r\n </div>\r\n <div class=\"entry header\" *ngIf=\"connected\">\r\n <span class=\"icon\"></span>\r\n <span class=\"name sortable\" (click)=\"setRemoteSort('name')\">{{ t('名称', 'Name') }}</span>\r\n <span class=\"size sortable\" (click)=\"setRemoteSort('size')\">{{ t('大小', 'Size') }}</span>\r\n <span class=\"perms\">{{ t('权限', 'Perms') }}</span>\r\n <span class=\"date sortable\" (click)=\"setRemoteSort('modified')\">{{ t('修改时间', 'Modified') }}</span>\r\n </div>\r\n <div\r\n class=\"entry\"\r\n *ngIf=\"connected && remotePath !== '/'\"\r\n (dblclick)=\"remoteUp()\"\r\n >\r\n <span class=\"icon\">⬆</span>\r\n <span class=\"name\">{{ t('返回上级', 'Go up') }}</span>\r\n <span class=\"size\"></span>\r\n <span class=\"date\"></span>\r\n </div>\r\n <div\r\n class=\"entry\"\r\n *ngFor=\"let e of getFilteredRemoteEntries()\"\r\n (click)=\"selectRemote(e, $event)\"\r\n (dblclick)=\"openRemote(e)\"\r\n (mousedown)=\"onRemoteMouseDown(e, $event)\"\r\n (contextmenu)=\"onRemoteContextMenu(e, $event)\"\r\n (dragover)=\"onRemoteEntryDragOver(e, $event)\"\r\n (drop)=\"onRemoteEntryDrop(e, $event)\"\r\n [class.drop-target]=\"remoteDropActive\"\r\n [class.selected]=\"isRemoteSelected(e)\"\r\n [draggable]=\"connected\"\r\n (dragstart)=\"onDragStartRemote($event, e)\"\r\n >\r\n <span class=\"icon\">{{ e.isDirectory ? '📁' : '📄' }}</span>\r\n <span class=\"name\">{{ e.name }}</span>\r\n <span class=\"size\">{{ getRemoteSizeDisplay(e) }}</span>\r\n <span class=\"perms\">{{ getOctalPerms(e.mode) }}</span>\r\n <span class=\"date\">\r\n <ng-container *ngIf=\"getDateColorParts(e.modified) as parts\">\r\n <span [style.color]=\"parts.dateMatch ? '#FBF732' : 'inherit'\">{{ parts.date }}</span>\r\n <span>_</span>\r\n <span [style.color]=\"parts.hourMatch ? '#FBF732' : 'inherit'\">{{ parts.hour }}</span>\r\n <span [style.color]=\"parts.minuteMatch ? '#FBF732' : 'inherit'\">:{{ parts.minute }}</span>\r\n </ng-container>\r\n </span>\r\n </div>\r\n </div>\r\n <div class=\"pane-actions-bar\">\r\n <div class=\"selection\" *ngIf=\"selectedRemote.length\">\r\n Selected: {{ selectedRemote.length === 1 ? selectedRemote[0].name : (selectedRemote.length + ' items') }}\r\n </div>\r\n <div class=\"action-inputs\">\r\n <input [(ngModel)]=\"remoteActionName\" placeholder=\"Name / new name\" />\r\n <input [(ngModel)]=\"remoteActionPerms\" placeholder=\"Perms (e.g. 755)\" />\r\n </div>\r\n <div class=\"action-buttons\">\r\n <button (click)=\"remoteRename()\" [disabled]=\"selectedRemote.length !== 1\">{{ t('重命名', 'Rename') }}</button>\r\n <button (click)=\"refreshRemote()\" [disabled]=\"!connected\">{{ t('刷新', 'Refresh') }}</button>\r\n <button (click)=\"remoteDelete()\" [disabled]=\"!selectedRemote.length\">{{ t('删除', 'Delete') }}</button>\r\n <button (click)=\"remoteNewFolder()\" [disabled]=\"!connected\">{{ t('新建文件夹', 'New Folder') }}</button>\r\n <button (click)=\"remoteEditPermissions()\" [disabled]=\"selectedRemote.length !== 1\">{{ t('修改权限', 'Edit Permissions') }}</button>\r\n <button (click)=\"remoteShowSize()\" [disabled]=\"selectedRemote.length !== 1 || !selectedRemote[0].isDirectory\">{{ t('查看大小', 'Show Size') }}</button>\r\n <button (click)=\"remoteDownload()\" [disabled]=\"!selectedRemote.length\">{{ t('下载', 'Download') }}</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"sftp-transfers\" *ngIf=\"transfers.length\">\r\n <div class=\"transfer\" *ngFor=\"let t of transfers\">\r\n <div class=\"transfer-main\">\r\n <div class=\"transfer-title\">\r\n <span class=\"direction\">{{ t.direction === 'upload' ? 'Upload' : 'Download' }}</span>\r\n <span class=\"name\">{{ t.name }}</span>\r\n </div>\r\n <div class=\"transfer-path\">\r\n <span class=\"label\">Remote:</span>\r\n <span class=\"value\">{{ t.remotePath }}</span>\r\n </div>\r\n <div class=\"transfer-path\">\r\n <span class=\"label\">Local:</span>\r\n <span class=\"value\">{{ t.localPath }}</span>\r\n </div>\r\n <div class=\"bar\">\r\n <div class=\"fill\" [style.width.%]=\"getTransferProgress(t.transfer)\"></div>\r\n </div>\r\n </div>\r\n <div class=\"transfer-stats\">\r\n <div class=\"percent\">{{ getTransferProgress(t.transfer) | number:'1.0-0' }}%</div>\r\n <div class=\"speed\">{{ formatSpeed(t.transfer.getSpeed()) }}</div>\r\n <button class=\"btn-cancel\" (click)=\"cancelTransfer(t)\" [disabled]=\"t.transfer.isComplete() || t.transfer.isCancelled()\">Cancel</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"delete-overlay\" *ngIf=\"deleteConfirmVisible\">\r\n <div class=\"delete-dialog\">\r\n <div class=\"delete-text\">{{ deleteConfirmText }}</div>\r\n <div class=\"delete-buttons\">\r\n <button class=\"danger\" (click)=\"confirmDelete()\">Delete</button>\r\n <button (click)=\"cancelDelete()\">Cancel</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"delete-overlay\" *ngIf=\"replaceConfirmVisible\">\r\n <div class=\"delete-dialog\">\r\n <div class=\"delete-text\">{{ replaceConfirmText }}</div>\r\n <div class=\"delete-buttons\">\r\n <button class=\"danger\" (click)=\"confirmReplace()\">Replace</button>\r\n <button (click)=\"cancelReplace()\">Cancel</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"delete-overlay\" *ngIf=\"inputDialogVisible\">\r\n <div class=\"delete-dialog\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"delete-text\">{{ inputDialogTitle }}</div>\r\n <ng-container *ngIf=\"inputDialogMode === 'local-favorite-rename' || inputDialogMode === 'remote-favorite-rename'\">\r\n <div style=\"margin-bottom: 4px; font-size: 12px; color: #aaa; text-align: left;\">{{ t('名称', 'Name') }}:</div>\r\n <input\r\n class=\"dialog-input\"\r\n style=\"margin-bottom: 12px; width: 100%;\"\r\n [(ngModel)]=\"inputDialogValue\"\r\n [placeholder]=\"t('名称', 'Name')\"\r\n />\r\n <div style=\"margin-bottom: 4px; font-size: 12px; color: #aaa; text-align: left;\">{{ t('路径', 'Path') }}:</div>\r\n <input\r\n class=\"dialog-input\"\r\n style=\"width: 100%;\"\r\n [(ngModel)]=\"inputDialogPathValue\"\r\n [placeholder]=\"t('路径', 'Path')\"\r\n (keyup.enter)=\"confirmInputDialog()\"\r\n />\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"inputDialogMode !== 'local-favorite-rename' && inputDialogMode !== 'remote-favorite-rename'\">\r\n <input\r\n class=\"dialog-input\"\r\n [(ngModel)]=\"inputDialogValue\"\r\n [placeholder]=\"inputDialogPlaceholder\"\r\n (keyup.enter)=\"confirmInputDialog()\"\r\n />\r\n </ng-container>\r\n\r\n <div class=\"delete-buttons\">\r\n <button class=\"danger\" (click)=\"confirmInputDialog()\" [disabled]=\"!inputDialogValue.trim()\">OK</button>\r\n <button class=\"danger\" *ngIf=\"inputDialogMode === 'local-favorite-rename' || inputDialogMode === 'remote-favorite-rename'\" (click)=\"deleteFavoriteFromDialog()\" style=\"background-color: #dc3545; border-color: #dc3545; margin-left: 5px; margin-right: 5px;\">Delete</button>\r\n <button (click)=\"cancelInputDialog()\">Cancel</button>\r\n </div>\r\n\r\n\r\n </div>\r\n </div>\r\n\r\n <div class=\"delete-overlay\" *ngIf=\"favDeleteConfirmVisible\">\r\n <div class=\"delete-dialog\">\r\n <div class=\"delete-text\">{{ favDeleteConfirmText }}</div>\r\n <div class=\"delete-buttons\">\r\n <button class=\"danger\" (click)=\"confirmFavDelete()\">Delete</button>\r\n <button (click)=\"cancelFavDelete()\">Cancel</button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div\r\n class=\"local-menu\"\r\n\r\n *ngIf=\"localMenuVisible\"\r\n [style.left.px]=\"localMenuX\"\r\n [style.top.px]=\"localMenuY\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <div class=\"local-menu-item\" *ngFor=\"let item of localMenuItems\" (click)=\"onLocalMenuItemClick(item)\">\r\n {{ item.label }}\r\n </div>\r\n </div>\r\n </div>\r\n `,\r\n styles: [`\r\n .sftp-root { display: flex; flex-direction: column; height: 100%; padding: 10px; gap: 10px; position: relative; }\r\n button { padding: 6px 10px; border-radius: 6px; border: 1px solid rgba(255,255,255,0.15); background: rgba(255,255,255,0.06); color: inherit; cursor: pointer; }\r\n button:disabled { opacity: 0.5; cursor: default; }\r\n .top-profiles { display: flex; justify-content: space-between; align-items: center; padding: 4px 8px 8px; gap: 12px; font-size: 11px; opacity: 0.9; }\r\n .top-profiles .current .label,\r\n .top-profiles .recent .label { text-transform: uppercase; letter-spacing: 0.05em; opacity: 0.7; margin-right: 4px; }\r\n .top-profiles .value { font-weight: 600; }\r\n .top-profiles .profile-chip { padding: 2px 8px; border-radius: 999px; border: 1px solid rgba(255,255,255,0.18); background: rgba(255,255,255,0.04); color: inherit; cursor: pointer; font-size: 11px; }\r\n .top-profiles .profile-chip:hover { background: rgba(255,255,255,0.12); }\r\n .sftp-body { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; flex: 1; min-height: 0; }\r\n .pane { display: flex; flex-direction: column; border: 1px solid rgba(255,255,255,0.12); border-radius: 10px; overflow: hidden; min-height: 0; }\r\n .pane-title { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 10px; padding: 8px 10px; background: rgba(255,255,255,0.04); border-bottom: 1px solid rgba(255,255,255,0.08); }\r\n .pane-label { font-weight: 600; display: flex; align-items: baseline; gap: 6px; }\r\n .pane-sub { font-weight: 400; font-size: 11px; opacity: 0.75; }\r\n .pane-path { opacity: 0.8; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n .pane-path input { width: 100%; padding: 4px 6px; border-radius: 4px; border: 1px solid rgba(255,255,255,0.18); background: rgba(0,0,0,0.3); color: inherit; font-family: inherit; font-size: 12px; }\r\n .pane-actions { display: flex; gap: 8px; align-items: center; }\r\n .pane-actions .path-preset,\r\n .pane-actions .path-favorite { max-width: 150px; padding: 3px 6px; border-radius: 4px; border: 1px solid rgba(255,255,255,0.22); background: rgba(20,20,20,0.95); color: inherit; font-size: 11px; }\r\n .pane-actions .path-preset option { background: #151515; color: #f5f5f5; }\r\n .pane-actions .path-favorite option { background: #151515; color: #f5f5f5; }\r\n .pane-actions .fav-toggle { padding: 3px 8px; border-radius: 4px; border: 1px solid rgba(255,255,255,0.25); background: rgba(255,255,255,0.05); font-size: 12px; line-height: 1; cursor: pointer; }\r\n .pane-actions .fav-toggle.active { background: rgba(255,215,0,0.2); border-color: rgba(255,215,0,0.6); color: #ffd700; }\r\n\r\n .pane-filters { display: flex; align-items: center; gap: 8px; padding: 4px 8px; border-bottom: 1px solid rgba(255,255,255,0.06); background: rgba(0,0,0,0.12); }\r\n .pane-filters input { flex: 1; padding: 4px 6px; border-radius: 4px; border: 1px solid rgba(255,255,255,0.18); background: rgba(0,0,0,0.3); color: inherit; font-size: 12px; }\r\n .show-hidden-toggle { display: flex; align-items: center; gap: 4px; font-size: 11px; opacity: 0.8; white-space: nowrap; }\r\n .show-hidden-toggle input[type=\"checkbox\"] { margin: 0; }\r\n .breadcrumbs { display: flex; flex-wrap: wrap; gap: 4px; font-size: 11px; opacity: 0.9; align-items: center; }\r\n .crumb-button { padding: 2px 6px; border-radius: 999px; border: 1px solid rgba(255,255,255,0.18); background: rgba(255,255,255,0.04); color: inherit; cursor: pointer; font-size: 11px; }\r\n .crumb-button:hover { background: rgba(255,255,255,0.10); }\r\n .crumb-separator { opacity: 0.6; }\r\n .pane-list { flex: 1; overflow: auto; padding: 4px; }\r\n .entry { display: grid; grid-template-columns: 24px minmax(0, 1.5fr) 80px 140px; gap: 8px; padding: 6px 8px; border-radius: 8px; user-select: none; align-items: center; }\r\n .entry:hover { background: rgba(255,255,255,0.06); }\r\n .entry.drop-target { outline: 1px dashed rgba(255,255,255,0.35); background: rgba(80, 160, 255, 0.10); }\r\n .entry.dim { opacity: 0.7; }\r\n .icon { text-align: center; opacity: 0.85; }\r\n .name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n .size { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; text-align: right; opacity: 0.8; }\r\n .date { font-size: 11px; opacity: 0.75; text-align: right; white-space: nowrap; }\r\n .entry.header { font-weight: 600; opacity: 0.9; background: rgba(255,255,255,0.02); }\r\n .sortable { cursor: pointer; }\r\n .entry.selected { background: rgba(80,160,255,0.18); }\r\n .pane-actions-bar { display: flex; flex-direction: column; gap: 4px; padding: 6px 8px; border-top: 1px solid rgba(255,255,255,0.06); background: rgba(0,0,0,0.18); }\r\n .pane-actions-bar .selection { font-size: 11px; opacity: 0.85; }\r\n .pane-actions-bar .action-inputs { display: flex; gap: 6px; }\r\n .pane-actions-bar .action-inputs input { flex: 1; padding: 3px 6px; border-radius: 4px; border: 1px solid rgba(255,255,255,0.18); background: rgba(0,0,0,0.3); color: inherit; font-size: 11px; }\r\n .pane-actions-bar .action-buttons { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 4px; }\r\n .sftp-transfers { margin-top: 8px; display: flex; flex-direction: column; gap: 6px; max-height: 120px; overflow-y: auto; }\r\n .transfer { display: grid; grid-template-columns: 1fr auto; gap: 8px; padding: 6px 8px; border-radius: 8px; background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.08); font-size: 11px; }\r\n .transfer-title { display: flex; gap: 6px; align-items: baseline; margin-bottom: 2px; }\r\n .transfer-title .direction { text-transform: uppercase; letter-spacing: 0.04em; opacity: 0.7; font-weight: 600; font-size: 10px; }\r\n .transfer-title .name { font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\r\n .transfer-path { display: flex; gap: 4px; opacity: 0.75; }\r\n .transfer-path .label { min-width: 48px; }\r\n .transfer-path .value { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; }\r\n .bar { position: relative; height: 4px; border-radius: 999px; background: rgba(255,255,255,0.07); margin-top: 4px; overflow: hidden; }\r\n .bar .fill { position: absolute; left: 0; top: 0; bottom: 0; border-radius: inherit; background: linear-gradient(90deg, #4dabff, #78ffce); transition: width 0.15s linear; }\r\n .transfer-stats { display: flex; flex-direction: column; justify-content: center; align-items: flex-end; gap: 4px; opacity: 0.8; }\r\n .transfer-stats .percent { font-weight: 600; }\r\n .transfer-stats .speed { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace; }\r\n .btn-cancel { padding: 2px 6px; font-size: 10px; border-radius: 999px; }\r\n .delete-overlay { position: absolute; inset: 0; background: rgba(0,0,0,0.55); display: flex; align-items: center; justify-content: center; z-index: 20; }\r\n .delete-dialog { min-width: 260px; max-width: 360px; padding: 14px 16px; border-radius: 10px; background: rgba(20,20,20,0.96); border: 1px solid rgba(255,255,255,0.15); box-shadow: 0 18px 45px rgba(0,0,0,0.75); display: flex; flex-direction: column; gap: 10px; }\r\n .delete-text { font-size: 13px; }\r\n .dialog-input { width: 100%; padding: 8px 10px; border-radius: 8px; border: 1px solid rgba(255,255,255,0.18); background: rgba(0,0,0,0.3); color: inherit; font-size: 13px; }\r\n .delete-buttons { display: flex; justify-content: flex-end; gap: 8px; }\r\n .delete-buttons .danger { background: rgba(255,80,80,0.85); border-color: rgba(255,120,120,0.85); }\r\n .local-menu { position: absolute; min-width: 180px; max-width: 260px; max-height: 260px; overflow-y: auto; padding: 4px 0; border-radius: 10px; background: rgba(18,18,22,0.98); border: 1px solid rgba(255,255,255,0.16); box-shadow: 0 18px 45px rgba(0,0,0,0.8); z-index: 30; backdrop-filter: blur(12px); }\r\n .local-menu-item { padding: 6px 12px; font-size: 12px; cursor: pointer; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; }\r\n .local-menu-item:hover { background: linear-gradient(90deg, rgba(120,200,255,0.24), rgba(120,255,206,0.15)); }\r\n .remote-pane .entry { grid-template-columns: 24px minmax(0, 1.5fr) 80px 60px 140px; }\r\n .remote-pane .perms { font-size: 11px; opacity: 0.75; text-align: right; white-space: nowrap; }\r\n `],\r\n})\r\nexport class SftpManagerTabComponent extends BaseTabComponent implements OnInit {\r\n // injected from the SSH tab when opened via SFTP-UI button\r\n sshSession: SSHSessionLike | null = null\r\n profile: any = null\r\n\r\n t (zhText: string, enText: string): string {\r\n return t(zhText, enText)\r\n }\r\n\r\n getOctalPerms (mode: number | undefined): string {\r\n if (mode === undefined) {\r\n return ''\r\n }\r\n return (mode & 0o777).toString(8)\r\n }\r\n\r\n getDateColorParts (timeValue: Date | number | undefined | null): { date: string, hour: string, minute: string, dateMatch: boolean, hourMatch: boolean, minuteMatch: boolean } | null {\r\n if (!timeValue) return null\r\n const d = new Date(timeValue)\r\n if (isNaN(d.getTime())) return null\r\n\r\n const pad = (n: number) => n.toString().padStart(2, '0')\r\n const dateStr = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`\r\n const hourStr = pad(d.getHours())\r\n const minuteStr = pad(d.getMinutes())\r\n\r\n const now = new Date()\r\n const dateMatch = d.getFullYear() === now.getFullYear() && d.getMonth() === now.getMonth() && d.getDate() === now.getDate()\r\n const hourMatch = dateMatch && d.getHours() === now.getHours()\r\n const minuteMatch = hourMatch && d.getMinutes() === now.getMinutes()\r\n\r\n return { date: dateStr, hour: hourStr, minute: minuteStr, dateMatch, hourMatch, minuteMatch }\r\n }\r\n\r\n connecting = false\r\n connected = false\r\n\r\n // legacy UI fields kept for now (not used when opened from SSH tab)\r\n host = ''\r\n port = 22\r\n username = ''\r\n password = ''\r\n\r\n localPath = os.homedir()\r\n localEntries: LocalEntry[] = []\r\n\r\n remotePath = '/'\r\n remoteEntries: SFTPFile[] = []\r\n\r\n private sftpSession: SFTPSessionLike | null = null\r\n\r\n localDropActive = false\r\n remoteDropActive = false\r\n\r\n transfers: Array<{\r\n transfer: FileTransfer\r\n direction: 'upload' | 'download'\r\n name: string\r\n remotePath: string\r\n localPath: string\r\n }> = []\r\n\r\n private transfersTimer: number | null = null\r\n localFilter = ''\r\n remoteFilter = ''\r\n remotePathInput = this.remotePath\r\n localPathInput = this.localPath\r\n private localFolderSizeLoading: Set<string> = new Set()\r\n private remoteFolderSizeLoading: Set<string> = new Set()\r\n private localSortBy: 'name' | 'size' | 'modified' = 'modified'\r\n private localSortAsc = false\r\n private remoteSortBy: 'name' | 'size' | 'modified' = 'modified'\r\n private remoteSortAsc = false\r\n private localCache: {\r\n entriesRef: LocalEntry[]\r\n filter: string\r\n showHidden: boolean\r\n sortBy: 'name' | 'size' | 'modified'\r\n asc: boolean\r\n result: LocalEntry[]\r\n } | null = null\r\n private remoteCache: {\r\n entriesRef: SFTPFile[]\r\n filter: string\r\n showHidden: boolean\r\n sortBy: 'name' | 'size' | 'modified'\r\n asc: boolean\r\n result: SFTPFile[]\r\n } | null = null\r\n showHiddenLocal = false\r\n showHiddenRemote = false\r\n selectedLocal: LocalEntry[] = []\r\n selectedRemote: SFTPFile[] = []\r\n localActionName = ''\r\n localActionPerms = ''\r\n remoteActionName = ''\r\n remoteActionPerms = ''\r\n private localLastSelectedIndex: number | null = null\r\n private remoteLastSelectedIndex: number | null = null\r\n\r\n deleteConfirmVisible = false\r\n deleteConfirmMode: 'local' | 'remote' | null = null\r\n deleteConfirmText = ''\r\n private pendingLocalDelete: LocalEntry[] = []\r\n private pendingRemoteDelete: SFTPFile[] = []\r\n\r\n favDeleteConfirmVisible = false\r\n favDeleteConfirmText = ''\r\n private pendingFavDeleteId: string | null = null\r\n\r\n replaceConfirmVisible = false\r\n\r\n replaceConfirmText = ''\r\n private replaceConfirmResolve: ((v: boolean) => void) | null = null\r\n\r\n inputDialogVisible = false\r\n inputDialogTitle = ''\r\n inputDialogPlaceholder = ''\r\n inputDialogValue = ''\r\n inputDialogPathValue = ''\r\n\r\n private inputDialogMode: 'local-new-folder' | 'remote-new-folder' | 'local-rename' | 'remote-rename' | 'local-edit-permissions' | 'remote-edit-permissions' | null = null\r\n private inputDialogTargetPath: string | null = null\r\n private inputDialogRemotePath: string | null = null\r\n private platform!: PlatformService\r\n private config!: ConfigService\r\n\r\n private openedRemoteFiles: Map<string, {\r\n remotePath: string\r\n mode: number\r\n watcher: fsSync.FSWatcher | null\r\n debounceTimer: number | null\r\n syncing: boolean\r\n pending: boolean\r\n lastUploadedSignature: string | null\r\n }> = new Map()\r\n localPathPresets: Array<{ id: string, label: string, path: string }> = []\r\n localFavorites: Array<{ id: string, label: string, path: string }> = []\r\n remoteFavorites: Array<{ id: string, label: string, path: string }> = []\r\n remoteDropdownOpen = false\r\n selectedRemoteFavId = ''\r\n recentProfiles: any[] = []\r\n\r\n localMenuVisible = false\r\n localMenuX = 0\r\n localMenuY = 0\r\n localMenuItems: Array<{ label: string, path: string }> = []\r\n\r\n private notifications!: NotificationsService\r\n\r\n constructor (\r\n injector: Injector,\r\n private sftp: SftpConnectionService,\r\n private profilesService: ProfilesService,\r\n private app: AppService,\r\n ) {\r\n // Tabby runtime BaseTabComponent expects Injector in constructor, but typings in this SDK may differ.\r\n // @ts-expect-error runtime-compatible super(injector)\r\n super(injector)\r\n this.platform = injector.get(PlatformService as any)\r\n this.config = injector.get(ConfigService as any)\r\n this.notifications = injector.get(NotificationsService as any)\r\n\r\n\r\n this.loadLocalFavorites()\r\n\r\n\r\n\r\n void this.refreshLocal()\r\n\r\n this.transfersTimer = window.setInterval(() => {\r\n this.transfers = this.transfers.filter(t => !t.transfer.isComplete() && !t.transfer.isCancelled())\r\n }, 1000)\r\n }\r\n\r\n ngOnInit (): void {\r\n // If there's no live SSH session, this tab was likely restored across\r\n // restart or opened in an invalid context. Close it immediately to avoid\r\n // an empty, nameless SFTP tab lingering after restart.\r\n if (!this.sshSession) {\r\n try {\r\n this.app.closeTab(this)\r\n } catch (e) {\r\n console.error('[SFTP-UI] Failed to close invalid SFTP tab', e)\r\n }\r\n return\r\n }\r\n\r\n this.loadRemoteFavorites()\r\n this.remotePathInput = this.remotePath\r\n\r\n this.localPathInput = this.localPath\r\n if (this.sshSession) {\r\n void this.connect()\r\n }\r\n this.loadRecentProfiles()\r\n }\r\n\r\n async connect (): Promise<void> {\r\n if (this.connecting || this.connected) {\r\n return\r\n }\r\n if (!this.sshSession) {\r\n console.error('[SFTP-UI] No SSH session on current tab')\r\n return\r\n }\r\n this.connecting = true\r\n try {\r\n this.sftpSession = await this.sftp.openFromSSHSession(this.sshSession)\r\n this.connected = true\r\n if (!this.remotePath || this.remotePath === '/') {\r\n this.remotePath = this.getDefaultRemotePath()\r\n }\r\n\r\n this.remotePathInput = this.remotePath\r\n await this.refreshRemote()\r\n } catch (e) {\r\n console.error('[SFTP-UI] SFTP connection failed', e)\r\n } finally {\r\n this.connecting = false\r\n }\r\n }\r\n\r\n async disconnect (): Promise<void> {\r\n this.sftpSession = null\r\n this.connected = false\r\n this.remoteEntries = []\r\n }\r\n\r\n canLocalUp (): boolean {\r\n const parent = path.dirname(this.localPath)\r\n return parent !== this.localPath\r\n }\r\n\r\n localUp (): void {\r\n const parent = path.dirname(this.localPath)\r\n if (parent !== this.localPath) {\r\n this.localPath = parent\r\n this.localPathInput = this.localPath\r\n void this.refreshLocal()\r\n }\r\n }\r\n\r\n remoteUp (): void {\r\n if (!this.connected || this.remotePath === '/') {\r\n return\r\n }\r\n const next = path.posix.dirname(this.remotePath)\r\n this.remotePath = next === '.' ? '/' : next\r\n this.remotePathInput = this.remotePath\r\n void this.refreshRemote()\r\n }\r\n\r\n async refreshLocal (): Promise<void> {\r\n try {\r\n const names = await fs.readdir(this.localPath)\r\n const entries: LocalEntry[] = []\r\n for (const name of names) {\r\n const fullPath = path.join(this.localPath, name)\r\n try {\r\n const st = await fs.stat(fullPath)\r\n entries.push({\r\n name,\r\n fullPath,\r\n isDirectory: st.isDirectory(),\r\n size: st.size,\r\n mtimeMs: st.mtimeMs,\r\n })\r\n } catch {\r\n // ignore entries that disappeared\r\n }\r\n }\r\n this.localEntries = entries\r\n } catch (e) {\r\n console.error('[SFTP-UI] Local listing failed', e)\r\n }\r\n }\r\n\r\n async refreshRemote (): Promise<void> {\r\n if (!this.connected) {\r\n return\r\n }\r\n try {\r\n if (!this.sftpSession) {\r\n throw new Error('Not connected')\r\n }\r\n this.remoteEntries = await this.sftpSession.readdir(this.remotePath)\r\n } catch (e) {\r\n console.error('[SFTP-UI] Remote listing failed', e)\r\n }\r\n }\r\n\r\n openLocal (e: LocalEntry): void {\r\n if (!e.isDirectory) {\r\n return\r\n }\r\n this.localPath = e.fullPath\r\n this.localPathInput = this.localPath\r\n void this.refreshLocal()\r\n }\r\n\r\n openRemote (e: SFTPFile): void {\r\n if (!this.connected) {\r\n return\r\n }\r\n if (e.isDirectory) {\r\n this.remotePath = e.fullPath\r\n this.remotePathInput = this.remotePath\r\n void this.refreshRemote()\r\n } else {\r\n void this.openRemoteFile(e)\r\n }\r\n }\r\n\r\n onDragOver (ev: DragEvent): void {\r\n ev.preventDefault()\r\n }\r\n\r\n onLocalMouseDown (entry: LocalEntry, event: MouseEvent): void {\r\n if (event.button === 2) {\r\n this.onLocalContextMenu(entry, event)\r\n }\r\n }\r\n\r\n onRemoteMouseDown (entry: SFTPFile, event: MouseEvent): void {\r\n if (event.button === 2) {\r\n this.onRemoteContextMenu(entry, event)\r\n }\r\n }\r\n\r\n selectLocal (entry: LocalEntry, event: MouseEvent): void {\r\n const list = this.getFilteredLocalEntries()\r\n const index = list.indexOf(entry)\r\n if (index === -1) {\r\n return\r\n }\r\n const isCtrl = event.ctrlKey || event.metaKey\r\n const isShift = event.shiftKey\r\n if (isShift && this.localLastSelectedIndex != null) {\r\n const [from, to] = this.localLastSelectedIndex < index\r\n ? [this.localLastSelectedIndex, index]\r\n : [index, this.localLastSelectedIndex]\r\n const range = list.slice(from, to + 1)\r\n const set = new Set(this.selectedLocal)\r\n for (const e of range) {\r\n set.add(e)\r\n }\r\n this.selectedLocal = Array.from(set)\r\n } else if (isCtrl) {\r\n const exists = this.selectedLocal.includes(entry)\r\n if (exists) {\r\n this.selectedLocal = this.selectedLocal.filter(e => e !== entry)\r\n } else {\r\n this.selectedLocal = [...this.selectedLocal, entry]\r\n }\r\n this.localLastSelectedIndex = index\r\n } else {\r\n this.selectedLocal = [entry]\r\n this.localLastSelectedIndex = index\r\n }\r\n if (this.selectedLocal.length === 1) {\r\n this.localActionName = this.selectedLocal[0].name\r\n }\r\n }\r\n\r\n isLocalSelected (entry: LocalEntry): boolean {\r\n return this.selectedLocal.includes(entry)\r\n }\r\n\r\n selectRemote (entry: SFTPFile, event: MouseEvent): void {\r\n const list = this.getFilteredRemoteEntries()\r\n const index = list.indexOf(entry)\r\n if (index === -1) {\r\n return\r\n }\r\n const isCtrl = event.ctrlKey || event.metaKey\r\n const isShift = event.shiftKey\r\n if (isShift && this.remoteLastSelectedIndex != null) {\r\n const [from, to] = this.remoteLastSelectedIndex < index\r\n ? [this.remoteLastSelectedIndex, index]\r\n : [index, this.remoteLastSelectedIndex]\r\n const range = list.slice(from, to + 1)\r\n const set = new Set(this.selectedRemote)\r\n for (const e of range) {\r\n set.add(e)\r\n }\r\n this.selectedRemote = Array.from(set)\r\n } else if (isCtrl) {\r\n const exists = this.selectedRemote.includes(entry)\r\n if (exists) {\r\n this.selectedRemote = this.selectedRemote.filter(e => e !== entry)\r\n } else {\r\n this.selectedRemote = [...this.selectedRemote, entry]\r\n }\r\n this.remoteLastSelectedIndex = index\r\n } else {\r\n this.selectedRemote = [entry]\r\n this.remoteLastSelectedIndex = index\r\n }\r\n if (this.selectedRemote.length === 1) {\r\n this.remoteActionName = this.selectedRemote[0].name\r\n const currentPerms = (this.selectedRemote[0].mode & 0o777).toString(8)\r\n this.remoteActionPerms = currentPerms\r\n }\r\n }\r\n\r\n isRemoteSelected (entry: SFTPFile): boolean {\r\n return this.selectedRemote.includes(entry)\r\n }\r\n\r\n setLocalSort (field: 'name' | 'size' | 'modified'): void {\r\n if (this.localSortBy === field) {\r\n this.localSortAsc = !this.localSortAsc\r\n } else {\r\n this.localSortBy = field\r\n this.localSortAsc = true\r\n }\r\n }\r\n\r\n setRemoteSort (field: 'name' | 'size' | 'modified'): void {\r\n if (this.remoteSortBy === field) {\r\n this.remoteSortAsc = !this.remoteSortAsc\r\n } else {\r\n this.remoteSortBy = field\r\n this.remoteSortAsc = true\r\n }\r\n }\r\n\r\n onDragStartLocal (ev: DragEvent, e: LocalEntry): void {\r\n const sources = this.selectedLocal.includes(e) && this.selectedLocal.length ? this.selectedLocal : [e]\r\n const movePayload = sources.map(x => x.fullPath)\r\n ev.dataTransfer?.setData('application/x-tabby-sftp-ui-local-move', JSON.stringify(movePayload))\r\n\r\n // Cross-device drag (local -> remote) supports multi-select\r\n const payload: DragPayload = {\r\n kind: 'local-paths',\r\n paths: sources.map(x => ({ fullPath: x.fullPath, name: x.name, isDirectory: x.isDirectory })),\r\n }\r\n ev.dataTransfer?.setData('application/x-tabby-sftp-ui', JSON.stringify(payload))\r\n ev.dataTransfer?.setData('text/plain', e.fullPath)\r\n ev.dataTransfer?.setDragImage?.((ev.target as HTMLElement) ?? document.body, 0, 0)\r\n }\r\n\r\n onDragStartRemote (ev: DragEvent, item: SFTPFile): void {\r\n if (!this.connected) {\r\n return\r\n }\r\n const sources = this.selectedRemote.includes(item) && this.selectedRemote.length ? this.selectedRemote : [item]\r\n const movePayload = sources.map(x => x.fullPath)\r\n ev.dataTransfer?.setData('application/x-tabby-sftp-ui-remote-move', JSON.stringify(movePayload))\r\n\r\n // Cross-device drag (remote -> local) supports multi-select\r\n const payload: DragPayload = {\r\n kind: 'remote-paths',\r\n paths: sources.map(x => ({\r\n remotePath: x.fullPath,\r\n name: x.name,\r\n isDirectory: x.isDirectory,\r\n size: x.size,\r\n mode: x.mode,\r\n })),\r\n }\r\n ev.dataTransfer?.setData('application/x-tabby-sftp-ui', JSON.stringify(payload))\r\n ev.dataTransfer?.setData('text/plain', item.fullPath)\r\n ev.dataTransfer?.setDragImage?.((ev.target as HTMLElement) ?? document.body, 0, 0)\r\n }\r\n\r\n async onDropOnRemote (ev: DragEvent): Promise<void> {\r\n ev.preventDefault()\r\n this.remoteDropActive = false\r\n if (!this.connected) {\r\n return\r\n }\r\n if (!this.sftpSession) {\r\n return\r\n }\r\n\r\n const raw = ev.dataTransfer?.getData('application/x-tabby-sftp-ui')\r\n if (raw) {\r\n let payload: DragPayload\r\n try {\r\n payload = JSON.parse(raw) as DragPayload\r\n } catch {\r\n return\r\n }\r\n\r\n try {\r\n if (payload.kind === 'local-file') {\r\n const targetRemotePath = path.posix.join(this.remotePath, payload.name)\r\n const existsOnRemote = this.remoteEntries.some(e => e.name === payload.name)\r\n if (existsOnRemote) {\r\n const ok = await this.showReplaceConfirm(`Replace existing \"${payload.name}\" on remote?`)\r\n if (!ok) {\r\n return\r\n }\r\n await this.deleteRemotePathRecursive(targetRemotePath)\r\n }\r\n const upload = new LocalPathFileUpload(payload.fullPath)\r\n this.trackTransfer(upload, 'upload', targetRemotePath, payload.fullPath)\r\n await this.sftpSession.upload(targetRemotePath, upload)\r\n await this.refreshRemote()\r\n return\r\n }\r\n\r\n if (payload.kind === 'local-paths') {\r\n for (const p of payload.paths) {\r\n const targetRemotePath = path.posix.join(this.remotePath, p.name)\r\n const existsOnRemote = this.remoteEntries.some(e => e.name === p.name)\r\n if (existsOnRemote) {\r\n const ok = await this.showReplaceConfirm(`Replace existing \"${p.name}\" on remote?`)\r\n if (!ok) {\r\n continue\r\n }\r\n await this.deleteRemotePathRecursive(targetRemotePath)\r\n }\r\n await this.uploadLocalPathToRemote(this.remotePath, p.fullPath)\r\n }\r\n await this.refreshRemote()\r\n return\r\n }\r\n } catch (e) {\r\n console.error('[SFTP-UI] Upload failed', e)\r\n return\r\n }\r\n }\r\n\r\n // Drag & drop from OS file manager (Explorer/Finder) into the remote pane\r\n const osPaths = this.getDroppedOsPaths(ev)\r\n if (osPaths.length) {\r\n try {\r\n for (const p of osPaths) {\r\n const baseName = path.basename(p)\r\n const existing = this.remoteEntries.find(e => e.name === baseName)\r\n if (existing) {\r\n const ok = await this.showReplaceConfirm(`Replace existing \"${baseName}\" on remote?`)\r\n if (!ok) {\r\n continue\r\n }\r\n const remoteTarget = path.posix.join(this.remotePath, baseName)\r\n await this.deleteRemotePathRecursive(remoteTarget)\r\n }\r\n await this.uploadLocalPathToRemote(this.remotePath, p)\r\n }\r\n await this.refreshRemote()\r\n } catch (e) {\r\n console.error('[SFTP-UI] Upload from OS drop failed', e)\r\n }\r\n return\r\n }\r\n\r\n // Fallback: use Tabby's native drag parser (supports directories and HTMLFileUpload)\r\n try {\r\n const dirUpload = await (this.platform as any).startUploadFromDragEvent?.(ev, true)\r\n if (dirUpload && this.sftpSession) {\r\n await this.uploadDirectoryUploadToRemote(this.remotePath, dirUpload)\r\n await this.refreshRemote()\r\n return\r\n }\r\n } catch (e) {\r\n console.error('[SFTP-UI] startUploadFromDragEvent failed', e)\r\n }\r\n\r\n }\r\n\r\n async onDropOnLocal (ev: DragEvent): Promise<void> {\r\n ev.preventDefault()\r\n this.localDropActive = false\r\n\r\n // 1) Tabby's internal drag (remote -> local download)\r\n const rawInternal = ev.dataTransfer?.getData('application/x-tabby-sftp-ui')\r\n if (rawInternal) {\r\n let payload: DragPayload\r\n try {\r\n payload = JSON.parse(rawInternal) as DragPayload\r\n } catch {\r\n payload = null as any\r\n }\r\n if (payload && payload.kind === 'remote-file') {\r\n try {\r\n const targetLocalPath = path.join(this.localPath, payload.name)\r\n if (!this.sftpSession) {\r\n throw new Error('Not connected')\r\n }\r\n if (fsSync.existsSync(targetLocalPath)) {\r\n const ok = await this.showReplaceConfirm(`Replace existing \"${payload.name}\"?`)\r\n if (!ok) {\r\n return\r\n }\r\n }\r\n const dl = new LocalPathFileDownload(targetLocalPath, payload.mode, payload.size)\r\n this.trackTransfer(dl, 'download', payload.remotePath, targetLocalPath)\r\n await this.sftpSession.download(payload.remotePath, dl)\r\n await this.refreshLocal()\r\n } catch (e) {\r\n console.error('[SFTP-UI] Download failed', e)\r\n }\r\n return\r\n }\r\n\r\n if (payload && payload.kind === 'remote-dir') {\r\n try {\r\n if (!this.sftpSession) {\r\n throw new Error('Not connected')\r\n }\r\n const targetLocalPath = path.join(this.localPath, payload.name)\r\n if (fsSync.existsSync(targetLocalPath)) {\r\n const ok = await this.showReplaceConfirm(`Replace existing folder \"${payload.name}\"?`)\r\n if (!ok) {\r\n return\r\n }\r\n await this.deleteLocalPathRecursive(targetLocalPath)\r\n }\r\n await this.downloadRemoteDirectoryRecursive(payload.remotePath, targetLocalPath)\r\n await this.refreshLocal()\r\n } catch (e) {\r\n console.error('[SFTP-UI] Download directory failed', e)\r\n }\r\n return\r\n }\r\n\r\n if (payload && payload.kind === 'remote-paths') {\r\n try {\r\n if (!this.sftpSession) {\r\n throw new Error('Not connected')\r\n }\r\n for (const it of payload.paths) {\r\n const targetLocalPath = path.join(this.localPath, it.name)\r\n if (fsSync.existsSync(targetLocalPath)) {\r\n const ok = await this.showReplaceConfirm(it.isDirectory ? `Replace existing folder \"${it.name}\"?` : `Replace existing \"${it.name}\"?`)\r\n if (!ok) {\r\n continue\r\n }\r\n await this.deleteLocalPathRecursive(targetLocalPath)\r\n }\r\n if (it.isDirectory) {\r\n await this.downloadRemoteDirectoryRecursive(it.remotePath, targetLocalPath)\r\n } else {\r\n const dl = new LocalPathFileDownload(targetLocalPath, it.mode ?? 0o644, it.size ?? 0)\r\n this.trackTransfer(dl, 'download', it.remotePath, targetLocalPath)\r\n await this.sftpSession.download(it.remotePath, dl)\r\n }\r\n }\r\n await this.refreshLocal()\r\n } catch (e) {\r\n console.error('[SFTP-UI] Download paths failed', e)\r\n }\r\n return\r\n }\r\n }\r\n\r\n // Drag & drop from OS file manager into the local pane (copy into current local folder)\r\n const osPaths = this.getDroppedOsPaths(ev)\r\n if (osPaths.length) {\r\n try {\r\n for (const p of osPaths) {\r\n const baseName = path.basename(p)\r\n const destPath = path.join(this.localPath, baseName)\r\n if (fsSync.existsSync(destPath)) {\r\n const ok = await this.showReplaceConfirm(`Replace existing \"${baseName}\"?`)\r\n if (!ok) {\r\n continue\r\n }\r\n }\r\n await this.copyLocalPathIntoLocalDir(this.localPath, p)\r\n }\r\n await this.refreshLocal()\r\n } catch (e) {\r\n console.error('[SFTP-UI] Local copy from OS drop failed', e)\r\n }\r\n return\r\n }\r\n\r\n // Fallback: use Tabby's native drag parser, then write files to disk\r\n try {\r\n const dirUpload = await (this.platform as any).startUploadFromDragEvent?.(ev, true)\r\n if (dirUpload) {\r\n await this.writeDirectoryUploadToLocal(this.localPath, dirUpload)\r\n await this.refreshLocal()\r\n return\r\n }\r\n } catch (e) {\r\n console.error('[SFTP-UI] startUploadFromDragEvent (local) failed', e)\r\n }\r\n\r\n const raw = ev.dataTransfer?.getData('application/x-tabby-sftp-ui')\r\n if (!raw) {\r\n return\r\n }\r\n let payload: DragPayload\r\n try {\r\n payload = JSON.parse(raw) as DragPayload\r\n } catch {\r\n return\r\n }\r\n if (payload.kind !== 'remote-file' && payload.kind !== 'remote-dir') {\r\n return\r\n }\r\n try {\r\n if (payload.kind === 'remote-file') {\r\n const targetLocalPath = path.join(this.localPath, payload.name)\r\n if (!this.sftpSession) {\r\n throw new Error('Not connected')\r\n }\r\n if (fsSync.existsSync(targetLocalPath)) {\r\n const ok = await this.showReplaceConfirm(`Replace existing \"${payload.name}\"?`)\r\n if (!ok) {\r\n return\r\n }\r\n await this.deleteLocalPathRecursive(targetLocalPath)\r\n }\r\n const dl = new LocalPathFileDownload(targetLocalPath, payload.mode, payload.size)\r\n this.trackTransfer(dl, 'download', payload.remotePath, targetLocalPath)\r\n await this.sftpSession.download(payload.remotePath, dl)\r\n await this.refreshLocal()\r\n return\r\n }\r\n\r\n // remote-dir -> local-dir (recursive download)\r\n if (!this.sftpSession) {\r\n throw new Error('Not connected')\r\n }\r\n const targetLocalPath = path.join(this.localPath, payload.name)\r\n if (fsSync.existsSync(targetLocalPath)) {\r\n const ok = await this.showReplaceConfirm(`Replace existing folder \"${payload.name}\"?`)\r\n if (!ok) {\r\n return\r\n }\r\n await this.deleteLocalPathRecursive(targetLocalPath)\r\n }\r\n await this.downloadRemoteDirectoryRecursive(payload.remotePath, targetLocalPath)\r\n await this.refreshLocal()\r\n } catch (e) {\r\n console.error('[SFTP-UI] Download failed', e)\r\n }\r\n }\r\n\r\n private async uploadLocalPathToRemote (remoteDir: string, localPath: string): Promise<void> {\r\n if (!this.sftpSession) {\r\n return\r\n }\r\n const st = await fs.stat(localPath).catch(() => null)\r\n if (!st) {\r\n return\r\n }\r\n const baseName = path.basename(localPath)\r\n const remoteTarget = path.posix.join(remoteDir, baseName)\r\n\r\n if (st.isDirectory()) {\r\n // Ensure destination folder exists, then recursively upload children\r\n try {\r\n await this.sftpSession.mkdir(remoteTarget)\r\n } catch {\r\n // ignore (might already exist)\r\n }\r\n const children = await fs.readdir(localPath)\r\n for (const child of children) {\r\n await this.uploadLocalPathToRemote(remoteTarget, path.join(localPath, child))\r\n }\r\n return\r\n }\r\n\r\n const upload = new LocalPathFileUpload(localPath)\r\n this.trackTransfer(upload, 'upload', remoteTarget, localPath)\r\n await this.sftpSession.upload(remoteTarget, upload)\r\n }\r\n\r\n private async copyLocalPathIntoLocalDir (destDir: string, srcPath: string): Promise<void> {\r\n const st = await fs.stat(srcPath).catch(() => null)\r\n if (!st) {\r\n return\r\n }\r\n const baseName = path.basename(srcPath)\r\n const destPath = path.join(destDir, baseName)\r\n\r\n if (st.isDirectory()) {\r\n await fs.mkdir(destPath, { recursive: true })\r\n const children = await fs.readdir(srcPath)\r\n for (const child of children) {\r\n await this.copyLocalPathIntoLocalDir(destPath, path.join(srcPath, child))\r\n }\r\n return\r\n }\r\n\r\n await fs.copyFile(srcPath, destPath)\r\n }\r\n\r\n private async uploadDirectoryUploadToRemote (remoteDir: string, dirUpload: any): Promise<void> {\r\n if (!this.sftpSession) {\r\n return\r\n }\r\n const childrens: any[] = dirUpload?.getChildrens?.() ?? []\r\n for (const item of childrens) {\r\n // DirectoryUpload\r\n if (typeof item?.getChildrens === 'function') {\r\n const name = item.getName?.() || 'folder'\r\n const nextRemote = path.posix.join(remoteDir, name)\r\n try {\r\n await this.sftpSession.mkdir(nextRemote)\r\n } catch {\r\n // ignore (might already exist)\r\n }\r\n await this.uploadDirectoryUploadToRemote(nextRemote, item)\r\n continue\r\n }\r\n\r\n // FileUpload (including HTMLFileUpload)\r\n if (typeof item?.read === 'function' && typeof item?.getName === 'function') {\r\n const fileUpload = item as FileUpload\r\n const name = fileUpload.getName()\r\n const targetRemotePath = path.posix.join(remoteDir, name)\r\n this.trackTransfer(fileUpload as any, 'upload', targetRemotePath, name)\r\n await this.sftpSession.upload(targetRemotePath, fileUpload as any)\r\n }\r\n }\r\n }\r\n\r\n private async writeDirectoryUploadToLocal (localDir: string, dirUpload: any): Promise<void> {\r\n const childrens: any[] = dirUpload?.getChildrens?.() ?? []\r\n for (const item of childrens) {\r\n if (typeof item?.getChildrens === 'function') {\r\n const name = item.getName?.() || 'folder'\r\n const nextLocal = path.join(localDir, name)\r\n await fs.mkdir(nextLocal, { recursive: true })\r\n await this.writeDirectoryUploadToLocal(nextLocal, item)\r\n continue\r\n }\r\n\r\n if (typeof item?.readAll === 'function' && typeof item?.getName === 'function') {\r\n const name = item.getName()\r\n const targetLocal = path.join(localDir, name)\r\n const buf = await item.readAll()\r\n await fs.writeFile(targetLocal, Buffer.from(buf))\r\n try {\r\n item.close?.()\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n }\r\n }\r\n\r\n private async downloadRemoteDirectoryRecursive (remoteDir: string, localDir: string): Promise<void> {\r\n if (!this.sftpSession) {\r\n return\r\n }\r\n await fs.mkdir(localDir, { recursive: true })\r\n const entries = await this.sftpSession.readdir(remoteDir).catch(() => null as any)\r\n if (!entries) {\r\n return\r\n }\r\n for (const e of entries as SFTPFile[]) {\r\n const targetLocal = path.join(localDir, e.name)\r\n if (e.isDirectory) {\r\n await this.downloadRemoteDirectoryRecursive(e.fullPath, targetLocal)\r\n } else {\r\n const dl = new LocalPathFileDownload(targetLocal, e.mode, e.size)\r\n this.trackTransfer(dl, 'download', e.fullPath, targetLocal)\r\n await this.sftpSession.download(e.fullPath, dl)\r\n }\r\n }\r\n }\r\n\r\n private getDroppedOsPaths (ev: DragEvent): string[] {\r\n const dt = ev.dataTransfer\r\n if (!dt) {\r\n return []\r\n }\r\n const isWin = os.platform() === 'win32'\r\n const isLocalPath = (p: string): boolean => {\r\n if (isWin) {\r\n // Accept both `C:\\...` and `C:/...` (some drag sources provide forward slashes)\r\n return /^[A-Za-z]:[\\\\/]/.test(p) || p.startsWith('\\\\\\\\')\r\n }\r\n return p.startsWith('/')\r\n }\r\n\r\n // 1) Electron-style File.path\r\n const filePaths = Array.from(dt.files ?? [])\r\n .map(f => (f as any).path as string | undefined)\r\n .filter((p): p is string => Boolean(p))\r\n if (filePaths.length) {\r\n return filePaths\r\n }\r\n\r\n // 2) Sometimes paths are exposed as URIs\r\n const uriList = dt.getData('text/uri-list') || ''\r\n const uris = uriList\r\n .split(/\\r?\\n/g)\r\n .map(x => x.trim())\r\n .filter(x => x && !x.startsWith('#'))\r\n .map(x => {\r\n if (x.startsWith('file://')) {\r\n try {\r\n return decodeURIComponent(x.replace(/^file:\\/\\//, ''))\r\n } catch {\r\n return x.replace(/^file:\\/\\//, '')\r\n }\r\n }\r\n return x\r\n })\r\n .map(x => {\r\n // Some sources may produce `/C:/Users/...`\r\n if (isWin && /^\\/[A-Za-z]:[\\\\/]/.test(x)) {\r\n return x.slice(1)\r\n }\r\n return x\r\n })\r\n .filter(x => x && isLocalPath(x))\r\n if (uris.length) {\r\n return uris\r\n }\r\n\r\n // 3) Plain text sometimes contains a local path\r\n const text = dt.getData('text/plain') || ''\r\n const textLines = text.split(/\\r?\\n/g).map(x => x.trim()).filter(Boolean)\r\n const textPaths = textLines\r\n .map(x => {\r\n if (x.startsWith('file://')) {\r\n try {\r\n return decodeURIComponent(x.replace(/^file:\\/\\//, ''))\r\n } catch {\r\n return x.replace(/^file:\\/\\//, '')\r\n }\r\n }\r\n return x\r\n })\r\n .map(x => {\r\n if (isWin && /^\\/[A-Za-z]:[\\\\/]/.test(x)) {\r\n return x.slice(1)\r\n }\r\n return x\r\n })\r\n .filter(x => x && isLocalPath(x))\r\n return textPaths\r\n }\r\n\r\n getFilteredLocalEntries (): LocalEntry[] {\r\n const entriesRef = this.localEntries\r\n const filter = this.localFilter\r\n const showHidden = this.showHiddenLocal\r\n const sortBy = this.localSortBy\r\n const asc = this.localSortAsc\r\n\r\n if (this.localCache &&\r\n this.localCache.entriesRef === entriesRef &&\r\n this.localCache.filter === filter &&\r\n this.localCache.showHidden === showHidden &&\r\n this.localCache.sortBy === sortBy &&\r\n this.localCache.asc === asc) {\r\n return this.localCache.result\r\n }\r\n\r\n const term = filter.trim().toLowerCase()\r\n let entries = entriesRef\r\n if (!showHidden) {\r\n entries = entries.filter(e => !e.name.startsWith('.'))\r\n }\r\n if (term) {\r\n entries = entries.filter(e => e.name.toLowerCase().includes(term))\r\n }\r\n const result = this.sortLocalEntries(entries.slice())\r\n this.localCache = { entriesRef, filter, showHidden, sortBy, asc, result }\r\n return result\r\n }\r\n\r\n getFilteredRemoteEntries (): SFTPFile[] {\r\n const entriesRef = this.remoteEntries\r\n const filter = this.remoteFilter\r\n const showHidden = this.showHiddenRemote\r\n const sortBy = this.remoteSortBy\r\n const asc = this.remoteSortAsc\r\n\r\n if (this.remoteCache &&\r\n this.remoteCache.entriesRef === entriesRef &&\r\n this.remoteCache.filter === filter &&\r\n this.remoteCache.showHidden === showHidden &&\r\n this.remoteCache.sortBy === sortBy &&\r\n this.remoteCache.asc === asc) {\r\n return this.remoteCache.result\r\n }\r\n\r\n const term = filter.trim().toLowerCase()\r\n let entries = entriesRef\r\n if (!showHidden) {\r\n entries = entries.filter(e => !e.name.startsWith('.'))\r\n }\r\n if (term) {\r\n entries = entries.filter(e => e.name.toLowerCase().includes(term))\r\n }\r\n const result = this.sortRemoteEntries(entries.slice())\r\n this.remoteCache = { entriesRef, filter, showHidden, sortBy, asc, result }\r\n return result\r\n }\r\n\r\n private sortLocalEntries (entries: LocalEntry[]): LocalEntry[] {\r\n const dirFirst = (a: LocalEntry, b: LocalEntry) => Number(b.isDirectory) - Number(a.isDirectory)\r\n const factor = this.localSortAsc ? 1 : -1\r\n const field = this.localSortBy\r\n return entries.sort((a, b) => {\r\n const d = dirFirst(a, b)\r\n if (d !== 0) return d\r\n if (field === 'name') {\r\n return a.name.localeCompare(b.name) * factor\r\n }\r\n if (field === 'size') {\r\n const av = a.size ?? 0\r\n const bv = b.size ?? 0\r\n return (av - bv) * factor\r\n }\r\n const av = a.mtimeMs ?? 0\r\n const bv = b.mtimeMs ?? 0\r\n return (av - bv) * factor\r\n })\r\n }\r\n\r\n private sortRemoteEntries (entries: SFTPFile[]): SFTPFile[] {\r\n const dirFirst = (a: SFTPFile, b: SFTPFile) => Number(b.isDirectory) - Number(a.isDirectory)\r\n const factor = this.remoteSortAsc ? 1 : -1\r\n const field = this.remoteSortBy\r\n return entries.sort((a, b) => {\r\n const d = dirFirst(a, b)\r\n if (d !== 0) return d\r\n if (field === 'name') {\r\n return a.name.localeCompare(b.name) * factor\r\n }\r\n if (field === 'size') {\r\n const av = a.size ?? 0\r\n const bv = b.size ?? 0\r\n return (av - bv) * factor\r\n }\r\n const av = a.modified?.getTime?.() ?? 0\r\n const bv = b.modified?.getTime?.() ?? 0\r\n return (av - bv) * factor\r\n })\r\n }\r\n\r\n private getLocalMovePayload (ev: DragEvent): string[] | null {\r\n const raw = ev.dataTransfer?.getData('application/x-tabby-sftp-ui-local-move')\r\n if (!raw) {\r\n return null\r\n }\r\n try {\r\n const arr = JSON.parse(raw) as string[]\r\n if (Array.isArray(arr)) {\r\n return arr\r\n }\r\n } catch {\r\n // ignore\r\n }\r\n return null\r\n }\r\n\r\n private getRemoteMovePayload (ev: DragEvent): string[] | null {\r\n const raw = ev.dataTransfer?.getData('application/x-tabby-sftp-ui-remote-move')\r\n if (!raw) {\r\n return null\r\n }\r\n try {\r\n const arr = JSON.parse(raw) as string[]\r\n if (Array.isArray(arr)) {\r\n return arr\r\n }\r\n } catch {\r\n // ignore\r\n }\r\n return null\r\n }\r\n\r\n formatSize (bytes?: number): string {\r\n if (bytes === undefined || bytes === null) {\r\n return ''\r\n }\r\n if (bytes === 0) {\r\n return '0 B'\r\n }\r\n const units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB']\r\n let value = bytes\r\n let unitIndex = 0\r\n while (value >= 1024 && unitIndex < units.length - 1) {\r\n value /= 1024\r\n unitIndex++\r\n }\r\n const digits = value >= 10 || unitIndex === 0 ? 0 : 1\r\n return `${value.toFixed(digits)} ${units[unitIndex]}`\r\n }\r\n\r\n formatSpeed (bytesPerSecond?: number): string {\r\n if (bytesPerSecond === undefined || bytesPerSecond === null) {\r\n return ''\r\n }\r\n if (bytesPerSecond === 0) {\r\n return '0 B/s'\r\n }\r\n const units = ['B/s', 'KB/s', 'MB/s', 'GB/s', 'TB/s', 'PB/s']\r\n let value = bytesPerSecond\r\n let unitIndex = 0\r\n while (value >= 1024 && unitIndex < units.length - 1) {\r\n value /= 1024\r\n unitIndex++\r\n }\r\n const digits = value >= 10 || unitIndex === 0 ? 0 : 1\r\n return `${value.toFixed(digits)} ${units[unitIndex]}`\r\n }\r\n\r\n getLocalSizeDisplay (e: LocalEntry): string {\r\n if (!e.isDirectory) {\r\n return this.formatSize(e.size)\r\n }\r\n if (e.size !== undefined) {\r\n return this.formatSize(e.size)\r\n }\r\n if (this.localFolderSizeLoading.has(e.fullPath)) {\r\n return '…'\r\n }\r\n return ''\r\n }\r\n\r\n getRemoteSizeDisplay (e: SFTPFile): string {\r\n if (!e.isDirectory) {\r\n return this.formatSize(e.size)\r\n }\r\n const key = e.fullPath\r\n if ((e as any).dirSize !== undefined) {\r\n return this.formatSize((e as any).dirSize)\r\n }\r\n if (this.remoteFolderSizeLoading.has(key)) {\r\n return '…'\r\n }\r\n return ''\r\n }\r\n\r\n onLocalEntryDragOver (entry: LocalEntry, ev: DragEvent): void {\r\n if (!entry.isDirectory) {\r\n return\r\n }\r\n if (!this.getLocalMovePayload(ev)) {\r\n return\r\n }\r\n ev.preventDefault()\r\n }\r\n\r\n async onLocalEntryDrop (entry: LocalEntry, ev: DragEvent): Promise<void> {\r\n if (!entry.isDirectory) {\r\n return\r\n }\r\n const sources = this.getLocalMovePayload(ev)\r\n if (!sources || !sources.length) {\r\n return\r\n }\r\n ev.preventDefault()\r\n const targetDir = entry.fullPath\r\n try {\r\n for (const src of sources) {\r\n if (!src || src === targetDir) {\r\n continue\r\n }\r\n // avoid moving a directory into its own subtree\r\n if (targetDir.startsWith(src + path.sep)) {\r\n continue\r\n }\r\n const name = path.basename(src)\r\n const dst = path.join(targetDir, name)\r\n if (dst === src) {\r\n continue\r\n }\r\n try {\r\n await fs.rename(src, dst)\r\n } catch (e) {\r\n console.error('[SFTP-UI] Local move failed', e)\r\n }\r\n }\r\n await this.refreshLocal()\r\n } catch (e) {\r\n console.error('[SFTP-UI] Local move batch failed', e)\r\n }\r\n }\r\n\r\n onRemoteEntryDragOver (entry: SFTPFile, ev: DragEvent): void {\r\n if (!entry.isDirectory) {\r\n return\r\n }\r\n if (!this.getRemoteMovePayload(ev)) {\r\n return\r\n }\r\n ev.preventDefault()\r\n }\r\n\r\n async onRemoteEntryDrop (entry: SFTPFile, ev: DragEvent): Promise<void> {\r\n if (!entry.isDirectory || !this.sftpSession || !this.connected) {\r\n return\r\n }\r\n const sources = this.getRemoteMovePayload(ev)\r\n if (!sources || !sources.length) {\r\n return\r\n }\r\n ev.preventDefault()\r\n const targetDir = entry.fullPath\r\n try {\r\n for (const src of sources) {\r\n if (!src || src === targetDir) {\r\n continue\r\n }\r\n // avoid moving a directory into its own subtree\r\n if (targetDir.startsWith(src + '/')) {\r\n continue\r\n }\r\n const name = src.split('/').filter(Boolean).pop() || ''\r\n if (!name) {\r\n continue\r\n }\r\n const dst = path.posix.join(targetDir, name)\r\n if (dst === src) {\r\n continue\r\n }\r\n try {\r\n await this.sftpSession.rename(src, dst)\r\n } catch (e) {\r\n console.error('[SFTP-UI] Remote move failed', e)\r\n }\r\n }\r\n await this.refreshRemote()\r\n } catch (e) {\r\n console.error('[SFTP-UI] Remote move batch failed', e)\r\n }\r\n }\r\n\r\n getRemoteBreadcrumbs (): Array<{ label: string, path: string }> {\r\n const parts = this.remotePath.split('/').filter(Boolean)\r\n const crumbs: Array<{ label: string, path: string }> = []\r\n let current = '/'\r\n crumbs.push({ label: '/', path: '/' })\r\n for (const p of parts) {\r\n current = current === '/' ? `/${p}` : `${current}/${p}`\r\n crumbs.push({ label: p, path: current })\r\n }\r\n return crumbs\r\n }\r\n\r\n navigateRemoteBreadcrumb (index: number): void {\r\n const crumbs = this.getRemoteBreadcrumbs()\r\n const crumb = crumbs[index]\r\n if (!crumb) {\r\n return\r\n }\r\n this.remotePath = crumb.path\r\n this.remotePathInput = this.remotePath\r\n void this.refreshRemote()\r\n }\r\n\r\n goToRemotePathInput (): void {\r\n if (!this.connected) {\r\n return\r\n }\r\n const target = this.normalizeRemotePath(this.remotePathInput || '/')\r\n this.remotePath = target\r\n this.remotePathInput = target\r\n void this.refreshRemote()\r\n }\r\n\r\n goToLocalPathInput (): void {\r\n const target = this.normalizeLocalPath(this.localPathInput || this.localPath)\r\n this.goToLocalPath(target)\r\n }\r\n\r\n getLocalBreadcrumbs (): Array<{ label: string, path: string }> {\r\n const currentPath = this.localPath\r\n const parsed = path.parse(currentPath)\r\n const root = parsed.root || path.sep\r\n const withoutRoot = currentPath.slice(root.length)\r\n const parts = withoutRoot.split(path.sep).filter(Boolean)\r\n const crumbs: Array<{ label: string, path: string }> = []\r\n\r\n const rootLabel = root.replace(/[\\\\\\/]+$/, '') || root\r\n crumbs.push({ label: rootLabel, path: root })\r\n\r\n let accum = root\r\n for (const p of parts) {\r\n accum = path.join(accum, p)\r\n crumbs.push({ label: p, path: accum })\r\n }\r\n return crumbs\r\n }\r\n\r\n navigateLocalBreadcrumb (index: number): void {\r\n const crumbs = this.getLocalBreadcrumbs()\r\n const crumb = crumbs[index]\r\n if (!crumb) {\r\n return\r\n }\r\n this.goToLocalPath(crumb.path)\r\n }\r\n\r\n private goToLocalPath (target: string): void {\r\n this.localPath = target\r\n this.localPathInput = target\r\n void this.refreshLocal()\r\n }\r\n\r\n onLocalPresetChange (id: string): void {\r\n if (!id) {\r\n return\r\n }\r\n const preset = this.localPathPresets.find(p => p.id === id)\r\n if (!preset) {\r\n return\r\n }\r\n this.goToLocalPath(preset.path)\r\n }\r\n\r\n isCurrentFavorite (): boolean {\r\n return this.localFavorites.some(f => f.path === this.localPath)\r\n }\r\n\r\n toggleCurrentFavorite (): void {\r\n const existingIndex = this.localFavorites.findIndex(f => f.path === this.localPath)\r\n if (existingIndex >= 0) {\r\n this.localFavorites.splice(existingIndex, 1)\r\n this.saveLocalFavorites()\r\n return\r\n }\r\n const label = path.basename(this.localPath) || this.localPath\r\n const id = `fav-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 6)}`\r\n this.localFavorites.push({ id, label, path: this.localPath })\r\n this.saveLocalFavorites()\r\n }\r\n\r\n onLocalFavoriteSelect (id: string): void {\r\n if (!id) {\r\n return\r\n }\r\n const fav = this.localFavorites.find(f => f.id === id)\r\n if (!fav) {\r\n return\r\n }\r\n this.goToLocalPath(fav.path)\r\n }\r\n\r\n favDropdownOpen = false\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClickFav (event: MouseEvent): void {\r\n const target = event.target as HTMLElement\r\n if (target && !target.closest('.fav-dropdown')) {\r\n this.favDropdownOpen = false\r\n }\r\n }\r\n\r\n\r\n toggleFavDropdown (): void {\r\n\r\n this.favDropdownOpen = !this.favDropdownOpen\r\n }\r\n\r\n getSelectedFavLabel (): string {\r\n const fav = this.localFavorites.find(f => f.path === this.localPath)\r\n return fav ? fav.label : '===='\r\n }\r\n\r\n\r\n onFavEditNameClick (event: MouseEvent, fav: any): void {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n this.favDropdownOpen = false\r\n\r\n this.inputDialogPathValue = fav.path || ''\r\n this.openInputDialog({\r\n mode: 'local-favorite-rename' as any,\r\n title: 'Edit Favorite',\r\n placeholder: 'Enter new name',\r\n value: fav.label,\r\n targetPath: fav.id,\r\n })\r\n\r\n }\r\n\r\n onFavDeleteClick (event: MouseEvent, fav: any): void {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n this.favDropdownOpen = false\r\n\r\n this.localFavorites = this.localFavorites.filter(f => f.id !== fav.id)\r\n this.saveLocalFavorites()\r\n }\r\n\r\n\r\n\r\n onLocalBreadcrumbContextMenu (index: number, event: MouseEvent): void {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n const crumbs = this.getLocalBreadcrumbs()\r\n const crumb = crumbs[index]\r\n if (!crumb) {\r\n return\r\n }\r\n\r\n const menuItems: Array<{ label: string, path: string }> = []\r\n const isWindows = process.platform === 'win32'\r\n const isRootCrumb = index === 0\r\n\r\n const basePath = crumb.path\r\n\r\n // Root crumb on Windows: offer other drives as \"siblings\"\r\n if (isWindows && isRootCrumb) {\r\n const drives: string[] = []\r\n for (let code = 67; code <= 90; code++) { // C..Z\r\n const letter = String.fromCharCode(code)\r\n const rootPath = `${letter}:\\\\`\r\n try {\r\n if (fsSync.existsSync(rootPath)) {\r\n drives.push(rootPath)\r\n }\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n for (const d of drives) {\r\n menuItems.push({ label: d, path: d })\r\n }\r\n } else {\r\n // For non-root crumbs (or non-Windows), show sibling folders only\r\n const parentPath = path.dirname(basePath)\r\n try {\r\n const parentEntries = fsSync.readdirSync(parentPath)\r\n for (const name of parentEntries) {\r\n const full = path.join(parentPath, name)\r\n try {\r\n const st = fsSync.statSync(full)\r\n if (st.isDirectory()) {\r\n menuItems.push({ label: name, path: full })\r\n }\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n\r\n if (!menuItems.length) {\r\n return\r\n }\r\n\r\n this.localMenuItems = menuItems\r\n this.localMenuVisible = true\r\n this.localMenuX = event.clientX\r\n this.localMenuY = event.clientY\r\n }\r\n\r\n toggleRemoteFavDropdown (): void {\r\n this.remoteDropdownOpen = !this.remoteDropdownOpen\r\n }\r\n\r\n getSelectedRemoteFavLabel (): string {\r\n const fav = this.remoteFavorites.find(f => f.path === this.remotePath)\r\n return fav ? fav.label : '===='\r\n }\r\n\r\n onRemoteFavoriteSelect (favId: string): void {\r\n const fav = this.remoteFavorites.find(f => f.id === favId)\r\n if (fav && fav.path) {\r\n this.remotePath = fav.path\r\n this.remotePathInput = fav.path\r\n void this.refreshRemote()\r\n }\r\n }\r\n\r\n isCurrentRemoteFavorite (): boolean {\r\n return this.remoteFavorites.some(f => f.path === this.remotePath)\r\n }\r\n\r\n toggleCurrentRemoteFavorite (): void {\r\n const idx = this.remoteFavorites.findIndex(f => f.path === this.remotePath)\r\n if (idx >= 0) {\r\n this.remoteFavorites.splice(idx, 1)\r\n } else {\r\n this.remoteFavorites.push({\r\n id: `fav-${Math.random().toString(36).slice(2, 8)}`,\r\n label: path.posix.basename(this.remotePath) || this.remotePath,\r\n path: this.remotePath,\r\n })\r\n }\r\n this.saveRemoteFavorites()\r\n }\r\n\r\n onRemoteFavEditNameClick (event: MouseEvent, fav: any): void {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n this.remoteDropdownOpen = false\r\n\r\n this.inputDialogPathValue = fav.path || ''\r\n this.openInputDialog({\r\n mode: 'remote-favorite-rename' as any,\r\n title: 'Edit Favorite',\r\n placeholder: 'Enter new name',\r\n value: fav.label,\r\n targetPath: fav.id,\r\n })\r\n }\r\n\r\n\r\n private loadLocalFavorites (): void {\r\n try {\r\n if (!this.config || !this.config.store) {\r\n return\r\n }\r\n const parsed = this.config.store.sftpLocalFavorites\r\n if (Array.isArray(parsed)) {\r\n this.localFavorites = parsed\r\n .filter(f => f && typeof f.path === 'string')\r\n .map(f => ({\r\n id: String(f.id || `fav-${Math.random().toString(36).slice(2, 8)}`),\r\n label: String(f.label || path.basename(f.path) || f.path),\r\n path: String(f.path),\r\n }))\r\n }\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n\r\n private saveLocalFavorites (): void {\r\n try {\r\n if (!this.config || !this.config.store) {\r\n return\r\n }\r\n this.config.store.sftpLocalFavorites = this.localFavorites\r\n this.config.save()\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n private getRemoteProfileId (): string {\r\n return this.profile?.id \r\n || this.profile?.name \r\n || this.profile?.options?.host \r\n || 'global'\r\n }\r\n\r\n private loadRemoteFavorites (): void {\r\n try {\r\n if (!this.config || !this.config.store) {\r\n return\r\n }\r\n const profileId = this.getRemoteProfileId()\r\n const allRemoteFavs = this.config.store.sftpRemoteFavorites || {}\r\n const parsed = allRemoteFavs[profileId]\r\n \r\n if (Array.isArray(parsed)) {\r\n this.remoteFavorites = parsed\r\n .filter(f => f && typeof f.path === 'string')\r\n .map(f => ({\r\n id: String(f.id || `fav-${Math.random().toString(36).slice(2, 8)}`),\r\n label: String(f.label || path.basename(f.path) || f.path),\r\n path: String(f.path),\r\n }))\r\n } else {\r\n this.remoteFavorites = []\r\n }\r\n } catch {\r\n this.remoteFavorites = []\r\n }\r\n }\r\n\r\n private saveRemoteFavorites (): void {\r\n try {\r\n if (!this.config || !this.config.store) {\r\n return\r\n }\r\n const profileId = this.getRemoteProfileId()\r\n const allRemoteFavs = { ...(this.config.store.sftpRemoteFavorites || {}) }\r\n allRemoteFavs[profileId] = this.remoteFavorites\r\n \r\n this.config.store.sftpRemoteFavorites = allRemoteFavs\r\n this.config.save()\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n\r\n\r\n\r\n onLocalMenuItemClick (item: { label: string, path: string }): void {\r\n this.localMenuVisible = false\r\n this.goToLocalPath(item.path)\r\n }\r\n\r\n private normalizeLocalPath (p: string): string {\r\n if (!p) {\r\n return this.localPath\r\n }\r\n let result = p.trim()\r\n // On Windows allow drive letters and backslashes, but normalize to current OS-style\r\n if (path.win32.isAbsolute(result) || path.posix.isAbsolute(result)) {\r\n return result\r\n }\r\n // relative path from current localPath\r\n return path.join(this.localPath, result)\r\n }\r\n\r\n private normalizeRemotePath (p: string): string {\r\n if (!p) {\r\n return '/'\r\n }\r\n let result = p.trim()\r\n if (!result.startsWith('/')) {\r\n result = '/' + result\r\n }\r\n // remove duplicate slashes\r\n result = result.replace(/\\/+/g, '/')\r\n return result\r\n }\r\n\r\n private getDefaultRemotePath (): string {\r\n const username = (this.profile && (this.profile.options?.username || this.profile.options?.user)) || ''\r\n if (username) {\r\n return `/home/${username}`\r\n }\r\n return '/'\r\n }\r\n\r\n private loadRecentProfiles (): void {\r\n try {\r\n const rec = this.profilesService.getRecentProfiles?.()\r\n if (Array.isArray(rec)) {\r\n this.recentProfiles = rec\r\n }\r\n } catch {\r\n this.recentProfiles = []\r\n }\r\n }\r\n\r\n getProfileLabel (p: any): string {\r\n if (!p) {\r\n return ''\r\n }\r\n return p.name || p.options?.host || p.id || 'Profile'\r\n }\r\n\r\n launchProfileFromSFTP (p: any): void {\r\n try {\r\n void this.profilesService.launchProfile(p)\r\n } catch (e) {\r\n console.error('[SFTP-UI] launchProfile failed', e)\r\n }\r\n }\r\n\r\n @HostListener('document:click')\r\n onDocumentClick (): void {\r\n this.localMenuVisible = false\r\n }\r\n\r\n localRename (): void {\r\n if (this.selectedLocal.length !== 1) {\r\n return\r\n }\r\n const entry = this.selectedLocal[0]\r\n this.openInputDialog({\r\n mode: 'local-rename',\r\n title: 'Rename (local)',\r\n placeholder: 'New name',\r\n value: entry.name,\r\n targetPath: entry.fullPath,\r\n })\r\n }\r\n\r\n localDelete (): void {\r\n if (!this.selectedLocal.length) {\r\n return\r\n }\r\n this.deleteConfirmMode = 'local'\r\n this.pendingLocalDelete = this.selectedLocal.slice()\r\n const names = this.pendingLocalDelete.map(e => e.name)\r\n this.deleteConfirmText = this.buildDeleteConfirmText('local', names)\r\n this.deleteConfirmVisible = true\r\n }\r\n\r\n localNewFolder (): void {\r\n this.openInputDialog({\r\n mode: 'local-new-folder',\r\n title: 'New folder (local)',\r\n placeholder: 'Folder name',\r\n value: 'New folder',\r\n targetPath: this.localPath,\r\n })\r\n }\r\n\r\n localEditPermissions (): void {\r\n if (this.selectedLocal.length !== 1) {\r\n return\r\n }\r\n const entry = this.selectedLocal[0]\r\n let currentPerms = '644'\r\n try {\r\n const st = fsSync.statSync(entry.fullPath)\r\n currentPerms = (st.mode & 0o777).toString(8)\r\n } catch {\r\n // ignore\r\n }\r\n this.openInputDialog({\r\n mode: 'local-edit-permissions' as any,\r\n title: 'Edit Permissions (local)',\r\n placeholder: 'Permissions (e.g. 755)',\r\n value: currentPerms,\r\n targetPath: entry.fullPath,\r\n })\r\n }\r\n\r\n localShowSize (): void {\r\n if (this.selectedLocal.length === 1 && this.selectedLocal[0].isDirectory) {\r\n this.ensureLocalFolderSize(this.selectedLocal[0])\r\n }\r\n }\r\n\r\n remoteRename (): void {\r\n if (this.selectedRemote.length !== 1 || !this.sftpSession) {\r\n return\r\n }\r\n const entry = this.selectedRemote[0]\r\n this.openInputDialog({\r\n mode: 'remote-rename',\r\n title: 'Rename (remote)',\r\n placeholder: 'New name',\r\n value: entry.name,\r\n remotePath: entry.fullPath,\r\n targetPath: this.remotePath,\r\n })\r\n }\r\n\r\n remoteDelete (): void {\r\n if (!this.selectedRemote.length || !this.sftpSession) {\r\n return\r\n }\r\n this.deleteConfirmMode = 'remote'\r\n this.pendingRemoteDelete = this.selectedRemote.slice()\r\n const names = this.pendingRemoteDelete.map(e => e.name)\r\n this.deleteConfirmText = this.buildDeleteConfirmText('remote', names)\r\n this.deleteConfirmVisible = true\r\n }\r\n\r\n remoteNewFolder (): void {\r\n if (!this.sftpSession) {\r\n return\r\n }\r\n this.openInputDialog({\r\n mode: 'remote-new-folder',\r\n title: 'New folder (remote)',\r\n placeholder: 'Folder name',\r\n value: 'New folder',\r\n targetPath: this.remotePath,\r\n })\r\n }\r\n\r\n private openInputDialog (opts: {\r\n mode: NonNullable<SftpManagerTabComponent['inputDialogMode']>\r\n title: string\r\n placeholder: string\r\n value: string\r\n targetPath: string\r\n remotePath?: string\r\n }): void {\r\n this.inputDialogMode = opts.mode\r\n this.inputDialogTitle = opts.title\r\n this.inputDialogPlaceholder = opts.placeholder\r\n this.inputDialogValue = opts.value\r\n this.inputDialogTargetPath = opts.targetPath\r\n this.inputDialogRemotePath = opts.remotePath ?? null\r\n this.inputDialogVisible = true\r\n }\r\n\r\n deleteFavoriteFromDialog (): void {\r\n if (!this.inputDialogVisible || \r\n (this.inputDialogMode !== ('local-favorite-rename' as any) && \r\n this.inputDialogMode !== ('remote-favorite-rename' as any))) {\r\n return\r\n }\r\n const id = this.inputDialogTargetPath\r\n const isRemote = this.inputDialogMode === ('remote-favorite-rename' as any)\r\n const fav = isRemote \r\n ? this.remoteFavorites.find(f => f.id === id)\r\n : this.localFavorites.find(f => f.id === id)\r\n \r\n this.cancelInputDialog()\r\n\r\n if (fav) {\r\n this.pendingFavDeleteId = id\r\n this.favDeleteConfirmText = `Are you sure you want to delete favorite \"${fav.label}\"?`\r\n this.favDeleteConfirmVisible = true\r\n }\r\n }\r\n\r\n confirmFavDelete (): void {\r\n if (this.pendingFavDeleteId) {\r\n const isRemote = this.remoteFavorites.some(f => f.id === this.pendingFavDeleteId)\r\n if (isRemote) {\r\n this.remoteFavorites = this.remoteFavorites.filter(f => f.id !== this.pendingFavDeleteId)\r\n this.saveRemoteFavorites()\r\n } else {\r\n this.localFavorites = this.localFavorites.filter(f => f.id !== this.pendingFavDeleteId)\r\n this.saveLocalFavorites()\r\n }\r\n }\r\n this.cancelFavDelete()\r\n }\r\n\r\n\r\n cancelFavDelete (): void {\r\n this.favDeleteConfirmVisible = false\r\n this.favDeleteConfirmText = ''\r\n this.pendingFavDeleteId = null\r\n }\r\n\r\n\r\n cancelInputDialog (): void {\r\n\r\n this.inputDialogVisible = false\r\n this.inputDialogMode = null\r\n this.inputDialogTitle = ''\r\n this.inputDialogPlaceholder = ''\r\n this.inputDialogValue = ''\r\n this.inputDialogPathValue = ''\r\n this.inputDialogTargetPath = null\r\n this.inputDialogRemotePath = null\r\n }\r\n\r\n\r\n async confirmInputDialog (): Promise<void> {\r\n if (!this.inputDialogVisible || !this.inputDialogMode) {\r\n return\r\n }\r\n const mode = this.inputDialogMode\r\n const value = this.inputDialogValue.trim()\r\n const targetPath = this.inputDialogTargetPath\r\n const remotePath = this.inputDialogRemotePath\r\n this.cancelInputDialog()\r\n\r\n if (!value || !targetPath) {\r\n return\r\n }\r\n\r\n if (mode === ('local-edit-permissions' as any)) {\r\n const modeNum = parseInt(value, 8)\r\n if (Number.isNaN(modeNum)) {\r\n this.notifications?.error('SFTP-UI', 'Invalid permissions value')\r\n return\r\n }\r\n try {\r\n await fs.chmod(targetPath, modeNum as any)\r\n await this.refreshLocal()\r\n this.notifications?.notice('Permissions changed successfully')\r\n } catch (e: any) {\r\n this.notifications?.error('SFTP-UI', `Local chmod failed: ${e.message || e}`)\r\n }\r\n return\r\n }\r\n\r\n if (mode === ('remote-edit-permissions' as any)) {\r\n const entry = this.selectedRemote.find(e => e.fullPath === targetPath) || this.selectedRemote[0]\r\n if (entry) {\r\n this.applyRemoteEditPermissions(entry, value)\r\n }\r\n return\r\n }\r\n\r\n try {\r\n if (mode === 'local-favorite-rename' as any) {\r\n const fav = this.localFavorites.find(f => f.id === targetPath)\r\n if (fav) {\r\n fav.label = value\r\n if (this.inputDialogPathValue && this.inputDialogPathValue.trim()) {\r\n fav.path = this.inputDialogPathValue.trim()\r\n }\r\n this.saveLocalFavorites()\r\n }\r\n\r\n return\r\n }\r\n\r\n if (mode === 'remote-favorite-rename' as any) {\r\n const fav = this.remoteFavorites.find(f => f.id === targetPath)\r\n if (fav) {\r\n fav.label = value\r\n if (this.inputDialogPathValue && this.inputDialogPathValue.trim()) {\r\n fav.path = this.inputDialogPathValue.trim()\r\n }\r\n this.saveRemoteFavorites()\r\n }\r\n\r\n return\r\n }\r\n\r\n\r\n if (mode === 'local-new-folder') {\r\n\r\n const dir = targetPath\r\n const folderPath = path.join(dir, value)\r\n await fs.mkdir(folderPath, { recursive: true })\r\n await this.refreshLocal()\r\n return\r\n }\r\n\r\n if (mode === 'local-rename') {\r\n const from = targetPath\r\n const to = path.join(this.localPath, value)\r\n if (path.basename(from) === value) {\r\n return\r\n }\r\n await fs.rename(from, to)\r\n await this.refreshLocal()\r\n return\r\n }\r\n\r\n if (mode === 'remote-new-folder') {\r\n if (!this.sftpSession) {\r\n return\r\n }\r\n const dir = targetPath\r\n const folderPath = path.posix.join(dir, value)\r\n await this.sftpSession.mkdir(folderPath)\r\n await this.refreshRemote()\r\n return\r\n }\r\n\r\n if (mode === 'remote-rename') {\r\n if (!this.sftpSession || !remotePath) {\r\n return\r\n }\r\n const to = path.posix.join(this.remotePath, value)\r\n if (path.posix.basename(remotePath) === value) {\r\n return\r\n }\r\n await this.sftpSession.rename(remotePath, to)\r\n await this.refreshRemote()\r\n }\r\n } catch (e) {\r\n console.error('[SFTP-UI] Input dialog action failed', e)\r\n }\r\n }\r\n\r\n remoteEditPermissions (): void {\r\n if (this.selectedRemote.length !== 1 || !this.sftpSession) {\r\n return\r\n }\r\n const entry = this.selectedRemote[0]\r\n const currentPerms = (entry.mode & 0o777).toString(8)\r\n this.openInputDialog({\r\n mode: 'remote-edit-permissions' as any,\r\n title: 'Edit Permissions (remote)',\r\n placeholder: 'Permissions (e.g. 755)',\r\n value: currentPerms || '644',\r\n targetPath: entry.fullPath,\r\n })\r\n }\r\n\r\n private applyRemoteEditPermissions (entry: SFTPFile, value: string): void {\r\n if (!this.sftpSession) {\r\n return\r\n }\r\n const mode = parseInt(value.trim(), 8)\r\n if (Number.isNaN(mode)) {\r\n this.notifications?.error('SFTP-UI', 'Invalid permissions value')\r\n return\r\n }\r\n\r\n const sftp = this.sftpSession as any\r\n\r\n if (typeof sftp.chmod === 'function') {\r\n try {\r\n let calledBack = false\r\n const result = sftp.chmod(entry.fullPath, mode, (err: any) => {\r\n if (calledBack) {\r\n return\r\n }\r\n calledBack = true\r\n if (err) {\r\n this.notifications?.error('SFTP-UI', `Failed to change permissions: ${err.message || err}`)\r\n } else {\r\n this.notifications?.notice('Permissions changed successfully')\r\n this.refreshRemote()\r\n }\r\n })\r\n\r\n if (result && typeof result.then === 'function') {\r\n result\r\n .then(() => {\r\n if (!calledBack) {\r\n calledBack = true\r\n this.notifications?.notice('Permissions changed successfully')\r\n this.refreshRemote()\r\n }\r\n })\r\n .catch((e: any) => {\r\n if (!calledBack) {\r\n calledBack = true\r\n this.notifications?.error('SFTP-UI', `Failed to change permissions: ${e.message || e}`)\r\n }\r\n })\r\n }\r\n return\r\n } catch (e: any) {\r\n console.error('[SFTP-UI] chmod call error', e)\r\n }\r\n }\r\n\r\n if (typeof sftp.setstat === 'function') {\r\n try {\r\n let calledBack = false\r\n const result = sftp.setstat(entry.fullPath, { mode }, (err: any) => {\r\n if (calledBack) {\r\n return\r\n }\r\n calledBack = true\r\n if (err) {\r\n this.notifications?.error('SFTP-UI', `Failed to change permissions (setstat): ${err.message || err}`)\r\n } else {\r\n this.notifications?.notice('Permissions changed successfully')\r\n this.refreshRemote()\r\n }\r\n })\r\n\r\n if (result && typeof result.then === 'function') {\r\n result\r\n .then(() => {\r\n if (!calledBack) {\r\n calledBack = true\r\n this.notifications?.notice('Permissions changed successfully')\r\n this.refreshRemote()\r\n }\r\n })\r\n .catch((e: any) => {\r\n if (!calledBack) {\r\n calledBack = true\r\n this.notifications?.error('SFTP-UI', `Failed to change permissions (setstat): ${e.message || e}`)\r\n }\r\n })\r\n }\r\n return\r\n } catch (e: any) {\r\n console.error('[SFTP-UI] setstat call error', e)\r\n }\r\n }\r\n\r\n this.notifications?.error('SFTP-UI', 'Operation not supported by the underlying SFTP client')\r\n }\r\n\r\n remoteShowSize (): void {\r\n if (this.selectedRemote.length === 1 && this.selectedRemote[0].isDirectory) {\r\n this.ensureRemoteFolderSize(this.selectedRemote[0])\r\n }\r\n }\r\n\r\n remoteDownload (): void {\r\n if (!this.selectedRemote.length || !this.sftpSession) {\r\n return\r\n }\r\n for (const entry of this.selectedRemote) {\r\n if (entry.isDirectory) {\r\n continue\r\n }\r\n const targetLocalPath = path.join(this.localPath, entry.name)\r\n const dl = new LocalPathFileDownload(targetLocalPath, entry.mode, entry.size)\r\n this.trackTransfer(dl, 'download', entry.fullPath, targetLocalPath)\r\n void this.sftpSession.download(entry.fullPath, dl)\r\n .then(() => this.refreshLocal())\r\n .catch(e => console.error('[SFTP-UI] Remote download failed', e))\r\n }\r\n }\r\n\r\n ensureLocalFolderSize (entry: LocalEntry): void {\r\n if (!entry.isDirectory) {\r\n return\r\n }\r\n if (entry.size !== undefined) {\r\n return\r\n }\r\n if (this.localFolderSizeLoading.has(entry.fullPath)) {\r\n return\r\n }\r\n this.localFolderSizeLoading.add(entry.fullPath)\r\n void this.computeLocalFolderSize(entry.fullPath)\r\n .then(size => {\r\n entry.size = size\r\n })\r\n .catch(e => {\r\n console.error('[SFTP-UI] Local folder size failed', e)\r\n })\r\n .finally(() => {\r\n this.localFolderSizeLoading.delete(entry.fullPath)\r\n })\r\n }\r\n\r\n ensureRemoteFolderSize (entry: SFTPFile): void {\r\n if (!entry.isDirectory) {\r\n return\r\n }\r\n const key = entry.fullPath\r\n if ((entry as any).dirSize !== undefined) {\r\n return\r\n }\r\n if (this.remoteFolderSizeLoading.has(key)) {\r\n return\r\n }\r\n if (!this.sftpSession || !this.connected) {\r\n return\r\n }\r\n this.remoteFolderSizeLoading.add(key)\r\n void this.computeRemoteFolderSize(key)\r\n .then(size => {\r\n ;(entry as any).dirSize = size\r\n })\r\n .catch(e => {\r\n console.error('[SFTP-UI] Remote folder size failed', e)\r\n })\r\n .finally(() => {\r\n this.remoteFolderSizeLoading.delete(key)\r\n })\r\n }\r\n\r\n private async computeLocalFolderSize (root: string): Promise<number> {\r\n let total = 0\r\n const stack: string[] = [root]\r\n const maxEntries = 5000\r\n let visited = 0\r\n while (stack.length) {\r\n const dir = stack.pop() as string\r\n let names: string[]\r\n try {\r\n names = await fs.readdir(dir)\r\n } catch {\r\n continue\r\n }\r\n for (const name of names) {\r\n if (visited++ > maxEntries) {\r\n return total\r\n }\r\n const full = path.join(dir, name)\r\n try {\r\n const st = await fs.stat(full)\r\n if (st.isDirectory()) {\r\n stack.push(full)\r\n } else {\r\n total += st.size\r\n }\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n }\r\n return total\r\n }\r\n\r\n private async computeRemoteFolderSize (root: string): Promise<number> {\r\n if (!this.sftpSession) {\r\n return 0\r\n }\r\n let total = 0\r\n const stack: string[] = [root]\r\n const maxEntries = 5000\r\n let visited = 0\r\n while (stack.length) {\r\n const dir = stack.pop() as string\r\n let entries: SFTPFile[]\r\n try {\r\n entries = await this.sftpSession.readdir(dir)\r\n } catch {\r\n continue\r\n }\r\n for (const item of entries) {\r\n if (visited++ > maxEntries) {\r\n return total\r\n }\r\n if (item.isDirectory) {\r\n stack.push(item.fullPath)\r\n } else {\r\n total += item.size\r\n }\r\n }\r\n }\r\n return total\r\n }\r\n\r\n onLocalContextMenu (entry: LocalEntry, event: MouseEvent): void {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n // TODO: полноценное контекстное меню. Пока все действия — через нижнюю панель.\r\n }\r\n\r\n onRemoteContextMenu (entry: SFTPFile, event: MouseEvent): void {\r\n event.preventDefault()\r\n event.stopPropagation()\r\n\r\n if (!this.sftpSession) {\r\n return\r\n }\r\n // TODO: полноценное контекстное меню. Пока все действия — через нижнюю панель.\r\n }\r\n\r\n private trackTransfer (transfer: FileTransfer, direction: 'upload' | 'download', remotePath: string, localPath: string): void {\r\n this.transfers.push({\r\n transfer,\r\n direction,\r\n name: transfer.getName(),\r\n remotePath,\r\n localPath,\r\n })\r\n }\r\n\r\n cancelTransfer (entry: { transfer: FileTransfer }): void {\r\n try {\r\n if (entry.transfer.isComplete() || entry.transfer.isCancelled()) {\r\n return\r\n }\r\n entry.transfer.cancel?.()\r\n } catch (e) {\r\n console.error('[SFTP-UI] Cancel transfer failed', e)\r\n }\r\n }\r\n\r\n getTransferProgress (transfer: FileTransfer): number {\r\n try {\r\n const total = transfer.getSize?.()\r\n const done = transfer.getCompletedBytes?.()\r\n if (typeof total !== 'number' || total <= 0 || typeof done !== 'number' || done < 0) {\r\n return transfer.isComplete() ? 100 : 0\r\n }\r\n const value = (done / total) * 100\r\n const clamped = Math.max(0, Math.min(100, value))\r\n return clamped\r\n } catch {\r\n return transfer.isComplete() ? 100 : 0\r\n }\r\n }\r\n\r\n onKeyDown (event: KeyboardEvent): void {\r\n const target = event.target as HTMLElement | null\r\n const isTypingTarget = Boolean(target) && (\r\n target?.tagName === 'INPUT' ||\r\n target?.tagName === 'TEXTAREA' ||\r\n (target as any)?.isContentEditable\r\n )\r\n\r\n if (event.key === 'Escape') {\r\n if (this.inputDialogVisible) {\r\n event.preventDefault()\r\n this.cancelInputDialog()\r\n return\r\n }\r\n if (this.deleteConfirmVisible) {\r\n event.preventDefault()\r\n this.cancelDelete()\r\n return\r\n }\r\n if (this.replaceConfirmVisible) {\r\n event.preventDefault()\r\n this.cancelReplace()\r\n return\r\n }\r\n }\r\n if (event.key === 'Delete' || event.key === 'Backspace') {\r\n // Don't intercept Delete/Backspace while typing in inputs\r\n if (isTypingTarget) {\r\n return\r\n }\r\n event.preventDefault()\r\n if (this.selectedRemote.length) {\r\n this.remoteDelete()\r\n } else if (this.selectedLocal.length) {\r\n this.localDelete()\r\n }\r\n }\r\n }\r\n\r\n override destroy (): void {\r\n // stop file watchers for opened remote files\r\n for (const { watcher } of this.openedRemoteFiles.values()) {\r\n try {\r\n watcher?.close()\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n this.openedRemoteFiles.clear()\r\n\r\n void this.disconnect()\r\n if (this.transfersTimer !== null) {\r\n clearInterval(this.transfersTimer)\r\n this.transfersTimer = null\r\n }\r\n super.destroy()\r\n }\r\n\r\n // Prevent Tabby from restoring SFTP-UI tabs across restarts, since they rely\r\n // on a live SSH session from a terminal tab.\r\n // Typинги допускают RecoveryToken | null, нам достаточно всегда возвращать null.\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n override async getRecoveryToken (_options?: any): Promise<null> {\r\n return null\r\n }\r\n\r\n async confirmDelete (): Promise<void> {\r\n if (!this.deleteConfirmVisible) {\r\n return\r\n }\r\n const mode = this.deleteConfirmMode\r\n this.deleteConfirmVisible = false\r\n\r\n try {\r\n if (mode === 'local') {\r\n const toDelete = this.pendingLocalDelete.slice()\r\n this.pendingLocalDelete = []\r\n for (const entry of toDelete) {\r\n await this.deleteLocalEntry(entry)\r\n }\r\n await this.refreshLocal()\r\n this.selectedLocal = []\r\n } else if (mode === 'remote' && this.sftpSession) {\r\n const toDelete = this.pendingRemoteDelete.slice()\r\n this.pendingRemoteDelete = []\r\n for (const entry of toDelete) {\r\n await this.deleteRemoteEntry(entry)\r\n }\r\n await this.refreshRemote()\r\n this.selectedRemote = []\r\n }\r\n } catch (e) {\r\n console.error('[SFTP-UI] Delete failed', e)\r\n } finally {\r\n this.deleteConfirmMode = null\r\n this.deleteConfirmText = ''\r\n }\r\n }\r\n\r\n cancelDelete (): void {\r\n this.deleteConfirmVisible = false\r\n this.deleteConfirmMode = null\r\n this.deleteConfirmText = ''\r\n this.pendingLocalDelete = []\r\n this.pendingRemoteDelete = []\r\n }\r\n\r\n private async showReplaceConfirm (text: string): Promise<boolean> {\r\n if (this.replaceConfirmVisible) {\r\n // Prevent stacking multiple confirmations; choose the latest replacement intent.\r\n return false\r\n }\r\n this.replaceConfirmText = text\r\n this.replaceConfirmVisible = true\r\n return new Promise(resolve => {\r\n this.replaceConfirmResolve = resolve\r\n })\r\n }\r\n\r\n async confirmReplace (): Promise<void> {\r\n if (!this.replaceConfirmVisible) {\r\n return\r\n }\r\n this.replaceConfirmVisible = false\r\n const resolve = this.replaceConfirmResolve\r\n this.replaceConfirmResolve = null\r\n this.replaceConfirmText = ''\r\n resolve?.(true)\r\n }\r\n\r\n cancelReplace (): void {\r\n if (!this.replaceConfirmVisible) {\r\n return\r\n }\r\n this.replaceConfirmVisible = false\r\n const resolve = this.replaceConfirmResolve\r\n this.replaceConfirmResolve = null\r\n this.replaceConfirmText = ''\r\n resolve?.(false)\r\n }\r\n\r\n private async deleteLocalEntry (entry: LocalEntry): Promise<void> {\r\n await this.deleteLocalPathRecursive(entry.fullPath)\r\n }\r\n\r\n private async deleteRemoteEntry (entry: SFTPFile): Promise<void> {\r\n if (!this.sftpSession) {\r\n return\r\n }\r\n await this.deleteRemotePathRecursive(entry.fullPath)\r\n }\r\n\r\n private buildDeleteConfirmText (scope: 'local' | 'remote', names: string[]): string {\r\n const total = names.length\r\n const label = scope === 'local' ? 'local' : 'remote'\r\n if (!total) {\r\n return `Delete 0 item(s) from ${label}?`\r\n }\r\n const maxShown = 5\r\n const shown = names.slice(0, maxShown)\r\n const list = shown.join(', ')\r\n if (total <= maxShown) {\r\n return `Delete ${total} item(s) from ${label}: ${list}?`\r\n }\r\n const rest = total - maxShown\r\n return `Delete ${total} item(s) from ${label}: ${list} and ${rest} more?`\r\n }\r\n\r\n private async deleteLocalPathRecursive (target: string): Promise<void> {\r\n try {\r\n const st = await fs.stat(target)\r\n if (!st.isDirectory()) {\r\n await fs.unlink(target)\r\n return\r\n }\r\n } catch (e) {\r\n console.error('[SFTP-UI] Local delete failed (stat)', e)\r\n return\r\n }\r\n\r\n try {\r\n const names = await fs.readdir(target)\r\n for (const name of names) {\r\n const child = path.join(target, name)\r\n await this.deleteLocalPathRecursive(child)\r\n }\r\n await fs.rmdir(target)\r\n } catch (e) {\r\n console.error('[SFTP-UI] Local recursive delete failed', e)\r\n }\r\n }\r\n\r\n private async deleteRemotePathRecursive (target: string): Promise<void> {\r\n if (!this.sftpSession) {\r\n return\r\n }\r\n try {\r\n const entries = await this.sftpSession.readdir(target).catch(() => null as any)\r\n if (!entries) {\r\n // treat as file\r\n try {\r\n await this.sftpSession.unlink(target)\r\n } catch (e) {\r\n console.error('[SFTP-UI] Remote delete failed', e)\r\n }\r\n return\r\n }\r\n for (const item of entries as SFTPFile[]) {\r\n const full = item.fullPath\r\n if (item.isDirectory) {\r\n await this.deleteRemotePathRecursive(full)\r\n } else {\r\n try {\r\n await this.sftpSession.unlink(full)\r\n } catch (e) {\r\n console.error('[SFTP-UI] Remote unlink failed', e)\r\n }\r\n }\r\n }\r\n try {\r\n await this.sftpSession.rmdir(target)\r\n } catch (e) {\r\n console.error('[SFTP-UI] Remote rmdir failed', e)\r\n }\r\n } catch (e) {\r\n console.error('[SFTP-UI] Remote recursive delete failed', e)\r\n }\r\n }\r\n\r\n private async openRemoteFile (entry: SFTPFile): Promise<void> {\r\n if (!this.sftpSession || !this.connected || entry.isDirectory) {\r\n return\r\n }\r\n try {\r\n const tmpRoot = path.join(os.tmpdir(), 'tabby-sftp-ui')\r\n await fs.mkdir(tmpRoot, { recursive: true })\r\n const hash = crypto.createHash('sha1').update(entry.fullPath).digest('hex').slice(0, 10)\r\n const safeName = entry.name.replace(/[<>:\"/\\\\|?*\\x00-\\x1F]/g, '_')\r\n const localPath = path.join(tmpRoot, `${hash}-${safeName}`)\r\n\r\n // если уже есть watcher на этот файл – закроем его и перезапишем\r\n const existing = this.openedRemoteFiles.get(localPath)\r\n if (existing?.watcher) {\r\n try {\r\n existing.watcher.close()\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n if (existing?.debounceTimer != null) {\r\n try {\r\n clearTimeout(existing.debounceTimer)\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n\r\n const dl = new LocalPathFileDownload(localPath, entry.mode, entry.size)\r\n this.trackTransfer(dl, 'download', entry.fullPath, localPath)\r\n await this.sftpSession.download(entry.fullPath, dl)\r\n\r\n // настроим наблюдение за изменениями локального файла\r\n const schedule = () => this.scheduleSyncBackRemoteFile(localPath)\r\n const watcher = fsSync.watch(localPath, { persistent: false }, (eventType) => {\r\n // Many editors save atomically (rename) or emit multiple change events.\r\n if (eventType === 'change' || eventType === 'rename') {\r\n schedule()\r\n }\r\n })\r\n this.openedRemoteFiles.set(localPath, {\r\n remotePath: entry.fullPath,\r\n mode: entry.mode,\r\n watcher,\r\n debounceTimer: null,\r\n syncing: false,\r\n pending: false,\r\n lastUploadedSignature: null,\r\n })\r\n\r\n this.platform.openPath(localPath)\r\n } catch (e) {\r\n console.error('[SFTP-UI] Open remote file failed', e)\r\n }\r\n }\r\n\r\n private scheduleSyncBackRemoteFile (localPath: string): void {\r\n const info = this.openedRemoteFiles.get(localPath)\r\n if (!info) {\r\n return\r\n }\r\n if (info.debounceTimer != null) {\r\n clearTimeout(info.debounceTimer)\r\n }\r\n // Debounce a burst of editor save events\r\n info.debounceTimer = window.setTimeout(() => {\r\n info.debounceTimer = null\r\n void this.syncBackRemoteFile(localPath)\r\n }, 650)\r\n }\r\n\r\n private async waitForStableLocalFile (localPath: string): Promise<{ size: number, mtimeMs: number } | null> {\r\n // Wait until the file stops changing (editors often write in multiple passes)\r\n let last: { size: number, mtimeMs: number } | null = null\r\n for (let i = 0; i < 10; i++) {\r\n const st = await fs.stat(localPath).catch(() => null)\r\n if (!st || !st.isFile()) {\r\n return null\r\n }\r\n const cur = { size: st.size, mtimeMs: st.mtimeMs }\r\n if (last && cur.size === last.size && cur.mtimeMs === last.mtimeMs) {\r\n // stable for one interval\r\n return cur\r\n }\r\n last = cur\r\n await new Promise(resolve => setTimeout(resolve, 180))\r\n }\r\n return last\r\n }\r\n\r\n private async syncBackRemoteFile (localPath: string): Promise<void> {\r\n if (!this.sftpSession || !this.connected) {\r\n return\r\n }\r\n const info = this.openedRemoteFiles.get(localPath)\r\n if (!info) {\r\n return\r\n }\r\n if (info.syncing) {\r\n info.pending = true\r\n return\r\n }\r\n info.syncing = true\r\n try {\r\n const stable = await this.waitForStableLocalFile(localPath)\r\n if (!stable) {\r\n return\r\n }\r\n const signature = `${stable.size}:${stable.mtimeMs}`\r\n if (info.lastUploadedSignature === signature) {\r\n return\r\n }\r\n const upload = new LocalPathFileUpload(localPath)\r\n this.trackTransfer(upload, 'upload', info.remotePath, localPath)\r\n await this.sftpSession.upload(info.remotePath, upload)\r\n info.lastUploadedSignature = signature\r\n await this.refreshRemote()\r\n } catch (e) {\r\n console.error('[SFTP-UI] Sync-back remote file failed', e)\r\n } finally {\r\n info.syncing = false\r\n if (info.pending) {\r\n info.pending = false\r\n this.scheduleSyncBackRemoteFile(localPath)\r\n }\r\n }\r\n }\r\n}\r\n\r\n","import { Injectable, NgZone } from '@angular/core'\r\nimport { AppService, HotkeysService, LogService, NotificationsService, SplitTabComponent } from 'tabby-core'\r\n\r\nimport { SftpManagerTabComponent } from './sftp-manager-tab.component'\r\n\r\n@Injectable()\r\nexport class SftpUiService {\r\n private logger: any\r\n\r\n constructor (\r\n private app: AppService,\r\n private hotkeys: HotkeysService,\r\n private log: LogService,\r\n private zone: NgZone,\r\n private notifications: NotificationsService,\r\n ) {\r\n this.logger = this.log.create('sftp-ui')\r\n\r\n this.hotkeys.hotkey$.subscribe(h => {\r\n if (h === 'open-sftp-ui') {\r\n this.open()\r\n }\r\n })\r\n\r\n this.logger.info('loaded')\r\n }\r\n\r\n open (): void {\r\n const active = this.app.activeTab\r\n const focused = active instanceof SplitTabComponent ? (active.getFocusedTab?.() ?? null) : active\r\n this.openForSourceTab(focused)\r\n }\r\n\r\n openForSourceTab (sourceTab: any, explicitRemotePath?: string): void {\r\n const sshSession = sourceTab?.sshSession ?? null\r\n const profile = sourceTab?.profile ?? null\r\n\r\n let remoteCwd = explicitRemotePath || '/'\r\n if (!explicitRemotePath && sourceTab) {\r\n remoteCwd = sourceTab.cwd \r\n || sourceTab.session?.cwd \r\n || sourceTab.path \r\n || sourceTab.session?.path \r\n || '/'\r\n }\r\n\r\n\r\n this.zone.run(() => {\r\n try {\r\n if (!sshSession) {\r\n this.notifications.error('SFTP-UI', 'No SSH session on current tab')\r\n return\r\n }\r\n const baseTitle =\r\n sourceTab?.customTitle ||\r\n sourceTab?.title ||\r\n profile?.name ||\r\n profile?.options?.host ||\r\n 'SFTP'\r\n const tab = this.app.openNewTab({\r\n type: SftpManagerTabComponent,\r\n inputs: {\r\n sshSession,\r\n profile,\r\n remotePath: remoteCwd,\r\n },\r\n })\r\n\r\n tab.setTitle(`${baseTitle} + SFTP`)\r\n this.notifications.notice('SFTP-UI opened')\r\n } catch (e) {\r\n this.notifications.error('SFTP-UI failed to open', String(e))\r\n this.logger.error('openForSourceTab failed', e)\r\n }\r\n })\r\n }\r\n}\r\n\r\n","import { Injectable } from '@angular/core'\r\n\r\nexport type SFTPFile = {\r\n name: string\r\n fullPath: string\r\n isDirectory: boolean\r\n isSymlink: boolean\r\n mode: number\r\n size: number\r\n modified: Date\r\n}\r\n\r\nexport type SFTPSessionLike = {\r\n readdir: (p: string) => Promise<SFTPFile[]>\r\n mkdir: (p: string) => Promise<void>\r\n rmdir: (p: string) => Promise<void>\r\n unlink: (p: string) => Promise<void>\r\n rename: (oldPath: string, newPath: string) => Promise<void>\r\n upload: (remotePath: string, transfer: import('tabby-core').FileUpload) => Promise<void>\r\n download: (remotePath: string, transfer: import('tabby-core').FileDownload) => Promise<void>\r\n}\r\n\r\nexport type SSHSessionLike = {\r\n openSFTP: () => Promise<SFTPSessionLike>\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class SftpConnectionService {\r\n async openFromSSHSession (sshSession: SSHSessionLike): Promise<SFTPSessionLike> {\r\n return await sshSession.openSFTP()\r\n }\r\n}\r\n\r\n","import { Injectable, Injector } from '@angular/core'\r\nimport { t } from './i18n'\r\nimport { Subscription } from 'rxjs'\r\nimport { NgbModal } from '@ng-bootstrap/ng-bootstrap'\r\nimport { ConfigService } from 'tabby-core'\r\nimport { TerminalDecorator, BaseTerminalTabComponent } from 'tabby-terminal'\r\nimport { QuickScript } from './configProvider'\r\nimport { ScriptEditModalComponent } from './scriptEditModal'\r\nimport { SftpUiService } from './sftp/sftp-ui.service'\r\n\r\nimport './quickScriptsBar.scss'\r\n\r\n@Injectable()\r\nexport class QuickScriptsDecorator extends TerminalDecorator {\r\n constructor (\r\n private config: ConfigService,\r\n private injector: Injector,\r\n private sftpUi: SftpUiService,\r\n ) {\r\n super()\r\n }\r\n\r\n attach (tab: BaseTerminalTabComponent): void {\r\n // 等待 tab 的 DOM 元素就绪后再注入按钮栏\r\n setTimeout(() => this.injectBar(tab), 200)\r\n }\r\n\r\n detach (_tab: BaseTerminalTabComponent): void {\r\n // 清理工作由 DOM 移除时自动完成\r\n }\r\n\r\n /**\r\n * 在终端 tab 的 DOM 中注入脚本按钮栏\r\n */\r\n private injectBar (tab: BaseTerminalTabComponent): void {\r\n const tabElement = (tab as any).element?.nativeElement\r\n || (tab as any).content?.nativeElement\r\n || document.querySelector('.tab-content .active')\r\n\r\n if (!tabElement) {\r\n return\r\n }\r\n\r\n // 查找终端内容容器(尝试多种可能的 DOM 结构)\r\n const terminalContainer = tabElement.querySelector('.content')\r\n || tabElement.querySelector('.terminal-container')\r\n || tabElement.querySelector('.xterm')\r\n || tabElement.firstElementChild\r\n\r\n if (!terminalContainer) {\r\n return\r\n }\r\n\r\n // 创建按钮栏容器\r\n const bar = document.createElement('div')\r\n bar.className = 'quick-scripts-bar'\r\n\r\n // 在终端内容前插入按钮栏\r\n terminalContainer.parentElement.insertBefore(bar, terminalContainer)\r\n\r\n // 渲染按钮\r\n this.renderButtons(bar, tab)\r\n\r\n // 监听配置变化,刷新按钮\r\n const sub = this.config.changed$.subscribe(() => {\r\n this.renderButtons(bar, tab)\r\n })\r\n\r\n // tab 销毁时清理\r\n tab.destroyed$.subscribe(() => {\r\n sub.unsubscribe()\r\n bar.remove()\r\n })\r\n }\r\n\r\n /**\r\n * 获取当前终端标签页的站点 Profile ID\r\n */\r\n private getProfileId (tab: any): string {\r\n return tab.profile?.id \r\n || tab.profile?.name \r\n || tab.customTitle \r\n || tab.title \r\n || 'global'\r\n }\r\n\r\n /**\r\n * 获取当前站点的专属脚本列表(带旧数据向前兼容)\r\n */\r\n private getScriptsForProfile (tab: any): QuickScript[] {\r\n const profileId = this.getProfileId(tab)\r\n const profileScripts = this.config.store.quickScriptsPlugin?.profileScripts || {}\r\n \r\n if (profileScripts[profileId]) {\r\n return profileScripts[profileId]\r\n }\r\n\r\n // 兼容:若 profile 没有配置过,但老全局 scripts 有配置,则继承老数据\r\n const legacy = this.config.store.quickScriptsPlugin?.scripts || []\r\n if (legacy.length > 0) {\r\n return legacy\r\n }\r\n\r\n return []\r\n }\r\n\r\n /**\r\n * 渲染按钮栏内容\r\n */\r\n private renderButtons (bar: HTMLElement, tab: BaseTerminalTabComponent): void {\r\n bar.innerHTML = ''\r\n\r\n const scripts = this.getScriptsForProfile(tab)\r\n\r\n // 渲染每个脚本按钮\r\n for (const script of scripts) {\r\n const btn = document.createElement('button')\r\n btn.className = 'script-btn'\r\n btn.textContent = script.name\r\n btn.title = t('点击执行', 'Click to run') + `: ${script.commands.join(' → ')}`\r\n\r\n if (script.color) {\r\n btn.style.backgroundColor = script.color\r\n btn.style.color = '#fff'\r\n btn.style.borderColor = 'rgba(0, 0, 0, 0.2)'\r\n }\r\n\r\n // 左键点击 → 执行脚本\r\n btn.addEventListener('click', (e) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n this.executeScript(tab, script, btn)\r\n })\r\n\r\n // 右键点击 → 编辑脚本\r\n btn.addEventListener('contextmenu', (e) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n this.editScript(tab, script)\r\n })\r\n\r\n bar.appendChild(btn)\r\n }\r\n\r\n // 新建按钮 (+)\r\n const addBtn = document.createElement('button')\r\n addBtn.className = 'script-btn-add'\r\n addBtn.textContent = '+'\r\n addBtn.title = t('新建脚本', 'New Script')\r\n addBtn.addEventListener('click', (e) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n this.addScript(tab)\r\n })\r\n bar.appendChild(addBtn)\r\n\r\n // SFTP 按钮\r\n const sftpBtn = document.createElement('button')\r\n sftpBtn.className = 'script-btn sftp-btn'\r\n sftpBtn.style.backgroundColor = '#f1c40f' // 黄色背景\r\n sftpBtn.style.color = '#000' // 黑色文字,保证可读性\r\n sftpBtn.style.marginLeft = 'auto' // 推到最右侧\r\n sftpBtn.style.display = 'inline-flex'\r\n sftpBtn.style.alignItems = 'center'\r\n sftpBtn.style.fontWeight = 'bold'\r\n sftpBtn.style.borderColor = 'rgba(0, 0, 0, 0.2)'\r\n sftpBtn.title = t('打开 SFTP 文件传输', 'Open SFTP File Transfer')\r\n\r\n // 文件夹图标\r\n const icon = document.createElement('i')\r\n icon.className = 'fas fa-folder me-1'\r\n sftpBtn.appendChild(icon)\r\n\r\n // 文字\r\n const text = document.createTextNode(' sftp')\r\n sftpBtn.appendChild(text)\r\n\r\n sftpBtn.addEventListener('click', async (e) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n\r\n const session = tab.session \r\n || (tab as any).getActiveSession?.() \r\n || (tab as any).getActivePane?.()?.session \r\n || (tab as any).activePane?.session\r\n\r\n if (!session || typeof session.output$?.subscribe !== 'function') {\r\n this.sftpUi.openForSourceTab(tab)\r\n return\r\n }\r\n\r\n let capturedPath = ''\r\n let outputBuffer = ''\r\n \r\n const sub = session.output$.subscribe((data: string) => {\r\n outputBuffer += data\r\n })\r\n\r\n if (typeof (tab as any).sendInput === 'function') {\r\n (tab as any).sendInput('pwd\\n')\r\n } else {\r\n session.write('pwd\\r')\r\n }\r\n\r\n await new Promise(resolve => setTimeout(resolve, 400))\r\n sub.unsubscribe()\r\n\r\n const lines = outputBuffer.split(/[\\r\\n]+/)\r\n for (let i = lines.length - 1; i >= 0; i--) {\r\n const line = lines[i].trim()\r\n if (line.startsWith('/') && !line.includes(' ') && line.length > 1) {\r\n if (line === 'pwd') {\r\n continue\r\n }\r\n capturedPath = line\r\n break\r\n }\r\n }\r\n\r\n this.sftpUi.openForSourceTab(tab, capturedPath)\r\n })\r\n\r\n bar.appendChild(sftpBtn)\r\n }\r\n\r\n\r\n /**\r\n * 执行脚本:按顺序逐条发送命令\r\n * 策略:发送命令后监听 output$,检测到提示符再发下一条,超时兜底\r\n */\r\n private async executeScript (\r\n tab: BaseTerminalTabComponent,\r\n script: QuickScript,\r\n btn: HTMLElement,\r\n ): Promise<void> {\r\n if (btn.classList.contains('running')) {\r\n return // 防止重复点击\r\n }\r\n\r\n // 尝试多渠道捕获当前活跃的会话\r\n const session = tab.session \r\n || (tab as any).getActiveSession?.() \r\n || (tab as any).getActivePane?.()?.session \r\n || (tab as any).activePane?.session\r\n\r\n const hasSendInput = typeof (tab as any).sendInput === 'function'\r\n\r\n // 既无有效 session 也无法广播输入,则静默退出\r\n if (!session && !hasSendInput) {\r\n return\r\n }\r\n\r\n btn.classList.add('running')\r\n\r\n const promptPattern = new RegExp(\r\n this.config.store.quickScriptsPlugin?.promptPattern || '(\\\\$|#|>|%)\\\\s*$'\r\n )\r\n const timeout = this.config.store.quickScriptsPlugin?.commandTimeout || 30000\r\n const minDelay = this.config.store.quickScriptsPlugin?.minDelay || 500\r\n\r\n try {\r\n for (const command of script.commands) {\r\n await this.sendAndWait(tab, session, command, promptPattern, timeout, minDelay)\r\n }\r\n } finally {\r\n btn.classList.remove('running')\r\n }\r\n }\r\n\r\n /**\r\n * 发送一条命令并等待执行完毕\r\n * @param tab 终端标签页\r\n * @param session 终端会话\r\n * @param command 要执行的命令\r\n * @param promptPattern 命令提示符正则\r\n * @param timeout 超时时间(毫秒)\r\n * @param minDelay 最小延时(毫秒)\r\n */\r\n private sendAndWait (\r\n tab: BaseTerminalTabComponent,\r\n session: any,\r\n command: string,\r\n promptPattern: RegExp,\r\n timeout: number,\r\n minDelay: number,\r\n ): Promise<void> {\r\n return new Promise<void>((resolve) => {\r\n let outputBuffer = ''\r\n let sub: Subscription | null = null\r\n let timer: any = null\r\n let resolved = false\r\n\r\n const cleanup = () => {\r\n if (resolved) {\r\n return\r\n }\r\n resolved = true\r\n if (sub) {\r\n sub.unsubscribe()\r\n }\r\n if (timer) {\r\n clearTimeout(timer)\r\n }\r\n resolve()\r\n }\r\n\r\n // 监听终端输出,检测指令提示符\r\n if (session) {\r\n sub = session.output$.subscribe((data: string) => {\r\n outputBuffer += data\r\n\r\n if (promptPattern.test(outputBuffer)) {\r\n setTimeout(cleanup, minDelay)\r\n }\r\n })\r\n } else {\r\n // 没有捕获到 session 走超时盲发\r\n setTimeout(cleanup, minDelay + 1000)\r\n }\r\n\r\n // 超时兜底\r\n timer = setTimeout(cleanup, timeout)\r\n\r\n // 优先使用 Tabby 广播输入,避免回车符号不适配的问题\r\n if (typeof (tab as any).sendInput === 'function') {\r\n (tab as any).sendInput(command + '\\n')\r\n } else if (session) {\r\n session.write(command + '\\r')\r\n }\r\n })\r\n }\r\n\r\n /**\r\n * 新建脚本\r\n */\r\n private async addScript (tab: BaseTerminalTabComponent): Promise<void> {\r\n const ngbModal = this.injector.get(NgbModal)\r\n const modal = ngbModal.open(ScriptEditModalComponent)\r\n modal.componentInstance.isNew = true\r\n modal.componentInstance.scriptName = ''\r\n modal.componentInstance.commandsText = ''\r\n // 默认生成随机颜色\r\n modal.componentInstance.scriptColor = '#' + Math.floor(Math.random() * 16777215).toString(16).padStart(6, '0')\r\n\r\n try {\r\n const result = await modal.result\r\n if (result?.action === 'save' && result.name) {\r\n const profileId = this.getProfileId(tab)\r\n const profileScripts = { ...(this.config.store.quickScriptsPlugin?.profileScripts || {}) }\r\n const scripts: QuickScript[] = [...(profileScripts[profileId] || this.getScriptsForProfile(tab))]\r\n \r\n scripts.push({\r\n name: result.name,\r\n commands: result.commands,\r\n color: result.color,\r\n })\r\n\r\n profileScripts[profileId] = scripts\r\n this.config.store.quickScriptsPlugin.profileScripts = profileScripts\r\n this.config.save()\r\n }\r\n } catch {\r\n // 用户取消,忽略\r\n }\r\n }\r\n\r\n /**\r\n * 编辑已有脚本\r\n */\r\n private async editScript (tab: BaseTerminalTabComponent, script: QuickScript): Promise<void> {\r\n const ngbModal = this.injector.get(NgbModal)\r\n const modal = ngbModal.open(ScriptEditModalComponent)\r\n modal.componentInstance.isNew = false\r\n modal.componentInstance.scriptName = script.name\r\n modal.componentInstance.commandsText = script.commands.join('\\n')\r\n modal.componentInstance.scriptColor = script.color || ('#' + Math.floor(Math.random() * 16777215).toString(16).padStart(6, '0'))\r\n\r\n try {\r\n const result = await modal.result\r\n const profileId = this.getProfileId(tab)\r\n const profileScripts = { ...(this.config.store.quickScriptsPlugin?.profileScripts || {}) }\r\n const scripts: QuickScript[] = [...(profileScripts[profileId] || this.getScriptsForProfile(tab))]\r\n const idx = scripts.findIndex(s => s.name === script.name)\r\n\r\n if (result?.action === 'save' && result.name) {\r\n // 更新脚本\r\n if (idx >= 0) {\r\n scripts[idx] = {\r\n name: result.name,\r\n commands: result.commands,\r\n color: result.color,\r\n }\r\n }\r\n profileScripts[profileId] = scripts\r\n this.config.store.quickScriptsPlugin.profileScripts = profileScripts\r\n this.config.save()\r\n } else if (result?.action === 'delete') {\r\n // 删除脚本\r\n if (idx >= 0) {\r\n scripts.splice(idx, 1)\r\n }\r\n profileScripts[profileId] = scripts\r\n this.config.store.quickScriptsPlugin.profileScripts = profileScripts\r\n this.config.save()\r\n }\r\n } catch {\r\n // 用户取消,忽略\r\n }\r\n }\r\n}\r\n","module.exports = require(\"crypto\");","module.exports = require(\"fs/promises\");","module.exports = require(\"os\");","module.exports = require(\"path\");","module.exports = __WEBPACK_EXTERNAL_MODULE__angular_common__;","module.exports = __WEBPACK_EXTERNAL_MODULE__angular_core__;","module.exports = __WEBPACK_EXTERNAL_MODULE__angular_forms__;","module.exports = __WEBPACK_EXTERNAL_MODULE__ng_bootstrap_ng_bootstrap__;","module.exports = __WEBPACK_EXTERNAL_MODULE_fs__;","module.exports = __WEBPACK_EXTERNAL_MODULE_tabby_core__;","module.exports = __WEBPACK_EXTERNAL_MODULE_tabby_terminal__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\tif (!(moduleId in __webpack_modules__)) {\n\t\tdelete __webpack_module_cache__[moduleId];\n\t\tvar e = new Error(\"Cannot find module '\" + moduleId + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nc = undefined;","import { NgModule } from '@angular/core'\r\nimport { CommonModule } from '@angular/common'\r\nimport { FormsModule } from '@angular/forms'\r\nimport TabbyCoreModule, { ConfigProvider } from 'tabby-core'\r\nimport { TerminalDecorator } from 'tabby-terminal'\r\n\r\nimport { QuickScriptsConfigProvider } from './configProvider'\r\nimport { QuickScriptsDecorator } from './terminalDecorator'\r\nimport { ScriptEditModalComponent } from './scriptEditModal'\r\nimport { SftpManagerTabComponent } from './sftp/sftp-manager-tab.component'\r\nimport { SftpUiService } from './sftp/sftp-ui.service'\r\n\r\n@NgModule({\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n TabbyCoreModule,\r\n ],\r\n providers: [\r\n { provide: ConfigProvider, useClass: QuickScriptsConfigProvider, multi: true },\r\n { provide: TerminalDecorator, useClass: QuickScriptsDecorator, multi: true },\r\n SftpUiService,\r\n ],\r\n entryComponents: [\r\n ScriptEditModalComponent,\r\n SftpManagerTabComponent,\r\n ],\r\n declarations: [\r\n ScriptEditModalComponent,\r\n SftpManagerTabComponent,\r\n ],\r\n})\r\nexport default class QuickScriptsModule { }\r\n\r\n"],"names":[],"sourceRoot":""}
|