@hyzyn/dsh-tty 0.30.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 +43 -14
- package/README.md +37 -10
- package/client.js +145 -45
- 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/preview/harness.js +140 -7
- package/scripts/preview/mock-host.js +19 -0
- package/scripts/preview.mjs +11 -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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAQnD,kDAAkD;AAClD,MAAM,eAAe,GAAG,uBAAuB,CAAA;AAE/C;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACtD,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,EAAE,CAAA;IAC7B,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAA;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC1F,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAC7E,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,MAAM,EAAE,CAAA;AACrD,CAAC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAA;IACnC,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,OAAO,EAAE,CAAA;AAC1D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAA;IACnC,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;AAClF,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;;;;;;;GAOG;AAEH;;;;;;;;GAQG;AACH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAA;AAE1C,gDAAgD;AAChD,SAAS,OAAO,CAAC,KAAoC;IACnD,OAAO,GAAG,KAAK,IAAI,OAAO,EAAE,IAAI,iBAAiB,EAAE,EAAE,CAAA;AACvD,CAAC;AAED;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,MAAc;IAC9B,OAAO;QACP,EAAE;QACF,qCAAqC;QACrC,yCAAyC;QACzC,iCAAiC;QACjC,iCAAiC;QACjC,yDAAyD;QACzD,6DAA6D;QAC7D,2BAA2B;QAC3B,uDAAuD;QACvD,uDAAuD;QACvD,0DAA0D;QAC1D,iEAAiE;QACjE,0DAA0D;QAC1D,QAAQ;QACR,oCAAoC;QACpC,oCAAoC;QACpC,uCAAuC;QACvC,8CAA8C;QAC9C,MAAM;QACN,oDAAoD;QACpD,iDAAiD;QACjD,wDAAwD;QACxD,wCAAwC;QACxC,yBAAyB;QACzB,gCAAgC;QAChC,sCAAsC,MAAM,uDAAuD;QACnG,6CAA6C;QAC7C,qGAAqG;QACrG,QAAQ;QACR,KAAK;QACL,wBAAwB;QACxB,iBAAiB;QACjB,qCAAqC;QACrC,2CAA2C;QAC3C,+DAA+D;QAC/D,+BAA+B;QAC/B,oDAAoD;QACpD,KAAK;QACL,yBAAyB;QACzB,wBAAwB;QACxB,+BAA+B;QAC/B,KAAK;QACL,0CAA0C;QAC1C,oCAAoC;QACpC,gEAAgE;QAChE,mEAAmE;QACnE,IAAI;QACJ,qCAAqC;QACrC,EAAE;KACD,CAAA;AACH,CAAC;AAED,uDAAuD;AACvD,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO;QACP,EAAE;QACF,qCAAqC;QACrC,yCAAyC;QACzC,iCAAiC;QACjC,sBAAsB;QACtB,iDAAiD;QACjD,2BAA2B;QAC3B,uDAAuD;QACvD,uDAAuD;QACvD,0DAA0D;QAC1D,iEAAiE;QACjE,0DAA0D;QAC1D,QAAQ;QACR,oCAAoC;QACpC,oCAAoC;QACpC,uCAAuC;QACvC,8CAA8C;QAC9C,MAAM;QACN,wEAAwE;QACxE,yBAAyB;QACzB,gCAAgC;QAChC,sCAAsC,MAAM,uDAAuD;QACnG,6CAA6C;QAC7C,qGAAqG;QACrG,QAAQ;QACR,KAAK;QACL,wBAAwB;QACxB,iBAAiB;QACjB,8DAA8D;QAC9D,gEAAgE;QAChE,4DAA4D;QAC5D,yDAAyD;QACzD,2BAA2B;QAC3B,yCAAyC;QACzC,yDAAyD;QACzD,+BAA+B;QAC/B,wDAAwD;QACxD,KAAK;KACJ,CAAA;AACH,CAAC;AAED,MAAM,aAAa,GAAG;IACpB,IAAI;IACJ,qCAAqC;IACrC,EAAE;CACH,CAAA;AAED,SAAS,gBAAgB;IACvB,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IAC3C,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,yCAAyC;QACzC,qDAAqD;QACrD,uCAAuC;QACvC,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,CAAU,EAAE,CAAC;YAC5E,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,QAAQ,CAAC,cAAc,EAAE,CAAC;SAC9B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACb,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAA;QACjC,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,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;IAC5C,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,WAAW,CAAC,cAAc,EAAE,CAAC;YAChC,mCAAmC;YACnC,uCAAuC;YACvC,8EAA8E;YAC9E,8GAA8G;YAC9G,sCAAsC;YACtC,wBAAwB;YACxB,qBAAqB;YACrB,0CAA0C;YAC1C,UAAU;YACV,kDAAkD;YAClD,0CAA0C;YAC1C,2CAA2C;YAC3C,wDAAwD;YACxD,sBAAsB;YACtB,wCAAwC;YACxC,kCAAkC;YAClC,4EAA4E;YAC5E,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,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAA;QACjC,OAAO,EAAE,CAAA;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED;;wEAEwE;AAExE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,SAAS,eAAe;IACtB,OAAO;QACP,EAAE;QACF,qCAAqC;QACrC,kFAAkF;QAClF,+EAA+E;QAC/E,0EAA0E;QAC1E,0CAA0C;QAC1C,wCAAwC;QACxC,oCAAoC;QACpC,mCAAmC;QACnC,oDAAoD;QACpD,+DAA+D;QAC/D,qCAAqC;QACrC,sCAAsC;QACtC,oFAAoF;QACpF,iFAAiF;QACjF,8CAA8C;QAC9C,6CAA6C;QAC7C,qDAAqD;QACrD,mFAAmF;QACnF,0CAA0C;QAC1C,6DAA6D;QAC7D,oFAAoF;QACpF,SAAS;QACT,uBAAuB;QACvB,OAAO;QACP,8BAA8B;QAC9B,0BAA0B;QAC1B,uCAAuC;QACvC,6BAA6B;QAC7B,yDAAyD;QACzD,0GAA0G;QAC1G,kDAAkD;QAClD,WAAW;QACX,qGAAqG;QACrG,2CAA2C;QAC3C,SAAS;QACT,kFAAkF;QAClF,aAAa;QACb,+EAA+E;QAC/E,kGAAkG;QAClG,mBAAmB;QACnB,uCAAuC;QACvC,OAAO;QACP,KAAK;QACL,GAAG;QACH,qCAAqC;QACrC,EAAE;KACD,CAAA;AACH,CAAC;AAED,8EAA8E;AAC9E,SAAS,oBAAoB;IAC3B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAA;IAClD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAA;IACvC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,eAAe,CAAC,CAAA;QAC7E,cAAc,CAAC,IAAI,EAAE,eAAe,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAClD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,CAAA;QACzC,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,IAAY,EAAE,SAAiB,EAAE,OAAe,EAAE,WAA4B,OAAO,CAAC,QAAQ;IAC7I,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACzE,MAAM,GAAG,GAAG,gBAAgB,IAAI,wBAAwB,SAAS,IAAI,CAAA;IACrE;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,MAAM,KAAK,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,OAAO,CAAC,EAAE,CAAA;IACpE,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,GAAG,SAAS,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAA;AACjE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAA4B,OAAO,CAAC,QAAQ,EAAE,MAAyB,OAAO,CAAC,GAAG;IACjH,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,SAAS,CAAA;IACjE,OAAO,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,UAAU,CAAA;AACxC,CAAC;AAED;;;;;;GAMG;AACH;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,WAA4B,OAAO,CAAC,QAAQ;IAC1F,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAA;IACzD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,SAAS,IAAI,2EAA2E,CAAA;IACjG,CAAC;IACD,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,SAAS,IAAI,qHAAqH,CAAA;IAC3I,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;IAC3D,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACzH,OAAO,SAAS,IAAI,6EAA6E,CAAA;IACnG,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACzC,OAAO,SAAS,IAAI,oCAAoC,CAAA;IAC1D,CAAC;IACD,OAAO,SAAS,IAAI,2HAA2H,CAAA;AACjJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;IAC5D,OAAO,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,UAAU,CAAA;AACrG,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAa,EAAE,WAA4B,OAAO,CAAC,QAAQ;IACnG,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,IAAI,CAAA;IACrC,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAA;AACjC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,SAAS,sBAAsB,CAAC,KAAa,EAAE,WAAoB;IACjE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAA;IAChE,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,oBAAoB,EAAE,CAAA;QACnC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,kBAAkB,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAA;QACtG,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAA;AAC9C,CAAC;AAED,6EAA6E;AAC7E,SAAS,wBAAwB,CAAC,KAAa,EAAE,OAAe;IAC9D,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAA;IACnE,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAA;IAC5D,8BAA8B;IAC9B,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACzH,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAA;IAClD,CAAC;IACD,kDAAkD;IAClD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACzC,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAA;IAC9D,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,IAAY,EAAE,SAAiB,EAAE,WAAoB,EAAE,WAA4B,OAAO,CAAC,QAAQ;IAChJ,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,sBAAsB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAA;IAC3E,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/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",
|
|
@@ -209,6 +209,63 @@
|
|
|
209
209
|
await sleep(200)
|
|
210
210
|
return item
|
|
211
211
|
}
|
|
212
|
+
/**
|
|
213
|
+
* SSH 连接对话框「头尾固定」的公共断言(0.31.0):
|
|
214
|
+
* 标题钉在卡片上缘、底部动作行钉在下缘,**只有中段滚**——此前是整张卡片
|
|
215
|
+
* `overflow-y: auto`,滚一下就两头都不见了(底部按钮初始根本不在视口里)。
|
|
216
|
+
* 内容溢出时把中段滚到底再复查一次,否则「没滚动」等于这条断言没验到。
|
|
217
|
+
*/
|
|
218
|
+
const sshFrameProblem = () => {
|
|
219
|
+
const card = q('.tt_sshCard')
|
|
220
|
+
const head = q('.tt_sshHead')
|
|
221
|
+
const body = q('.tt_sshBody')
|
|
222
|
+
const foot = q('.tt_sshFoot')
|
|
223
|
+
if (card === null || head === null || body === null || foot === null) return '连接对话框缺少头 / 身 / 尾三段'
|
|
224
|
+
if (getComputedStyle(card).overflowY !== 'hidden') return '卡片自己还在滚动(标题与按钮会跟着跑)'
|
|
225
|
+
if (getComputedStyle(body).overflowY !== 'auto') return '中段不是滚动容器'
|
|
226
|
+
const cardRect = card.getBoundingClientRect()
|
|
227
|
+
if (Math.abs(head.getBoundingClientRect().top - cardRect.top) > 1) return '标题没钉在卡片上缘'
|
|
228
|
+
if (Math.abs(foot.getBoundingClientRect().bottom - cardRect.bottom) > 1) return '底部动作行没钉在卡片下缘'
|
|
229
|
+
if (body.scrollHeight > body.clientHeight) {
|
|
230
|
+
body.scrollTop = body.scrollHeight
|
|
231
|
+
const after = card.getBoundingClientRect()
|
|
232
|
+
if (Math.abs(head.getBoundingClientRect().top - after.top) > 1) return '把中段滚到底后标题跟着跑了'
|
|
233
|
+
if (Math.abs(foot.getBoundingClientRect().bottom - after.bottom) > 1) return '把中段滚到底后底部动作行跟着跑了'
|
|
234
|
+
if (body.scrollTop === 0) return '中段内容溢出却滚不动'
|
|
235
|
+
}
|
|
236
|
+
return null
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* 「高级」折叠区的展开图标:收起 = 右尖括号、展开 = 下尖括号,**路径逐字取自宿主**
|
|
240
|
+
* `dsh-client-ui-primitives` 的 `IconChevronRightOutlineRegular` / `IconChevronDownOutlineRegular`
|
|
241
|
+
* (官方 provider 卡片「自定义设置」就是这一对;用户原话「展开图标和 dsh 官方的图标保持一致」)。
|
|
242
|
+
* 夹具里比一次实时的 DOM,源码那一半在 `test/ssh-dialog-shell.test.ts` 钉着。
|
|
243
|
+
*/
|
|
244
|
+
const HOST_CHEVRON_RIGHT = 'M6 12L9.29289 8.70711C9.68342 8.31658 9.68342 7.68342 9.29289 7.29289L6 4'
|
|
245
|
+
const HOST_CHEVRON_DOWN = 'M4 6L7.29289 9.29289C7.68342 9.68342 8.31658 9.68342 8.70711 9.29289L12 6'
|
|
246
|
+
/** 折叠区钉在图标上的判据:返回 null 表示与宿主一致,否则给出实测路径。 */
|
|
247
|
+
const advChevronProblem = (expected) => {
|
|
248
|
+
const path = q('.tt_sshAdvChevron path')
|
|
249
|
+
if (path === null) return '「高级」折叠区的展开图标缺失'
|
|
250
|
+
const d = path.getAttribute('d') ?? ''
|
|
251
|
+
if (d !== expected) return '展开图标与宿主的不是同一只(实测 d="' + d + '")'
|
|
252
|
+
return null
|
|
253
|
+
}
|
|
254
|
+
/** 从「+」菜单里按条目名点开编辑(对话框只认连接簿里已存在的名字)。 */
|
|
255
|
+
const openEditFor = async (name) => {
|
|
256
|
+
await clickAdd()
|
|
257
|
+
const rows = await waitFor(() => {
|
|
258
|
+
const r = qa('.tt_addMenuRow')
|
|
259
|
+
return r.length > 0 ? r : null
|
|
260
|
+
})
|
|
261
|
+
const row = rows.find((r) => (r.querySelector('.tt_addMenuMain')?.textContent ?? '') === name)
|
|
262
|
+
if (row === undefined) throw new Error('「+」菜单里找不到条目 ' + name)
|
|
263
|
+
const editBtn = [...row.querySelectorAll('.tt_addMenuEdit')].find((b) => attributeSays(b, 'title', '编辑连接', 'Edit connection'))
|
|
264
|
+
if (editBtn === undefined) throw new Error('条目 ' + name + ' 没有「编辑连接」按钮')
|
|
265
|
+
editBtn.click()
|
|
266
|
+
await waitFor(() => q('.tt_sshCard'))
|
|
267
|
+
await sleep(200)
|
|
268
|
+
}
|
|
212
269
|
/** SFTP 落点断言:卡片在挂载位里(docked)还是退回了居中对话框(modal)。 */
|
|
213
270
|
const sftpSurfaceAssert = () => ({
|
|
214
271
|
docked: q('.tt_dockPaneBody > .tt_sftpCard') !== null || q('.tt_dockPaneBody > .tt_sftpDualCard') !== null,
|
|
@@ -425,18 +482,94 @@
|
|
|
425
482
|
await waitFor(() => resultEl() && resultEl().textContent !== '' && !says(resultEl(), '测试中', 'Testing'))
|
|
426
483
|
await sleep(250)
|
|
427
484
|
},
|
|
485
|
+
/* SSH 连接对话框:「保存到连接簿」名称行常显 + 填名字自动勾上(0.31.0) */
|
|
486
|
+
async 'ssh-save-book'() {
|
|
487
|
+
await openPanel()
|
|
488
|
+
await clickAdd()
|
|
489
|
+
await clickMenuItem('SSH 连接…', 'SSH connection…')
|
|
490
|
+
await waitFor(() => q('.tt_sshCard'))
|
|
491
|
+
/*
|
|
492
|
+
* 用户原话「这个默认展开吧」(贴的是「保存到连接簿 + 连接簿名称」那一块)。这里按**文案**
|
|
493
|
+
* 找那两个控件,再把四条联动规则逐条敲一遍——它们错掉时界面都看不出来(最典型:取消勾选后
|
|
494
|
+
* 名字还留在框里 ⇒ 按下去既不保存也没提示)。
|
|
495
|
+
*/
|
|
496
|
+
window.__previewAssert = async () => {
|
|
497
|
+
const labelFor = (...names) => qa('.tt_sshCard .tt_cardLabel').find((el) => says(el, ...names))
|
|
498
|
+
const saveLabel = labelFor('保存到连接簿', 'Save to the host book')
|
|
499
|
+
const nameLabel = labelFor('连接簿名称', 'Book name')
|
|
500
|
+
if (saveLabel === undefined || nameLabel === undefined) return '找不到「保存到连接簿 / 连接簿名称」这两个控件'
|
|
501
|
+
const saveCheck = saveLabel.closest('.tt_cardRow')?.querySelector('input[type="checkbox"]')
|
|
502
|
+
const nameRow = nameLabel.closest('.tt_sshRow')
|
|
503
|
+
const nameInput = nameRow?.querySelector('input')
|
|
504
|
+
if (saveCheck === undefined || saveCheck === null || nameRow === null || nameInput === null) {
|
|
505
|
+
return '「保存到连接簿」那一组的结构不对'
|
|
506
|
+
}
|
|
507
|
+
const hostInput = qa('.tt_sshCard input')[0]
|
|
508
|
+
// ① 默认:名称行就在眼前(不必先勾勾选框),且勾选框是关的
|
|
509
|
+
if (nameRow.getBoundingClientRect().height <= 0) return '连接簿名称这一行默认不显示(用户要的是「默认展开」)'
|
|
510
|
+
if (saveCheck.checked !== false) return '默认就把「保存到连接簿」勾上了(那一项应当是关的)'
|
|
511
|
+
// ② 填了名字 → 自动勾上
|
|
512
|
+
nameInput.value = 'staging-db'
|
|
513
|
+
nameInput.dispatchEvent(new Event('input'))
|
|
514
|
+
if (saveCheck.checked !== true) return '名称框里填了名字,「保存到连接簿」却没自动勾上'
|
|
515
|
+
// ③ 清空名字 → 自动取消
|
|
516
|
+
nameInput.value = ''
|
|
517
|
+
nameInput.dispatchEvent(new Event('input'))
|
|
518
|
+
if (saveCheck.checked !== false) return '名字清空了,「保存到连接簿」还勾着(等于静默保存一条无名条目)'
|
|
519
|
+
// ④ 手动勾上且名称为空 → 用主机名兜底
|
|
520
|
+
hostInput.value = 'db.internal'
|
|
521
|
+
saveCheck.checked = true
|
|
522
|
+
saveCheck.dispatchEvent(new Event('change'))
|
|
523
|
+
if (nameInput.value !== 'db.internal') return '手动勾上时没有用主机名兜底(实测 "' + nameInput.value + '")'
|
|
524
|
+
// ⑤ 手动取消 → 名字一起清掉(不留「名字还在、但不会保存」的悬空态)
|
|
525
|
+
saveCheck.checked = false
|
|
526
|
+
saveCheck.dispatchEvent(new Event('change'))
|
|
527
|
+
if (nameInput.value !== '') return '取消勾选后名字还留在框里(实测 "' + nameInput.value + '")'
|
|
528
|
+
// 截图落在「填了名字、勾选框自动跟上」这个态上
|
|
529
|
+
nameInput.value = 'staging-db'
|
|
530
|
+
nameInput.dispatchEvent(new Event('input'))
|
|
531
|
+
return null
|
|
532
|
+
}
|
|
533
|
+
},
|
|
428
534
|
/* SSH 连接对话框(编辑连接簿条目,含 env 选择器) */
|
|
429
535
|
async 'ssh-edit'() {
|
|
536
|
+
await openPanel()
|
|
537
|
+
await openEditFor('staging-db')
|
|
538
|
+
window.__previewAssert = async () => {
|
|
539
|
+
const advBody = q('.tt_sshAdvBody')
|
|
540
|
+
const advToggle = q('.tt_sshAdvToggle')
|
|
541
|
+
if (advBody === null || advToggle === null) return '「高级」折叠区缺失'
|
|
542
|
+
// 这条条目一项「高级」都没配:必须默认收起,否则这轮优化等于没做
|
|
543
|
+
if (advBody.hidden !== true) return '条目里没配过高级项,折叠区却是展开的'
|
|
544
|
+
if (advToggle.getAttribute('aria-expanded') !== 'false') return 'aria-expanded 与收起态不一致'
|
|
545
|
+
return advChevronProblem(HOST_CHEVRON_RIGHT) ?? sshFrameProblem()
|
|
546
|
+
}
|
|
547
|
+
},
|
|
548
|
+
/* SSH 连接对话框:展开「高级」并检验头尾固定(中段溢出时滚到底再复查) */
|
|
549
|
+
async 'ssh-adv'() {
|
|
430
550
|
await openPanel()
|
|
431
551
|
await clickAdd()
|
|
432
|
-
|
|
433
|
-
const r = qa('.tt_addMenuRow')
|
|
434
|
-
return r.length > 0 ? r : null
|
|
435
|
-
})
|
|
436
|
-
const editBtn = [...rows[1].querySelectorAll('.tt_addMenuEdit')].find((b) => attributeSays(b, 'title', '编辑连接', 'Edit connection'))
|
|
437
|
-
editBtn.click()
|
|
552
|
+
await clickMenuItem('SSH 连接…', 'SSH connection…')
|
|
438
553
|
await waitFor(() => q('.tt_sshCard'))
|
|
439
|
-
await
|
|
554
|
+
const advBody = await waitFor(() => q('.tt_sshAdvBody'))
|
|
555
|
+
if (advBody.hidden !== true) throw new Error('新建连接时「高级」应当默认收起')
|
|
556
|
+
q('.tt_sshAdvToggle').click()
|
|
557
|
+
await sleep(150)
|
|
558
|
+
if (advBody.hidden === true) throw new Error('点「高级」没有展开')
|
|
559
|
+
window.__previewAssert = async () => advChevronProblem(HOST_CHEVRON_DOWN) ?? sshFrameProblem()
|
|
560
|
+
},
|
|
561
|
+
/* SSH 连接对话框:编辑一条**配过高级项**的条目 → 折叠区自动展开并点名已配置的项 */
|
|
562
|
+
async 'ssh-jump'() {
|
|
563
|
+
await openPanel()
|
|
564
|
+
await openEditFor('bastion-jump')
|
|
565
|
+
window.__previewAssert = async () => {
|
|
566
|
+
const advBody = q('.tt_sshAdvBody')
|
|
567
|
+
const meta = q('.tt_sshAdvMeta')
|
|
568
|
+
if (advBody === null) return '「高级」折叠区缺失'
|
|
569
|
+
if (advBody.hidden === true) return '条目里配了跳板机 / 代理命令,折叠区却默认收起(配置被藏起来了)'
|
|
570
|
+
if (meta === null || !says(meta, '跳板机', 'Jump host')) return '折叠区元信息没点名已配置的跳板机'
|
|
571
|
+
return advChevronProblem(HOST_CHEVRON_DOWN) ?? sshFrameProblem()
|
|
572
|
+
}
|
|
440
573
|
},
|
|
441
574
|
/* 设置卡片(展开) */
|
|
442
575
|
async settings() {
|
|
@@ -53,6 +53,25 @@
|
|
|
53
53
|
// 刻意**没有**任何隧道:验证「没配隧道时收进 ⋯ 更多」这条路径
|
|
54
54
|
// (上面两条都有隧道,走的是常驻「隧道 N」按钮)
|
|
55
55
|
{ name: 'bare-host', host: 'bare.internal', port: 22, username: 'ops', auth: 'agent', keyPath: '', passphrase: '', password: '', agentForward: false, persist: false },
|
|
56
|
+
/*
|
|
57
|
+
* 唯一一条把「高级」三段**都配上**的条目(跳板机 + 代理命令 + 主机密钥别名):
|
|
58
|
+
* `ssh-jump` 场景用它验折叠区的默认展开判据——配过却收起来,等于把配置藏了。
|
|
59
|
+
*/
|
|
60
|
+
{
|
|
61
|
+
name: 'bastion-jump',
|
|
62
|
+
host: 'internal.corp',
|
|
63
|
+
port: 22,
|
|
64
|
+
username: 'deploy',
|
|
65
|
+
auth: 'key',
|
|
66
|
+
keyPath: '~/.ssh/id_ed25519',
|
|
67
|
+
passphrase: '',
|
|
68
|
+
password: '',
|
|
69
|
+
agentForward: false,
|
|
70
|
+
persist: false,
|
|
71
|
+
hostKeyAlias: 'corp-internal',
|
|
72
|
+
proxyCommand: 'ssh -W %h:%p bastion.corp',
|
|
73
|
+
jump: { host: 'bastion.corp', port: 2222 },
|
|
74
|
+
},
|
|
56
75
|
],
|
|
57
76
|
hostKeys: [
|
|
58
77
|
{ host: '198.51.100.20', port: 22, fingerprint: 'SHA256:9xQ2mVr7Kp3sTf1cZbLd8uYwAe4nHjR6gPoXkMvQ2Bc' },
|
package/scripts/preview.mjs
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* node scripts/preview.mjs --build # 顺带重建 client.js(默认不重建,产物落后直接报错)
|
|
14
14
|
* node scripts/preview.mjs --theme=light # 浅色主题
|
|
15
15
|
* node scripts/preview.mjs --width=560 # 压窄视口走查窄容器排版(默认 1680)
|
|
16
|
+
* node scripts/preview.mjs --height=560 # 压矮视口走查「内容溢出时头尾还固不固定」(默认 1050)
|
|
16
17
|
* PREVIEW_CHROME_ARGS=--no-sandbox node scripts/preview.mjs # 受限沙箱 / CI 里 Chrome 起不来时
|
|
17
18
|
*
|
|
18
19
|
* 需要本机有 Chrome/Chromium(默认找 playwright 缓存的 Chrome for Testing,
|
|
@@ -46,6 +47,12 @@ const shotsDir = join(previewDir, outName)
|
|
|
46
47
|
* `--width=560` 之类显式压窄。
|
|
47
48
|
*/
|
|
48
49
|
const viewportWidth = Number((argv.find((a) => a.startsWith('--width=')) || '--width=1680').split('=')[1]) || 1680
|
|
50
|
+
/**
|
|
51
|
+
* 视口高度(默认 1050)。**与连接对话框的「头尾固定」直接相关**:那张卡片是
|
|
52
|
+
* `max-height: 86vh`,矮视口下内容才会溢出中段——1050px 高时展开态刚好塞得下,
|
|
53
|
+
* 「滚到底头尾还在不在」这条断言就永远走不到。走查时用 `--height=560` 压矮。
|
|
54
|
+
*/
|
|
55
|
+
const viewportHeight = Number((argv.find((a) => a.startsWith('--height=')) || '--height=1050').split('=')[1]) || 1050
|
|
49
56
|
/**
|
|
50
57
|
* 额外 Chrome 参数(空格分隔)。受限环境(文件沙箱 / CI 容器)里 Chrome 自己的
|
|
51
58
|
* sandbox 起不来,CDP 会一直卡在 `Page.enable` 直到超时——此时用
|
|
@@ -65,6 +72,9 @@ const SCENARIOS = [
|
|
|
65
72
|
['ssh', 'SSH 连接对话框'],
|
|
66
73
|
['ssh-probe', 'SSH 连接对话框(试连结果)'],
|
|
67
74
|
['ssh-edit', 'SSH 连接对话框(编辑)'],
|
|
75
|
+
['ssh-save-book', 'SSH 连接对话框:连接簿名称行常显 + 填名字自动勾上'],
|
|
76
|
+
['ssh-adv', 'SSH 连接对话框:「高级」展开 + 中段滚动(头尾固定)'],
|
|
77
|
+
['ssh-jump', 'SSH 连接对话框:配过高级项的条目默认展开折叠区'],
|
|
68
78
|
['settings', '设置卡片'],
|
|
69
79
|
['settings-assist', '设置卡片:AI 辅助小节(默认关 + 模型路由一个控件)'],
|
|
70
80
|
['settings-shell', '设置卡片:Shell 路径候选表(浮层,不顶动卡片布局)'],
|
|
@@ -547,7 +557,7 @@ async function main() {
|
|
|
547
557
|
await ensureVendor()
|
|
548
558
|
log('启动 headless Chrome(' + theme + ' 主题)')
|
|
549
559
|
const { child, cdp, userDataDir } = await launchChrome()
|
|
550
|
-
await cdp.send('Emulation.setDeviceMetricsOverride', { width: viewportWidth, height:
|
|
560
|
+
await cdp.send('Emulation.setDeviceMetricsOverride', { width: viewportWidth, height: viewportHeight, deviceScaleFactor: 2, mobile: false })
|
|
551
561
|
let failed = 0
|
|
552
562
|
try {
|
|
553
563
|
for (const name of wanted) {
|
|
@@ -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
|
+
}
|