@hyzyn/dsh-tty 0.5.0 → 0.10.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.
@@ -6,61 +6,170 @@
6
6
  * 打标记即可两全,不需要动 DSH 的 spawnTerminal 协议。
7
7
  *
8
8
  * 注入方式(对用户透明,不要求改 rc):
9
- * - zsh:进程级懒创建临时目录写四个桩文件(.zshenv/.zprofile/.zshrc/.zlogin,
10
- * 各自先 source 用户 ZDOTDIR/HOME 下的原文件,.zshrc 追加钩子),spawn 时经
11
- * `-c` 包装层 `export ZDOTDIR=<桩目录>` 生效 —— VS Code 同款成熟方案;
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
- * 命令开始标记走 PS0(bash ≥ 4.4,macOS 自带 bash 3.2 无 PS0 时优雅降级:
14
- * 只丢 B 标记,A/D/OSC 7 照常);
14
+ * B 标记按版本二选一:bash ≥ 4.4 走 PS0;bash < 4.4(macOS 自带 3.2)无
15
+ * PS0,用**自卸式 DEBUG trap** 兜底——首次触发即发 B 并卸载(避免复合命令
16
+ * 内部逐条触发),再由 PROMPT_COMMAND 尾段在每轮 prompt 前重新武装;
17
+ * PROMPT_COMMAND 挂钩兼容字符串与数组(bash 5.1+)两种形态;
15
18
  * - 其他 shell:返回 null,集成静默关闭(tty_capture{last} 会明确报错)。
16
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
+ *
17
32
  * 标记语义(iTerm2/kitty/VS Code 同一约定):
18
33
  * OSC 133;A —— prompt 开始;OSC 133;B —— 命令开始(preexec/PS0);
19
34
  * OSC 133;D;<exit> —— 命令结束带退出码;OSC 7;file://<host><path> —— cwd 上报。
20
35
  */
21
- import { mkdtempSync, writeFileSync } from 'node:fs';
22
- import { homedir, tmpdir } from 'node:os';
36
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
37
+ import { homedir } from 'node:os';
23
38
  import { join, basename } from 'node:path';
24
- /** 桩文件目录(进程级懒创建,zsh/bash 共用进程生命周期)。 */
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)。 */
25
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
+ ];
26
154
  function ensureZshStubDir() {
27
155
  const cached = stubDirs.get('zsh');
28
156
  if (cached !== undefined)
29
157
  return cached;
30
158
  try {
31
- const dir = mkdtempSync(join(tmpdir(), 'dsh-tty-zsh-'));
159
+ const dir = join(pluginRuntimeDir(), 'shell', 'zsh');
32
160
  // 桩只做「source 用户原文件 + 追加钩子」;DSH_TTY_ORIG_ZDOTDIR 在包装层里
33
161
  // 固化为用户原 ZDOTDIR(无则 $HOME),保证用户 rc 链路不变
34
162
  for (const name of ['.zshenv', '.zprofile', '.zlogin']) {
35
- writeFileSync(join(dir, name), [
163
+ writeIfChanged(join(dir, name), [
36
164
  '# dsh-tty shell integration stub (chain to user file)',
37
165
  '[ -f "$DSH_TTY_ORIG_ZDOTDIR/' + name + '" ] && source "$DSH_TTY_ORIG_ZDOTDIR/' + name + '"',
38
166
  '',
39
167
  ].join('\n'));
40
168
  }
41
- writeFileSync(join(dir, '.zshrc'), [
169
+ writeIfChanged(join(dir, '.zshrc'), [
42
170
  '# dsh-tty shell integration stub (chain to user file, then add hooks)',
43
171
  '[ -f "$DSH_TTY_ORIG_ZDOTDIR/.zshrc" ] && source "$DSH_TTY_ORIG_ZDOTDIR/.zshrc"',
44
- '',
45
- '# >>> dsh-tty shell integration >>>',
46
- 'if [ -z "$DSH_TTY_HOOKS_LOADED" ]; then',
47
- ' export DSH_TTY_HOOKS_LOADED=1',
48
- ' typeset -g __DSH_TTY_IN_CMD=0',
49
- ' __dsh_tty_precmd() {',
50
- ' local ec=$?',
51
- ' if (( __DSH_TTY_IN_CMD )); then printf \'\\e]133;D;%s\\a\' "$ec"; __DSH_TTY_IN_CMD=0; fi',
52
- ' printf \'\\e]133;A\\a\'',
53
- ' printf \'\\e]7;file://%s%s\\a\' "${HOST}" "${PWD}"',
54
- ' }',
55
- ' __dsh_tty_preexec() {',
56
- ' __DSH_TTY_IN_CMD=1',
57
- ' printf \'\\e]133;B\\a\'',
58
- ' }',
59
- ' precmd_functions+=(__dsh_tty_precmd)',
60
- ' preexec_functions+=(__dsh_tty_preexec)',
61
- 'fi',
62
- '# <<< dsh-tty shell integration <<<',
63
- '',
172
+ ...ZSH_HOOKS,
64
173
  ].join('\n'));
65
174
  stubDirs.set('zsh', dir);
66
175
  return dir;
@@ -74,34 +183,60 @@ function ensureBashStubRc() {
74
183
  if (cached !== undefined)
75
184
  return cached;
76
185
  try {
77
- const dir = mkdtempSync(join(tmpdir(), 'dsh-tty-bash-'));
186
+ const dir = join(pluginRuntimeDir(), 'shell', 'bash');
78
187
  const rc = join(dir, 'bashrc');
79
- writeFileSync(rc, [
188
+ writeIfChanged(rc, [
80
189
  '# dsh-tty shell integration stub (chain to user file, then add hooks)',
81
190
  '[ -f "$HOME/.bashrc" ] && source "$HOME/.bashrc"',
82
- '',
83
- '# >>> dsh-tty shell integration >>>',
84
- 'if [ -z "$DSH_TTY_HOOKS_LOADED" ]; then',
85
- ' export DSH_TTY_HOOKS_LOADED=1',
86
- ' __DSH_TTY_IN_CMD=0',
87
- ' __dsh_tty_precmd() {',
88
- ' local ec=$?',
89
- ' if [ "$__DSH_TTY_IN_CMD" = "1" ]; then printf \'\\e]133;D;%s\\a\' "$ec"; __DSH_TTY_IN_CMD=0; fi',
90
- ' printf \'\\e]133;A\\a\'',
91
- ' printf \'\\e]7;file://%s%s\\a\' "${HOSTNAME}" "${PWD}"',
92
- ' }',
93
- ' case "${PROMPT_COMMAND:-}" in',
94
- ' *__dsh_tty_precmd*) ;;',
95
- ' *) PROMPT_COMMAND="__dsh_tty_precmd${PROMPT_COMMAND:+;$PROMPT_COMMAND}" ;;',
96
- ' esac',
97
- ' # PS0 需要 bash ≥ 4.4;老 bash 无 PS0,仅丢 B 标记(A/D/OSC 7 照常)',
98
- ' case "${PS0:-}" in',
99
- ' *\'133;B\'*) ;;',
100
- ' *) PS0=\'\\e]133;B\\a\'"$PS0" ;;',
101
- ' esac',
102
- 'fi',
103
- '# <<< dsh-tty shell integration <<<',
104
- '',
191
+ ...BASH_PRELUDE,
192
+ ' # —— B 标记(命令开始):按 bash 版本二选一 ——',
193
+ ' __dsh_tty_major=${BASH_VERSION%%.*}',
194
+ ' __dsh_tty_minor=${BASH_VERSION#*.}; __dsh_tty_minor=${__dsh_tty_minor%%.*}',
195
+ ' if [ "$__dsh_tty_major" -gt 4 ] || { [ "$__dsh_tty_major" -eq 4 ] && [ "$__dsh_tty_minor" -ge 4 ]; }; then',
196
+ ' # bash ≥ 4.4:PS0 在每个提示符后、命令输出前展开',
197
+ ' case "${PS0:-}" in',
198
+ " *'133;B'*) ;;",
199
+ ' *) PS0="$__DSH_TTY_FMT_B""$PS0" ;;',
200
+ ' esac',
201
+ ' # PROMPT_COMMAND 挂钩:兼容字符串与数组(bash 5.1+)两种形态',
202
+ ' case "$(declare -p PROMPT_COMMAND 2>/dev/null)" in',
203
+ ' "declare -a"*)',
204
+ ' case "${PROMPT_COMMAND[*]}" in',
205
+ ' *__dsh_tty_precmd*) ;;',
206
+ ' *) PROMPT_COMMAND+=("__dsh_tty_precmd") ;;',
207
+ ' esac ;;',
208
+ ' *)',
209
+ ' case "${PROMPT_COMMAND:-}" in',
210
+ ' *__dsh_tty_precmd*) ;;',
211
+ ' *) PROMPT_COMMAND="__dsh_tty_precmd${PROMPT_COMMAND:+;$PROMPT_COMMAND}" ;;',
212
+ ' esac ;;',
213
+ ' esac',
214
+ ' else',
215
+ ' # bash < 4.4(macOS 自带 3.2):无 PS0,用 DEBUG trap 兜底。实测两个 3.2 怪癖:',
216
+ ' # 1) handler 内 trap - DEBUG 卸载不生效(trap 保持武装);',
217
+ ' # 2) PROMPT_COMMAND 机制自身(precmd/rearm 段)也会触发 DEBUG fire。',
218
+ ' # 因此按「永久武装 + handler 过滤」设计:$BASH_COMMAND 含桩内函数名的',
219
+ ' # fire 直接忽略(否则幻影 B 会重启捕获区间,把用户输出切出 last 区域);',
220
+ ' # PROMPT_COMMAND 尾段每轮重新武装(bash 4.0~4.3 上 trap - DEBUG 生效时',
221
+ ' # 走正常卸载/重装轮转)。副作用:循环体等内部命令会多发 B,仅影响',
222
+ ' # capture{last} 的截取起点,D/退出码与 tty_expect 不受影响。',
223
+ ' __dsh_tty_preexec() {',
224
+ ' case "$BASH_COMMAND" in',
225
+ ' ""|*__dsh_tty_precmd*|*__dsh_tty_rearm*) return ;;',
226
+ ' esac',
227
+ ' __DSH_TTY_IN_CMD=1',
228
+ ' printf "$__DSH_TTY_FMT_B"',
229
+ ' trap - DEBUG',
230
+ ' }',
231
+ ' __dsh_tty_rearm() { trap \'__dsh_tty_preexec\' DEBUG; }',
232
+ ' # 不在 rc 加载时武装:bash 启动横幅("default interactive shell" 等)',
233
+ ' # 会触发一次无主 fire,产生幻影 B/D;首次 PROMPT_COMMAND 尾段武装即可',
234
+ ' case "${PROMPT_COMMAND:-}" in',
235
+ ' *__dsh_tty_precmd*) ;;',
236
+ ' *) PROMPT_COMMAND="__dsh_tty_precmd${PROMPT_COMMAND:+;$PROMPT_COMMAND}; __dsh_tty_rearm" ;;',
237
+ ' esac',
238
+ ' fi',
239
+ ...BASH_POSTLUDE,
105
240
  ].join('\n'));
106
241
  stubDirs.set('bash', rc);
107
242
  return rc;
@@ -141,4 +276,43 @@ export function buildShellSpawn(shell, term, colorTerm, integration) {
141
276
  }
142
277
  return { argv: [shell, '-c', `${pre} ${exec}`], env: {} };
143
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
+ }
144
318
  //# sourceMappingURL=shell-integration.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell-integration.js","sourceRoot":"","sources":["../src/shell-integration.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shell-integration.js","sourceRoot":"","sources":["../src/shell-integration.ts"],"names":[],"mappings":"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"}
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
- conn.on('ready', () => {
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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"}