@hyzyn/dsh-tty 0.32.0 → 0.32.2
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 +15 -8
- package/README.md +10 -4
- package/lib/index.d.ts +8 -0
- package/lib/index.js +98 -10
- package/lib/index.js.map +1 -1
- package/lib/shell-integration.js +28 -7
- package/lib/shell-integration.js.map +1 -1
- package/package.json +6 -3
- package/scripts/pwsh-probe.mjs +411 -0
package/lib/shell-integration.js
CHANGED
|
@@ -356,6 +356,11 @@ function ensureBashStubRc() {
|
|
|
356
356
|
* `echo $LASTEXITCODE` 读到空值。代价:连续两次原生命令给出同一个非零码时,第二次降级
|
|
357
357
|
* 报 1(仍如实标失败,只是丢了具体码值)。
|
|
358
358
|
*
|
|
359
|
+
* **解析错误例外**(两版一致,2026-10-13 真机实测):整行解析失败时命令一条都没跑,但
|
|
360
|
+
* `$?` 与 `$LASTEXITCODE` 都没变,于是 D 报 **0**(`echo (1` 在 7.6.6 与 5.1 上都是 0;
|
|
361
|
+
* 5.1 上 `echo A && echo B` 同样报 0)。没有可靠的钩子能区分「解析失败」与「命令成功但
|
|
362
|
+
* 无输出」,所以如实记着:**PowerShell 上不能只看退出码判成功**,报错文本就在输出里。
|
|
363
|
+
*
|
|
359
364
|
* 只在原 `PSConsoleHostReadLine` 存在时才装钩子:用户若关掉了 PSReadLine,那个函数不
|
|
360
365
|
* 存在,此时**一个标记都不发**(连 A/7 也不发)——只发 A/7 会让宿主 `sawMark=true` 而
|
|
361
366
|
* `inCommand` 恒 false,`running` 就从「未知」退化成「没在跑」,正是 D77 警告的静默事故
|
|
@@ -367,11 +372,13 @@ function ensureBashStubRc() {
|
|
|
367
372
|
* 失效。要修得先把失败态还原回去(例如按捕获到的状态补发一条错误记录),而那必须两版
|
|
368
373
|
* PowerShell 都真机验过才能落。
|
|
369
374
|
*
|
|
370
|
-
*
|
|
371
|
-
* 里晚于 D 标记抵达(渲染管线批量重画 vs 直通序列即时转发,与 tmux
|
|
372
|
-
*
|
|
373
|
-
*
|
|
374
|
-
*
|
|
375
|
+
* 已知限制(**未复现**,见 README 的 Windows 一节):曾有记录说 PowerShell 7 上命令 stdout
|
|
376
|
+
* 在 ConPTY 里晚于 D 标记抵达(渲染管线批量重画 vs 直通序列即时转发,与 tmux 场景同根因),
|
|
377
|
+
* 于是宿主的 B..D 捕获窗口为空 —— cwd 跟随 / 退出码 / running 三态都正常,只有 `capture{last}`
|
|
378
|
+
* 的输出在 PS 7 上可能为空。2026-10-13 在 pwsh **7.6.6**(Win11 ARM64)上按三档输出量复测
|
|
379
|
+
* (20 次小输出、2000 行大输出、2s 内分 20 次的慢输出):**0/20 空窗**,大输出保尾、慢输出
|
|
380
|
+
* 完整,窗口里也没混进命令行回显 —— 未复现。留作待复现项(遇到空窗用 `tty_capture` 读尾部,
|
|
381
|
+
* 并把当时的 pwsh 版本报回来);tmux 那边用 OSC 133;T 快照绕过同类问题。
|
|
375
382
|
*/
|
|
376
383
|
function powershellHooks() {
|
|
377
384
|
return [
|
|
@@ -517,7 +524,14 @@ export function commandShellHint(shell, platform = process.platform) {
|
|
|
517
524
|
return `本地命令由 ${name} 执行:按 POSIX shell 语法(\`a; b\`、\`cd x && y\`、\`for …; do …; done\`、管道、单引号)`;
|
|
518
525
|
}
|
|
519
526
|
if (isPowerShellShell(name)) {
|
|
520
|
-
|
|
527
|
+
const kind = name.split(/[\\/]/).pop()?.toLowerCase() ?? '';
|
|
528
|
+
// PowerShell 7(pwsh)与 Windows PowerShell 5.1 的语法**不一样**,这句话每一轮都进
|
|
529
|
+
// systemPrompt,说错会直接把模型引到不存在的坑里(D101,2026-10-13 真机实测:
|
|
530
|
+
// 7.6.6 上 `echo A && echo B` 正常输出 A/B、5.1 上同一行是解析错误且一条都没跑)。
|
|
531
|
+
if (kind === 'pwsh' || kind === 'pwsh.exe') {
|
|
532
|
+
return `本地命令由 ${name} 执行:按 **PowerShell 7** 语法(\`;\` 分隔语句、\`$env:VAR\` 取环境变量、\`$(…)\` 子表达式、\`&&\`/\`||\` 链式、\`$?\` 判上一条是否成功、\`$LASTEXITCODE\` 取原生命令退出码;单引号是字面量、双引号才插值)`;
|
|
533
|
+
}
|
|
534
|
+
return `本地命令由 ${name} 执行:按 **Windows PowerShell 5.1** 语法(\`;\` 分隔语句、\`$env:VAR\` 取环境变量、\`$(…)\` 子表达式;**5.1 没有 \`&&\`/\`||\`**——条件执行写 \`if ($?) { … }\`,退出码用 \`$LASTEXITCODE\`;单引号是字面量)`;
|
|
521
535
|
}
|
|
522
536
|
const kind = name.split(/[\\/]/).pop()?.toLowerCase() ?? '';
|
|
523
537
|
if (kind === 'bash.exe' || kind === 'bash' || kind === 'sh.exe' || kind === 'sh' || kind === 'zsh.exe' || kind === 'zsh') {
|
|
@@ -586,7 +600,14 @@ function buildWindowsShellSpawn(shell, integration) {
|
|
|
586
600
|
}
|
|
587
601
|
return { argv: [shell, '-NoLogo'], env: {} };
|
|
588
602
|
}
|
|
589
|
-
/**
|
|
603
|
+
/**
|
|
604
|
+
* Windows 宿主的「跑一条命令」计划:按 shell 家族选参数(0.19.0 前一律 /c,Git Bash / WSL 静默失败)。
|
|
605
|
+
*
|
|
606
|
+
* PowerShell 的退出码口径(2026-10-13 真机实测,两版一致):`-Command` 会把**末条命令非零**的
|
|
607
|
+
* 情况塌成进程退出码 **1**,拿不到具体码值 —— `cmd /c exit 5` 经 `-Command` 出来是 1,而
|
|
608
|
+
* `exit 5` 出来是 5。POSIX 侧 `sh -c` 不会这样(`exit 5` → 5、末条命令是它自己)。所以
|
|
609
|
+
* `tty_run` 在 PowerShell 上要拿到具体退出码,命令得自己 `exit`(README 的「跑一条命令」一节记着)。
|
|
610
|
+
*/
|
|
590
611
|
function buildWindowsCommandSpawn(shell, command) {
|
|
591
612
|
if (isPowerShellShell(shell)) {
|
|
592
613
|
return { argv: [shell, '-NoLogo', '-Command', command], env: {} };
|
|
@@ -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.32.
|
|
3
|
+
"version": "0.32.2",
|
|
4
4
|
"description": "DSH Web GUI 的终端面板插件:侧边栏「终端」提供 xterm.js + PTY 全交互终端与 ssh2 原生 SSH 远程连接(连接簿、主机指纹 TOFU、跳板机),支持 tmux 会话持久化、SFTP 文件传输、端口转发与服务器状态条,并向其他插件开放 ttyTerminal / ttyPanel / ttyConnbar 扩展点;Windows 宿主同样可用。",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dsh",
|
|
@@ -52,8 +52,8 @@
|
|
|
52
52
|
"ws": "^8.18.0"
|
|
53
53
|
},
|
|
54
54
|
"peerDependencies": {
|
|
55
|
-
"@deepseek-ai/dsh": "^0.1.7-rc.2 || ^0.2.0-rc.1 || ^0.2.0-rc.2 || ^0.2.1-alpha.1 || ^0.2.1-alpha.2",
|
|
56
|
-
"@deepseek-ai/dsh-tools": "^0.1.7-rc.2 || ^0.2.0-rc.1 || ^0.2.0-rc.2 || ^0.2.1-alpha.1 || ^0.2.1-alpha.2"
|
|
55
|
+
"@deepseek-ai/dsh": "^0.1.7-rc.2 || ^0.2.0-rc.1 || ^0.2.0-rc.2 || ^0.2.1-alpha.1 || ^0.2.1-alpha.2 || ^0.2.1-alpha.5 || ^0.2.1-rc.1",
|
|
56
|
+
"@deepseek-ai/dsh-tools": "^0.1.7-rc.2 || ^0.2.0-rc.1 || ^0.2.0-rc.2 || ^0.2.1-alpha.1 || ^0.2.1-alpha.2 || ^0.2.1-alpha.5 || ^0.2.1-rc.1"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
59
|
"@deepseek-ai/cordis": "^4.0.4",
|
|
@@ -95,6 +95,9 @@
|
|
|
95
95
|
"peerDependenciesMeta": {
|
|
96
96
|
"@deepseek-ai/dsh": {
|
|
97
97
|
"optional": true
|
|
98
|
+
},
|
|
99
|
+
"@deepseek-ai/dsh-tools": {
|
|
100
|
+
"optional": true
|
|
98
101
|
}
|
|
99
102
|
},
|
|
100
103
|
"scripts": {
|
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @hyzyn/dsh-tty — PowerShell 家族真机对照探针(Windows PowerShell 5.1 ↔ PowerShell 7)。
|
|
4
|
+
*
|
|
5
|
+
* 为什么单独一个探针:`windows-smoke.mjs` 的 W8 只钉两条断言(桩生效 = 收到首个 A;
|
|
6
|
+
* 一条命令发全 B/D 且真的执行了),而且它在有 pwsh 的机器上**只跑 pwsh**。也就是说
|
|
7
|
+
* 「5.1 与 7 行为差异」这一整类事实在真机上从来没有被对照过。本探针把支持面在两个
|
|
8
|
+
* shell 上跑**同一套**用例并排输出:桩生效 / cwd 跟随(含含空格的路径)/ running 三态 /
|
|
9
|
+
* 退出码(命令级与会话级)/ `tty_expect` 早停与**回显剔除** / `capture{last}` 的输出窗口 /
|
|
10
|
+
* 命令型会话(`tty_run`)/ `&&` 的语法差异。
|
|
11
|
+
*
|
|
12
|
+
* 判据分两档:
|
|
13
|
+
* - PASS / FAIL:该行为**应当**如此,不对就是缺陷(退出码非 0);
|
|
14
|
+
* - INFO:测量值与原始证据——给「要不要修、怎么修」提供数字。INFO 不影响退出码。
|
|
15
|
+
*
|
|
16
|
+
* 两条刻意的设计(否则会自欺):
|
|
17
|
+
* 1. **pattern 不能字面出现在命令行里**的用例,用 `('A'+'_B')` 拼出来 —— 否则命中的
|
|
18
|
+
* 可能只是命令回显(这正是 D75 要防的假绿);
|
|
19
|
+
* 2. `tty_expect` 的耗时**有下界**:命令里带 `Start-Sleep -Seconds 2`,命中早于 1.5s
|
|
20
|
+
* 就说明命中的是回显、不是输出。
|
|
21
|
+
*
|
|
22
|
+
* 用法(Windows):
|
|
23
|
+
* node packages/tty/scripts/pwsh-probe.mjs # 自动找 5.1 与 7,两个都跑
|
|
24
|
+
* node packages/tty/scripts/pwsh-probe.mjs --shell <path> --label <名字>
|
|
25
|
+
* node packages/tty/scripts/pwsh-probe.mjs --n 20 # P6 的采样次数(默认 20)
|
|
26
|
+
*
|
|
27
|
+
* 非 Windows 平台优雅退出(退出码 0):本探针的全部价值都在真实 ConPTY 上。
|
|
28
|
+
*/
|
|
29
|
+
import { existsSync } from 'node:fs'
|
|
30
|
+
import { Context } from '@deepseek-ai/cordis'
|
|
31
|
+
import WebServerRuntime from '@deepseek-ai/dsh-host-webserver'
|
|
32
|
+
import { LocalSubprocessRuntime } from '@deepseek-ai/dsh-subprocess-local'
|
|
33
|
+
import { name, inject, apply } from '../lib/index.js'
|
|
34
|
+
|
|
35
|
+
if (process.platform !== 'win32') {
|
|
36
|
+
console.log(`[pwsh-probe] 跳过:当前平台 ${process.platform}——本探针只在 Windows 上跑(真实 ConPTY + 真实 PowerShell)`)
|
|
37
|
+
process.exit(0)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const argv = process.argv.slice(2)
|
|
41
|
+
function argOf(flag) {
|
|
42
|
+
const i = argv.indexOf(flag)
|
|
43
|
+
return i === -1 ? undefined : argv[i + 1]
|
|
44
|
+
}
|
|
45
|
+
const N = Math.max(1, Number(argOf('--n') ?? 20))
|
|
46
|
+
const ONLY_SHELL = argOf('--shell')
|
|
47
|
+
const ONLY_LABEL = argOf('--label')
|
|
48
|
+
|
|
49
|
+
const CANDIDATES = [
|
|
50
|
+
{ label: 'PowerShell 7 (pwsh)', shell: 'C:/Program Files/PowerShell/7/pwsh.exe' },
|
|
51
|
+
{ label: 'Windows PowerShell 5.1', shell: 'C:/Windows/System32/WindowsPowerShell/v1.0/powershell.exe' },
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms))
|
|
55
|
+
|
|
56
|
+
const ROWS = []
|
|
57
|
+
function row(shell, item, status, detail) {
|
|
58
|
+
ROWS.push({ shell, item, status, detail })
|
|
59
|
+
const mark = status === 'PASS' ? ' ✔ PASS ' : status === 'FAIL' ? ' ✘ FAIL ' : ' ℹ INFO '
|
|
60
|
+
const line = mark + '[' + shell + '] ' + item + (detail === undefined ? '' : ' — ' + detail)
|
|
61
|
+
if (status === 'FAIL') console.error(line)
|
|
62
|
+
else console.log(line)
|
|
63
|
+
}
|
|
64
|
+
function pass(shell, item, detail) { row(shell, item, 'PASS', detail) }
|
|
65
|
+
function fail(shell, item, detail) { row(shell, item, 'FAIL', detail) }
|
|
66
|
+
function info(shell, item, detail) { row(shell, item, 'INFO', detail) }
|
|
67
|
+
|
|
68
|
+
/** 注册进来的 agent 工具(与 windows-smoke.mjs 同形:直接走 `execute`,即 agent 的真实路径)。 */
|
|
69
|
+
const TOOLS = new Map()
|
|
70
|
+
function tool(name) {
|
|
71
|
+
const t = TOOLS.get(name)
|
|
72
|
+
if (t === undefined) throw new Error(`agent 工具没注册:${name}(注册到的:${[...TOOLS.keys()].join(', ')})`)
|
|
73
|
+
return t
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
async function mount(shell) {
|
|
77
|
+
TOOLS.clear()
|
|
78
|
+
const app = new Context()
|
|
79
|
+
const wsFiber = app.plugin(WebServerRuntime, { host: '127.0.0.1', port: 0 })
|
|
80
|
+
const subFiber = app.plugin(LocalSubprocessRuntime)
|
|
81
|
+
const stubFiber = app.plugin({
|
|
82
|
+
name: 'pwsh-probe-stub',
|
|
83
|
+
apply: (ctx) => {
|
|
84
|
+
ctx.provide('settings', { describe: () => [], update: async () => {}, configure: () => () => {} })
|
|
85
|
+
ctx.provide('tools', { register: (definition) => { TOOLS.set(definition.name, definition); return () => {} } })
|
|
86
|
+
},
|
|
87
|
+
})
|
|
88
|
+
await stubFiber.await()
|
|
89
|
+
const pluginFiber = app.plugin({ name, inject, apply }, { shell, term: 'xterm-256color', colorTerm: 'truecolor', maxSessions: 4 })
|
|
90
|
+
await wsFiber.await()
|
|
91
|
+
await subFiber.await()
|
|
92
|
+
await pluginFiber.await()
|
|
93
|
+
await sleep(400) // 等 ctx.inject(['webServer']) 回调注册路由
|
|
94
|
+
return app
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async function entryOf(sid) {
|
|
98
|
+
const listed = await tool('tty_list').execute({})
|
|
99
|
+
return listed.sessions.find((s) => s.sid === sid) ?? null
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** 等 tty_list 上某个字段满足条件;超时抛错(带上最后一次快照)。 */
|
|
103
|
+
async function waitEntry(sid, pred, timeoutMs, label) {
|
|
104
|
+
const deadline = Date.now() + timeoutMs
|
|
105
|
+
let last = null
|
|
106
|
+
for (;;) {
|
|
107
|
+
last = await entryOf(sid)
|
|
108
|
+
if (last !== null && pred(last)) return last
|
|
109
|
+
if (Date.now() > deadline) throw new Error(`等不到「${label}」(${timeoutMs}ms);最后一次快照:${JSON.stringify(last)}`)
|
|
110
|
+
await sleep(100)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* 发一条命令并等它结束(判据用 `lastExitAt` 前进,不依赖具体输出)。
|
|
116
|
+
*
|
|
117
|
+
* **只用 tty_list 轮询**——`tty_capture` 会推进已读水位线,而下面有几条用例正是要
|
|
118
|
+
* 「命令结束之后、还没读过任何输出」这一刻的现场(D72/D75 的闸门都看这个水位线)。
|
|
119
|
+
*/
|
|
120
|
+
async function runCommand(sid, command, timeoutMs = 20000) {
|
|
121
|
+
const before = (await entryOf(sid))?.lastExitAt ?? 0
|
|
122
|
+
await tool('tty_send').execute({ sid, data: command + '\n' })
|
|
123
|
+
const deadline = Date.now() + timeoutMs
|
|
124
|
+
for (;;) {
|
|
125
|
+
const snap = await entryOf(sid)
|
|
126
|
+
if (snap !== null && snap.running === false && (snap.lastExitAt ?? 0) > before) return snap
|
|
127
|
+
if (Date.now() > deadline) throw new Error(`命令「${command}」在 ${timeoutMs}ms 内没结束;快照:${JSON.stringify(snap)}`)
|
|
128
|
+
await sleep(80)
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/** 读「上一条已完成命令」(命令在途时等它落地)。 */
|
|
133
|
+
async function lastCommand(sid, timeoutMs = 10000) {
|
|
134
|
+
const deadline = Date.now() + timeoutMs
|
|
135
|
+
for (;;) {
|
|
136
|
+
try {
|
|
137
|
+
const read = await tool('tty_capture').execute({ sid, last: true })
|
|
138
|
+
if (read.inProgress !== true) return read
|
|
139
|
+
} catch (error) {
|
|
140
|
+
// 「暂无上一条命令」在命令刚发出去时是正常的(B 标记还没到),继续等
|
|
141
|
+
if (!/暂无|没有「上一条命令」/.test(String(error?.message ?? ''))) throw error
|
|
142
|
+
}
|
|
143
|
+
if (Date.now() > deadline) return { sid, tail: '', source: 'last', inProgress: true }
|
|
144
|
+
await sleep(80)
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** 人读起来短一点的原始尾部。 */
|
|
149
|
+
function short(text, n = 200) {
|
|
150
|
+
return JSON.stringify(String(text ?? '').replace(/\s+/g, ' ').slice(-n))
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
async function probeShell({ label, shell }) {
|
|
154
|
+
console.log(`\n===== ${label} — ${shell} =====`)
|
|
155
|
+
await mount(shell)
|
|
156
|
+
|
|
157
|
+
// ---------- P0 版本(证明探针真的跑在这个 shell 上)----------
|
|
158
|
+
try {
|
|
159
|
+
const run = await tool('tty_run').execute({ command: '$PSVersionTable.PSVersion.ToString() + " / " + $PSVersionTable.PSEdition' })
|
|
160
|
+
const text = String(run.tail ?? '').split('\n').map((x) => x.trim()).filter((x) => /^\d+\.\d+/.test(x)).pop() ?? ''
|
|
161
|
+
pass(label, 'P0 版本自述', `${text}(exitCode=${String(run.exitCode ?? '?')})`)
|
|
162
|
+
} catch (error) {
|
|
163
|
+
fail(label, 'P0 版本自述', error.message)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// ---------- P1 shell 集成生效(sawMark 可信 → running 是三态里的布尔)----------
|
|
167
|
+
const opened = await tool('tty_open').execute({ cwd: process.cwd(), cols: 100, rows: 30 })
|
|
168
|
+
const sid = opened.sid
|
|
169
|
+
try {
|
|
170
|
+
const snap = await waitEntry(sid, (e) => e.running === false, 25000, 'shell 集成标记(running 变布尔)')
|
|
171
|
+
pass(label, 'P1 桩载入 + shell 集成生效', `running=${String(snap.running)}(省略 = 没见过 OSC 133 标记)`)
|
|
172
|
+
} catch (error) {
|
|
173
|
+
fail(label, 'P1 桩载入 + shell 集成生效', error.message)
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// ---------- P2 cwd 跟随(OSC 7 上报;上报的是 URI 形态,分隔符是正斜杠)----------
|
|
177
|
+
try {
|
|
178
|
+
await runCommand(sid, 'Set-Location C:\\Windows')
|
|
179
|
+
const snap = await entryOf(sid)
|
|
180
|
+
// OSC 7 是 file:///C:/Windows 这种 URI 形态 → 解出来是 `C:/Windows`(正斜杠)。
|
|
181
|
+
// 两种分隔符都接受:这里判的是「cwd 有没有跟着走」,不是分隔符风格。
|
|
182
|
+
if (snap !== null && /^[A-Za-z]:[\\/]Windows$/.test(String(snap.cwd))) pass(label, 'P2a cwd 跟随 Set-Location', String(snap.cwd))
|
|
183
|
+
else fail(label, 'P2a cwd 跟随 Set-Location', `cwd=${JSON.stringify(snap?.cwd)}`)
|
|
184
|
+
} catch (error) {
|
|
185
|
+
fail(label, 'P2a cwd 跟随 Set-Location', error.message)
|
|
186
|
+
}
|
|
187
|
+
try {
|
|
188
|
+
await runCommand(sid, "Set-Location 'C:\\Program Files'")
|
|
189
|
+
const snap = await entryOf(sid)
|
|
190
|
+
if (snap !== null && /Program Files$/i.test(String(snap.cwd))) pass(label, 'P2b cwd 跟随(路径含空格,验 OSC 7 的 %20 解码)', String(snap.cwd))
|
|
191
|
+
else fail(label, 'P2b cwd 跟随(路径含空格)', `cwd=${JSON.stringify(snap?.cwd)}`)
|
|
192
|
+
} catch (error) {
|
|
193
|
+
fail(label, 'P2b cwd 跟随(路径含空格)', error.message)
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// ---------- P3 running 三态 ----------
|
|
197
|
+
try {
|
|
198
|
+
await tool('tty_send').execute({ sid, data: 'Start-Sleep -Seconds 3\n' })
|
|
199
|
+
let sawTrue = false
|
|
200
|
+
const deadline = Date.now() + 2500
|
|
201
|
+
while (Date.now() < deadline) {
|
|
202
|
+
const snap = await entryOf(sid)
|
|
203
|
+
if (snap?.running === true) { sawTrue = true; break }
|
|
204
|
+
await sleep(100)
|
|
205
|
+
}
|
|
206
|
+
if (!sawTrue) fail(label, 'P3a 命令在跑时 running=true', '2.5s 内没看到 running:true')
|
|
207
|
+
else pass(label, 'P3a 命令在跑时 running=true')
|
|
208
|
+
await waitEntry(sid, (e) => e.running === false, 15000, '命令结束后 running=false')
|
|
209
|
+
pass(label, 'P3b 命令结束后 running=false')
|
|
210
|
+
} catch (error) {
|
|
211
|
+
fail(label, 'P3 running 三态', error.message)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// ---------- P4 退出码 ----------
|
|
215
|
+
try {
|
|
216
|
+
await runCommand(sid, 'cmd /c exit 7')
|
|
217
|
+
const read = await lastCommand(sid)
|
|
218
|
+
if (read.exitCode === 7) pass(label, 'P4a 命令级退出码(原生命令 $LASTEXITCODE=7)', 'capture{last}.exitCode=7')
|
|
219
|
+
else fail(label, 'P4a 命令级退出码', `capture{last}.exitCode=${JSON.stringify(read.exitCode)} tail=${short(read.tail, 120)}`)
|
|
220
|
+
} catch (error) {
|
|
221
|
+
fail(label, 'P4a 命令级退出码', error.message)
|
|
222
|
+
}
|
|
223
|
+
try {
|
|
224
|
+
const opened2 = await tool('tty_open').execute({ cwd: process.cwd(), cols: 80, rows: 24 })
|
|
225
|
+
await tool('tty_send').execute({ sid: opened2.sid, data: 'exit 3\n' })
|
|
226
|
+
const snap = await waitEntry(opened2.sid, (e) => e.exited === true, 15000, '会话退出')
|
|
227
|
+
if (snap.exitCode === 3) pass(label, 'P4b 会话级退出码(exit 3 → exited + exitCode)', `exitCode=${String(snap.exitCode)}`)
|
|
228
|
+
else fail(label, 'P4b 会话级退出码', `exited=${String(snap.exited)} exitCode=${JSON.stringify(snap.exitCode)}`)
|
|
229
|
+
await tool('tty_close').execute({ sid: opened2.sid }).catch(() => {})
|
|
230
|
+
} catch (error) {
|
|
231
|
+
fail(label, 'P4b 会话级退出码', error.message)
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// ---------- P5 tty_expect:早停、回显剔除、以及回显到底落在哪一段边界里 ----------
|
|
235
|
+
// P5a:pattern **不字面出现**在命令行里(用拼接造出来)→ 只能命中真实输出。
|
|
236
|
+
try {
|
|
237
|
+
const opened3 = await tool('tty_open').execute({ cwd: process.cwd(), cols: 100, rows: 30 })
|
|
238
|
+
await tool('tty_send').execute({ sid: opened3.sid, data: "Start-Sleep -Seconds 2; echo ('PROBE'+'_READY_OK')\n" })
|
|
239
|
+
const started = Date.now()
|
|
240
|
+
const matched = await tool('tty_expect').execute({ sid: opened3.sid, pattern: 'PROBE_READY_OK', timeoutSec: 20 })
|
|
241
|
+
const elapsed = Date.now() - started
|
|
242
|
+
if (matched.matched === true && elapsed >= 1500 && elapsed < 12000) pass(label, 'P5a tty_expect 命中真实输出即返回', `${elapsed}ms,matchedFrom=${String(matched.matchedFrom ?? '?')}`)
|
|
243
|
+
else fail(label, 'P5a tty_expect 命中真实输出即返回', `matched=${String(matched.matched)} elapsed=${elapsed}ms matchedFrom=${String(matched.matchedFrom ?? '?')} text=${short(matched.text, 160)}`)
|
|
244
|
+
await tool('tty_close').execute({ sid: opened3.sid }).catch(() => {})
|
|
245
|
+
} catch (error) {
|
|
246
|
+
fail(label, 'P5a tty_expect 命中真实输出即返回', error.message)
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// P5b:pattern **字面出现**在命令行里,而命令前面有 2s 的睡眠。
|
|
250
|
+
// 命中早于 1.5s = 命中的是回显(命令还没跑完)→ D75 要防的假绿。
|
|
251
|
+
try {
|
|
252
|
+
const opened4 = await tool('tty_open').execute({ cwd: process.cwd(), cols: 100, rows: 30 })
|
|
253
|
+
await tool('tty_send').execute({ sid: opened4.sid, data: 'Start-Sleep -Seconds 2; echo PROBE_ECHO_QQQ\n' })
|
|
254
|
+
const started = Date.now()
|
|
255
|
+
const matched = await tool('tty_expect').execute({ sid: opened4.sid, pattern: 'PROBE_ECHO_QQQ', timeoutSec: 20 })
|
|
256
|
+
const elapsed = Date.now() - started
|
|
257
|
+
if (matched.matched === true && elapsed >= 1500) pass(label, 'P5b 回显不算命中(命令在跑时)', `${elapsed}ms 命中真实输出,matchedFrom=${String(matched.matchedFrom ?? '?')}`)
|
|
258
|
+
else if (matched.matched === true) fail(label, 'P5b 回显不算命中(命令在跑时)', `${elapsed}ms 就命中了——命令还在 Start-Sleep,命中的只能是回显(D75 的剔除在 inCommand 时不启用)`)
|
|
259
|
+
else fail(label, 'P5b 回显不算命中(命令在跑时)', `matched=${String(matched.matched)} elapsed=${elapsed}ms text=${short(matched.text, 160)}`)
|
|
260
|
+
await sleep(1200) // 让这条命令真的跑完,别把它的 D 标记留给下一条用例
|
|
261
|
+
await tool('tty_close').execute({ sid: opened4.sid }).catch(() => {})
|
|
262
|
+
} catch (error) {
|
|
263
|
+
fail(label, 'P5b 回显不算命中(命令在跑时)', error.message)
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// P5c:命令**只有回显、没有任何 stdout**(`| Out-Null`),pattern 只出现在命令行里。
|
|
267
|
+
// 命令结束后立刻注册 expect(中间不读任何输出,水位线不许推进):
|
|
268
|
+
// - 命中 → 命中的只能是回显(这是判据的核心:那里根本没有输出);
|
|
269
|
+
// - matchedFrom 顺带说明回显落在哪条路径上(last = B..D 窗口被回显污染)。
|
|
270
|
+
try {
|
|
271
|
+
const opened5 = await tool('tty_open').execute({ cwd: process.cwd(), cols: 100, rows: 30 })
|
|
272
|
+
await waitEntry(opened5.sid, (e) => e.running === false, 25000, 'P5c 会话就绪')
|
|
273
|
+
await runCommand(opened5.sid, 'echo PROBE_ECHO_ONLY_ZZZ | Out-Null')
|
|
274
|
+
const started = Date.now()
|
|
275
|
+
const matched = await tool('tty_expect').execute({ sid: opened5.sid, pattern: 'PROBE_ECHO_ONLY_ZZZ', timeoutSec: 2 })
|
|
276
|
+
const elapsed = Date.now() - started
|
|
277
|
+
const detail = `matched=${String(matched.matched)} matchedFrom=${String(matched.matchedFrom ?? '-')} ${elapsed}ms`
|
|
278
|
+
if (matched.matched === true) fail(label, 'P5c 只有回显、没有输出时不该命中', `${detail}(那条命令用 Out-Null 吞了输出,pattern 只存在于命令行里)`)
|
|
279
|
+
else info(label, 'P5c 只有回显、没有输出时不命中(D75 的 A..B 边界前提成立)', detail)
|
|
280
|
+
await tool('tty_close').execute({ sid: opened5.sid }).catch(() => {})
|
|
281
|
+
} catch (error) {
|
|
282
|
+
fail(label, 'P5c 只有回显、没有输出时不该命中', error.message)
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// ---------- P6 capture{last} 的输出窗口(pattern 用拼接造,确保命中一定来自 stdout)----------
|
|
286
|
+
let immediateMiss = 0
|
|
287
|
+
let delayedMiss = 0
|
|
288
|
+
let bufferMiss = 0
|
|
289
|
+
let inProgress = 0
|
|
290
|
+
let echoInWindow = 0
|
|
291
|
+
for (let i = 0; i < N; i += 1) {
|
|
292
|
+
const mark = `PROBE_LAST_${String(i)}_END`
|
|
293
|
+
// 命令行本身:注意它**不含** mark(拼接形态),所以窗口里出现它 = 回显混进了 B..D 窗口
|
|
294
|
+
const commandText = `echo ('PROBE_LAST_${String(i)}' + '_END')`
|
|
295
|
+
try {
|
|
296
|
+
await runCommand(sid, commandText)
|
|
297
|
+
const now = await tool('tty_capture').execute({ sid, last: true })
|
|
298
|
+
if (now.inProgress === true) inProgress += 1
|
|
299
|
+
if (!String(now.tail ?? '').includes(mark)) immediateMiss += 1
|
|
300
|
+
if (String(now.tail ?? '').includes(`PROBE_LAST_${String(i)}'`)) echoInWindow += 1
|
|
301
|
+
await sleep(700)
|
|
302
|
+
const later = await tool('tty_capture').execute({ sid, last: true })
|
|
303
|
+
if (!String(later.tail ?? '').includes(mark)) delayedMiss += 1
|
|
304
|
+
const tail = await tool('tty_capture').execute({ sid, lines: 40 })
|
|
305
|
+
if (!String(tail.tail ?? '').includes(mark)) bufferMiss += 1
|
|
306
|
+
} catch (error) {
|
|
307
|
+
immediateMiss += 1
|
|
308
|
+
delayedMiss += 1
|
|
309
|
+
bufferMiss += 1
|
|
310
|
+
info(label, `P6 第 ${String(i + 1)} 轮异常`, error.message)
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
info(label, `P6 capture{last} 空窗率(N=${String(N)})`,
|
|
314
|
+
`立即读取空 ${String(immediateMiss)}/${String(N)};延迟 700ms 后取空 ${String(delayedMiss)}/${String(N)};同一时刻纯尾部读(lines)取空 ${String(bufferMiss)}/${String(N)};inProgress ${String(inProgress)}/${String(N)};窗口里混进命令行回显 ${String(echoInWindow)}/${String(N)}`)
|
|
315
|
+
|
|
316
|
+
// P6b/P6c:文档里那条「PowerShell 7 上 stdout 晚于 D、窗口可能为空」的限制,输出量与时序各变一档。
|
|
317
|
+
try {
|
|
318
|
+
await runCommand(sid, '1..2000 | ForEach-Object { "BIG_" + $_ }', 60000)
|
|
319
|
+
const read = await lastCommand(sid)
|
|
320
|
+
if (String(read.tail ?? '').includes('BIG_2000')) pass(label, 'P6b 大输出(2000 行)的窗口不空且保尾', `exitCode=${JSON.stringify(read.exitCode)} 末行在窗口里`)
|
|
321
|
+
else fail(label, 'P6b 大输出(2000 行)的窗口不空且保尾', `tail=${short(read.tail, 160)}`)
|
|
322
|
+
} catch (error) {
|
|
323
|
+
fail(label, 'P6b 大输出(2000 行)的窗口', error.message)
|
|
324
|
+
}
|
|
325
|
+
try {
|
|
326
|
+
await runCommand(sid, '1..20 | ForEach-Object { "TRICKLE_" + $_; Start-Sleep -Milliseconds 100 }', 60000)
|
|
327
|
+
const read = await lastCommand(sid)
|
|
328
|
+
if (String(read.tail ?? '').includes('TRICKLE_20')) pass(label, 'P6c 慢输出(2s 内分 20 次)的窗口不空', `exitCode=${JSON.stringify(read.exitCode)}`)
|
|
329
|
+
else fail(label, 'P6c 慢输出(2s 内分 20 次)的窗口不空', `tail=${short(read.tail, 160)}`)
|
|
330
|
+
} catch (error) {
|
|
331
|
+
fail(label, 'P6c 慢输出的窗口', error.message)
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// ---------- P7 命令型会话(tty_run,走 -Command)----------
|
|
335
|
+
try {
|
|
336
|
+
const run = await tool('tty_run').execute({ command: 'echo RUN_$env:OS' })
|
|
337
|
+
if (run.exitCode === 0 && /RUN_Windows_NT/.test(String(run.tail ?? ''))) pass(label, 'P7a tty_run 成功路径(-Command,$env:OS 展开)', `exitCode=0,closed=${String(run.closed)}`)
|
|
338
|
+
else fail(label, 'P7a tty_run 成功路径', `exitCode=${JSON.stringify(run.exitCode)} tail=${short(run.tail, 160)}`)
|
|
339
|
+
} catch (error) {
|
|
340
|
+
fail(label, 'P7a tty_run 成功路径', error.message)
|
|
341
|
+
}
|
|
342
|
+
try {
|
|
343
|
+
const run = await tool('tty_run').execute({ command: 'exit 5' })
|
|
344
|
+
if (run.exitCode === 5) pass(label, 'P7b tty_run 退出码透传(exit 5)', 'exitCode=5')
|
|
345
|
+
else fail(label, 'P7b tty_run 退出码透传(exit 5)', `exitCode=${JSON.stringify(run.exitCode)} tail=${short(run.tail, 160)}`)
|
|
346
|
+
} catch (error) {
|
|
347
|
+
fail(label, 'P7b tty_run 退出码透传(exit 5)', error.message)
|
|
348
|
+
}
|
|
349
|
+
try {
|
|
350
|
+
// PowerShell 的 `-Command` 语义:末条命令非零时进程退出码塌成 1(不是那条命令的码)。
|
|
351
|
+
// 这不是插件的缺陷,但用户在 `tty_run` 里等到的就是它 —— 如实量一份。
|
|
352
|
+
const run = await tool('tty_run').execute({ command: 'cmd /c exit 5' })
|
|
353
|
+
info(label, 'P7c PowerShell -Command 的退出码塌陷(原生命令非零 → 1;要具体码值就让命令自己 exit)', `cmd /c exit 5 → exitCode=${JSON.stringify(run.exitCode)}`)
|
|
354
|
+
} catch (error) {
|
|
355
|
+
info(label, 'P7c PowerShell -Command 的退出码塌陷', error.message)
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// ---------- P8 `&&`:PS 5.1 不认、PS 7 认(`commandShellHint` 的文案指着这条差异)----------
|
|
359
|
+
try {
|
|
360
|
+
await runCommand(sid, 'echo A && echo B')
|
|
361
|
+
const read = await lastCommand(sid)
|
|
362
|
+
const tail = short(read.tail, 200)
|
|
363
|
+
const hasB = /(^|\n)\s*B\s*(\n|$)/.test(String(read.tail ?? ''))
|
|
364
|
+
if (label.includes('5.1')) {
|
|
365
|
+
// 5.1 是解析错误:命令一条都没跑(输出里只有错误文本,没有 A / B)
|
|
366
|
+
info(label, 'P8 `&&` 在 5.1 上是解析错误(命令没执行)', `exitCode=${JSON.stringify(read.exitCode)} hasB=${String(hasB)} tail=${tail}`)
|
|
367
|
+
if (read.exitCode === 0) info(label, 'P8 附注:5.1 把解析错误报成 exitCode=0(成功)', 'agent 只看退出码会误判成功——输出文本里才是真相')
|
|
368
|
+
} else if (read.exitCode === 0 && hasB) {
|
|
369
|
+
pass(label, 'P8 `&&` 可用(PS 7 支持 &&)', `exitCode=0 tail=${tail}`)
|
|
370
|
+
} else {
|
|
371
|
+
fail(label, 'P8 `&&` 可用(PS 7)', `exitCode=${JSON.stringify(read.exitCode)} hasB=${String(hasB)} tail=${tail}`)
|
|
372
|
+
}
|
|
373
|
+
} catch (error) {
|
|
374
|
+
fail(label, 'P8 `&&` 语法差异', error.message)
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// ---------- P8b 两版都不合法的一行(解析错误)该报什么退出码 ----------
|
|
378
|
+
try {
|
|
379
|
+
await runCommand(sid, 'echo (1')
|
|
380
|
+
const read = await lastCommand(sid)
|
|
381
|
+
info(label, 'P8b 解析错误的退出码(两版都不合法的 `echo (1`)', `exitCode=${JSON.stringify(read.exitCode)} tail=${short(read.tail, 160)}`)
|
|
382
|
+
} catch (error) {
|
|
383
|
+
info(label, 'P8b 解析错误的退出码', error.message)
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
// ---------- 清理 ----------
|
|
387
|
+
await tool('tty_close').execute({ sid }).catch(() => {})
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
const shells = ONLY_SHELL !== undefined
|
|
391
|
+
? [{ label: ONLY_LABEL ?? ONLY_SHELL, shell: ONLY_SHELL }]
|
|
392
|
+
: CANDIDATES.filter((c) => { try { return existsSync(c.shell) } catch { return false } })
|
|
393
|
+
|
|
394
|
+
if (shells.length === 0) {
|
|
395
|
+
console.log('[pwsh-probe] 本机既没有 PowerShell 7 也没有 Windows PowerShell 5.1,无可测对象')
|
|
396
|
+
process.exit(0)
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
for (const s of shells) {
|
|
400
|
+
try {
|
|
401
|
+
await probeShell(s)
|
|
402
|
+
} catch (error) {
|
|
403
|
+
fail(s.label, '探针整体异常', error?.stack ?? String(error))
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
const failed = ROWS.filter((r) => r.status === 'FAIL')
|
|
408
|
+
const passed = ROWS.filter((r) => r.status === 'PASS')
|
|
409
|
+
console.log(`\n==== pwsh-probe:${String(passed.length)} PASS / ${String(failed.length)} FAIL / ${String(ROWS.length - passed.length - failed.length)} INFO(shell:${shells.map((s) => s.label).join(' + ')})====`)
|
|
410
|
+
for (const r of failed) console.error(` ✘ [${r.shell}] ${r.item} — ${String(r.detail ?? '')}`)
|
|
411
|
+
process.exit(failed.length === 0 ? 0 : 1)
|