@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/lib/tmux.js ADDED
@@ -0,0 +1,176 @@
1
+ /**
2
+ * @hyzyn/dsh-tty — tmux 会话持久化(0.10.0)。
3
+ *
4
+ * 目标:给「需要活得比宿主久」的工作(dev server、build、训练任务)一个显式
5
+ * 逃生门。默认安全模型不变 —— 会话仍随宿主生死(内核级 PTY 清理);持久标签
6
+ * 只是把会话状态委托给 tmux server(专用 socket `dsh-tty`,与用户自己的 tmux
7
+ * 完全隔离)托管:浏览器断线、保活窗口超时、甚至宿主重启后,重开标签用同一
8
+ * 持久名 `new-session -A` 即可接回原现场(正在跑的程序、pane 状态原样恢复)。
9
+ *
10
+ * 职责:
11
+ * 1. probeTmux() —— 探测 tmux 可用性与版本(≥3.3 才支持 DCS
12
+ * allow-passthrough,agent 命令粒度工具依赖它),
13
+ * 30s TTL 缓存;不可用时 spawn 走普通会话 + 灰字提示;
14
+ * 2. ensureTmuxAssets —— 在稳定目录(pluginRuntimeDir())生成 tmux.conf 与
15
+ * 内层启动器 inner.sh(write-if-changed 原子覆盖);
16
+ * tmux server 只在首次启动读 conf,路径必须稳定;
17
+ * 3. buildTmuxSpawnPlan—— 组装 `-c` 包装层:TERM/COLORTERM 注入 + exec tmux
18
+ * 客户端(`-A` attach-or-create;cwd 由 node-pty 的
19
+ * spawn cwd 继承,tmux 新 session 以此为 pane cwd);
20
+ * 4. killTmuxSession —— kill 帧的 tmux 侧收尾:kill-session 让 pane 随之
21
+ * 结束(会话真正关闭,而不是 detach 留活口)。
22
+ *
23
+ * 残留会话边界:宿主被硬杀/浏览器丢失标签规格时,tmux server 上的会话会留存
24
+ * (这正是恢复能力的前提),直到机器重启或手动 `tmux -L dsh-tty kill-server`;
25
+ * 专用 socket 让这些残留对用户的 tmux 世界完全不可见(README 已知限制)。
26
+ */
27
+ import { execFile } from 'node:child_process';
28
+ import { buildTmuxInnerLauncher, pluginRuntimeDir, shSingleQuote } from './shell-integration.js';
29
+ import { chmodSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
30
+ import { join } from 'node:path';
31
+ /** 专用 tmux socket 名:与用户自己的 tmux server 完全隔离。 */
32
+ export const TMUX_SOCKET = 'dsh-tty';
33
+ let probeCache = null;
34
+ const PROBE_TTL_MS = 30_000;
35
+ /** 探测 tmux 可用性与版本(30s TTL;execFile 3s 超时)。 */
36
+ export async function probeTmux() {
37
+ if (probeCache !== null && Date.now() - probeCache.at < PROBE_TTL_MS)
38
+ return probeCache.value;
39
+ const value = await new Promise((resolve) => {
40
+ execFile('tmux', ['-V'], { timeout: 3000 }, (error, stdout) => {
41
+ if (error !== null && error !== undefined) {
42
+ resolve({ available: false, passthrough: false });
43
+ return;
44
+ }
45
+ const match = /tmux\s+(\d+)\.(\d+)/.exec(String(stdout));
46
+ if (match === null) {
47
+ resolve({ available: false, passthrough: false });
48
+ return;
49
+ }
50
+ const major = Number(match[1]);
51
+ const minor = Number(match[2]);
52
+ resolve({ available: true, passthrough: major > 3 || (major === 3 && minor >= 3) });
53
+ });
54
+ });
55
+ probeCache = { at: Date.now(), value };
56
+ return value;
57
+ }
58
+ /** spawn 帧里的持久名清洗:合法字符集加 `dsh-` 前缀;不合法退回 sid 派生名。 */
59
+ export function sanitizePersistName(raw, sid) {
60
+ const name = typeof raw === 'string' ? raw.trim() : '';
61
+ if (/^[A-Za-z0-9_-]{1,48}$/.test(name))
62
+ return `dsh-${name}`;
63
+ return `dsh-${sid.replace(/[^A-Za-z0-9_-]/g, '')}`;
64
+ }
65
+ /** write-if-changed + rename(与 shell-integration 桩同策略;目录自动创建)。 */
66
+ function writeIfChanged(file, content) {
67
+ try {
68
+ if (readFileSync(file, 'utf8') === content)
69
+ return;
70
+ }
71
+ catch {
72
+ /* 不存在:继续写入 */
73
+ }
74
+ mkdirSync(dirname(file), { recursive: true });
75
+ const tmp = `${file}.${process.pid}.tmp`;
76
+ writeFileSync(tmp, content);
77
+ renameSync(tmp, file);
78
+ }
79
+ function dirname(path) {
80
+ const index = path.lastIndexOf('/');
81
+ return index > 0 ? path.slice(0, index) : '/';
82
+ }
83
+ /** 组装 tmux.conf:状态栏关(防重绘污染 capture)、真色透传、内层启动器。 */
84
+ function buildTmuxConf(passthrough, runtimeDir) {
85
+ const lines = [
86
+ '# generated by dsh-tty(会话持久化)— 手改会在下次生成时被覆盖;',
87
+ '# tmux server 仅首次启动读取本文件,改完需 `tmux -L ' + TMUX_SOCKET + ' kill-server` 或重启宿主生效',
88
+ 'set -g default-terminal "screen-256color"',
89
+ 'set -ga terminal-overrides ",*:RGB"',
90
+ 'set -g status off',
91
+ 'set -g history-limit 20000',
92
+ `set -g default-command ${shSingleQuote(join(runtimeDir, 'inner.sh'))}`,
93
+ ];
94
+ if (passthrough)
95
+ lines.push('set -g allow-passthrough on');
96
+ return lines.join('\n') + '\n';
97
+ }
98
+ /**
99
+ * 生成/刷新 tmux 运行资产(tmux.conf + inner.sh):每个持久 spawn 前调用,
100
+ * 内容随当前配置(shell / shellIntegration / passthrough)write-if-changed。
101
+ * conf 只在 tmux server 首启时被读,后续 spawn 的重写不生效 —— 但 inner.sh
102
+ * 内容每次开 pane 都会重新执行,配置热改对持久标签的新 pane 仍然生效。
103
+ */
104
+ export function ensureTmuxAssets(options) {
105
+ const runtimeDir = pluginRuntimeDir();
106
+ writeIfChanged(join(runtimeDir, 'tmux.conf'), buildTmuxConf(options.passthrough, runtimeDir));
107
+ const inner = join(runtimeDir, 'inner.sh');
108
+ writeIfChanged(inner, buildTmuxInnerLauncher(options.shell, options.colorTerm, options.shellIntegration));
109
+ try {
110
+ chmodSync(inner, 0o755);
111
+ }
112
+ catch {
113
+ /* chmod 失败由 exec 阶段自然报错 */
114
+ }
115
+ }
116
+ /**
117
+ * 持久本地会话的 `-c` 包装层:TERM/COLORTERM 注入(与普通会话同机制)后
118
+ * `exec tmux -A` attach-or-create。持久名已过 sanitizePersistName(安全字符集),
119
+ * 单引号包裹防注入;cwd 不进命令行 —— tmux 客户端继承 node-pty spawn 的 cwd,
120
+ * 新 session 的 pane 以此为工作目录。
121
+ */
122
+ export function buildTmuxSpawnPlan(options) {
123
+ const runtimeDir = pluginRuntimeDir();
124
+ const pre = `export TERM=${shSingleQuote(options.term)}; export COLORTERM=${shSingleQuote(options.colorTerm)};`;
125
+ const exec = [
126
+ 'exec tmux',
127
+ '-L', TMUX_SOCKET,
128
+ '-f', shSingleQuote(join(runtimeDir, 'tmux.conf')),
129
+ 'new-session -A -s', shSingleQuote(options.tmuxName),
130
+ ].join(' ');
131
+ return { argv: [options.shell, '-c', `${pre} ${exec}`], env: {} };
132
+ }
133
+ /** kill 帧的 tmux 侧收尾:kill-session(不存在/已死同样 resolve,错误吞掉)。 */
134
+ export function killTmuxSession(tmuxName) {
135
+ return new Promise((resolve) => {
136
+ execFile('tmux', ['-L', TMUX_SOCKET, 'kill-session', '-t', tmuxName], { timeout: 4000 }, () => resolve());
137
+ });
138
+ }
139
+ /** 专用 socket 上现存的 tmux 会话名(sessions 帧的 tmux 字段,客户端恢复确认用)。 */
140
+ export function listTmuxSessions() {
141
+ return new Promise((resolve) => {
142
+ execFile('tmux', ['-L', TMUX_SOCKET, 'list-sessions', '-F', '#{session_name}'], { timeout: 4000 }, (error, stdout) => {
143
+ if (error !== null && error !== undefined) {
144
+ resolve([]);
145
+ return;
146
+ }
147
+ resolve(String(stdout).trim().split('\n').filter(Boolean));
148
+ });
149
+ });
150
+ }
151
+ /**
152
+ * attach 重画:tmux 背书会话重连时不回放宿主环形缓冲(tmux 的整屏重画会把
153
+ * 同样内容再画一遍 → 重影 + 幽灵滚动条),改为让 tmux 强制重画客户端一次。
154
+ * 同一会话可能被多个窗口同时接回(每窗口一个 PTY 客户端),list-clients
155
+ * 逐个 refresh——只刷第一个会把另一个窗口留在 reset 后的空白屏上;任何
156
+ * 失败静默吞掉(极端情况下用户敲一次键 tmux 也会重画)。
157
+ */
158
+ export function refreshTmuxClient(tmuxName) {
159
+ return new Promise((resolve) => {
160
+ execFile('tmux', ['-L', TMUX_SOCKET, 'list-clients', '-t', tmuxName, '-F', '#{client_name}'], { timeout: 4000 }, (error, stdout) => {
161
+ if (error !== null && error !== undefined) {
162
+ resolve();
163
+ return;
164
+ }
165
+ const clients = String(stdout).trim().split('\n').filter(Boolean);
166
+ if (clients.length === 0) {
167
+ resolve();
168
+ return;
169
+ }
170
+ void Promise.all(clients.map((client) => new Promise((done) => {
171
+ execFile('tmux', ['-L', TMUX_SOCKET, 'refresh-client', '-t', client], { timeout: 4000 }, () => done());
172
+ }))).then(() => resolve());
173
+ });
174
+ });
175
+ }
176
+ //# sourceMappingURL=tmux.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tmux.js","sourceRoot":"","sources":["../src/tmux.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,23 @@
1
1
  {
2
2
  "name": "@hyzyn/dsh-tty",
3
- "version": "0.9.0",
4
- "description": "DSH Web GUI 的终端面板插件:侧边栏「终端」大弹窗,xterm.js + PTY 全交互终端(路线1),ssh2 原生 SSH 远程连接(方案 C)。",
3
+ "version": "0.10.1",
4
+ "description": "DSH Web GUI 的终端面板插件:侧边栏「终端」大弹窗,xterm.js + PTY 全交互终端(路线1),ssh2 原生 SSH 远程连接(方案 C),tmux 会话持久化(0.10.0)。",
5
+ "keywords": [
6
+ "dsh",
7
+ "deepseek",
8
+ "deepseek-harness",
9
+ "terminal",
10
+ "ssh",
11
+ "sftp",
12
+ "tmux",
13
+ "xterm",
14
+ "pty",
15
+ "agent",
16
+ "ai",
17
+ "plugin",
18
+ "web",
19
+ "cordis"
20
+ ],
5
21
  "type": "module",
6
22
  "engines": {
7
23
  "node": ">=22.19.0"
@@ -25,31 +41,31 @@
25
41
  }
26
42
  },
27
43
  "dependencies": {
28
- "@deepseek-ai/schemastery": "^3.18.1",
29
- "@hyzyn/dsh-kit": "^0.1.0",
44
+ "@deepseek-ai/schemastery": "^3.18.2",
30
45
  "@xterm/headless": "^5.5.0",
31
46
  "ssh2": "^1.17.0",
32
- "ws": "^8.18.0"
47
+ "ws": "^8.18.0",
48
+ "@hyzyn/dsh-kit": "0.1.2"
33
49
  },
34
50
  "peerDependencies": {
35
51
  "@deepseek-ai/dsh-tools": "^0.1.1-rc.2"
36
52
  },
37
53
  "devDependencies": {
38
- "@deepseek-ai/cordis": "^4.0.1",
54
+ "@deepseek-ai/cordis": "^4.0.2",
39
55
  "@deepseek-ai/dsh-tools": "0.1.1-rc.2",
40
56
  "@deepseek-ai/dsh-host-webserver": "0.1.0-rc.7",
41
57
  "@deepseek-ai/dsh-subprocess": "0.1.0-rc.7",
42
58
  "@deepseek-ai/dsh-subprocess-local": "0.1.0-rc.7",
43
59
  "@types/node": "^22.20.0",
44
- "@types/ssh2": "^1.15.5",
60
+ "@types/ssh2": "^1.15.6",
45
61
  "@types/ws": "^8.5.12",
46
62
  "@xterm/addon-fit": "^0.10.0",
47
63
  "@xterm/addon-search": "^0.16.0",
48
64
  "@xterm/addon-webgl": "^0.19.0",
49
65
  "@xterm/addon-web-links": "^0.12.0",
50
66
  "@xterm/xterm": "^5.5.0",
51
- "esbuild": "^0.24.0",
52
- "typescript": "~5.7.2"
67
+ "esbuild": "^0.28.2",
68
+ "typescript": "~5.9.3"
53
69
  },
54
70
  "files": [
55
71
  "lib",
@@ -57,7 +73,7 @@
57
73
  "cordis.patch.yml",
58
74
  "README.md"
59
75
  ],
60
- "license": "MIT",
76
+ "license": "Apache-2.0",
61
77
  "repository": {
62
78
  "type": "git",
63
79
  "url": "git+https://github.com/hyzyn/dsh-plugin-kit.git",