@hyzyn/dsh-tty 0.24.1 → 0.26.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/README.en.md +65 -13
- package/README.md +51 -13
- package/client.js +464 -192
- package/lib/index.js +164 -9
- package/lib/index.js.map +1 -1
- package/lib/probe.js +11 -6
- package/lib/probe.js.map +1 -1
- package/lib/shell-integration.d.ts +40 -1
- package/lib/shell-integration.js +180 -102
- package/lib/shell-integration.js.map +1 -1
- package/lib/ssh-config.d.ts +1 -1
- package/lib/ssh-config.js +9 -0
- package/lib/ssh-config.js.map +1 -1
- package/lib/ssh.d.ts +32 -2
- package/lib/ssh.js +32 -12
- package/lib/ssh.js.map +1 -1
- package/lib/tmux.d.ts +13 -4
- package/lib/tmux.js +23 -15
- package/lib/tmux.js.map +1 -1
- package/lib/tunnels.d.ts +101 -0
- package/lib/tunnels.js +233 -0
- package/lib/tunnels.js.map +1 -1
- package/package.json +1 -1
- package/scripts/integration.mjs +3 -3
- package/scripts/lib/crash-trace.mjs +164 -0
- package/scripts/preview/harness.js +53 -0
- package/scripts/preview/mock-host.js +12 -1
- package/scripts/preview.mjs +60 -20
- package/scripts/windows-smoke.mjs +76 -0
package/lib/tunnels.js
CHANGED
|
@@ -20,6 +20,143 @@
|
|
|
20
20
|
import net from 'node:net';
|
|
21
21
|
import { Client } from 'ssh2';
|
|
22
22
|
import { classifyError, prepareSshConnect, proxyFailureSuffix } from './ssh.js';
|
|
23
|
+
/** 本地端口占用的中文文案(`duplicate` / `in-use` 各一条,措辞与 tunnels.ts 的 EADDRINUSE 说明同源)。 */
|
|
24
|
+
export function tunnelPortIssueMessage(kind, names, port) {
|
|
25
|
+
if (kind === 'duplicate') {
|
|
26
|
+
return `隧道「${names[1] ?? '?'}」与「${names[0] ?? '?'}」的本地端口都是 ${String(port)}——同一端口只能有一条本地转发(先起来的那条会占住它,后一条必定 EADDRINUSE)。改掉其中一条的 localPort。`;
|
|
27
|
+
}
|
|
28
|
+
return `本地端口 ${String(port)}(隧道「${names[0] ?? '?'}」)已被占用:端口转发是机器级资源,最常见的原因是另一个 DSH profile 的宿主进程还在跑同一条隧道。这条隧道会停在 error 且不重试;换一个没被占用的 localPort,或在那个 profile 里关掉它。`;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* **纯函数**:在待保存的隧道列表里找「同一个 localPort 被两条 local 隧道用」。
|
|
32
|
+
*
|
|
33
|
+
* 只判 local 方向——remote 方向的 `remotePort` 在**服务端**监听,不在本机资源里,
|
|
34
|
+
* 本机探测对它没有意义(而且它由 forwardIn 的结果定论,能自愈)。
|
|
35
|
+
* 返回按端口升序、每端口一条(文本渲染与测试都按这个顺序断言)。
|
|
36
|
+
*/
|
|
37
|
+
export function findDuplicateLocalPorts(specs) {
|
|
38
|
+
const byPort = new Map();
|
|
39
|
+
for (const spec of specs) {
|
|
40
|
+
if (spec.direction !== 'local')
|
|
41
|
+
continue;
|
|
42
|
+
const port = Number(spec.localPort ?? 0);
|
|
43
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535)
|
|
44
|
+
continue;
|
|
45
|
+
const names = byPort.get(port);
|
|
46
|
+
if (names === undefined)
|
|
47
|
+
byPort.set(port, [String(spec.name)]);
|
|
48
|
+
else if (!names.includes(String(spec.name)))
|
|
49
|
+
names.push(String(spec.name));
|
|
50
|
+
}
|
|
51
|
+
const out = [];
|
|
52
|
+
for (const port of [...byPort.keys()].sort((a, b) => a - b)) {
|
|
53
|
+
const names = byPort.get(port);
|
|
54
|
+
if (names.length < 2)
|
|
55
|
+
continue;
|
|
56
|
+
out.push({ kind: 'duplicate', names, port, message: tunnelPortIssueMessage('duplicate', names, port) });
|
|
57
|
+
}
|
|
58
|
+
return out;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 探测「这个本地端口现在能不能绑」。
|
|
62
|
+
*
|
|
63
|
+
* 语义是**独占探测**(`listen` 成功即立刻 `close`),不是「连一下看看」——后者对
|
|
64
|
+
* 「端口空着但 DHCP/防火墙挡着」这类情形给不出结论,而我们要答的正是「bind 会不会
|
|
65
|
+
* 失败」。探测窗口是微秒级,探完立即释放,不会与随后 reconcile 的真监听打架
|
|
66
|
+
* (本机实测:同一 tick 内 `close()` 之后立刻 `listen` 同一端口可以成功)。
|
|
67
|
+
*
|
|
68
|
+
* `host` 固定 `127.0.0.1`——本地转发只绑回环(见 `startTunnel`),去探 `0.0.0.0`
|
|
69
|
+
* 会把「别人绑在外部接口上」误报成冲突。
|
|
70
|
+
*/
|
|
71
|
+
export function probeLocalPort(port, timeoutMs = 500) {
|
|
72
|
+
return new Promise((resolve) => {
|
|
73
|
+
const server = net.createServer();
|
|
74
|
+
let settled = false;
|
|
75
|
+
const done = (free) => {
|
|
76
|
+
if (settled)
|
|
77
|
+
return;
|
|
78
|
+
settled = true;
|
|
79
|
+
clearTimeout(timer);
|
|
80
|
+
server.removeAllListeners();
|
|
81
|
+
try {
|
|
82
|
+
server.close();
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
/* 未监听成功时 close 会抛,忽略 */
|
|
86
|
+
}
|
|
87
|
+
resolve(free);
|
|
88
|
+
};
|
|
89
|
+
const timer = setTimeout(() => { done(true); }, timeoutMs);
|
|
90
|
+
timer.unref?.();
|
|
91
|
+
server.once('error', () => { done(false); });
|
|
92
|
+
// 'listening' 是唯一算「空着」的信号:error 之外还有 close 等路径,不能靠它们推定
|
|
93
|
+
server.once('listening', () => { done(true); });
|
|
94
|
+
try {
|
|
95
|
+
server.listen(port, '127.0.0.1');
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
done(false);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* 保存隧道配置时的**保存前探测**(tty D60 前半)。
|
|
104
|
+
*
|
|
105
|
+
* ## 为什么只警告、不拒绝保存
|
|
106
|
+
*
|
|
107
|
+
* `duplicate` 能判死,但**不能**用它拒绝整个 POST:设置卡片的保存是**整表提交**
|
|
108
|
+
* (`toPayload` 把所有字段一起发上来),一旦配置里已经躺着一条重名端口的隧道
|
|
109
|
+
* (老配置 / 另一个窗口写的),硬拒就等于把用户锁死在「任何一项都存不下去」上——
|
|
110
|
+
* 而修它恰恰需要先能保存。所以这里把它降成**响应里的 warnings**,由客户端点名通报。
|
|
111
|
+
*
|
|
112
|
+
* `in-use` 更进一步:端口可能属于**用户故意**在跑的东西,探测本身也有极小的误报面
|
|
113
|
+
* (IPv6-only 的占用、探测期间的竞态),拿它拦保存是越权。它的价值在「不等那条
|
|
114
|
+
* 红色 error 出现就先说一声」。
|
|
115
|
+
*
|
|
116
|
+
* 每条隧道最多一条 in-use 警告;duplicate 优先(它更确定、且不必探端口)。
|
|
117
|
+
*/
|
|
118
|
+
export async function probeTunnelPorts(specs, probe = probeLocalPort, heldByUs = new Set()) {
|
|
119
|
+
const warnings = [];
|
|
120
|
+
const seen = new Set();
|
|
121
|
+
for (const issue of findDuplicateLocalPorts(specs)) {
|
|
122
|
+
warnings.push(issue.message);
|
|
123
|
+
seen.add(issue.port);
|
|
124
|
+
}
|
|
125
|
+
for (const spec of specs) {
|
|
126
|
+
if (spec.direction !== 'local')
|
|
127
|
+
continue;
|
|
128
|
+
const port = Number(spec.localPort ?? 0);
|
|
129
|
+
if (!Number.isInteger(port) || port < 1 || port > 65535)
|
|
130
|
+
continue;
|
|
131
|
+
if (seen.has(port))
|
|
132
|
+
continue;
|
|
133
|
+
/*
|
|
134
|
+
* **本进程自己正占着的端口不探**:改一条正在跑的隧道的其它字段(换个 remoteHost)
|
|
135
|
+
* 时端口当然是被自己占着的——那不是冲突,reconcile 会先 stop 再 start,端口在
|
|
136
|
+
* 同一拍里就还回来了(本机实测:同 tick `close()` 后立刻 `listen` 可以成功)。
|
|
137
|
+
* 不豁免这一条的话,每次编辑都会得到一条假警告,警告立刻会退化成没人看的东西。
|
|
138
|
+
* 同理,「删掉 A 再在同端口加 B」也不该报——A 会先被停掉。
|
|
139
|
+
*/
|
|
140
|
+
if (heldByUs.has(port))
|
|
141
|
+
continue;
|
|
142
|
+
seen.add(port);
|
|
143
|
+
/*
|
|
144
|
+
* 探测失败(注入的实现抛错 / 极端情况下的同步异常)一律按「没探到」处理:
|
|
145
|
+
* 这是一条**提示**,为它把整个保存打挂是本末倒置——用户会看到「保存失败」,
|
|
146
|
+
* 却完全不知道是哪来的(端口探测的失败原因与配置的正确性无关)。
|
|
147
|
+
*/
|
|
148
|
+
let free = true;
|
|
149
|
+
try {
|
|
150
|
+
free = await probe(port);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
free = true;
|
|
154
|
+
}
|
|
155
|
+
if (!free)
|
|
156
|
+
warnings.push(tunnelPortIssueMessage('in-use', [String(spec.name)], port));
|
|
157
|
+
}
|
|
158
|
+
return warnings;
|
|
159
|
+
}
|
|
23
160
|
/**
|
|
24
161
|
* 本地监听失败的文案(D58 补充):`EADDRINUSE` 在多 profile 场景下**几乎总是**
|
|
25
162
|
* 「另一个 profile 的宿主进程还占着这个端口」——端口转发是**机器级**资源,而配置是按
|
|
@@ -51,6 +188,14 @@ export class TunnelManager {
|
|
|
51
188
|
store;
|
|
52
189
|
resolveBook;
|
|
53
190
|
tunnels = new Map();
|
|
191
|
+
/**
|
|
192
|
+
* 配置回写回调(settings 就绪后由插件注入一次)。
|
|
193
|
+
*
|
|
194
|
+
* `setEnabled` 走「翻转 spec.enabled → 写回配置」这条路,所以必须能落盘;回调缺失
|
|
195
|
+
* (settings 服务不可用的极早期 / 单测)时只改内存里的 spec 与运行态——行为退化成
|
|
196
|
+
* 「本次进程内生效、重启丢失」,而不是静默什么都不做(返回的 status 一样会反映结果)。
|
|
197
|
+
*/
|
|
198
|
+
persist = null;
|
|
54
199
|
constructor(logger, store,
|
|
55
200
|
/** 按名字解析连接簿条目(实时读取,重连自动用最新凭证) */
|
|
56
201
|
resolveBook) {
|
|
@@ -110,6 +255,94 @@ export class TunnelManager {
|
|
|
110
255
|
lastForwardError: rt.lastForwardError,
|
|
111
256
|
}));
|
|
112
257
|
}
|
|
258
|
+
/** 一条隧道的当前状态(不存在返回 undefined)。 */
|
|
259
|
+
status(name) {
|
|
260
|
+
return this.list().find((tunnel) => tunnel.name === name);
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* **本进程此刻真的持有**的本地监听端口集合(`probeTunnelPorts` 的豁免依据)。
|
|
264
|
+
*
|
|
265
|
+
* 为什么不是「配置里所有 localPort」:那条判据会把「A 已停用、B 想用同一个端口」
|
|
266
|
+
* (完全合法)误报成冲突。只有 `server.listening === true` 才算**真的绑上了**——
|
|
267
|
+
* `rt.server !== null` 不够:`startTunnel` 先建 server 再 `listen`,监听失败
|
|
268
|
+
* (EADDRINUSE)时句柄仍在表里,按它判会把「其实没占住」说成「我占着」,
|
|
269
|
+
* 于是端口被**别人**占着的那条真冲突反被豁免掉。
|
|
270
|
+
*/
|
|
271
|
+
localPortsInUse() {
|
|
272
|
+
const out = new Set();
|
|
273
|
+
for (const rt of this.tunnels.values()) {
|
|
274
|
+
if (rt.server?.listening !== true)
|
|
275
|
+
continue;
|
|
276
|
+
const port = Number(rt.spec.localPort ?? 0);
|
|
277
|
+
if (Number.isInteger(port) && port >= 1 && port <= 65535)
|
|
278
|
+
out.add(port);
|
|
279
|
+
}
|
|
280
|
+
return out;
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* 启停一条隧道(agent 的 `tunnel_start` / `tunnel_stop`)——**改配置,不只改运行态**。
|
|
284
|
+
*
|
|
285
|
+
* 为什么不是「只改运行时开关」:`src/tunnels.ts` 的一等设计是「settings 即真相源,
|
|
286
|
+
* `reconcile()` 按配置对齐运行态」(见文件头)。再加一层运行态覆盖,就同时存在两个
|
|
287
|
+
* 真相源,而 `reconcile` 会在下一次 settings 热应用(哪怕只是改了个 Shell 路径)时
|
|
288
|
+
* **静默把 agent 刚停掉的隧道重新拉起**——这种「停了又自己回来」正是最难查的一类。
|
|
289
|
+
* 所以这里翻转的就是 `spec.enabled`,与用户在卡片上点那个勾**走同一条路**:
|
|
290
|
+
* 写入 caller 给的持久化回调 → settings 热应用 → reconcile。结果一致、可预期。
|
|
291
|
+
*
|
|
292
|
+
* 返回值是写完配置后的状态快照。**注意 `state` 是异步收敛的**:回来时通常是
|
|
293
|
+
* `connecting`(拨号还没完成),要拿最终结论就稍后 `tunnel_list`。
|
|
294
|
+
*/
|
|
295
|
+
setEnabled(name, enabled) {
|
|
296
|
+
const rt = this.tunnels.get(name);
|
|
297
|
+
if (rt === undefined) {
|
|
298
|
+
const known = [...this.tunnels.keys()];
|
|
299
|
+
return {
|
|
300
|
+
ok: false,
|
|
301
|
+
error: `没有名为「${name}」的隧道。${known.length === 0 ? '当前没有任何隧道(在 插件配置 → 终端面板 卡片添加)' : '现有:' + known.join('、')}`,
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
/*
|
|
305
|
+
* 幂等边界:已经处于目标状态就什么都不做。
|
|
306
|
+
*
|
|
307
|
+
* `active` / `connecting` 才算「开着」——`error` **不**算:那正是最该重试的情形
|
|
308
|
+
* (本地监听失败这类 fatal 故障不会自愈,但用户可能刚把配置改对,此时 `tunnel_start`
|
|
309
|
+
* 就该真的再拨一次)。反过来 `stopped` 才算「关着」。
|
|
310
|
+
*/
|
|
311
|
+
const running = rt.state === 'active' || rt.state === 'connecting';
|
|
312
|
+
if ((enabled && rt.spec.enabled && running) || (!enabled && !rt.spec.enabled && rt.state === 'stopped')) {
|
|
313
|
+
return { ok: true, status: this.status(name) };
|
|
314
|
+
}
|
|
315
|
+
this.applyEnabled(rt, enabled);
|
|
316
|
+
const status = this.status(name);
|
|
317
|
+
/* istanbul ignore next —— 上面刚确认过它在表里;留作类型收窄 */
|
|
318
|
+
if (status === undefined)
|
|
319
|
+
return { ok: false, error: `隧道「${name}」状态读取失败` };
|
|
320
|
+
return { ok: true, status };
|
|
321
|
+
}
|
|
322
|
+
/** 翻转一条隧道的 enabled 并就地收敛运行态(`setEnabled` 的落点)。 */
|
|
323
|
+
applyEnabled(rt, enabled) {
|
|
324
|
+
rt.spec = { ...rt.spec, enabled };
|
|
325
|
+
rt.signature = signatureOf(rt.spec);
|
|
326
|
+
if (enabled) {
|
|
327
|
+
// fatal 恢复的前置条件是配置被改对;没改配置就重开会在同一条错误上再撞一次,
|
|
328
|
+
// 但仍允许重开——用户可能刚在卡片上改好、热应用还没到,这里重开就是让它立刻生效
|
|
329
|
+
if (rt.server !== null || rt.conn !== null)
|
|
330
|
+
this.stopTunnel(rt);
|
|
331
|
+
rt.fatal = false;
|
|
332
|
+
rt.error = null;
|
|
333
|
+
this.startTunnel(rt);
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
this.stopTunnel(rt);
|
|
337
|
+
}
|
|
338
|
+
// 写回配置(settings 热应用 → reconcile 会按新配置收敛,与卡片上点那个勾同一条路)。
|
|
339
|
+
// 放在最后:配置写失败(回调抛错)不该让运行态停在一个与配置相反的状态上。
|
|
340
|
+
this.persist?.([...this.tunnels.values()].map((entry) => entry.spec));
|
|
341
|
+
}
|
|
342
|
+
/** 持久化回调注入(settings 就绪后一次;`setEnabled` 靠它把意图写回配置)。 */
|
|
343
|
+
setPersist(persist) {
|
|
344
|
+
this.persist = persist;
|
|
345
|
+
}
|
|
113
346
|
disposeAll() {
|
|
114
347
|
for (const rt of this.tunnels.values())
|
|
115
348
|
this.stopTunnel(rt);
|
package/lib/tunnels.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tunnels.js","sourceRoot":"","sources":["../src/tunnels.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tunnels.js","sourceRoot":"","sources":["../src/tunnels.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyzyn/dsh-tty",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.26.0",
|
|
4
4
|
"description": "DSH Web GUI 的终端面板插件:侧边栏「终端」提供 xterm.js + PTY 全交互终端与 ssh2 原生 SSH 远程连接(连接簿、主机指纹 TOFU、跳板机),支持 tmux 会话持久化、SFTP 文件传输、端口转发与服务器状态条,并向其他插件开放 ttyTerminal / ttyPanel / ttyConnbar 扩展点;Windows 宿主同样可用。",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dsh",
|
package/scripts/integration.mjs
CHANGED
|
@@ -1585,9 +1585,9 @@ async function run() {
|
|
|
1585
1585
|
if (on.status === 200 && on.body.config?.enabled === true) pass('B29h 重新启用生效')
|
|
1586
1586
|
else fail('B29h 重新启用生效', `status=${String(on.status)}`)
|
|
1587
1587
|
await sleep(100)
|
|
1588
|
-
// 0.
|
|
1589
|
-
if (toolDefs.length ===
|
|
1590
|
-
else fail('B29i 重新启用后
|
|
1588
|
+
// 0.25.0:tunnel_start / tunnel_stop 加入后是 19 个(0.23.0 加 tty_run 时是 17 个)
|
|
1589
|
+
if (toolDefs.length === 19) pass('B29i 重新启用后 19 个 agent 工具回归')
|
|
1590
|
+
else fail('B29i 重新启用后 19 个 agent 工具回归', `当前 ${String(toolDefs.length)}`)
|
|
1591
1591
|
if (promptParts.length === 2) pass('B29j 重新启用后公告与动态快照恢复')
|
|
1592
1592
|
else fail('B29j 重新启用后公告与动态快照恢复', `当前 ${String(promptParts.length)}`)
|
|
1593
1593
|
const again = openSession(port)
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Windows 冒烟脚本的**崩溃诊断留痕**——`fs.writeSync` 直写 fd 1,绕开 stdout 缓冲。
|
|
3
|
+
*
|
|
4
|
+
* ## 为什么需要它(2026-10-04 实测)
|
|
5
|
+
*
|
|
6
|
+
* CI run `37170601433` 的 Windows 腿上,`windows-smoke` 以
|
|
7
|
+
* **`Exit status 3221226356`(= `0xC0000374`,Windows 堆损坏)** 退出。W1–W5 五条断言
|
|
8
|
+
* 全 PASS,但**日志里连 `[W6]` 那行都没有**——看起来像「跑到 W5 就没了」。
|
|
9
|
+
*
|
|
10
|
+
* 而 `[W6]` 是**下一行的 `console.log`**。它为什么不在日志里?Node 官方对 stdout 的
|
|
11
|
+
* 同步性有明确规定:
|
|
12
|
+
*
|
|
13
|
+
* | 目标 | Linux / macOS | Windows |
|
|
14
|
+
* |---|---|---|
|
|
15
|
+
* | 文件 | 同步 | 同步 |
|
|
16
|
+
* | TTY | 同步 | **异步** |
|
|
17
|
+
* | **管道** | 同步 | **异步** |
|
|
18
|
+
*
|
|
19
|
+
* CI 上 stdout 正是**管道**,而 Windows 上它是**异步**的。所以 `console.log('[W6] …')`
|
|
20
|
+
* 只是把字节交给了 libuv 的写队列,**进程在原生崩溃那一刻直接没了,队列里的字节一起没了**。
|
|
21
|
+
* 结果就是:**崩溃点之前的那几行诊断信息凭空消失**,留下一个「什么都没说」的退出码。
|
|
22
|
+
*
|
|
23
|
+
* 这与本仓已记在案的一类问题同形——`windows-smoke` 自己文件头就记着 D62:
|
|
24
|
+
* 「`process.exit()` 会丢掉管道里还没 flush 的写……CI 上 stdout 正是管道,缓冲 64 KB:
|
|
25
|
+
* 实测『写 300 KB 后直接 exit』只活下来 65 536 字节」。D62 修的是**正常退出**路径
|
|
26
|
+
* (末尾用空串写入做 flush 屏障);**本条是它在原生崩溃上的另一半**——崩溃没有「末尾」,
|
|
27
|
+
* 屏障来不及跑,只能靠**同步写**。
|
|
28
|
+
*
|
|
29
|
+
* ## 判据:只留「能定位崩溃点」的东西,不是把日志改道
|
|
30
|
+
*
|
|
31
|
+
* 正常路径**照旧走 `console.log`**(异步没关系,进程会正常走完 D62 的 flush 屏障)。
|
|
32
|
+
* 只有**阶段边界**(每开/关一个会话、每次原生资源动作)用同步写记一行,因为那正是
|
|
33
|
+
* 崩溃会落在的地方。这样:
|
|
34
|
+
*
|
|
35
|
+
* - 正常时:多出几行 `[trace]` 前缀的同步行,无害;
|
|
36
|
+
* - 崩溃时:**最后一行 `[trace]` 就是崩溃点**,而且它一定在日志里。
|
|
37
|
+
*
|
|
38
|
+
* ## 为什么是 `writeSync(1, …)` 而不是 `fs.appendFileSync(某文件)`
|
|
39
|
+
*
|
|
40
|
+
* 崩溃诊断要出现在**CI 日志**里,写文件还得再 upload artifact 才看得到。
|
|
41
|
+
* `writeSync(1, …)` 直写 fd 1,不经过 stream 缓冲,**同步落进管道**。
|
|
42
|
+
*
|
|
43
|
+
* 不写 shebang:本文件要被 `packages/tty/test/crash-trace.test.ts` import。
|
|
44
|
+
*/
|
|
45
|
+
import { writeSync } from 'node:fs'
|
|
46
|
+
|
|
47
|
+
/** 同步行前缀。用固定标记,便于在几千行 CI 日志里 grep。 */
|
|
48
|
+
export const TRACE_PREFIX = '[trace]'
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* 同步写一行到 stdout(**不经过 stream 缓冲**)。
|
|
52
|
+
*
|
|
53
|
+
* 写失败**吞掉**:诊断留痕不该成为新的失败源——它是在「主流程可能已经出问题」的
|
|
54
|
+
* 场景里跑的,此时 fd 1 可能已不可写(管道对端没了)。吞掉后主流程照旧。
|
|
55
|
+
*
|
|
56
|
+
* @param message - 要写的内容(自动补换行)
|
|
57
|
+
* @param options.writeSyncImpl - 注入写函数(测试用;默认 `fs.writeSync`)
|
|
58
|
+
* @returns 真的写了 → `true`;写失败 → `false`
|
|
59
|
+
*/
|
|
60
|
+
export function traceSync(message, options = {}) {
|
|
61
|
+
const { writeSyncImpl = writeSync } = options
|
|
62
|
+
try {
|
|
63
|
+
writeSyncImpl(1, `${TRACE_PREFIX} ${String(message)}\n`)
|
|
64
|
+
return true
|
|
65
|
+
} catch {
|
|
66
|
+
return false
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* 造一个「阶段留痕器」:`enter(label)` 记进入、`leave(label)` 记离开。
|
|
72
|
+
*
|
|
73
|
+
* 崩溃点 = **最后一条 `enter` 没有对应的 `leave`**。这比只记「走到哪」更强:
|
|
74
|
+
* 它能区分「卡在这个阶段里」与「这个阶段跑完了、崩在下一个阶段的入口之前」——
|
|
75
|
+
* 2026-10-04 那次正是后者(W5 的 `leave` 有没有打出来,直接决定崩在 W5 内部还是 W6 入口)。
|
|
76
|
+
*
|
|
77
|
+
* @param options.trace - 注入留痕函数(默认 `traceSync`)
|
|
78
|
+
* @param options.now - 注入时钟(默认 `Date.now`;测试用)
|
|
79
|
+
* @returns `{ enter, leave, snapshot }`
|
|
80
|
+
*/
|
|
81
|
+
export function createPhaseTracer(options = {}) {
|
|
82
|
+
const { trace = traceSync, now = Date.now } = options
|
|
83
|
+
/** 已进入未离开的阶段(栈:嵌套阶段按后进先出记)。 */
|
|
84
|
+
const open = []
|
|
85
|
+
const startedAt = now()
|
|
86
|
+
|
|
87
|
+
return {
|
|
88
|
+
/**
|
|
89
|
+
* 记「进入某阶段」。带**自启动以来的毫秒数**——原生崩溃的时间点往往比阶段名更能
|
|
90
|
+
* 说明问题(例如「每次都是启动后 3.2s 崩」会指向某个固定动作)。
|
|
91
|
+
*
|
|
92
|
+
* ## 为什么 `enter` 要把**整个栈**写进去(2026-10-04 实测后改的)
|
|
93
|
+
*
|
|
94
|
+
* 第一版只写「栈深 N」,靠 `describeCrashPoint` 在 `process.on('exit')` 里输出完整诊断。
|
|
95
|
+
* 实测发现**原生崩溃时 `exit` 钩子根本不触发**:
|
|
96
|
+
*
|
|
97
|
+
* ```
|
|
98
|
+
* $ node -e "process.on('exit', c => writeSync(1,'HOOK\n')); process.abort()"
|
|
99
|
+
* (只有 abort 前的输出,HOOK 从未出现)
|
|
100
|
+
* ```
|
|
101
|
+
*
|
|
102
|
+
* 于是「靠收尾钩子打诊断」这条路在**最需要它的场景**(段错误 / 堆损坏)里失效。
|
|
103
|
+
* 改成:**每一行 `enter` 自带完整栈**——最后一行就是完整诊断,不依赖任何收尾代码。
|
|
104
|
+
* 代价是行变长(阶段多时是 O(n²) 总量),但冒烟脚本只有 7 个阶段、几十行,可忽略。
|
|
105
|
+
*/
|
|
106
|
+
enter(label) {
|
|
107
|
+
open.push({ label, at: now() })
|
|
108
|
+
trace(`+${String(now() - startedAt)}ms enter|栈:${renderStack(open)}`)
|
|
109
|
+
},
|
|
110
|
+
/** 记「离开某阶段」。栈空时也照记(说明调用方配对错了,这本身是信息)。 */
|
|
111
|
+
leave(label) {
|
|
112
|
+
const index = open.map((entry) => entry.label).lastIndexOf(label)
|
|
113
|
+
const entry = index === -1 ? undefined : open.splice(index, 1)[0]
|
|
114
|
+
const spent = entry === undefined ? '?' : String(now() - entry.at)
|
|
115
|
+
trace(`+${String(now() - startedAt)}ms leave ${label}(用了 ${spent}ms)|栈:${renderStack(open)}`)
|
|
116
|
+
},
|
|
117
|
+
/** 当前还开着的阶段(崩溃后无法调用它——留给正常路径与测试用)。 */
|
|
118
|
+
snapshot() {
|
|
119
|
+
return open.map((entry) => entry.label)
|
|
120
|
+
},
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/** 把阶段栈渲染成 `A → B`;空栈渲染成 `(空)`——空栈本身就是信息(崩在所有阶段之外)。 */
|
|
125
|
+
function renderStack(open) {
|
|
126
|
+
return open.length === 0 ? '(空)' : open.map((entry) => entry.label).join(' → ')
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* 把「崩溃点」渲染成人话。
|
|
131
|
+
*
|
|
132
|
+
* ## 它的定位(2026-10-04 实测后收窄)
|
|
133
|
+
*
|
|
134
|
+
* **不是**主要手段——原生崩溃时 `process.on('exit')` **不触发**(实测:`process.abort()`
|
|
135
|
+
* 时钩子从未跑到),所以「靠收尾钩子打诊断」在最需要它的场景里失效。真正的保证是
|
|
136
|
+
* `createPhaseTracer` 的**每行 `enter` 自带完整栈**。
|
|
137
|
+
*
|
|
138
|
+
* 这个函数留给**能触发的地方**:
|
|
139
|
+
* - 看门狗超时(`setTimeout` 里的 `process.exit`,钩子会跑);
|
|
140
|
+
* - `uncaughtException` / `unhandledRejection`(JS 层异常,钩子会跑);
|
|
141
|
+
* - 人肉排查时对着日志调用。
|
|
142
|
+
*
|
|
143
|
+
* @param input - `{ openPhases, exitCode }`
|
|
144
|
+
* @returns 多行诊断
|
|
145
|
+
*/
|
|
146
|
+
export function describeCrashPoint({ openPhases = [], exitCode } = {}) {
|
|
147
|
+
const lines = []
|
|
148
|
+
lines.push('==== 崩溃点诊断 ====')
|
|
149
|
+
if (openPhases.length === 0) {
|
|
150
|
+
lines.push('所有阶段都已配对离开:崩溃发生在**最后一个阶段结束之后**(或首个阶段开始之前)')
|
|
151
|
+
} else {
|
|
152
|
+
lines.push(`未配对离开的阶段(崩溃最可能落在**最后一个**里):${openPhases.join(' → ')}`)
|
|
153
|
+
}
|
|
154
|
+
if (exitCode !== undefined) {
|
|
155
|
+
const hex = typeof exitCode === 'number' && exitCode >= 0 ? `0x${exitCode.toString(16).toUpperCase()}` : '?'
|
|
156
|
+
lines.push(`退出码:${String(exitCode)}(${hex})`)
|
|
157
|
+
// 这两个是本仓实际遇到过的形态,写进来省得每次查
|
|
158
|
+
if (exitCode === 3221226356) lines.push(' ↑ 0xC0000374 = STATUS_HEAP_CORRUPTION(Windows 堆损坏,原生层)')
|
|
159
|
+
if (exitCode === 3221225477) lines.push(' ↑ 0xC0000005 = STATUS_ACCESS_VIOLATION(原生层访问越界)')
|
|
160
|
+
}
|
|
161
|
+
lines.push('定位方法:上面最后一条 `[trace] enter …` 就是崩溃点所在阶段;')
|
|
162
|
+
lines.push('它若没有对应的 `leave`,崩溃发生在该阶段**内部**;若有,则在**下一个阶段入口之前**。')
|
|
163
|
+
return lines.join('\n')
|
|
164
|
+
}
|
|
@@ -613,6 +613,59 @@
|
|
|
613
613
|
return problems.length > 0 ? problems.join(';') : null
|
|
614
614
|
}
|
|
615
615
|
},
|
|
616
|
+
/*
|
|
617
|
+
* 设置卡片:保存隧道时宿主报了**端口问题**(tty D60 前半)。
|
|
618
|
+
*
|
|
619
|
+
* 这一条是纯客户端的一半:宿主在 200 里带回 `warnings`,卡片必须
|
|
620
|
+
* ① **说**出来(不能说「已生效」就完事——那条隧道会停在红色 error 且不重试);
|
|
621
|
+
* ② 说成**警告**而不是成功(绿色)也不是失败(红色)——保存**真的成功了**,
|
|
622
|
+
* 配置落盘了,只是端口有问题。颜色就是这三态唯一的区别。
|
|
623
|
+
*/
|
|
624
|
+
async 'port-warn'() {
|
|
625
|
+
window.__PREVIEW_PORT_WARNINGS = [
|
|
626
|
+
'本地端口 15432(隧道「staging-db-L15432」)已被占用:端口转发是机器级资源,最常见的原因是另一个 DSH profile 的宿主进程还在跑同一条隧道。这条隧道会停在 error 且不重试;换一个没被占用的 localPort,或在那个 profile 里关掉它。',
|
|
627
|
+
]
|
|
628
|
+
const host = document.createElement('div')
|
|
629
|
+
host.id = 'preview-settings'
|
|
630
|
+
host.style.cssText = 'position:fixed;inset:24px 24px 24px 260px;overflow:auto;z-index:2000;background:var(--dsw-alias-bg-base);padding:8px;border-radius:16px'
|
|
631
|
+
document.body.appendChild(host)
|
|
632
|
+
const root = window.ReactDOM.createRoot(host)
|
|
633
|
+
root.render(window.React.createElement(cards[0].Component))
|
|
634
|
+
await waitFor(() => q('#preview-settings .tt_card'))
|
|
635
|
+
await sleep(80)
|
|
636
|
+
q('#preview-settings .tt_cardHeader').click()
|
|
637
|
+
await waitFor(() => q('#preview-settings .tt_cardBody'))
|
|
638
|
+
await sleep(400)
|
|
639
|
+
|
|
640
|
+
const buttonsIn = (el) => [...el.querySelectorAll('button')]
|
|
641
|
+
const body = q('#preview-settings .tt_cardBody')
|
|
642
|
+
// 勾掉一条既有隧道的启停 → 走 commitTunnels 那条路(保存隧道 → 宿主报端口问题)
|
|
643
|
+
const row = [...document.querySelectorAll('#preview-settings .tt_sshHostRow')]
|
|
644
|
+
.find((r) => (r.querySelector('.tt_sshHostName')?.textContent ?? '').startsWith('staging-pg'))
|
|
645
|
+
if (row === undefined) throw new Error('找不到 staging-pg 隧道行(fixture 应有该隧道)')
|
|
646
|
+
const box = row.querySelector('input[type=checkbox]')
|
|
647
|
+
if (box === null) throw new Error('隧道行没有启停勾选(夹具失效)')
|
|
648
|
+
box.click()
|
|
649
|
+
await sleep(700)
|
|
650
|
+
|
|
651
|
+
// 消息落在卡片最下方(保存按钮那一行):截图要能拍到它,否则这条走查图是废的
|
|
652
|
+
const msgEl = q('#preview-settings .tt_cardMessage')
|
|
653
|
+
if (msgEl !== null) msgEl.scrollIntoView({ block: 'center' })
|
|
654
|
+
await sleep(200)
|
|
655
|
+
|
|
656
|
+
window.__previewAssert = async () => {
|
|
657
|
+
const msg = q('#preview-settings .tt_cardMessage')
|
|
658
|
+
if (msg === null) return '夹具失效:卡片里没有消息节点'
|
|
659
|
+
const text = msg.textContent ?? ''
|
|
660
|
+
if (!text.includes('15432')) return '端口问题的警告没有显示出来(消息为「' + text + '」)'
|
|
661
|
+
if (msg.classList.contains('tt_cardMessageOk')) return '端口有问题却报成了成功(绿色)——那条隧道会停在 error'
|
|
662
|
+
if (msg.classList.contains('tt_cardMessageError')) return '端口问题报成了保存失败(红色)——配置其实已经存下了'
|
|
663
|
+
if (!msg.classList.contains('tt_cardMessageWarn')) return '端口警告的样式类不对:' + msg.className
|
|
664
|
+
// 警告必须真的顶掉成功文案:两条同时出现用户只会挑好听的那条看
|
|
665
|
+
if (text.includes('已生效') || text.includes('is active')) return '成功文案与警告同时出现:' + text
|
|
666
|
+
return null
|
|
667
|
+
}
|
|
668
|
+
},
|
|
616
669
|
/*
|
|
617
670
|
* 设置卡片:AI 辅助小节(0.24.0)。
|
|
618
671
|
*
|
|
@@ -101,7 +101,18 @@
|
|
|
101
101
|
CONFIG[key] = value
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
|
-
|
|
104
|
+
/*
|
|
105
|
+
* 保存前端口探测(tty D60 前半):真宿主在 **200** 里带回 `warnings`,客户端据此
|
|
106
|
+
* 把「已生效」换成黄色警告。夹具必须照这个形状回,否则 `port-warn` 场景验的是
|
|
107
|
+
* 一条不存在的路(同 D91 那条:夹具自己扮演宿主,它撒谎测试就永远绿)。
|
|
108
|
+
*
|
|
109
|
+
* `window.__PREVIEW_PORT_WARNINGS` 决定回什么:数组即照发,缺省 = 一次都不报
|
|
110
|
+
* (与真实宿主「端口都空着」的常态一致)。
|
|
111
|
+
*/
|
|
112
|
+
const warnings = window.__PREVIEW_PORT_WARNINGS
|
|
113
|
+
return Array.isArray(warnings) && warnings.length > 0
|
|
114
|
+
? { ok: true, config: CONFIG, warnings }
|
|
115
|
+
: { ok: true, config: CONFIG }
|
|
105
116
|
}
|
|
106
117
|
if (url.indexOf('/api/dsh-tty/shells') === 0) return { ok: true, shells: ['/bin/zsh', '/bin/bash', '/bin/sh', '/opt/homebrew/bin/fish'] }
|
|
107
118
|
/*
|