@hyzyn/dsh-tty 0.9.0 → 0.10.1
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 +214 -21
- package/README.md +77 -10
- package/client.js +32 -58
- package/lib/index.d.ts +24 -7
- package/lib/index.js +432 -112
- package/lib/index.js.map +1 -1
- package/lib/shell-integration.d.ts +11 -0
- package/lib/shell-integration.js +182 -48
- package/lib/shell-integration.js.map +1 -1
- package/lib/ssh.d.ts +24 -0
- package/lib/ssh.js +114 -2
- package/lib/ssh.js.map +1 -1
- package/lib/tmux.d.ts +48 -0
- package/lib/tmux.js +176 -0
- package/lib/tmux.js.map +1 -0
- package/package.json +26 -10
package/lib/shell-integration.js
CHANGED
|
@@ -6,9 +6,10 @@
|
|
|
6
6
|
* 打标记即可两全,不需要动 DSH 的 spawnTerminal 协议。
|
|
7
7
|
*
|
|
8
8
|
* 注入方式(对用户透明,不要求改 rc):
|
|
9
|
-
* - zsh
|
|
10
|
-
*
|
|
11
|
-
* `-c` 包装层 `export ZDOTDIR=<桩目录>`
|
|
9
|
+
* - zsh:把桩文件写到**稳定目录**(<DSH_HOME|~/.dsh>/tty/shell/zsh/ 下的
|
|
10
|
+
* .zshenv/.zprofile/.zshrc/.zlogin,各自先 source 用户 ZDOTDIR/HOME 下的
|
|
11
|
+
* 原文件,.zshrc 追加钩子),spawn 时经 `-c` 包装层 `export ZDOTDIR=<桩目录>`
|
|
12
|
+
* 生效 —— VS Code 同款成熟方案;
|
|
12
13
|
* - bash:写桩 rc(先 source ~/.bashrc 再挂钩子),`exec bash --rcfile <桩>`;
|
|
13
14
|
* B 标记按版本二选一:bash ≥ 4.4 走 PS0;bash < 4.4(macOS 自带 3.2)无
|
|
14
15
|
* PS0,用**自卸式 DEBUG trap** 兜底——首次触发即发 B 并卸载(避免复合命令
|
|
@@ -16,53 +17,159 @@
|
|
|
16
17
|
* PROMPT_COMMAND 挂钩兼容字符串与数组(bash 5.1+)两种形态;
|
|
17
18
|
* - 其他 shell:返回 null,集成静默关闭(tty_capture{last} 会明确报错)。
|
|
18
19
|
*
|
|
20
|
+
* 稳定目录(0.10.0):桩文件必须在跨进程、跨宿主重启的路径上 —— tmux 持久
|
|
21
|
+
* 会话的内层 pane 由 tmux server(比宿主进程活得久)按 inner.sh 启动,若桩
|
|
22
|
+
* 在每次进程的临时目录里,宿主重启后新开 pane 的钩子会指向已失效路径。内容
|
|
23
|
+
* 静态(不含配置),write-if-changed 原子覆盖。
|
|
24
|
+
*
|
|
25
|
+
* tmux passthrough(0.10.0):持久标签的 pane 跑在 tmux 里,tmux 会吞掉不认
|
|
26
|
+
* 识的转义序列 —— 钩子检测 $TMUX,把 OSC 133/7 包进 DCS tmux; 信封
|
|
27
|
+
* (`\ePtmux;\e\e]133;…\a\e\\`,payload 内 ESC 需双写),tmux ≥3.3 且
|
|
28
|
+
* allow-passthrough on 时解包后原样转发到外层终端;宿主侧解析器看到的仍是
|
|
29
|
+
* 裸标记,零改动。低版本 tmux(<3.3)会吞掉信封:持久化本身可用,
|
|
30
|
+
* capture{last} / expect 的命令粒度降级(README 已知限制)。
|
|
31
|
+
*
|
|
19
32
|
* 标记语义(iTerm2/kitty/VS Code 同一约定):
|
|
20
33
|
* OSC 133;A —— prompt 开始;OSC 133;B —— 命令开始(preexec/PS0);
|
|
21
34
|
* OSC 133;D;<exit> —— 命令结束带退出码;OSC 7;file://<host><path> —— cwd 上报。
|
|
22
35
|
*/
|
|
23
|
-
import {
|
|
24
|
-
import { homedir
|
|
36
|
+
import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
37
|
+
import { homedir } from 'node:os';
|
|
25
38
|
import { join, basename } from 'node:path';
|
|
26
|
-
/**
|
|
39
|
+
/** 插件运行时资产根目录(稳定路径;DSH_HOME 优先,与 env 插件同语义)。 */
|
|
40
|
+
export function pluginRuntimeDir() {
|
|
41
|
+
const dshHome = process.env.DSH_HOME?.trim() || join(homedir(), '.dsh');
|
|
42
|
+
return join(dshHome, 'tty');
|
|
43
|
+
}
|
|
44
|
+
/** 原子 write-if-changed:内容相同跳过;不同则写同目录临时文件后 rename(避免半截文件)。 */
|
|
45
|
+
function writeIfChanged(file, content) {
|
|
46
|
+
try {
|
|
47
|
+
if (readFileSync(file, 'utf8') === content)
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
/* 不存在:继续写入 */
|
|
52
|
+
}
|
|
53
|
+
mkdirSync(dirname(file), { recursive: true });
|
|
54
|
+
const tmp = `${file}.${process.pid}.tmp`;
|
|
55
|
+
writeFileSync(tmp, content);
|
|
56
|
+
renameSync(tmp, file);
|
|
57
|
+
}
|
|
58
|
+
function dirname(path) {
|
|
59
|
+
const index = path.lastIndexOf('/');
|
|
60
|
+
return index > 0 ? path.slice(0, index) : '/';
|
|
61
|
+
}
|
|
62
|
+
/** 桩文件目录(稳定路径,zsh/bash 各一份;进程内缓存避免重复 stat)。 */
|
|
27
63
|
const stubDirs = new Map();
|
|
64
|
+
const ZSH_HOOKS = [
|
|
65
|
+
'',
|
|
66
|
+
'# >>> dsh-tty shell integration >>>',
|
|
67
|
+
'if [ -z "$DSH_TTY_HOOKS_LOADED" ]; then',
|
|
68
|
+
' export DSH_TTY_HOOKS_LOADED=1',
|
|
69
|
+
' typeset -g __DSH_TTY_IN_CMD=0',
|
|
70
|
+
' # tmux 持久标签:标记包 DCS passthrough 信封(payload 内 ESC 双写),',
|
|
71
|
+
' # tmux ≥3.3 + allow-passthrough 解包后原样转发;低版本 tmux 吞信封 → 降级',
|
|
72
|
+
' if [ -n "$TMUX" ]; then',
|
|
73
|
+
" __DSH_TTY_FMT_A='\\ePtmux;\\e\\e]133;A\\a\\e\\\\'",
|
|
74
|
+
" __DSH_TTY_FMT_B='\\ePtmux;\\e\\e]133;B\\a\\e\\\\'",
|
|
75
|
+
" __DSH_TTY_FMT_D='\\ePtmux;\\e\\e]133;D;%s\\a\\e\\\\'",
|
|
76
|
+
" __DSH_TTY_FMT_CWD='\\ePtmux;\\e\\e]7;file://%s%s\\a\\e\\\\'",
|
|
77
|
+
" __DSH_TTY_FMT_T='\\ePtmux;\\e\\e]133;T;%s\\a\\e\\\\'",
|
|
78
|
+
' else',
|
|
79
|
+
" __DSH_TTY_FMT_A='\\e]133;A\\a'",
|
|
80
|
+
" __DSH_TTY_FMT_B='\\e]133;B\\a'",
|
|
81
|
+
" __DSH_TTY_FMT_D='\\e]133;D;%s\\a'",
|
|
82
|
+
" __DSH_TTY_FMT_CWD='\\e]7;file://%s%s\\a'",
|
|
83
|
+
' fi',
|
|
84
|
+
' # tmux 里 pane 内容的重画是异步批量的(passthrough 标记即时直写),命令',
|
|
85
|
+
' # 输出会落在 D 标记之后、逃出宿主的 B..D 捕获窗口。precmd 在发 D 前先',
|
|
86
|
+
' # capture-pane 快照 pane 内容,经 OSC 133;T(base64)随流直送宿主,',
|
|
87
|
+
' # 宿主优先用 T 快照作为 tty_capture{last} 的输出',
|
|
88
|
+
' __dsh_tty_capture() {',
|
|
89
|
+
' local __dsh_tty_precmd_cap',
|
|
90
|
+
' __dsh_tty_precmd_cap=$(tmux -L dsh-tty capture-pane -p -t "$TMUX_PANE" -S -200 2>/dev/null)',
|
|
91
|
+
' if [ -n "$__dsh_tty_precmd_cap" ]; then',
|
|
92
|
+
' printf "$__DSH_TTY_FMT_T" "$(printf \'%s\' "$__dsh_tty_precmd_cap" | base64 | tr -d \'\\n\')"',
|
|
93
|
+
' fi',
|
|
94
|
+
' }',
|
|
95
|
+
' __dsh_tty_precmd() {',
|
|
96
|
+
' local ec=$?',
|
|
97
|
+
' if (( __DSH_TTY_IN_CMD )); then',
|
|
98
|
+
' [ -n "$TMUX" ] && __dsh_tty_capture',
|
|
99
|
+
' printf "$__DSH_TTY_FMT_D" "$ec"; __DSH_TTY_IN_CMD=0; fi',
|
|
100
|
+
' printf "$__DSH_TTY_FMT_A"',
|
|
101
|
+
' printf "$__DSH_TTY_FMT_CWD" "${HOST}" "${PWD}"',
|
|
102
|
+
' }',
|
|
103
|
+
' __dsh_tty_preexec() {',
|
|
104
|
+
' __DSH_TTY_IN_CMD=1',
|
|
105
|
+
' printf "$__DSH_TTY_FMT_B"',
|
|
106
|
+
' }',
|
|
107
|
+
' precmd_functions+=(__dsh_tty_precmd)',
|
|
108
|
+
' preexec_functions+=(__dsh_tty_preexec)',
|
|
109
|
+
'fi',
|
|
110
|
+
'# <<< dsh-tty shell integration <<<',
|
|
111
|
+
'',
|
|
112
|
+
];
|
|
113
|
+
const BASH_PRELUDE = [
|
|
114
|
+
'',
|
|
115
|
+
'# >>> dsh-tty shell integration >>>',
|
|
116
|
+
'if [ -z "$DSH_TTY_HOOKS_LOADED" ]; then',
|
|
117
|
+
' export DSH_TTY_HOOKS_LOADED=1',
|
|
118
|
+
' __DSH_TTY_IN_CMD=0',
|
|
119
|
+
' # tmux 持久标签:标记包 DCS passthrough 信封(同 zsh 桩说明)',
|
|
120
|
+
' if [ -n "$TMUX" ]; then',
|
|
121
|
+
" __DSH_TTY_FMT_A='\\ePtmux;\\e\\e]133;A\\a\\e\\\\'",
|
|
122
|
+
" __DSH_TTY_FMT_B='\\ePtmux;\\e\\e]133;B\\a\\e\\\\'",
|
|
123
|
+
" __DSH_TTY_FMT_D='\\ePtmux;\\e\\e]133;D;%s\\a\\e\\\\'",
|
|
124
|
+
" __DSH_TTY_FMT_CWD='\\ePtmux;\\e\\e]7;file://%s%s\\a\\e\\\\'",
|
|
125
|
+
" __DSH_TTY_FMT_T='\\ePtmux;\\e\\e]133;T;%s\\a\\e\\\\'",
|
|
126
|
+
' else',
|
|
127
|
+
" __DSH_TTY_FMT_A='\\e]133;A\\a'",
|
|
128
|
+
" __DSH_TTY_FMT_B='\\e]133;B\\a'",
|
|
129
|
+
" __DSH_TTY_FMT_D='\\e]133;D;%s\\a'",
|
|
130
|
+
" __DSH_TTY_FMT_CWD='\\e]7;file://%s%s\\a'",
|
|
131
|
+
' fi',
|
|
132
|
+
' # tmux 重画异步:precmd 发 D 前 capture-pane 快照(OSC 133;T base64,同 zsh 桩说明)',
|
|
133
|
+
' __dsh_tty_capture() {',
|
|
134
|
+
' local __dsh_tty_precmd_cap',
|
|
135
|
+
' __dsh_tty_precmd_cap=$(tmux -L dsh-tty capture-pane -p -t "$TMUX_PANE" -S -200 2>/dev/null)',
|
|
136
|
+
' if [ -n "$__dsh_tty_precmd_cap" ]; then',
|
|
137
|
+
' printf "$__DSH_TTY_FMT_T" "$(printf \'%s\' "$__dsh_tty_precmd_cap" | base64 | tr -d \'\\n\')"',
|
|
138
|
+
' fi',
|
|
139
|
+
' }',
|
|
140
|
+
' __dsh_tty_precmd() {',
|
|
141
|
+
' local ec=$?',
|
|
142
|
+
' if [ "$__DSH_TTY_IN_CMD" = "1" ]; then',
|
|
143
|
+
' [ -n "$TMUX" ] && __dsh_tty_capture',
|
|
144
|
+
' printf "$__DSH_TTY_FMT_D" "$ec"; __DSH_TTY_IN_CMD=0; fi',
|
|
145
|
+
' printf "$__DSH_TTY_FMT_A"',
|
|
146
|
+
' printf "$__DSH_TTY_FMT_CWD" "${HOSTNAME}" "${PWD}"',
|
|
147
|
+
' }',
|
|
148
|
+
];
|
|
149
|
+
const BASH_POSTLUDE = [
|
|
150
|
+
'fi',
|
|
151
|
+
'# <<< dsh-tty shell integration <<<',
|
|
152
|
+
'',
|
|
153
|
+
];
|
|
28
154
|
function ensureZshStubDir() {
|
|
29
155
|
const cached = stubDirs.get('zsh');
|
|
30
156
|
if (cached !== undefined)
|
|
31
157
|
return cached;
|
|
32
158
|
try {
|
|
33
|
-
const dir =
|
|
159
|
+
const dir = join(pluginRuntimeDir(), 'shell', 'zsh');
|
|
34
160
|
// 桩只做「source 用户原文件 + 追加钩子」;DSH_TTY_ORIG_ZDOTDIR 在包装层里
|
|
35
161
|
// 固化为用户原 ZDOTDIR(无则 $HOME),保证用户 rc 链路不变
|
|
36
162
|
for (const name of ['.zshenv', '.zprofile', '.zlogin']) {
|
|
37
|
-
|
|
163
|
+
writeIfChanged(join(dir, name), [
|
|
38
164
|
'# dsh-tty shell integration stub (chain to user file)',
|
|
39
165
|
'[ -f "$DSH_TTY_ORIG_ZDOTDIR/' + name + '" ] && source "$DSH_TTY_ORIG_ZDOTDIR/' + name + '"',
|
|
40
166
|
'',
|
|
41
167
|
].join('\n'));
|
|
42
168
|
}
|
|
43
|
-
|
|
169
|
+
writeIfChanged(join(dir, '.zshrc'), [
|
|
44
170
|
'# dsh-tty shell integration stub (chain to user file, then add hooks)',
|
|
45
171
|
'[ -f "$DSH_TTY_ORIG_ZDOTDIR/.zshrc" ] && source "$DSH_TTY_ORIG_ZDOTDIR/.zshrc"',
|
|
46
|
-
|
|
47
|
-
'# >>> dsh-tty shell integration >>>',
|
|
48
|
-
'if [ -z "$DSH_TTY_HOOKS_LOADED" ]; then',
|
|
49
|
-
' export DSH_TTY_HOOKS_LOADED=1',
|
|
50
|
-
' typeset -g __DSH_TTY_IN_CMD=0',
|
|
51
|
-
' __dsh_tty_precmd() {',
|
|
52
|
-
' local ec=$?',
|
|
53
|
-
' if (( __DSH_TTY_IN_CMD )); then printf \'\\e]133;D;%s\\a\' "$ec"; __DSH_TTY_IN_CMD=0; fi',
|
|
54
|
-
' printf \'\\e]133;A\\a\'',
|
|
55
|
-
' printf \'\\e]7;file://%s%s\\a\' "${HOST}" "${PWD}"',
|
|
56
|
-
' }',
|
|
57
|
-
' __dsh_tty_preexec() {',
|
|
58
|
-
' __DSH_TTY_IN_CMD=1',
|
|
59
|
-
' printf \'\\e]133;B\\a\'',
|
|
60
|
-
' }',
|
|
61
|
-
' precmd_functions+=(__dsh_tty_precmd)',
|
|
62
|
-
' preexec_functions+=(__dsh_tty_preexec)',
|
|
63
|
-
'fi',
|
|
64
|
-
'# <<< dsh-tty shell integration <<<',
|
|
65
|
-
'',
|
|
172
|
+
...ZSH_HOOKS,
|
|
66
173
|
].join('\n'));
|
|
67
174
|
stubDirs.set('zsh', dir);
|
|
68
175
|
return dir;
|
|
@@ -76,30 +183,20 @@ function ensureBashStubRc() {
|
|
|
76
183
|
if (cached !== undefined)
|
|
77
184
|
return cached;
|
|
78
185
|
try {
|
|
79
|
-
const dir =
|
|
186
|
+
const dir = join(pluginRuntimeDir(), 'shell', 'bash');
|
|
80
187
|
const rc = join(dir, 'bashrc');
|
|
81
|
-
|
|
188
|
+
writeIfChanged(rc, [
|
|
82
189
|
'# dsh-tty shell integration stub (chain to user file, then add hooks)',
|
|
83
190
|
'[ -f "$HOME/.bashrc" ] && source "$HOME/.bashrc"',
|
|
84
|
-
|
|
85
|
-
'# >>> dsh-tty shell integration >>>',
|
|
86
|
-
'if [ -z "$DSH_TTY_HOOKS_LOADED" ]; then',
|
|
87
|
-
' export DSH_TTY_HOOKS_LOADED=1',
|
|
88
|
-
' __DSH_TTY_IN_CMD=0',
|
|
89
|
-
' __dsh_tty_precmd() {',
|
|
90
|
-
' local ec=$?',
|
|
91
|
-
' if [ "$__DSH_TTY_IN_CMD" = "1" ]; then printf \'\\e]133;D;%s\\a\' "$ec"; __DSH_TTY_IN_CMD=0; fi',
|
|
92
|
-
' printf \'\\e]133;A\\a\'',
|
|
93
|
-
' printf \'\\e]7;file://%s%s\\a\' "${HOSTNAME}" "${PWD}"',
|
|
94
|
-
' }',
|
|
191
|
+
...BASH_PRELUDE,
|
|
95
192
|
' # —— B 标记(命令开始):按 bash 版本二选一 ——',
|
|
96
193
|
' __dsh_tty_major=${BASH_VERSION%%.*}',
|
|
97
194
|
' __dsh_tty_minor=${BASH_VERSION#*.}; __dsh_tty_minor=${__dsh_tty_minor%%.*}',
|
|
98
195
|
' if [ "$__dsh_tty_major" -gt 4 ] || { [ "$__dsh_tty_major" -eq 4 ] && [ "$__dsh_tty_minor" -ge 4 ]; }; then',
|
|
99
196
|
' # bash ≥ 4.4:PS0 在每个提示符后、命令输出前展开',
|
|
100
197
|
' case "${PS0:-}" in',
|
|
101
|
-
|
|
102
|
-
' *) PS0
|
|
198
|
+
" *'133;B'*) ;;",
|
|
199
|
+
' *) PS0="$__DSH_TTY_FMT_B""$PS0" ;;',
|
|
103
200
|
' esac',
|
|
104
201
|
' # PROMPT_COMMAND 挂钩:兼容字符串与数组(bash 5.1+)两种形态',
|
|
105
202
|
' case "$(declare -p PROMPT_COMMAND 2>/dev/null)" in',
|
|
@@ -128,7 +225,7 @@ function ensureBashStubRc() {
|
|
|
128
225
|
' ""|*__dsh_tty_precmd*|*__dsh_tty_rearm*) return ;;',
|
|
129
226
|
' esac',
|
|
130
227
|
' __DSH_TTY_IN_CMD=1',
|
|
131
|
-
' printf
|
|
228
|
+
' printf "$__DSH_TTY_FMT_B"',
|
|
132
229
|
' trap - DEBUG',
|
|
133
230
|
' }',
|
|
134
231
|
' __dsh_tty_rearm() { trap \'__dsh_tty_preexec\' DEBUG; }',
|
|
@@ -139,9 +236,7 @@ function ensureBashStubRc() {
|
|
|
139
236
|
' *) PROMPT_COMMAND="__dsh_tty_precmd${PROMPT_COMMAND:+;$PROMPT_COMMAND}; __dsh_tty_rearm" ;;',
|
|
140
237
|
' esac',
|
|
141
238
|
' fi',
|
|
142
|
-
|
|
143
|
-
'# <<< dsh-tty shell integration <<<',
|
|
144
|
-
'',
|
|
239
|
+
...BASH_POSTLUDE,
|
|
145
240
|
].join('\n'));
|
|
146
241
|
stubDirs.set('bash', rc);
|
|
147
242
|
return rc;
|
|
@@ -181,4 +276,43 @@ export function buildShellSpawn(shell, term, colorTerm, integration) {
|
|
|
181
276
|
}
|
|
182
277
|
return { argv: [shell, '-c', `${pre} ${exec}`], env: {} };
|
|
183
278
|
}
|
|
279
|
+
/* ------------------------------------------------------------------ *
|
|
280
|
+
* tmux 持久会话的内层 pane 启动器(0.10.0)
|
|
281
|
+
* ------------------------------------------------------------------ */
|
|
282
|
+
/** POSIX 单引号安全包裹(路径/值进 inner.sh 与 -c 包装层用)。 */
|
|
283
|
+
export function shSingleQuote(value) {
|
|
284
|
+
return "'" + value.replace(/'/g, `'\\''`) + "'";
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* 生成 tmux `default-command` 指向的内层启动器脚本:pane 里的 shell 由它
|
|
288
|
+
* exec 出来(非登录式,与非持久标签语义一致),并按当前配置注入 shell 集成。
|
|
289
|
+
* 脚本内容随配置重写(路径稳定、内容原子覆盖),tmux server 无需重启即可
|
|
290
|
+
* 让新 pane 用上新配置。
|
|
291
|
+
*/
|
|
292
|
+
export function buildTmuxInnerLauncher(shell, colorTerm, integration) {
|
|
293
|
+
const lines = [
|
|
294
|
+
'#!/bin/sh',
|
|
295
|
+
'# generated by dsh-tty(tmux 持久会话内层 shell 启动器)— 手改会被覆盖',
|
|
296
|
+
`export COLORTERM=${shSingleQuote(colorTerm)}`,
|
|
297
|
+
];
|
|
298
|
+
if (integration) {
|
|
299
|
+
const kind = basename(shell);
|
|
300
|
+
if (kind === 'zsh') {
|
|
301
|
+
const stubDir = ensureZshStubDir();
|
|
302
|
+
if (stubDir !== undefined) {
|
|
303
|
+
lines.push(`export DSH_TTY_ORIG_ZDOTDIR="\${ZDOTDIR:-$HOME}"`, `export ZDOTDIR=${shSingleQuote(stubDir)}`, `exec ${shSingleQuote(shell)}`);
|
|
304
|
+
return lines.join('\n') + '\n';
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
else if (kind === 'bash') {
|
|
308
|
+
const stubRc = ensureBashStubRc();
|
|
309
|
+
if (stubRc !== undefined) {
|
|
310
|
+
lines.push(`exec ${shSingleQuote(shell)} --rcfile ${shSingleQuote(stubRc)}`);
|
|
311
|
+
return lines.join('\n') + '\n';
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
lines.push(`exec ${shSingleQuote(shell)}`);
|
|
316
|
+
return lines.join('\n') + '\n';
|
|
317
|
+
}
|
|
184
318
|
//# sourceMappingURL=shell-integration.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell-integration.js","sourceRoot":"","sources":["../src/shell-integration.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"shell-integration.js","sourceRoot":"","sources":["../src/shell-integration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AAQ1C,gDAAgD;AAChD,MAAM,UAAU,gBAAgB;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAA;IACvE,OAAO,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;AAC7B,CAAC;AAED,8DAA8D;AAC9D,SAAS,cAAc,CAAC,IAAY,EAAE,OAAe;IACnD,IAAI,CAAC;QACH,IAAI,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,OAAO;YAAE,OAAM;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;IACD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAA;IACxC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAC3B,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;AACvB,CAAC;AAED,SAAS,OAAO,CAAC,IAAY;IAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IACnC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;AAC/C,CAAC;AAED,+CAA+C;AAC/C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAA;AAE1C,MAAM,SAAS,GAAG;IAChB,EAAE;IACF,qCAAqC;IACrC,yCAAyC;IACzC,iCAAiC;IACjC,iCAAiC;IACjC,yDAAyD;IACzD,6DAA6D;IAC7D,2BAA2B;IAC3B,uDAAuD;IACvD,uDAAuD;IACvD,0DAA0D;IAC1D,iEAAiE;IACjE,0DAA0D;IAC1D,QAAQ;IACR,oCAAoC;IACpC,oCAAoC;IACpC,uCAAuC;IACvC,8CAA8C;IAC9C,MAAM;IACN,oDAAoD;IACpD,iDAAiD;IACjD,wDAAwD;IACxD,wCAAwC;IACxC,yBAAyB;IACzB,gCAAgC;IAChC,iGAAiG;IACjG,6CAA6C;IAC7C,qGAAqG;IACrG,QAAQ;IACR,KAAK;IACL,wBAAwB;IACxB,iBAAiB;IACjB,qCAAqC;IACrC,2CAA2C;IAC3C,+DAA+D;IAC/D,+BAA+B;IAC/B,oDAAoD;IACpD,KAAK;IACL,yBAAyB;IACzB,wBAAwB;IACxB,+BAA+B;IAC/B,KAAK;IACL,wCAAwC;IACxC,0CAA0C;IAC1C,IAAI;IACJ,qCAAqC;IACrC,EAAE;CACH,CAAA;AAED,MAAM,YAAY,GAAG;IACnB,EAAE;IACF,qCAAqC;IACrC,yCAAyC;IACzC,iCAAiC;IACjC,sBAAsB;IACtB,iDAAiD;IACjD,2BAA2B;IAC3B,uDAAuD;IACvD,uDAAuD;IACvD,0DAA0D;IAC1D,iEAAiE;IACjE,0DAA0D;IAC1D,QAAQ;IACR,oCAAoC;IACpC,oCAAoC;IACpC,uCAAuC;IACvC,8CAA8C;IAC9C,MAAM;IACN,wEAAwE;IACxE,yBAAyB;IACzB,gCAAgC;IAChC,iGAAiG;IACjG,6CAA6C;IAC7C,qGAAqG;IACrG,QAAQ;IACR,KAAK;IACL,wBAAwB;IACxB,iBAAiB;IACjB,4CAA4C;IAC5C,2CAA2C;IAC3C,+DAA+D;IAC/D,+BAA+B;IAC/B,wDAAwD;IACxD,KAAK;CACN,CAAA;AAED,MAAM,aAAa,GAAG;IACpB,IAAI;IACJ,qCAAqC;IACrC,EAAE;CACH,CAAA;AAED,SAAS,gBAAgB;IACvB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAClC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAA;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,KAAK,CAAC,CAAA;QACpD,sDAAsD;QACtD,wCAAwC;QACxC,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,CAAU,EAAE,CAAC;YAChE,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;gBAC9B,uDAAuD;gBACvD,8BAA8B,GAAG,IAAI,GAAG,uCAAuC,GAAG,IAAI,GAAG,GAAG;gBAC5F,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACf,CAAC;QACD,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE;YAClC,uEAAuE;YACvE,gFAAgF;YAChF,GAAG,SAAS;SACb,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACb,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACxB,OAAO,GAAG,CAAA;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACnC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAA;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;QACrD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QAC9B,cAAc,CAAC,EAAE,EAAE;YACjB,uEAAuE;YACvE,kDAAkD;YAClD,GAAG,YAAY;YACf,mCAAmC;YACnC,uCAAuC;YACvC,8EAA8E;YAC9E,8GAA8G;YAC9G,sCAAsC;YACtC,wBAAwB;YACxB,qBAAqB;YACrB,0CAA0C;YAC1C,UAAU;YACV,iDAAiD;YACjD,wDAAwD;YACxD,sBAAsB;YACtB,wCAAwC;YACxC,kCAAkC;YAClC,sDAAsD;YACtD,iBAAiB;YACjB,UAAU;YACV,uCAAuC;YACvC,kCAAkC;YAClC,sFAAsF;YACtF,iBAAiB;YACjB,UAAU;YACV,QAAQ;YACR,mEAAmE;YACnE,qDAAqD;YACrD,gEAAgE;YAChE,sDAAsD;YACtD,kDAAkD;YAClD,+DAA+D;YAC/D,yCAAyC;YACzC,mDAAmD;YACnD,2BAA2B;YAC3B,+BAA+B;YAC/B,4DAA4D;YAC5D,YAAY;YACZ,0BAA0B;YAC1B,iCAAiC;YACjC,oBAAoB;YACpB,OAAO;YACP,6DAA6D;YAC7D,4DAA4D;YAC5D,sDAAsD;YACtD,mCAAmC;YACnC,8BAA8B;YAC9B,mGAAmG;YACnG,UAAU;YACV,MAAM;YACN,GAAG,aAAa;SACjB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACb,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACxB,OAAO,EAAE,CAAA;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,IAAY,EAAE,SAAiB,EAAE,WAAoB;IAClG,MAAM,GAAG,GAAG,gBAAgB,IAAI,wBAAwB,SAAS,IAAI,CAAA;IACrE,MAAM,IAAI,GAAG,SAAS,KAAK,GAAG,CAAA;IAC9B,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC5B,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAA;YAClC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,OAAO;oBACL,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,6CAA6C,OAAO,EAAE,uBAAuB,OAAO,MAAM,IAAI,EAAE,CAAC;oBAC3H,GAAG,EAAE,EAAE;iBACR,CAAA;YACH,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAA;YACjC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,OAAO;oBACL,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,IAAI,cAAc,MAAM,GAAG,CAAC;oBAC1D,GAAG,EAAE,EAAE;iBACR,CAAA;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAA;AAC3D,CAAC;AAED;;wEAEwE;AAExE,+CAA+C;AAC/C,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,GAAG,CAAA;AACjD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAa,EAAE,SAAiB,EAAE,WAAoB;IAC3F,MAAM,KAAK,GAAG;QACZ,WAAW;QACX,uDAAuD;QACvD,oBAAoB,aAAa,CAAC,SAAS,CAAC,EAAE;KAC/C,CAAA;IACD,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC5B,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAA;YAClC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CACR,kDAAkD,EAClD,kBAAkB,aAAa,CAAC,OAAO,CAAC,EAAE,EAC1C,QAAQ,aAAa,CAAC,KAAK,CAAC,EAAE,CAC/B,CAAA;gBACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;YAChC,CAAC;QACH,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAA;YACjC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,QAAQ,aAAa,CAAC,KAAK,CAAC,aAAa,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;gBAC5E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,QAAQ,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAChC,CAAC"}
|
package/lib/ssh.d.ts
CHANGED
|
@@ -17,6 +17,19 @@ export interface TermHandle {
|
|
|
17
17
|
terminate(): Promise<unknown>;
|
|
18
18
|
/** terminate 失败后的最后手段(本地 PTY:对顶层 shell 直接 SIGKILL)。 */
|
|
19
19
|
forceKill?(): void;
|
|
20
|
+
/**
|
|
21
|
+
* tmux 背书会话(0.10.0 持久化)的关闭收尾:kill-session 让 pane 真正结束,
|
|
22
|
+
* 而不是只杀客户端把会话留在 tmux server 上。kill 帧路径在 forceKill 前调用。
|
|
23
|
+
*/
|
|
24
|
+
tmuxTeardown?(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* 强制 tmux 重画该会话的全部客户端(0.10.1 跨窗口共享:新绑定连接的
|
|
27
|
+
* xterm 需要一份可见屏重画)。本地实现走本机 tmux CLI(src/tmux.ts),
|
|
28
|
+
* SSH 实现在远程连接内 exec(本机 tmux 看不到远程会话)。
|
|
29
|
+
*/
|
|
30
|
+
tmuxRefresh?(): Promise<void>;
|
|
31
|
+
/** spawn 后注入终端的灰字提示(如远程无 tmux 降级为普通会话)。 */
|
|
32
|
+
startupNotice?: string;
|
|
20
33
|
}
|
|
21
34
|
/** TOFU 主机指纹记录。 */
|
|
22
35
|
export interface HostKeyRecord {
|
|
@@ -40,6 +53,8 @@ export interface SshSpec {
|
|
|
40
53
|
/** 连接簿条目(带名字,存 settings)。 */
|
|
41
54
|
export interface SshHostEntry extends SshSpec {
|
|
42
55
|
name: string;
|
|
56
|
+
/** 该条目的 SSH 标签默认以 tmux 持久会话打开(仅宿主 persistence=tmux 时生效)。 */
|
|
57
|
+
persist?: boolean;
|
|
43
58
|
}
|
|
44
59
|
export interface SshSpawnOptions {
|
|
45
60
|
term: string;
|
|
@@ -54,6 +69,15 @@ export interface SshSpawnOptions {
|
|
|
54
69
|
* 缺省时退化为 accept-and-log(仅记录指纹,无条件放行)。
|
|
55
70
|
*/
|
|
56
71
|
hostKeyStore?: HostKeyStore;
|
|
72
|
+
/**
|
|
73
|
+
* tmux 会话持久化(0.10.0):远程以 `exec tmux new-session -A -s <name>` 开
|
|
74
|
+
* pty channel(专用 socket dsh-tty),会话托管在远程 tmux server 上,断线/
|
|
75
|
+
* 宿主重启后按同名接回。远程无 tmux 时降级普通 shell channel,
|
|
76
|
+
* startupNotice 带提示。name 须已过 sanitizePersistName(安全字符集)。
|
|
77
|
+
*/
|
|
78
|
+
persist?: {
|
|
79
|
+
name: string;
|
|
80
|
+
};
|
|
57
81
|
}
|
|
58
82
|
/** 主机指纹钉扎存储(宿主半体实现为 LiveConfig + settings 持久化)。 */
|
|
59
83
|
export interface HostKeyStore {
|
package/lib/ssh.js
CHANGED
|
@@ -23,6 +23,8 @@ import { readFileSync } from 'node:fs';
|
|
|
23
23
|
import { homedir } from 'node:os';
|
|
24
24
|
import { join } from 'node:path';
|
|
25
25
|
import { PassThrough } from 'node:stream';
|
|
26
|
+
import { TMUX_SOCKET } from './tmux.js';
|
|
27
|
+
import { shSingleQuote } from './shell-integration.js';
|
|
26
28
|
/** `env:VAR` 前缀从 process.env 取值;否则原样返回。 */
|
|
27
29
|
function resolveSecret(value) {
|
|
28
30
|
if (value === undefined)
|
|
@@ -159,9 +161,12 @@ export async function spawnSsh(spec, options) {
|
|
|
159
161
|
// 认证配置可能抛错(keyPath 读不到 / env 变量缺失)——先构造再连
|
|
160
162
|
const connectConfig = buildConnectConfig(spec);
|
|
161
163
|
const policy = applyHostKeyPolicy({ connectConfig, spec, store: options.hostKeyStore, logger, target });
|
|
164
|
+
/** 持久会话:远程 tmux 探测/降级提示(spawn 后由调用方注入终端)。 */
|
|
165
|
+
let startupNotice;
|
|
166
|
+
let tmuxUsed = false;
|
|
162
167
|
const channel = await new Promise((resolve, reject) => {
|
|
163
168
|
let settled = false;
|
|
164
|
-
|
|
169
|
+
const openShell = () => {
|
|
165
170
|
// agentForward 走 per-channel 请求(@types/ssh2 的 ShellOptions 未声明,
|
|
166
171
|
// 运行时支持;仅在本机 agent 存在时生效,见 buildConnectConfig)
|
|
167
172
|
conn.shell({ term: options.term, cols: options.cols, rows: options.rows, agentForward: spec.agentForward === true }, (error, ch) => {
|
|
@@ -173,6 +178,69 @@ export async function spawnSsh(spec, options) {
|
|
|
173
178
|
}
|
|
174
179
|
resolve(ch);
|
|
175
180
|
});
|
|
181
|
+
};
|
|
182
|
+
/** 持久会话:远程 `exec tmux new-session -A`(pty channel,语义与 shell 一致)。 */
|
|
183
|
+
const openTmux = () => {
|
|
184
|
+
// 链式 set-option 幂等重放(attach 已有 server 时也生效);首 pane 在
|
|
185
|
+
// 选项生效前创建,default-terminal 用 tmux 自身默认(README 已知限制)
|
|
186
|
+
const cmd = [
|
|
187
|
+
`exec tmux -L ${TMUX_SOCKET} -f /dev/null new-session -A -s ${shSingleQuote(options.persist?.name ?? '')}`,
|
|
188
|
+
"';' set-option -g status off",
|
|
189
|
+
"';' set-option -g history-limit 20000",
|
|
190
|
+
"';' set-option -ga terminal-overrides ,*:RGB",
|
|
191
|
+
].join(' ');
|
|
192
|
+
conn.exec(cmd, { pty: { term: options.term, cols: options.cols, rows: options.rows } }, (error, ch) => {
|
|
193
|
+
if (error !== undefined && error !== null) {
|
|
194
|
+
// tmux 启动失败(存在但异常):连接已建立,降级普通 shell 优于直接报错
|
|
195
|
+
logger?.warn(`[dsh-tty] ssh ${target} tmux 启动失败,降级普通 shell: ${error.message}`);
|
|
196
|
+
startupNotice = 'tmux 启动失败,已降级为普通会话';
|
|
197
|
+
openShell();
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
settled = true;
|
|
201
|
+
tmuxUsed = true;
|
|
202
|
+
resolve(ch);
|
|
203
|
+
});
|
|
204
|
+
};
|
|
205
|
+
const openWithPersist = () => {
|
|
206
|
+
// 先毫秒级探测远程是否有 tmux(不带 pty 的 exec)。决策依据:exit(大多
|
|
207
|
+
// 数 sshd 立即回)→ close(兜底,个别实现无 exit)→ 10s 超时(实测某些
|
|
208
|
+
// sshd 如 CentOS 9 只回 exit 不回 close,等 close 会永久卡死 spawn)。
|
|
209
|
+
// error 与 close 可能先后到达,proceeded 防止降级路径开两条 channel
|
|
210
|
+
let proceeded = false;
|
|
211
|
+
const fallback = (notice) => {
|
|
212
|
+
if (proceeded)
|
|
213
|
+
return;
|
|
214
|
+
proceeded = true;
|
|
215
|
+
startupNotice = notice;
|
|
216
|
+
openShell();
|
|
217
|
+
};
|
|
218
|
+
const decide = (code) => {
|
|
219
|
+
if (proceeded)
|
|
220
|
+
return;
|
|
221
|
+
proceeded = true;
|
|
222
|
+
if (code === 0)
|
|
223
|
+
openTmux();
|
|
224
|
+
else
|
|
225
|
+
fallback('远程 tmux 不可用(未安装或探测超时),本次以普通会话连接;安装 tmux 后持久会话可跨断线/宿主重启恢复');
|
|
226
|
+
};
|
|
227
|
+
conn.exec('command -v tmux >/dev/null 2>&1', (error, stream) => {
|
|
228
|
+
if (error !== undefined && error !== null) {
|
|
229
|
+
fallback('远程 tmux 探测失败,已降级为普通会话');
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
stream.on('exit', (c) => { decide(typeof c === 'number' ? c : 1); });
|
|
233
|
+
stream.on('close', () => { decide(null); });
|
|
234
|
+
stream.on('error', () => fallback('远程 tmux 探测失败,已降级为普通会话'));
|
|
235
|
+
const timer = setTimeout(() => decide(null), 10_000);
|
|
236
|
+
timer.unref?.();
|
|
237
|
+
});
|
|
238
|
+
};
|
|
239
|
+
conn.on('ready', () => {
|
|
240
|
+
if (options.persist !== undefined)
|
|
241
|
+
openWithPersist();
|
|
242
|
+
else
|
|
243
|
+
openShell();
|
|
176
244
|
});
|
|
177
245
|
conn.on('error', (error) => {
|
|
178
246
|
if (!settled) {
|
|
@@ -217,6 +285,47 @@ export async function spawnSsh(spec, options) {
|
|
|
217
285
|
channel.on('close', () => {
|
|
218
286
|
finish();
|
|
219
287
|
});
|
|
288
|
+
// 持久会话的重画(0.10.1 跨窗口共享):远程 list-clients + 逐个
|
|
289
|
+
// refresh-client 一条 exec 管道完成;resolve 时机 = 远程命令跑完
|
|
290
|
+
const tmuxRefresh = tmuxUsed && options.persist !== undefined
|
|
291
|
+
? () => new Promise((resolve) => {
|
|
292
|
+
const cmd = `tmux -L ${TMUX_SOCKET} list-clients -t ${shSingleQuote(options.persist?.name ?? '')} -F '#{client_name}' | ` +
|
|
293
|
+
`while IFS= read -r c; do tmux -L ${TMUX_SOCKET} refresh-client -t "$c"; done`;
|
|
294
|
+
try {
|
|
295
|
+
conn.exec(cmd, (error, stream) => {
|
|
296
|
+
if (error !== undefined && error !== null) {
|
|
297
|
+
resolve();
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
stream.on('close', () => resolve());
|
|
301
|
+
stream.on('error', () => resolve());
|
|
302
|
+
});
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
resolve();
|
|
306
|
+
}
|
|
307
|
+
})
|
|
308
|
+
: undefined;
|
|
309
|
+
// 持久会话的关闭收尾:kill-session 须在连接还活着时发出(连接随 channel
|
|
310
|
+
// 关闭而断开);resolve 时机 = 远程命令跑完(stream close),调用方另有
|
|
311
|
+
// 2.5s 兜底 forceKill 防悬挂
|
|
312
|
+
const tmuxTeardown = tmuxUsed && options.persist !== undefined
|
|
313
|
+
? () => new Promise((resolve) => {
|
|
314
|
+
try {
|
|
315
|
+
conn.exec(`tmux -L ${TMUX_SOCKET} kill-session -t ${shSingleQuote(options.persist?.name ?? '')}`, (error, stream) => {
|
|
316
|
+
if (error !== undefined && error !== null) {
|
|
317
|
+
resolve();
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
stream.on('close', () => resolve());
|
|
321
|
+
stream.on('error', () => resolve());
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
catch {
|
|
325
|
+
resolve();
|
|
326
|
+
}
|
|
327
|
+
})
|
|
328
|
+
: undefined;
|
|
220
329
|
// 背压透传:TtyServer 暂停 PassThrough 时一并暂停上游 channel,
|
|
221
330
|
// 避免高速输出(cat 大文件)在 Node 侧无界堆积
|
|
222
331
|
const nativePause = output.pause.bind(output);
|
|
@@ -239,7 +348,7 @@ export async function spawnSsh(spec, options) {
|
|
|
239
348
|
}
|
|
240
349
|
return nativeResume();
|
|
241
350
|
};
|
|
242
|
-
logger?.info(`[dsh-tty] ssh 会话就绪: ${target}`);
|
|
351
|
+
logger?.info(`[dsh-tty] ssh 会话就绪: ${target}${tmuxUsed ? '(tmux 持久)' : ''}`);
|
|
243
352
|
return {
|
|
244
353
|
kind: 'ssh',
|
|
245
354
|
pid: null,
|
|
@@ -267,6 +376,9 @@ export async function spawnSsh(spec, options) {
|
|
|
267
376
|
finish();
|
|
268
377
|
return Promise.resolve(true);
|
|
269
378
|
},
|
|
379
|
+
...(tmuxTeardown !== undefined ? { tmuxTeardown } : {}),
|
|
380
|
+
...(tmuxRefresh !== undefined ? { tmuxRefresh } : {}),
|
|
381
|
+
...(startupNotice !== undefined ? { startupNotice } : {}),
|
|
270
382
|
};
|
|
271
383
|
}
|
|
272
384
|
//# sourceMappingURL=ssh.js.map
|
package/lib/ssh.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../src/ssh.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../src/ssh.ts"],"names":[],"mappings":"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"}
|
package/lib/tmux.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { ShellSpawnPlan } from './shell-integration.js';
|
|
2
|
+
/** 专用 tmux socket 名:与用户自己的 tmux server 完全隔离。 */
|
|
3
|
+
export declare const TMUX_SOCKET = "dsh-tty";
|
|
4
|
+
/** 探测结果:available = tmux 存在;passthrough = 版本 ≥3.3(DCS 信封可转发)。 */
|
|
5
|
+
export interface TmuxProbe {
|
|
6
|
+
available: boolean;
|
|
7
|
+
passthrough: boolean;
|
|
8
|
+
}
|
|
9
|
+
/** 探测 tmux 可用性与版本(30s TTL;execFile 3s 超时)。 */
|
|
10
|
+
export declare function probeTmux(): Promise<TmuxProbe>;
|
|
11
|
+
/** spawn 帧里的持久名清洗:合法字符集加 `dsh-` 前缀;不合法退回 sid 派生名。 */
|
|
12
|
+
export declare function sanitizePersistName(raw: unknown, sid: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* 生成/刷新 tmux 运行资产(tmux.conf + inner.sh):每个持久 spawn 前调用,
|
|
15
|
+
* 内容随当前配置(shell / shellIntegration / passthrough)write-if-changed。
|
|
16
|
+
* conf 只在 tmux server 首启时被读,后续 spawn 的重写不生效 —— 但 inner.sh
|
|
17
|
+
* 内容每次开 pane 都会重新执行,配置热改对持久标签的新 pane 仍然生效。
|
|
18
|
+
*/
|
|
19
|
+
export declare function ensureTmuxAssets(options: {
|
|
20
|
+
shell: string;
|
|
21
|
+
colorTerm: string;
|
|
22
|
+
shellIntegration: boolean;
|
|
23
|
+
passthrough: boolean;
|
|
24
|
+
}): void;
|
|
25
|
+
/**
|
|
26
|
+
* 持久本地会话的 `-c` 包装层:TERM/COLORTERM 注入(与普通会话同机制)后
|
|
27
|
+
* `exec tmux -A` attach-or-create。持久名已过 sanitizePersistName(安全字符集),
|
|
28
|
+
* 单引号包裹防注入;cwd 不进命令行 —— tmux 客户端继承 node-pty spawn 的 cwd,
|
|
29
|
+
* 新 session 的 pane 以此为工作目录。
|
|
30
|
+
*/
|
|
31
|
+
export declare function buildTmuxSpawnPlan(options: {
|
|
32
|
+
shell: string;
|
|
33
|
+
term: string;
|
|
34
|
+
colorTerm: string;
|
|
35
|
+
tmuxName: string;
|
|
36
|
+
}): ShellSpawnPlan;
|
|
37
|
+
/** kill 帧的 tmux 侧收尾:kill-session(不存在/已死同样 resolve,错误吞掉)。 */
|
|
38
|
+
export declare function killTmuxSession(tmuxName: string): Promise<void>;
|
|
39
|
+
/** 专用 socket 上现存的 tmux 会话名(sessions 帧的 tmux 字段,客户端恢复确认用)。 */
|
|
40
|
+
export declare function listTmuxSessions(): Promise<string[]>;
|
|
41
|
+
/**
|
|
42
|
+
* attach 重画:tmux 背书会话重连时不回放宿主环形缓冲(tmux 的整屏重画会把
|
|
43
|
+
* 同样内容再画一遍 → 重影 + 幽灵滚动条),改为让 tmux 强制重画客户端一次。
|
|
44
|
+
* 同一会话可能被多个窗口同时接回(每窗口一个 PTY 客户端),list-clients
|
|
45
|
+
* 逐个 refresh——只刷第一个会把另一个窗口留在 reset 后的空白屏上;任何
|
|
46
|
+
* 失败静默吞掉(极端情况下用户敲一次键 tmux 也会重画)。
|
|
47
|
+
*/
|
|
48
|
+
export declare function refreshTmuxClient(tmuxName: string): Promise<void>;
|