@hyzyn/dsh-tty 0.31.0 → 0.32.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 +35 -13
- package/README.md +31 -9
- package/client.js +29 -29
- package/lib/index.d.ts +61 -7
- package/lib/index.js +109 -13
- package/lib/index.js.map +1 -1
- package/lib/shell-integration.d.ts +10 -0
- package/lib/shell-integration.js +148 -7
- package/lib/shell-integration.js.map +1 -1
- package/package.json +1 -1
- package/scripts/pty-kill-probe.cjs +123 -0
- package/scripts/pty-kill-repro-plugin.mjs +72 -0
- package/scripts/pty-kill-repro.mjs +101 -0
- package/scripts/windows-smoke.mjs +97 -2
|
@@ -85,6 +85,16 @@ export declare function defaultShellPath(platform?: NodeJS.Platform, env?: NodeJ
|
|
|
85
85
|
*/
|
|
86
86
|
export declare function commandShellHint(shell: string, platform?: NodeJS.Platform): string;
|
|
87
87
|
export declare function isPowerShellShell(shell: string): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* 该平台 + 该 shell 下,OSC 133/7 集成**能不能注入**(宿主把开关存成什么值的判据)。
|
|
90
|
+
*
|
|
91
|
+
* POSIX 恒 true:注入只对 zsh / bash 有实现,其他 shell 在 buildShellSpawn 里自然退回最简
|
|
92
|
+
* 包装层 —— 这是历史行为,不动它(把 fish 之流一并拨 false 会改变既有快照语义)。
|
|
93
|
+
*
|
|
94
|
+
* Windows 只有 PowerShell 家族为 true(`-File` 桩 + prompt / PSConsoleHostReadLine 钩子);
|
|
95
|
+
* cmd 没有命令开始/结束钩子,注入无从谈起。
|
|
96
|
+
*/
|
|
97
|
+
export declare function shellIntegrationSupported(shell: string, platform?: NodeJS.Platform): boolean;
|
|
88
98
|
export declare function buildShellSpawn(shell: string, term: string, colorTerm: string, integration: boolean, platform?: NodeJS.Platform): ShellSpawnPlan;
|
|
89
99
|
/** POSIX 单引号安全包裹(路径/值进 inner.sh 与 -c 包装层用)。 */
|
|
90
100
|
export declare function shSingleQuote(value: string): string;
|
package/lib/shell-integration.js
CHANGED
|
@@ -337,6 +337,108 @@ function ensureBashStubRc() {
|
|
|
337
337
|
return undefined;
|
|
338
338
|
}
|
|
339
339
|
}
|
|
340
|
+
/* ------------------------------------------------------------------ *
|
|
341
|
+
* PowerShell 桩(Windows 宿主)
|
|
342
|
+
* ------------------------------------------------------------------ */
|
|
343
|
+
/**
|
|
344
|
+
* PowerShell 钩子(纯 ASCII)。
|
|
345
|
+
*
|
|
346
|
+
* 为什么必须纯 ASCII:Windows PowerShell 5.1 把**无 BOM** 的 .ps1 按当前 ANSI 代码页读,
|
|
347
|
+
* 一个非 ASCII 字节就能让解析错位(本桩由 `-File` 载入,解析失败=集成静默失效)。ESC/BEL
|
|
348
|
+
* 因此用 `[char]27` / `[char]7` 现构造 —— PS 5.1 没有 `` `e `` 转义(6+ 才有)。
|
|
349
|
+
*
|
|
350
|
+
* 钩子形态:包装 `prompt`(发 `D;<退出码>`、`A`、OSC 7,再调用用户原 prompt)与
|
|
351
|
+
* `PSConsoleHostReadLine`(命令被接受时发 `B`)。桩在 profile **之后**由 `-File` 载入,
|
|
352
|
+
* 所以 `$function:prompt` 拿到的就是用户主题定义过的那个,包装后原样生效。
|
|
353
|
+
*
|
|
354
|
+
* 退出码取值:B 时刻快照 `$LASTEXITCODE`,D 时刻若它**变了**就报它(原生命令),否则按
|
|
355
|
+
* `$?` 报 0/1(cmdlet)。刻意**不清空** `$LASTEXITCODE` —— 清了会让用户紧接着的
|
|
356
|
+
* `echo $LASTEXITCODE` 读到空值。代价:连续两次原生命令给出同一个非零码时,第二次降级
|
|
357
|
+
* 报 1(仍如实标失败,只是丢了具体码值)。
|
|
358
|
+
*
|
|
359
|
+
* 只在原 `PSConsoleHostReadLine` 存在时才装钩子:用户若关掉了 PSReadLine,那个函数不
|
|
360
|
+
* 存在,此时**一个标记都不发**(连 A/7 也不发)——只发 A/7 会让宿主 `sawMark=true` 而
|
|
361
|
+
* `inCommand` 恒 false,`running` 就从「未知」退化成「没在跑」,正是 D77 警告的静默事故
|
|
362
|
+
* (往正在跑的程序里塞命令)。
|
|
363
|
+
*
|
|
364
|
+
* 已知副作用(未修;VS Code 的 shell integration 是同一个取舍):包装里先抓 `$?`、写完 OSC
|
|
365
|
+
* 才调用户原 `prompt`,于是**用户原 prompt 读到的 `$?` 是那几次 `[Console]::Write` 的成败**
|
|
366
|
+
* (恒真),而不是上一条命令的 —— `function prompt { if ($?) {…} }` 那种「失败变红」会因此
|
|
367
|
+
* 失效。要修得先把失败态还原回去(例如按捕获到的状态补发一条错误记录),而那必须两版
|
|
368
|
+
* PowerShell 都真机验过才能落。
|
|
369
|
+
*
|
|
370
|
+
* 已知限制(真机实测,见 README 的 Windows 一节):PowerShell 7 上命令 stdout 在 ConPTY
|
|
371
|
+
* 里晚于 D 标记抵达(渲染管线批量重画 vs 直通序列即时转发,与 tmux 场景同根因),于是
|
|
372
|
+
* 宿主的 B..D 捕获窗口为空 —— cwd 跟随 / 退出码 / running 三态都正常,`capture{last}` 的
|
|
373
|
+
* 输出在 PS 5.1 正常、PS 7 上可能为空(用 `tty_capture` 读尾部)。tmux 那边用 OSC 133;T
|
|
374
|
+
* 快照绕过同一问题,Windows 侧暂无可用的等价快照源,故留作已知限制。
|
|
375
|
+
*/
|
|
376
|
+
function powershellHooks() {
|
|
377
|
+
return [
|
|
378
|
+
'',
|
|
379
|
+
'# >>> dsh-tty shell integration >>>',
|
|
380
|
+
'# Emits OSC 133 (A/B/D + exit code) and OSC 7 (cwd); the host parses the stream.',
|
|
381
|
+
'# ASCII only: Windows PowerShell 5.1 reads a BOM-less .ps1 as ANSI text, so a',
|
|
382
|
+
'# single non-ASCII byte (even inside a comment) breaks the whole script.',
|
|
383
|
+
'if (-not $global:DSH_TTY_HOOKS_LOADED) {',
|
|
384
|
+
' $global:DSH_TTY_HOOKS_LOADED = $true',
|
|
385
|
+
' $global:__DSH_TTY_ESC = [char]27',
|
|
386
|
+
' $global:__DSH_TTY_BEL = [char]7',
|
|
387
|
+
' $global:__DSH_TTY_ORIG_PROMPT = $function:prompt',
|
|
388
|
+
' $global:__DSH_TTY_ORIG_RL = $function:PSConsoleHostReadLine',
|
|
389
|
+
' $global:__DSH_TTY_IN_CMD = $false',
|
|
390
|
+
' $global:__DSH_TTY_LEC_AT_B = $null',
|
|
391
|
+
' # No PSReadLine (user disabled it) -> emit nothing at all: an unpaired A/7 would',
|
|
392
|
+
' # make the host report "not running" for a busy session (see the TS comment).',
|
|
393
|
+
' if ($null -ne $global:__DSH_TTY_ORIG_RL) {',
|
|
394
|
+
' function global:PSConsoleHostReadLine {',
|
|
395
|
+
' $__dsh_tty_line = & $global:__DSH_TTY_ORIG_RL',
|
|
396
|
+
' if ($null -ne $__dsh_tty_line -and "$__dsh_tty_line".Trim().Length -gt 0) {',
|
|
397
|
+
' $global:__DSH_TTY_IN_CMD = $true',
|
|
398
|
+
' $global:__DSH_TTY_LEC_AT_B = "$global:LASTEXITCODE"',
|
|
399
|
+
' [Console]::Write($global:__DSH_TTY_ESC + "]133;B" + $global:__DSH_TTY_BEL)',
|
|
400
|
+
' }',
|
|
401
|
+
' $__dsh_tty_line',
|
|
402
|
+
' }',
|
|
403
|
+
' function global:prompt {',
|
|
404
|
+
' $__dsh_tty_ok = $?',
|
|
405
|
+
' if ($global:__DSH_TTY_IN_CMD) {',
|
|
406
|
+
' $__dsh_tty_ec = "0"',
|
|
407
|
+
' if (-not $__dsh_tty_ok) { $__dsh_tty_ec = "1" }',
|
|
408
|
+
' if ($null -ne $global:LASTEXITCODE -and "$global:LASTEXITCODE" -ne $global:__DSH_TTY_LEC_AT_B) {',
|
|
409
|
+
' $__dsh_tty_ec = "$global:LASTEXITCODE"',
|
|
410
|
+
' }',
|
|
411
|
+
' [Console]::Write($global:__DSH_TTY_ESC + "]133;D;" + $__dsh_tty_ec + $global:__DSH_TTY_BEL)',
|
|
412
|
+
' $global:__DSH_TTY_IN_CMD = $false',
|
|
413
|
+
' }',
|
|
414
|
+
' [Console]::Write($global:__DSH_TTY_ESC + "]133;A" + $global:__DSH_TTY_BEL)',
|
|
415
|
+
' try {',
|
|
416
|
+
' $__dsh_tty_uri = ([System.Uri]::new((Get-Location).Path)).AbsoluteUri',
|
|
417
|
+
' [Console]::Write($global:__DSH_TTY_ESC + "]7;" + $__dsh_tty_uri + $global:__DSH_TTY_BEL)',
|
|
418
|
+
' } catch { }',
|
|
419
|
+
' & $global:__DSH_TTY_ORIG_PROMPT',
|
|
420
|
+
' }',
|
|
421
|
+
' }',
|
|
422
|
+
'}',
|
|
423
|
+
'# <<< dsh-tty shell integration <<<',
|
|
424
|
+
'',
|
|
425
|
+
];
|
|
426
|
+
}
|
|
427
|
+
/** 写 PowerShell 桩(稳定路径 + write-if-changed)并返回桩文件路径;失败返回 undefined(集成静默降级)。 */
|
|
428
|
+
function ensurePowerShellStub() {
|
|
429
|
+
const cached = stubDirs.get(stubKey('powershell'));
|
|
430
|
+
if (cached !== undefined)
|
|
431
|
+
return cached;
|
|
432
|
+
try {
|
|
433
|
+
const stub = join(pluginRuntimeDir(), 'shell', 'powershell', 'bootstrap.ps1');
|
|
434
|
+
writeIfChanged(stub, powershellHooks().join('\n'));
|
|
435
|
+
stubDirs.set(stubKey('powershell'), stub);
|
|
436
|
+
return stub;
|
|
437
|
+
}
|
|
438
|
+
catch {
|
|
439
|
+
return undefined;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
340
442
|
/**
|
|
341
443
|
* 组装 shell 启动计划:在原有 TERM/COLORTERM 包装层之上,按 shell basename
|
|
342
444
|
* 注入集成(zsh → ZDOTDIR 桩;bash → --rcfile 桩)。integration=false 或不
|
|
@@ -430,20 +532,59 @@ export function isPowerShellShell(shell) {
|
|
|
430
532
|
const kind = shell.split(/[\\/]/).pop()?.toLowerCase() ?? '';
|
|
431
533
|
return kind === 'powershell' || kind === 'powershell.exe' || kind === 'pwsh' || kind === 'pwsh.exe';
|
|
432
534
|
}
|
|
535
|
+
/**
|
|
536
|
+
* 该平台 + 该 shell 下,OSC 133/7 集成**能不能注入**(宿主把开关存成什么值的判据)。
|
|
537
|
+
*
|
|
538
|
+
* POSIX 恒 true:注入只对 zsh / bash 有实现,其他 shell 在 buildShellSpawn 里自然退回最简
|
|
539
|
+
* 包装层 —— 这是历史行为,不动它(把 fish 之流一并拨 false 会改变既有快照语义)。
|
|
540
|
+
*
|
|
541
|
+
* Windows 只有 PowerShell 家族为 true(`-File` 桩 + prompt / PSConsoleHostReadLine 钩子);
|
|
542
|
+
* cmd 没有命令开始/结束钩子,注入无从谈起。
|
|
543
|
+
*/
|
|
544
|
+
export function shellIntegrationSupported(shell, platform = process.platform) {
|
|
545
|
+
if (platform !== 'win32')
|
|
546
|
+
return true;
|
|
547
|
+
return isPowerShellShell(shell);
|
|
548
|
+
}
|
|
433
549
|
/**
|
|
434
550
|
* Windows 宿主的启动计划:**直接跑 shell 本体,不做 `-c` 包装层**。
|
|
435
551
|
*
|
|
436
552
|
* 为什么不能沿用 POSIX 那层(`-c 'export TERM=…; exec "$shell"'`):cmd.exe 不认 `-c`,
|
|
437
553
|
* 会把整行忽略掉、开一场空跑然后立刻退出(标签开了就消失);PowerShell 认 `-c` 但把
|
|
438
|
-
* `export` 当不存在的 cmdlet 直接报错(两条都在 Windows 11
|
|
439
|
-
*
|
|
440
|
-
*
|
|
554
|
+
* `export` 当不存在的 cmdlet 直接报错(两条都在 Windows 11 上实测过)。TERM / COLORTERM
|
|
555
|
+
* 对 ConPTY 也没有意义。
|
|
556
|
+
*
|
|
557
|
+
* OSC 133/7 集成的注入形态与 POSIX 不同:Windows 走 PowerShell 的 `-File` 稳定桩(rc 注入
|
|
558
|
+
* 在这里不成立 —— 没有 rc 文件可挂)。cmd 维持「不注入」:没有命令开始/结束钩子就发不出
|
|
559
|
+
* A/B/D,`capture{last}`、running 三态与 cwd 跟随全都无从谈起(宿主侧因此对 Windows + cmd
|
|
560
|
+
* 把 shellIntegration 存 false,见 index.ts 与 shellIntegrationSupported)。
|
|
441
561
|
*
|
|
442
562
|
* PowerShell 补 `-NoLogo` 只是去掉启动横幅;**不补 `-NoProfile`** —— 用户的 profile 正是
|
|
443
|
-
*
|
|
563
|
+
* 别名与函数的来源,终端面板不该替用户把它关掉;桩也要靠「profile 之后」载入才能拿到用户
|
|
564
|
+
* 自定义的 prompt 去包装。
|
|
565
|
+
*
|
|
566
|
+
* `-NoExit` 必须给:`-File` 跑完脚本就退出,标签会开了即关。桩只装钩子、不做别的。
|
|
567
|
+
*
|
|
568
|
+
* `-ExecutionPolicy Bypass` 是**进程级**的:机器策略若为 Restricted / AllSigned,不加它连
|
|
569
|
+
* 这个未签名的桩都载不进去(表现是集成静默失效)。它不改机器策略,也不放宽本插件的信任级
|
|
570
|
+
* —— 终端面板本来就在以用户身份执行任意命令。取值停在 Bypass(不改用更窄的 RemoteSigned:
|
|
571
|
+
* 收益只是策略窄一点,代价是载入路径要在真机上重验一遍)。两条边界如实记下:
|
|
572
|
+
* 1. **组策略优先**:`-ExecutionPolicy` 能压过注册表里的策略,但压不过**组策略**设置的
|
|
573
|
+
* 策略。GPO 锁成 Restricted / AllSigned 的机器上,桩照样载不进去 —— 标签开着、集成
|
|
574
|
+
* 没有(与「用户关了 PSReadLine」同一种静默降级,见 README 的 Windows 一节);
|
|
575
|
+
* 2. **会外溢给子进程**:这个参数把值写进 `$Env:PSExecutionPolicyPreference`,从该会话里
|
|
576
|
+
* 再起 powershell / pwsh 会继承它。
|
|
444
577
|
*/
|
|
445
|
-
function buildWindowsShellSpawn(shell) {
|
|
446
|
-
|
|
578
|
+
function buildWindowsShellSpawn(shell, integration) {
|
|
579
|
+
if (!isPowerShellShell(shell))
|
|
580
|
+
return { argv: [shell], env: {} };
|
|
581
|
+
if (integration) {
|
|
582
|
+
const stub = ensurePowerShellStub();
|
|
583
|
+
if (stub !== undefined) {
|
|
584
|
+
return { argv: [shell, '-NoLogo', '-NoExit', '-ExecutionPolicy', 'Bypass', '-File', stub], env: {} };
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
return { argv: [shell, '-NoLogo'], env: {} };
|
|
447
588
|
}
|
|
448
589
|
/** Windows 宿主的「跑一条命令」计划:按 shell 家族选参数(0.19.0 前一律 /c,Git Bash / WSL 静默失败)。 */
|
|
449
590
|
function buildWindowsCommandSpawn(shell, command) {
|
|
@@ -463,7 +604,7 @@ function buildWindowsCommandSpawn(shell, command) {
|
|
|
463
604
|
}
|
|
464
605
|
export function buildShellSpawn(shell, term, colorTerm, integration, platform = process.platform) {
|
|
465
606
|
if (platform === 'win32')
|
|
466
|
-
return buildWindowsShellSpawn(shell);
|
|
607
|
+
return buildWindowsShellSpawn(shell, integration);
|
|
467
608
|
const pre = `export TERM='${term}'; export COLORTERM='${colorTerm}';`;
|
|
468
609
|
const exec = `exec "${shell}"`;
|
|
469
610
|
if (integration) {
|
|
@@ -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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyzyn/dsh-tty",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.32.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",
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 预载探针:把 node-pty 的**原生终止调用**记账落盘(`node -r ./scripts/pty-kill-probe.cjs …`)。
|
|
3
|
+
*
|
|
4
|
+
* 为什么要有它([DEFECTS.md](../DEFECTS.md) 的 D100):`0xC0000374` 是**原生**堆损坏,
|
|
5
|
+
* 崩的时候拿不到 JS 栈、也不一定有 WER 记录,事后只剩一个退出码。而这类崩溃的共同触发形态是
|
|
6
|
+
* 「同一个 pty 被原生 kill 两次」——把每一次 `NATIVE-KILL id=N` 记下来,"谁在什么时候多杀了一次"
|
|
7
|
+
* 就变成可读的一串行。D100 的定位就是靠它:3/3 个会话上抓到同一个 id 被 kill 两次,间隔约 40 ms。
|
|
8
|
+
*
|
|
9
|
+
* 用法:
|
|
10
|
+
* set PTY_PROBE_LOG=C:\dsh-smoke\logs\probe.log # 缺省写 <cwd>\pty-probe.log
|
|
11
|
+
* node -r ./scripts/pty-kill-probe.cjs ./scripts/pty-kill-repro.mjs kill+terminate 150
|
|
12
|
+
*
|
|
13
|
+
* 行的写法用 `writeSync` 直写 fd——原生崩溃发生时进程级的异步写队列会一起没掉(本包
|
|
14
|
+
* D62 / scripts/crash-trace.mjs 记过同一条),`console.log` 会把这批证据留在缓冲里。
|
|
15
|
+
*
|
|
16
|
+
* 插桩方式是 patch `Module._load`、按**实际被加载的模块对象**下手:pnpm 的软链布局下
|
|
17
|
+
* `require.resolve` 拿到的路径会随 hoist 变化,按对象插桩与布局无关。
|
|
18
|
+
*/
|
|
19
|
+
'use strict'
|
|
20
|
+
const fs = require('node:fs')
|
|
21
|
+
const path = require('node:path')
|
|
22
|
+
|
|
23
|
+
const logPath = process.env.PTY_PROBE_LOG ?? path.join(process.cwd(), 'pty-probe.log')
|
|
24
|
+
let fd = null
|
|
25
|
+
try { fd = fs.openSync(logPath, 'a') } catch (error) { process.stderr.write('probe: open log failed: ' + error.message + '\n') }
|
|
26
|
+
|
|
27
|
+
function log(line) {
|
|
28
|
+
const text = '[probe ' + new Date().toISOString() + ' pid=' + process.pid + '] ' + line + '\n'
|
|
29
|
+
if (fd !== null) { try { fs.writeSync(fd, text) } catch { /* fd 没了 */ } }
|
|
30
|
+
try { fs.writeSync(2, text) } catch { /* stderr 没了 */ }
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
log('probe loaded; node=' + process.version + ' log=' + logPath)
|
|
34
|
+
|
|
35
|
+
const Module = require('node:module')
|
|
36
|
+
const origLoad = Module._load
|
|
37
|
+
const seen = new Set()
|
|
38
|
+
|
|
39
|
+
Module._load = function (request, parent, isMain) {
|
|
40
|
+
const mod = origLoad.apply(this, arguments)
|
|
41
|
+
try { patch(request, mod) } catch (error) { log('patch error for ' + request + ': ' + (error && error.message)) }
|
|
42
|
+
return mod
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function patch(request, mod) {
|
|
46
|
+
if (mod === null || mod === undefined) return
|
|
47
|
+
if (seen.has(request)) return
|
|
48
|
+
seen.add(request)
|
|
49
|
+
|
|
50
|
+
// 1) conpty.node(原生导出):startProcess / connect / kill 是仅有的三个原生入口
|
|
51
|
+
if (typeof mod.kill === 'function' && typeof mod.startProcess === 'function' && typeof mod.connect === 'function') {
|
|
52
|
+
if (mod.__probePatched !== true) {
|
|
53
|
+
mod.__probePatched = true
|
|
54
|
+
const kill = mod.kill
|
|
55
|
+
mod.kill = function (id) { log('NATIVE-KILL id=' + String(id) + '(第 ' + nextKill(id) + ' 次)'); return kill.apply(mod, arguments) }
|
|
56
|
+
const start = mod.startProcess
|
|
57
|
+
mod.startProcess = function () { const result = start.apply(mod, arguments); log('NATIVE-START pty=' + String(result && result.pty)); return result }
|
|
58
|
+
const connect = mod.connect
|
|
59
|
+
mod.connect = function (id) { const result = connect.apply(mod, arguments); log('NATIVE-CONNECT pty=' + String(id) + ' shellPid=' + String(result && result.pid)); return result }
|
|
60
|
+
log('patched native conpty exports (' + request + ')')
|
|
61
|
+
}
|
|
62
|
+
return
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// 2) WindowsTerminal.kill / destroy
|
|
66
|
+
if (mod.WindowsTerminal && mod.WindowsTerminal.prototype && mod.WindowsTerminal.prototype.__probePatched !== true) {
|
|
67
|
+
const proto = mod.WindowsTerminal.prototype
|
|
68
|
+
proto.__probePatched = true
|
|
69
|
+
const kill = proto.kill
|
|
70
|
+
proto.kill = function () {
|
|
71
|
+
log('WT-KILL ready=' + String(this._isReady) + ' pty=' + String(this._pty) + ' pid=' + String(this._pid))
|
|
72
|
+
return kill.apply(this, arguments)
|
|
73
|
+
}
|
|
74
|
+
if (typeof proto.destroy === 'function') {
|
|
75
|
+
const destroy = proto.destroy
|
|
76
|
+
proto.destroy = function () { log('WT-DESTROY pty=' + String(this._pty)); return destroy.apply(this, arguments) }
|
|
77
|
+
}
|
|
78
|
+
log('patched WindowsTerminal (' + request + ')')
|
|
79
|
+
return
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// 3) WindowsPtyAgent.kill —— `_ptyNative.kill` 唯一的调用点,也是 D100 闸门所在的那一层
|
|
83
|
+
if (mod.WindowsPtyAgent && mod.WindowsPtyAgent.prototype && mod.WindowsPtyAgent.prototype.__probePatched !== true) {
|
|
84
|
+
const proto = mod.WindowsPtyAgent.prototype
|
|
85
|
+
proto.__probePatched = true
|
|
86
|
+
if (typeof proto.kill === 'function') {
|
|
87
|
+
const kill = proto.kill
|
|
88
|
+
proto.kill = function () {
|
|
89
|
+
// PTY_PROBE_GATE=1:一次性闸门,**只用来做因果验证**(同一 harness 只差这一个变量)。
|
|
90
|
+
if (process.env.PTY_PROBE_GATE === '1') {
|
|
91
|
+
if (this.__probeAgentKilled === true) { log('AGENT-KILL 已闸门:跳过第 2 次原生 kill pty=' + String(this._pty)); return }
|
|
92
|
+
this.__probeAgentKilled = true
|
|
93
|
+
}
|
|
94
|
+
log('AGENT-KILL pty=' + String(this._pty) + ' innerPid=' + String(this._innerPid) + ' exitCode=' + String(this._exitCode))
|
|
95
|
+
return kill.apply(this, arguments)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
log('patched WindowsPtyAgent (' + request + ') gate=' + String(process.env.PTY_PROBE_GATE))
|
|
99
|
+
return
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// 4) ConoutConnection(每个终端一个 worker 线程,dispose 会 terminate 它)
|
|
103
|
+
if (mod.ConoutConnection && mod.ConoutConnection.prototype && typeof mod.ConoutConnection.prototype.dispose === 'function' && mod.ConoutConnection.prototype.__probePatched !== true) {
|
|
104
|
+
const proto = mod.ConoutConnection.prototype
|
|
105
|
+
proto.__probePatched = true
|
|
106
|
+
const dispose = proto.dispose
|
|
107
|
+
proto.dispose = function () {
|
|
108
|
+
log('CONOUT-DISPOSE pipe=' + String(this._conoutPipeName) + ' alreadyDisposed=' + String(this._isDisposed) + ' ready=' + String(this._isReady))
|
|
109
|
+
return dispose.apply(this, arguments)
|
|
110
|
+
}
|
|
111
|
+
log('patched ConoutConnection (' + request + ')')
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const killCounts = new Map()
|
|
116
|
+
function nextKill(id) {
|
|
117
|
+
const key = String(id)
|
|
118
|
+
const next = (killCounts.get(key) ?? 0) + 1
|
|
119
|
+
killCounts.set(key, next)
|
|
120
|
+
// 这一行就是 D100 的判据:同一个 pty 出现第 2 次就说明两个调用方叠加了
|
|
121
|
+
if (next > 1) log('!! 同一个 pty 被原生 kill 第 ' + next + ' 次:id=' + key)
|
|
122
|
+
return next
|
|
123
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* D100 的最小复现(**插件层**):把 W1–W5 的形状(经插件 + WS 的 spawn → 输入回显 → kill →
|
|
3
|
+
* 关连接)在一只进程里循环 N 次,**不带** W6/W7(agent 工具与只读保留)与 W8(第二个 app + PowerShell)。
|
|
4
|
+
*
|
|
5
|
+
* 它回答的是「触发点在插件这一层,还是要更后面的档」:D100 定位时用它在**没有任何 W8 代码**的
|
|
6
|
+
* 树上崩了 2/168 个会话(≈1.2%/会话),从而把「与 W8 相关」这条排除掉——W8 只是**加多了掷骰子
|
|
7
|
+
* 的次数**(每多一条会话就多一次 kill),不是成因。
|
|
8
|
+
*
|
|
9
|
+
* 跑法(真机 / Windows VM,用 `lib/` 的构建产物):
|
|
10
|
+
* node -r ./scripts/pty-kill-probe.cjs ./scripts/pty-kill-repro-plugin.mjs 150
|
|
11
|
+
* 装上 D100 闸门之后:150 个会话一轮跑满、探针里 150 次 `NATIVE-KILL`、**0 次双重 kill**。
|
|
12
|
+
*
|
|
13
|
+
* 进度用 `writeSync` 直写 fd(原生崩溃会丢掉异步写队列里的行,见 D62)。
|
|
14
|
+
*/
|
|
15
|
+
import { writeSync } from 'node:fs'
|
|
16
|
+
import { Context } from '@deepseek-ai/cordis'
|
|
17
|
+
import WebServerRuntime from '@deepseek-ai/dsh-host-webserver'
|
|
18
|
+
import { LocalSubprocessRuntime } from '@deepseek-ai/dsh-subprocess-local'
|
|
19
|
+
import WebSocket from 'ws'
|
|
20
|
+
import { name, inject, apply } from '../lib/index.js'
|
|
21
|
+
|
|
22
|
+
const loops = Number(process.argv[2] ?? 12)
|
|
23
|
+
const say = (s) => { try { writeSync(1, s + '\n') } catch { /* fd 没了 */ } }
|
|
24
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms))
|
|
25
|
+
|
|
26
|
+
// 同 pty-kill-repro.mjs:只在 Windows 上有意义(默认 shell 是 %COMSPEC%,打的是 ConPTY 的终止路径)。
|
|
27
|
+
if (process.platform !== 'win32') {
|
|
28
|
+
say(`# 这份复现只在 Windows 上有意义(当前 ${process.platform}):它打的是 ConPTY 的原生终止路径`)
|
|
29
|
+
process.exit(0)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const app = new Context()
|
|
33
|
+
app.plugin(WebServerRuntime, { host: '127.0.0.1', port: 0 })
|
|
34
|
+
app.plugin(LocalSubprocessRuntime)
|
|
35
|
+
app.plugin({
|
|
36
|
+
name: 'repro-stub',
|
|
37
|
+
apply: (ctx) => {
|
|
38
|
+
ctx.provide('settings', { describe: () => [], update: async () => {}, configure: () => () => {} })
|
|
39
|
+
ctx.provide('tools', { register: () => () => {} })
|
|
40
|
+
},
|
|
41
|
+
})
|
|
42
|
+
await app.plugin({ name, inject, apply }, { maxSessions: 4, term: 'xterm-256color', colorTerm: 'truecolor' }).await?.()
|
|
43
|
+
await sleep(400)
|
|
44
|
+
const port = app.webServer.port
|
|
45
|
+
say(`# loops=${loops} port=${port}`)
|
|
46
|
+
|
|
47
|
+
for (let i = 1; i <= loops; i += 1) {
|
|
48
|
+
say(`[${i}] connect`)
|
|
49
|
+
const ws = new WebSocket(`ws://127.0.0.1:${port}/api/dsh-tty/ws`)
|
|
50
|
+
let ready = false
|
|
51
|
+
let exited = false
|
|
52
|
+
ws.on('message', (raw) => {
|
|
53
|
+
const m = JSON.parse(raw.toString())
|
|
54
|
+
if (m.t === 'ready') ready = true
|
|
55
|
+
if (m.t === 'exit') exited = true
|
|
56
|
+
})
|
|
57
|
+
await new Promise((r) => ws.once('open', r))
|
|
58
|
+
ws.send(JSON.stringify({ t: 'spawn', cols: 100, rows: 30 }))
|
|
59
|
+
let t0 = Date.now()
|
|
60
|
+
while (!ready && Date.now() - t0 < 20000) await sleep(50)
|
|
61
|
+
say(`[${i}] ready=${String(ready)}`)
|
|
62
|
+
ws.send(JSON.stringify({ t: 'input', d: 'echo x\r\n' }))
|
|
63
|
+
await sleep(200)
|
|
64
|
+
ws.send(JSON.stringify({ t: 'kill' }))
|
|
65
|
+
t0 = Date.now()
|
|
66
|
+
while (!exited && Date.now() - t0 < 15000) await sleep(50)
|
|
67
|
+
say(`[${i}] exited=${String(exited)}`)
|
|
68
|
+
try { ws.close() } catch { /* 已关 */ }
|
|
69
|
+
await sleep(150)
|
|
70
|
+
}
|
|
71
|
+
say(`# 全部 ${loops} 轮跑完(没崩)`)
|
|
72
|
+
process.exit(0)
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* D100 的最小复现(**裸层**):只做 `spawnTerminal` + 一层或多层终止,不跑 smoke 其余部分。
|
|
3
|
+
*
|
|
4
|
+
* 用途有两个:
|
|
5
|
+
* 1. 隔离变量——「单次 kill 无害、双重 kill 致命」这句话是拿它跑出来的 A/B(各 150 轮):
|
|
6
|
+
* 无闸门 `node -r ./scripts/pty-kill-probe.cjs ./scripts/pty-kill-repro.mjs kill+terminate 150`
|
|
7
|
+
* 一次性闸门 `PTY_PROBE_GATE=1 node -r ./scripts/pty-kill-probe.cjs ./scripts/pty-kill-repro.mjs kill+terminate 150`
|
|
8
|
+
* 单次对照 `node -r ./scripts/pty-kill-probe.cjs ./scripts/pty-kill-repro.mjs terminate 150`
|
|
9
|
+
* 真机(Win11 ARM64)实测:无闸门 188 次原生 kill / 94 次双重 → 第 75 轮崩
|
|
10
|
+
* (退出码 -1073740940 = `0xC0000374`);装了闸门 150/150 每 pty 恰好 1 次、跑满不崩。
|
|
11
|
+
* 2. 复现**插件实际用的那条顺序**:`kill+terminate` 才是本包 `killSessionNow` 的顺序
|
|
12
|
+
* (先 D48 的预杀、后 DSH 的 `terminate()`);反过来(`terminate+kill`)也留着做对照。
|
|
13
|
+
*
|
|
14
|
+
* `kill+terminate` 为什么会双重(D100 的正文):DSH 的 `stopShellWindows()` 在
|
|
15
|
+
* `rootIdentity === undefined` 时**也**调 `terminal.kill()`,而 Windows 上 rootIdentity 恒为
|
|
16
|
+
* undefined(`pid` 要等 conout 连接才有值,DSH 构造 handler 时取到 0)⇒ 两个调用方叠加。
|
|
17
|
+
* 想看这条证据就跑上面的第一行:探针会打出两行 `NATIVE-KILL id=N`。
|
|
18
|
+
*
|
|
19
|
+
* 进度用 `writeSync` 直写 fd(原生崩溃会丢掉异步写队列里的行,见 D62)。
|
|
20
|
+
*
|
|
21
|
+
* 用法(在包根):node ./scripts/pty-kill-repro.mjs <mode> <iterations>
|
|
22
|
+
* mode: spawn-only | terminate | nodepty-kill | terminate+kill | kill+terminate
|
|
23
|
+
* | kill+kill | terminate+terminate | write+<上面任意终止组合>
|
|
24
|
+
* 例:write+kill+terminate(最接近插件真实路径:先写输入,再预杀,再 terminate)
|
|
25
|
+
*/
|
|
26
|
+
import { writeSync } from 'node:fs'
|
|
27
|
+
import { Context } from '@deepseek-ai/cordis'
|
|
28
|
+
import { LocalSubprocessRuntime } from '@deepseek-ai/dsh-subprocess-local'
|
|
29
|
+
|
|
30
|
+
const mode = process.argv[2] ?? 'kill+terminate'
|
|
31
|
+
const iterations = Number(process.argv[3] ?? 15)
|
|
32
|
+
const say = (s) => { try { writeSync(1, s + '\n') } catch { /* fd 没了 */ } }
|
|
33
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms))
|
|
34
|
+
|
|
35
|
+
// 这份复现针对的是 Windows 的 ConPTY 终止路径:非 win32 上既没有 `cmd.exe` 也没有那条原生
|
|
36
|
+
// `PtyKill`,跑起来只会得到「命令不存在」——直接说清楚,别让人以为复现失败。
|
|
37
|
+
if (process.platform !== 'win32') {
|
|
38
|
+
say(`# 这份复现只在 Windows 上有意义(当前 ${process.platform}):它打的是 ConPTY 的原生终止路径`)
|
|
39
|
+
process.exit(0)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const ALLOWED = new Set([
|
|
43
|
+
'spawn-only', 'terminate', 'nodepty-kill', 'terminate+kill', 'kill+terminate',
|
|
44
|
+
'kill+kill', 'terminate+terminate',
|
|
45
|
+
'write+kill', 'write+terminate', 'write+kill+terminate', 'write+terminate+kill',
|
|
46
|
+
])
|
|
47
|
+
if (!ALLOWED.has(mode)) {
|
|
48
|
+
say(`# 未知 mode=${mode};可选:${[...ALLOWED].join(' | ')}`)
|
|
49
|
+
process.exit(2)
|
|
50
|
+
}
|
|
51
|
+
const steps = mode.split('+')
|
|
52
|
+
const doWrite = steps[0] === 'write'
|
|
53
|
+
const kills = doWrite ? steps.slice(1) : steps
|
|
54
|
+
|
|
55
|
+
say(`# mode=${mode} iterations=${iterations} node=${process.version} kills=[${kills.join(',')}]`)
|
|
56
|
+
const app = new Context()
|
|
57
|
+
const fiber = app.plugin(LocalSubprocessRuntime)
|
|
58
|
+
await fiber.await()
|
|
59
|
+
const subprocess = app.get('subprocess')
|
|
60
|
+
if (subprocess === undefined) { say('# subprocess 服务缺失!'); process.exit(2) }
|
|
61
|
+
|
|
62
|
+
/** 走一层终止:`terminate` = DSH 的 handle.terminate()(closeOnce);其余 = node-pty 的 kill。 */
|
|
63
|
+
const callKill = (handle, kind) => {
|
|
64
|
+
if (kind === 'terminate') {
|
|
65
|
+
return handle.terminate().then(
|
|
66
|
+
() => { say(' terminate() 返回') },
|
|
67
|
+
(e) => { say(` terminate() 抛: ${e?.message ?? e}`) },
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
const kill = handle.terminal?.kill
|
|
71
|
+
if (typeof kill !== 'function') { say(' terminal.kill 不存在'); return Promise.resolve() }
|
|
72
|
+
try {
|
|
73
|
+
kill.call(handle.terminal)
|
|
74
|
+
say(' kill() 返回')
|
|
75
|
+
} catch (e) {
|
|
76
|
+
say(` kill() 抛: ${e?.message ?? e}`)
|
|
77
|
+
}
|
|
78
|
+
return Promise.resolve()
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
for (let i = 1; i <= iterations; i += 1) {
|
|
82
|
+
say(`[${i}] before-spawn`)
|
|
83
|
+
const handle = await subprocess.spawnTerminal({
|
|
84
|
+
argv: ['cmd.exe'], rows: 30, cols: 100, cwd: process.cwd(), env: { ...process.env }, graceMs: 5000,
|
|
85
|
+
})
|
|
86
|
+
// Windows 上当轮拿到的 pid 就是 0(D100 的另一半证据:node-pty 的 pid 要等 conout 连接才有值)
|
|
87
|
+
say(`[${i}] spawned pid=${handle.pid} (${new Date().toISOString()})`)
|
|
88
|
+
if (doWrite) { await handle.write('echo x\r\n'); await sleep(150); say(`[${i}] wrote`) }
|
|
89
|
+
for (const kind of kills) {
|
|
90
|
+
say(`[${i}] -> ${kind}`)
|
|
91
|
+
await callKill(handle, kind)
|
|
92
|
+
await sleep(kind === 'terminate' ? 0 : 50)
|
|
93
|
+
}
|
|
94
|
+
await Promise.race([
|
|
95
|
+
handle.done.then((d) => say(`[${i}] done ${JSON.stringify(d)}`)),
|
|
96
|
+
sleep(4000).then(() => say(`[${i}] done 超时(不等待)`)),
|
|
97
|
+
]).catch(() => {})
|
|
98
|
+
await sleep(60)
|
|
99
|
+
}
|
|
100
|
+
say(`# 全部 ${iterations} 轮跑完(没崩) mode=${mode}`)
|
|
101
|
+
process.exit(0)
|