@xiaoqiong0v0/opencode-ssh-tool 0.5.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +27 -21
  2. package/dist/agent.d.ts +52 -0
  3. package/dist/agent.d.ts.map +1 -0
  4. package/dist/agent.js +244 -0
  5. package/dist/agent.js.map +1 -0
  6. package/dist/base-session.d.ts +95 -13
  7. package/dist/base-session.d.ts.map +1 -1
  8. package/dist/base-session.js +271 -102
  9. package/dist/base-session.js.map +1 -1
  10. package/dist/config.d.ts +6 -2
  11. package/dist/config.d.ts.map +1 -1
  12. package/dist/config.js +16 -7
  13. package/dist/config.js.map +1 -1
  14. package/dist/constants.d.ts +14 -15
  15. package/dist/constants.d.ts.map +1 -1
  16. package/dist/constants.js +14 -15
  17. package/dist/constants.js.map +1 -1
  18. package/dist/i18n.d.ts +24 -14
  19. package/dist/i18n.d.ts.map +1 -1
  20. package/dist/i18n.js +37 -12
  21. package/dist/i18n.js.map +1 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +90 -73
  24. package/dist/index.js.map +1 -1
  25. package/dist/last-match.d.ts +11 -0
  26. package/dist/last-match.d.ts.map +1 -1
  27. package/dist/last-match.js +24 -0
  28. package/dist/last-match.js.map +1 -1
  29. package/dist/local-session.d.ts +2 -1
  30. package/dist/local-session.d.ts.map +1 -1
  31. package/dist/local-session.js +14 -8
  32. package/dist/local-session.js.map +1 -1
  33. package/dist/server-entry.d.ts +2 -0
  34. package/dist/server-entry.d.ts.map +1 -0
  35. package/dist/server-entry.js +61 -0
  36. package/dist/server-entry.js.map +1 -0
  37. package/dist/server-manager.d.ts +9 -9
  38. package/dist/server-manager.d.ts.map +1 -1
  39. package/dist/server-manager.js +208 -27
  40. package/dist/server-manager.js.map +1 -1
  41. package/dist/server.d.ts +3 -28
  42. package/dist/server.d.ts.map +1 -1
  43. package/dist/server.js +429 -275
  44. package/dist/server.js.map +1 -1
  45. package/dist/session.d.ts +0 -1
  46. package/dist/session.d.ts.map +1 -1
  47. package/dist/session.js +2 -9
  48. package/dist/session.js.map +1 -1
  49. package/dist/shell-adapter.d.ts +38 -2
  50. package/dist/shell-adapter.d.ts.map +1 -1
  51. package/dist/shell-adapter.js +372 -24
  52. package/dist/shell-adapter.js.map +1 -1
  53. package/dist/utils.d.ts +3 -1
  54. package/dist/utils.d.ts.map +1 -1
  55. package/dist/utils.js +29 -10
  56. package/dist/utils.js.map +1 -1
  57. package/dist/web/app.css +12 -7
  58. package/dist/web/app.js +11 -2
  59. package/dist/web/index.html +6 -3
  60. package/dist/web/xterm.css +218 -0
  61. package/package.json +3 -2
@@ -1,13 +1,27 @@
1
- // Shell 适配器:Shell 类型探测 + 可见完成标记注入/检测
1
+ // Shell 适配器:Shell 类型探测 + 完成标记命令(每条命令后追加)
2
2
  // 标记格式:<SSH_DONE:<退出码>> —— 可见文本便于 web Raw 模式直接调试;
3
- // 展示给用户/模型的输出会在上层剥离标记(用户实际看不到,与不可见标记等效)
4
- import { DONE_TAG, INJECT_TOKEN, SHELL_ID_PREFIX, VAR_LAST_HIST, VAR_NESTED, VAR_ORIG_RL, VAR_PENDING, VAR_HID } from "./constants.js";
3
+ // 展示给用户/模型的输出会在上层剥离标记(用户实际看不到,与不可见标记等效)。
4
+ // 完成判定不再依赖 prompt 钩子(PROMPT_COMMAND/PS1/prompt 函数——会被 oh-my-posh/p10k 覆盖),
5
+ // 改为在每条命令后追加独立一行的标记输出命令,免疫任何提示符框架。
6
+ import { DONE_TAG, SHELL_ID_PREFIX } from "./constants.js";
5
7
  import { findLastMatch } from "./last-match.js";
6
- // ===== 完成标记检测(在原始字节流中定位/剥离 <SSH_DONE:退出码>) =====
7
- const DONE_RE = /<SSH_DONE:(-?\d+)>/g;
8
- export function detectLastDoneMarker(buffer, fromPos) {
9
- // 取最后一个合法标记(退出码为数字)——避免注入脚本字面文本 <SSH_DONE:%s> 被误判
10
- const m = findLastMatch(DONE_RE, buffer, fromPos);
8
+ // ===== 完成标记检测(在原始字节流中定位/剥离 <SSH_DONE:seq:退出码>) =====
9
+ /** 匹配任意完成标记(含序号式 <SSH_DONE:seq:code> 与无序号 <SSH_DONE:code>,退出码在末尾);前缀取自 DONE_TAG,< 与 : 在正则中均为字面量 */
10
+ const DONE_RE = new RegExp(DONE_TAG + "(?:\\d+:)?(-?\\d+)>", "g");
11
+ /** 检测指定序号命令的完成标记 */
12
+ function doneSeqRe(seq) {
13
+ return new RegExp(`${DONE_TAG}${seq}:(-?\\d+)>`, "g");
14
+ }
15
+ /** 终端中断回显:Ctrl-C 由 TTY 层回显为 ^C(ECHOCTL 开启),与 shell 框架无关 */
16
+ const INTERRUPT_ECHO = "^C";
17
+ /**
18
+ * 判断命令是否完成:检测指定序号 <SSH_DONE:seq:<码>> 的完成标记(只认当前命令,防残留误判)
19
+ * @param buffer 原始字节流
20
+ * @param fromPos 搜索起点
21
+ * @param seq 当前命令序号
22
+ */
23
+ export function detectLastDoneMarker(buffer, fromPos, seq) {
24
+ const m = findLastMatch(doneSeqRe(seq), buffer, fromPos);
11
25
  if (!m)
12
26
  return { done: false, exitCode: 0, pos: 0 };
13
27
  return { done: true, exitCode: parseInt(m[1], 10) || 0, pos: m.index + m[0].length };
@@ -15,44 +29,378 @@ export function detectLastDoneMarker(buffer, fromPos) {
15
29
  export function stripMarkers(raw) {
16
30
  return raw.replace(DONE_RE, "");
17
31
  }
18
- // ===== Shell 类型探测与注入脚本 =====
32
+ /** 检测从指定位置起是否出现中断回显 ^C(命令被 Ctrl-C 中断) */
33
+ export function detectInterrupt(buffer, fromPos) {
34
+ const idx = buffer.indexOf(INTERRUPT_ECHO, fromPos);
35
+ return { interrupted: idx >= 0, pos: idx >= 0 ? idx : 0 };
36
+ }
37
+ // ===== Shell 类型探测与标记命令 =====
38
+ /**
39
+ * 提取 POSIX heredoc 分隔符(`<<EOF` / `<<-EOF` / `<<'EOF'` / `<<"EOF"`),无则返回 null。
40
+ * 逐字符扫描并跟踪 `'`/`"` 引号状态,只对引号外的 `<<` 尝试匹配分隔符;
41
+ * 避免 `echo "a << b"`、`grep '<<EOF' file` 这类引号内的 `<<` 被误判为 heredoc 起始。
42
+ * @param line 当前行文本
43
+ * @returns 引号外首个合法 heredoc 的分隔符;不存在则 null
44
+ */
45
+ function heredocDelim(line) {
46
+ let inSingle = false;
47
+ let inDouble = false;
48
+ let escaped = false;
49
+ for (let i = 0; i < line.length; i++) {
50
+ const c = line[i];
51
+ if (escaped) {
52
+ escaped = false;
53
+ continue;
54
+ }
55
+ if (c === "\\" && !inSingle) {
56
+ escaped = true;
57
+ continue;
58
+ }
59
+ if (c === "'" && !inDouble) {
60
+ inSingle = !inSingle;
61
+ continue;
62
+ }
63
+ if (c === '"' && !inSingle) {
64
+ inDouble = !inDouble;
65
+ continue;
66
+ }
67
+ if (inSingle || inDouble)
68
+ continue;
69
+ // 引号外发现 `<<`:从其后匹配 <<-?\s*(['"]?)([A-Za-z_]\w*)\1
70
+ if (c === "<" && line[i + 1] === "<") {
71
+ const m = line.slice(i + 2).match(/^-?\s*(['"]?)([A-Za-z_][A-Za-z0-9_]*)\1/);
72
+ if (m)
73
+ return m[2];
74
+ }
75
+ }
76
+ return null;
77
+ }
78
+ /**
79
+ * 判断行内位置 i 的 `#` 是否构成 POSIX 注释起始(词首)。
80
+ * 仅当 `#` 处于文本开头、或前一字符为空白 / `;` `&` `|` `(` `)` `<` `>` 之一时为注释;
81
+ * `$#`(前为 `$`)、`a#b`(前为普通字符)与 `${x}#foo`(前为 `}`,属词内)均非注释。
82
+ * @param line 当前行文本
83
+ * @param i `#` 所在下标
84
+ * @returns true 表示该 `#` 起至行尾为注释
85
+ */
86
+ function isPosixCommentStart(line, i) {
87
+ if (i === 0)
88
+ return true;
89
+ const p = line[i - 1];
90
+ return /\s/.test(p) || p === ";" || p === "&" || p === "|" || p === "(" || p === ")" || p === "<" || p === ">";
91
+ }
92
+ /**
93
+ * POSIX(bash/zsh/sh)续行检测:未闭合的单/双引号或反引号(命令替换)、行尾未转义反斜杠、
94
+ * 未闭合的 heredoc、以及未闭合的 `(`/`{` 组。
95
+ * 单引号内反斜杠为字面量;双引号/反引号内反斜杠转义下一个字符。
96
+ * 逐行扫描:heredoc 正文行(分隔符行之间的内容)与注释(词首 `#` 起至行尾)整段跳过,
97
+ * 不参与引号/深度配对,否则正文里的 `don't` 等会被误判为未闭合而拒绝命令。
98
+ * 深度用「> 0」而非「≠ 0」判断,以兼容 `case` 语句 `a)` 臂产生的负括号深度。
99
+ * @param s 命令文本
100
+ * @returns true 表示 shell 会等待续行
101
+ */
102
+ function posixOpenContinuation(s) {
103
+ let inSingle = false;
104
+ let inDouble = false;
105
+ let inBacktick = false;
106
+ let parenDepth = 0;
107
+ let braceDepth = 0;
108
+ let pendingHeredoc = null;
109
+ let lineContinuation = false;
110
+ for (const line of s.split("\n")) {
111
+ // heredoc 正文行:整行跳过,不参与引号/深度配对;遇分隔符行则闭合
112
+ if (pendingHeredoc !== null) {
113
+ if (line.trim() === pendingHeredoc)
114
+ pendingHeredoc = null;
115
+ continue;
116
+ }
117
+ let escaped = false;
118
+ lineContinuation = false;
119
+ for (let i = 0; i < line.length; i++) {
120
+ const c = line[i];
121
+ if (escaped) {
122
+ escaped = false;
123
+ continue;
124
+ }
125
+ if (c === "\\" && !inSingle) {
126
+ escaped = true;
127
+ continue;
128
+ }
129
+ if (c === "'" && !inDouble && !inBacktick) {
130
+ inSingle = !inSingle;
131
+ continue;
132
+ }
133
+ if (c === '"' && !inSingle) {
134
+ inDouble = !inDouble;
135
+ continue;
136
+ }
137
+ if (c === "`" && !inSingle) {
138
+ inBacktick = !inBacktick;
139
+ continue;
140
+ }
141
+ if (inSingle || inDouble || inBacktick)
142
+ continue;
143
+ // 注释:词首 `#` 起至行尾跳过(注释里的引号不影响配对)
144
+ if (c === "#" && isPosixCommentStart(line, i))
145
+ break;
146
+ if (c === "(")
147
+ parenDepth++;
148
+ else if (c === ")")
149
+ parenDepth--;
150
+ else if (c === "{")
151
+ braceDepth++;
152
+ else if (c === "}")
153
+ braceDepth--;
154
+ }
155
+ // 行尾未转义反斜杠 = 续行(下一行首字符不被转义,故 escaped 不跨行)
156
+ if (escaped)
157
+ lineContinuation = true;
158
+ // 引号外检测本行 heredoc 起始(`<<EOF` 等)
159
+ if (!inSingle && !inDouble && !inBacktick) {
160
+ const d = heredocDelim(line);
161
+ if (d)
162
+ pendingHeredoc = d;
163
+ }
164
+ }
165
+ return inSingle || inDouble || inBacktick || lineContinuation || pendingHeredoc !== null || parenDepth > 0 || braceDepth > 0;
166
+ }
167
+ /**
168
+ * 判断 pwsh 行是否以 here-string 起始标记结尾,返回对应闭合标记(`"@` 或 `'@`)或 null。
169
+ * 引号感知扫描:仅当行尾(去尾空白后)为 `@"` 或 `@'`、且该 `@` 处于引号外、并位于词首
170
+ * (前一字符为文本开头 / 空白 / `=` / `(` / `,` / `|`)时才算起始。
171
+ * 避免 `Write-Output "foo@"` 这类引号内/词内的 `@"` 被误判为 here-string 起始。
172
+ * @param line 当前行文本
173
+ * @returns 该起始标记对应的闭合标记(`"@` 对应 `@"`,`'@` 对应 `@'`);非起始则 null
174
+ */
175
+ function pwshHereStringStart(line) {
176
+ const trimmed = line.trimEnd();
177
+ const n = trimmed.length;
178
+ if (n < 2 || trimmed[n - 2] !== "@")
179
+ return null;
180
+ const quote = trimmed[n - 1];
181
+ if (quote !== '"' && quote !== "'")
182
+ return null;
183
+ // 词首判定:`@` 前一字符须为 文本开头/空白/=/(/,/|
184
+ const prev = n >= 3 ? trimmed[n - 3] : "";
185
+ if (!(prev === "" || /\s/.test(prev) || prev === "=" || prev === "(" || prev === "," || prev === "|"))
186
+ return null;
187
+ // 引号感知扫描 `@` 之前的部分:反引号转义下一字符,判断 `@` 处是否在引号外
188
+ let inSingle = false;
189
+ let inDouble = false;
190
+ let escaped = false;
191
+ for (let i = 0; i < n - 2; i++) {
192
+ const c = trimmed[i];
193
+ if (escaped) {
194
+ escaped = false;
195
+ continue;
196
+ }
197
+ if (c === "`") {
198
+ escaped = true;
199
+ continue;
200
+ }
201
+ if (c === "'" && !inDouble) {
202
+ inSingle = !inSingle;
203
+ continue;
204
+ }
205
+ if (c === '"' && !inSingle) {
206
+ inDouble = !inDouble;
207
+ continue;
208
+ }
209
+ }
210
+ if (inSingle || inDouble)
211
+ return null;
212
+ return quote + "@";
213
+ }
214
+ /**
215
+ * PowerShell 续行检测:未闭合单/双引号、行尾反引号(转义/续行)、行尾管道 `|`、
216
+ * 未闭合的 here-string(`@"`…`"@` / `@'`…`'@`)、以及未闭合的 `{`/`(` 组。
217
+ * 反引号转义下一个字符;单引号内不转义。here-string 正文内的引号/花括号/圆括号不参与配对。
218
+ * @param s 命令文本
219
+ * @returns true 表示 shell 会等待续行
220
+ */
221
+ function pwshOpenContinuation(s) {
222
+ let inSingle = false;
223
+ let inDouble = false;
224
+ let parenDepth = 0;
225
+ let braceDepth = 0;
226
+ let hereClose = null;
227
+ let lineContinuation = false;
228
+ const lines = s.split("\n");
229
+ for (const line of lines) {
230
+ // here-string 正文行:整行跳过;遇闭合行(以 "@ 或 '@ 结尾)则闭合
231
+ if (hereClose !== null) {
232
+ if (line.trim().endsWith(hereClose))
233
+ hereClose = null;
234
+ continue;
235
+ }
236
+ // here-string 起始:行尾以 @" 或 @' 结束(须引号外且词首,见 pwshHereStringStart);标记不参与引号配对
237
+ let scanLine = line;
238
+ let opener = null;
239
+ if (!inSingle && !inDouble) {
240
+ opener = pwshHereStringStart(line);
241
+ if (opener !== null)
242
+ scanLine = line.slice(0, line.trimEnd().length - 2);
243
+ }
244
+ let escaped = false;
245
+ lineContinuation = false;
246
+ for (let i = 0; i < scanLine.length; i++) {
247
+ const c = scanLine[i];
248
+ if (escaped) {
249
+ escaped = false;
250
+ continue;
251
+ }
252
+ if (c === "`") {
253
+ escaped = true;
254
+ continue;
255
+ }
256
+ if (c === "'" && !inDouble) {
257
+ inSingle = !inSingle;
258
+ continue;
259
+ }
260
+ if (c === '"' && !inSingle) {
261
+ inDouble = !inDouble;
262
+ continue;
263
+ }
264
+ if (inSingle || inDouble)
265
+ continue;
266
+ if (c === "{")
267
+ braceDepth++;
268
+ else if (c === "}")
269
+ braceDepth--;
270
+ else if (c === "(")
271
+ parenDepth++;
272
+ else if (c === ")")
273
+ parenDepth--;
274
+ }
275
+ // 行尾反引号 = 续行
276
+ if (escaped)
277
+ lineContinuation = true;
278
+ if (opener !== null)
279
+ hereClose = opener;
280
+ }
281
+ // 行尾管道 `|`:整段最后一行以 | 结尾 → 续行
282
+ const trailingPipe = /\|\s*$/.test(lines[lines.length - 1] ?? "");
283
+ return inSingle || inDouble || lineContinuation || trailingPipe || hereClose !== null || parenDepth > 0 || braceDepth > 0;
284
+ }
285
+ /**
286
+ * cmd.exe 续行检测:未闭合的 `(`/`)` 组(cmd 显示 `More?` 等待),或行尾脱字符 `^`(转义/续行)。
287
+ * 注意 cmd 无双引号续行语义:未闭合双引号不代表等待输入,故不作为续行依据(避免合法命令被拒)。
288
+ * @param s 命令文本
289
+ * @returns true 表示 shell 会等待续行
290
+ */
291
+ function cmdOpenContinuation(s) {
292
+ let inDouble = false;
293
+ let parenDepth = 0;
294
+ for (let i = 0; i < s.length; i++) {
295
+ const c = s[i];
296
+ if (c === "^") {
297
+ i++;
298
+ continue;
299
+ } // ^ 转义下一个字符
300
+ if (c === '"') {
301
+ inDouble = !inDouble;
302
+ continue;
303
+ }
304
+ if (inDouble)
305
+ continue;
306
+ if (c === "(")
307
+ parenDepth++;
308
+ else if (c === ")")
309
+ parenDepth--;
310
+ }
311
+ return parenDepth > 0 || /\^\s*$/.test(s);
312
+ }
19
313
  class ZshAdapter {
20
314
  name = "zsh";
21
315
  probeCommand = `echo ${SHELL_ID_PREFIX}$0`;
22
- parseProbe(output) {
23
- return new RegExp(`${SHELL_ID_PREFIX}zsh|(?:^|\\W)zsh(?:\\W|$)`, "i").test(output);
316
+ stmtSep = ";";
317
+ markerCmd(seq) {
318
+ // 结尾补换行:否则 zsh 判定"上条输出未以换行结束",会补印 PROMPT_EOL_MARK(root 为 #)污染画面
319
+ return `printf '\\n${DONE_TAG}${seq}:%s>\\n' $?`;
320
+ }
321
+ groupWrap(body) {
322
+ // `{ }` 命令组在当前作用域执行(保留 cd/变量);未闭合的 `{` 会让 zsh 进入 PS2 续行,
323
+ // 整段多行输入被当作一条命令解析
324
+ return `{ ${body}\n}`;
24
325
  }
25
- buildInjectScript() {
26
- return `PS1='${DONE_TAG}%?>'"\$PS1"; echo ${INJECT_TOKEN}`;
326
+ hasOpenContinuation(command) {
327
+ return posixOpenContinuation(command);
328
+ }
329
+ parseProbe(output) {
330
+ // login shell 的 $0 带 - 前缀(-zsh),须容忍
331
+ return new RegExp(`${SHELL_ID_PREFIX}-?zsh|(?:^|\\W)zsh(?:\\W|$)`, "i").test(output);
27
332
  }
28
333
  }
29
334
  // ===== Bash 系(bash / sh) =====
30
335
  class BashAdapter {
31
336
  name = "bash";
32
337
  probeCommand = `echo ${SHELL_ID_PREFIX}$0`;
33
- parseProbe(output) {
34
- return new RegExp(`${SHELL_ID_PREFIX}(bash|sh)\\b|(?:^|\\W)(bash|sh)(?:\\W|$)`, "i").test(output);
338
+ stmtSep = ";";
339
+ markerCmd(seq) {
340
+ // bash 无 PROMPT_EOL_MARK,标记无需补尾换行(补了反而在 raw 里多顶一行)
341
+ return `printf '\\n${DONE_TAG}${seq}:%s>' $?`;
35
342
  }
36
- buildInjectScript() {
37
- return `__ssh_prompt() { local ec=$?; if [ "\${HISTCMD:-}" != "\${${VAR_LAST_HIST}:-}" ]; then printf '\\n${DONE_TAG}%s>' "$ec"; ${VAR_LAST_HIST}=$HISTCMD; fi; }; PROMPT_COMMAND=__ssh_prompt; echo ${INJECT_TOKEN}`;
343
+ groupWrap(body) {
344
+ // `{ }` 命令组在当前作用域执行(保留 cd/变量);未闭合的 `{` 会让 bash 进入 PS2 续行
345
+ return `{ ${body}\n}`;
346
+ }
347
+ hasOpenContinuation(command) {
348
+ return posixOpenContinuation(command);
349
+ }
350
+ parseProbe(output) {
351
+ // login shell 的 $0 带 - 前缀(-bash),须容忍
352
+ return new RegExp(`${SHELL_ID_PREFIX}-?(?:bash|sh)\\b|(?:^|\\W)(?:bash|sh)(?:\\W|$)`, "i").test(output);
38
353
  }
39
354
  }
40
355
  // ===== PowerShell =====
41
356
  class PwshAdapter {
42
357
  name = "pwsh";
43
- probeCommand = `echo ${SHELL_ID_PREFIX}$0`;
44
- parseProbe(_output) {
45
- return true;
358
+ probeCommand = `Write-Output ${SHELL_ID_PREFIX}pwsh_$PSHOME`;
359
+ stmtSep = ";";
360
+ markerCmd(seq) {
361
+ // 用 Write-Output(success 管线)而非 Write-Host:Write-Host 直写 host 流会抢在
362
+ // cmdlet 输出(经格式化器批量渲染)之前,导致 marker 落在命令输出之前、提取时把输出裁掉
363
+ return `Write-Output "${DONE_TAG}${seq}:$LASTEXITCODE>"`;
364
+ }
365
+ groupWrap(body) {
366
+ // 点源 `. { }` 在当前作用域执行(保留变量/状态);不可用 `& { }`(子作用域会丢变量/状态)。
367
+ // 未闭合的 `{` 会让 pwsh 进入续行,整段多行输入被当作一条命令解析
368
+ return `. { ${body}\n}`;
369
+ }
370
+ hasOpenContinuation(command) {
371
+ return pwshOpenContinuation(command);
372
+ }
373
+ parseProbe(output) {
374
+ // Write-Output __SHELL_ID__pwsh_$PSHOME → pwsh 展开为路径;cmd 下 $PSHOME 不被展开(字面保留 $),借此区分
375
+ return /__SHELL_ID__pwsh_[^$]/.test(output);
46
376
  }
47
- buildInjectScript() {
48
- return `function global:prompt { $h = Get-History -Count 1; $hid = if ($h) { $h.Id } else { 0 }; $nested = $nestedPromptLevel; $ec = $LASTEXITCODE; if ($null -eq $ec) { $ec = 0 }; $s = ""; if ($null -eq $global:${VAR_PENDING} -or $global:${VAR_PENDING} -or $hid -ne $global:${VAR_HID} -or $nested -lt $global:${VAR_NESTED}) { $s = "${DONE_TAG}$ec>" }; $global:${VAR_PENDING} = $false; $global:${VAR_HID} = $hid; $global:${VAR_NESTED} = $nested; $s + "PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) " }; if ($function:PSConsoleHostReadLine) { $global:${VAR_ORIG_RL} = $function:PSConsoleHostReadLine; function global:PSConsoleHostReadLine { $global:${VAR_PENDING} = $true; & $global:${VAR_ORIG_RL} } }; echo ${INJECT_TOKEN}`;
377
+ }
378
+ // ===== Windows cmd.exe =====
379
+ class CmdAdapter {
380
+ name = "cmd";
381
+ probeCommand = `echo ${SHELL_ID_PREFIX}%COMSPEC%`;
382
+ stmtSep = "&";
383
+ markerCmd(seq) {
384
+ return `echo ${DONE_TAG}${seq}:%errorlevel%>`;
385
+ }
386
+ groupWrap(_body) {
387
+ // cmd 不包组:组内 `%errorlevel%` 是解析期展开,退出码会失真;保持原样逐行执行
388
+ return null;
389
+ }
390
+ hasOpenContinuation(command) {
391
+ return cmdOpenContinuation(command);
392
+ }
393
+ parseProbe(output) {
394
+ // echo __SHELL_ID__%COMSPEC% → cmd 展开为 __SHELL_ID__C:\...cmd.exe(无 % 原样遗留即判为 cmd)
395
+ return /__SHELL_ID__(?!%)\S*cmd\.exe/i.test(output);
49
396
  }
50
397
  }
51
- /** 注册表(按优先级排列) */
52
- const adapters = [
398
+ /** 注册表(探测顺序:先 POSIX 系,后 pwsh/cmd;resolveByProbe 由 _probeShell 改用各适配器 probeCommand 逐个探测) */
399
+ export const adapters = [
53
400
  new ZshAdapter(),
54
401
  new BashAdapter(),
55
402
  new PwshAdapter(),
403
+ new CmdAdapter(),
56
404
  ];
57
405
  /**
58
406
  * 根据探测结果选择适配器
@@ -1 +1 @@
1
- {"version":3,"file":"shell-adapter.js","sourceRoot":"","sources":["../src/shell-adapter.ts"],"names":[],"mappings":"AAAA,qCAAqC;AACrC,mDAAmD;AACnD,wCAAwC;AAExC,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AACtI,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAU/C,kDAAkD;AAElD,MAAM,OAAO,GAAG,qBAAqB,CAAA;AAErC,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,OAAe;IAClE,kDAAkD;IAClD,MAAM,CAAC,GAAG,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;IACjD,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAA;IACnD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAA;AACtF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;AACjC,CAAC;AAED,8BAA8B;AAC9B,MAAM,UAAU;IACL,IAAI,GAAG,KAAK,CAAA;IACZ,YAAY,GAAG,QAAQ,eAAe,IAAI,CAAA;IACnD,UAAU,CAAC,MAAc;QACvB,OAAO,IAAI,MAAM,CAAC,GAAG,eAAe,2BAA2B,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACpF,CAAC;IACD,iBAAiB;QACf,OAAO,QAAQ,QAAQ,qBAAqB,YAAY,EAAE,CAAA;IAC5D,CAAC;CACF;AAED,gCAAgC;AAChC,MAAM,WAAW;IACN,IAAI,GAAG,MAAM,CAAA;IACb,YAAY,GAAG,QAAQ,eAAe,IAAI,CAAA;IACnD,UAAU,CAAC,MAAc;QACvB,OAAO,IAAI,MAAM,CAAC,GAAG,eAAe,0CAA0C,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACnG,CAAC;IACD,iBAAiB;QACf,OAAO,6DAA6D,aAAa,2BAA2B,QAAQ,eAAe,aAAa,uDAAuD,YAAY,EAAE,CAAA;IACvN,CAAC;CACF;AAED,yBAAyB;AACzB,MAAM,WAAW;IACN,IAAI,GAAG,MAAM,CAAA;IACb,YAAY,GAAG,QAAQ,eAAe,IAAI,CAAA;IACnD,UAAU,CAAC,OAAe;QACxB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,iBAAiB;QACf,OAAO,8MAA8M,WAAW,gBAAgB,WAAW,yBAAyB,OAAO,4BAA4B,UAAU,aAAa,QAAQ,oBAAoB,WAAW,sBAAsB,OAAO,oBAAoB,UAAU,oKAAoK,WAAW,uFAAuF,WAAW,uBAAuB,WAAW,cAAc,YAAY,EAAE,CAAA;IACjwB,CAAC;CACF;AAED,kBAAkB;AAClB,MAAM,QAAQ,GAAmB;IAC/B,IAAI,UAAU,EAAE;IAChB,IAAI,WAAW,EAAE;IACjB,IAAI,WAAW,EAAE;CAClB,CAAA;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB;IAChD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC;YAAE,OAAO,CAAC,CAAA;IACzC,CAAC;IACD,cAAc;IACd,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AACtC,CAAC"}
1
+ {"version":3,"file":"shell-adapter.js","sourceRoot":"","sources":["../src/shell-adapter.ts"],"names":[],"mappings":"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"}
package/dist/utils.d.ts CHANGED
@@ -2,11 +2,13 @@
2
2
  * 定位命令回显行在原始流中的结束位置(供流式增量定位使用):
3
3
  * 丢弃窗口开头到"命令回显行结束"之前的一切内容(提示符、PS1 填充、光标定位噪音均在内)。
4
4
  * 命令回显行 = 命令文本首次出现所在行(命令本身可能含 \033 等转义)。
5
+ * 命令文本后允许任意行内字符直到行尾:命令可能被追加完成标记(如 `cmd ;printf '<SSH_DONE…>'`),
6
+ * 此时回显是整行拼接,不能要求命令后紧跟换行。
5
7
  * @param raw 原始终端流(含 ANSI)
6
8
  * @param command 本次执行的命令文本
7
9
  * @returns 命令回显结束后的字节偏移;未命中命令文本返回 0(此时应视作输出尚未开始)
8
10
  */
9
- export declare function extractOutputStart(raw: string, command: string): number;
11
+ export declare function extractOutputStart(raw: string, command: string, endBound?: number): number;
10
12
  /**
11
13
  * 剥离"提示符 + 命令回显",只保留程序纯输出:
12
14
  * shell 提示符(含背景填充、zle 重绘序列)依赖其自身终端屏幕状态,字节流脱离该状态无法忠实还原,
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAWA;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAavE;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAIlE;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO/C;AAgJD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAI1C"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAWA;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,SAAa,GAAG,MAAM,CA6B9F;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAIlE;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAO/C;AAgJD;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAI1C"}
package/dist/utils.js CHANGED
@@ -1,6 +1,6 @@
1
1
  // 工具函数:命令回显定位、模型文本清理、ANSI 清洗、CR 覆盖合并、完成标记剥离
2
2
  import { stripMarkers } from "./shell-adapter.js";
3
- import { findLastEndOf } from "./last-match.js";
3
+ import { findLastEndOfBefore } from "./last-match.js";
4
4
  /** 正则转义文本 */
5
5
  const escRe = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
6
6
  /** 命令回显匹配的宽松字符间隙(ANSI 序列或普通空白/换行,可插在命令字符之间;容忍终端列宽自动换行) */
@@ -9,24 +9,43 @@ const ECHO_WIDE = "(?:\\x1b\\[[0-9;?]*[a-zA-Z]|\\x1b\\][^\\x07\\x1b]*(?:\\x07|\\
9
9
  * 定位命令回显行在原始流中的结束位置(供流式增量定位使用):
10
10
  * 丢弃窗口开头到"命令回显行结束"之前的一切内容(提示符、PS1 填充、光标定位噪音均在内)。
11
11
  * 命令回显行 = 命令文本首次出现所在行(命令本身可能含 \033 等转义)。
12
+ * 命令文本后允许任意行内字符直到行尾:命令可能被追加完成标记(如 `cmd ;printf '<SSH_DONE…>'`),
13
+ * 此时回显是整行拼接,不能要求命令后紧跟换行。
12
14
  * @param raw 原始终端流(含 ANSI)
13
15
  * @param command 本次执行的命令文本
14
16
  * @returns 命令回显结束后的字节偏移;未命中命令文本返回 0(此时应视作输出尚未开始)
15
17
  */
16
- export function extractOutputStart(raw, command) {
18
+ export function extractOutputStart(raw, command, endBound = raw.length) {
17
19
  const cmd = command.trim();
18
20
  if (!cmd)
19
21
  return 0;
20
- // 单条宽松正则一次性匹配命令回显(命令文本 + 字符间 ANSI 间隙):
21
- // 1) 字符间容忍 ANSI 间隙(WIDE)2) 命令字面 \033 回显可能变真实 ESC(二选一)
22
+ // 单条宽松正则一次性匹配命令回显(支持多行命令):
23
+ // 1) 命令字符间容忍 ANSI 间隙(ECHO_WIDE)
24
+ // 2) 命令字面 \033 回显可能变真实 ESC(二选一)
25
+ // 3) 每段命令文本后允许任意行内字符直到行尾([^\r\n]*),兼容追加的完成标记命令
26
+ // 4) 多行命令:bash 逐行回显,行间可能夹 prompt 文本与 ANSI,用宽松段间匹配连接
22
27
  const norm = cmd.replace(/\\033/gi, "\x1b");
23
- const frags = [...norm].map((c) => (c === "\x1b" ? "(?:\\x1b|\\\\033)" : escRe(c)));
24
- // 要求命令文本(及尾部 ANSI 重置序列)后紧跟行尾(\r?\n 或串尾),避免子 shell 输出内命令字(如 zsh: not found)误匹配
25
28
  const TAIL_ANSI = "(?:\\x1b\\[[0-9;?]*[a-zA-Z]|\\x1b\\][^\\x07\\x1b]*(?:\\x07|\\x1b\\\\)|\\x1b[^\\x1b])*";
26
- const re = new RegExp(frags.join(ECHO_WIDE) + TAIL_ANSI + "(?=\\r?\\n|$)", "g");
27
- // 取最后一次匹配:备屏退出(如 cmatrix)会重放主屏历史,其中含旧命令回显,
28
- // 只有最后一次出现的回显之后才是本次命令的真实输出
29
- return findLastEndOf(re, raw);
29
+ // 行尾:容忍 \r 后跟 ANSI(如 bracketed paste off \x1b[?2004l)再换行,或直接 \n/字符串末尾
30
+ const LINE_END = "(?:(?:\\r?" + TAIL_ANSI + ")\\r?\\n|\\r?$)";
31
+ const lineOf = (line) => {
32
+ const frags = [...line].map((c) => (c === "\x1b" ? "(?:\\x1b|\\\\033)" : escRe(c)));
33
+ // 字符间隙:容忍 ANSI/空白;并容忍 readline 折行重绘在折行处**重复前一个字符**
34
+ // (超宽命令回显会多出边界字符,如 `...libayatan\r\n\x1b[39;120Hna-...`,精确匹配会失败)
35
+ const gap = (prev) => ECHO_WIDE + "(?:\\r?\\n" + TAIL_ANSI + prev + ECHO_WIDE + ")?";
36
+ let out = frags[0] ?? "";
37
+ for (let i = 1; i < frags.length; i++)
38
+ out += gap(frags[i - 1]) + frags[i];
39
+ return out + TAIL_ANSI + "[^\\r\\n]*";
40
+ };
41
+ const lines = norm.split("\n");
42
+ // 段间匹配:容忍任意行(prompt、输出行等)直到下一段命令,再用 ECHO_WIDE 收紧命令字符间隙
43
+ const BETWEEN = "[\\s\\S]*?";
44
+ const re = new RegExp(lines.map(lineOf).join(BETWEEN + ECHO_WIDE) + "(?:" + LINE_END + ")", "g");
45
+ // 取 [0, endBound) 范围内最后一次匹配:备屏退出(如 cmatrix)会重放主屏历史,
46
+ // 其中含旧命令回显,只有最后一次出现的回显之后才是本次命令的真实输出;
47
+ // endBound 限到完成标记之前,避免连续输入时后续裸命令回显把定位带偏
48
+ return findLastEndOfBefore(re, raw, 0, endBound);
30
49
  }
31
50
  /**
32
51
  * 剥离"提示符 + 命令回显",只保留程序纯输出:
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/dist/web/app.css CHANGED
@@ -5,10 +5,15 @@
5
5
  }
6
6
 
7
7
  html, body { margin: 0; height: 100%; background: #0d1117; color: #c9d1d9; font-family: system-ui, sans-serif; }
8
- header { position: sticky; top: 0; display: flex; align-items: center; gap: 12px; padding: 10px 16px; background: #161b22; border-bottom: 1px solid #30363d; }
8
+ body { display: flex; flex-direction: column; }
9
+ header { position: sticky; top: 0; flex: 0 0 auto; display: flex; align-items: center; gap: 12px; padding: 10px 16px; background: #161b22; border-bottom: 1px solid #30363d; }
9
10
  header h1 { margin: 0; font-size: 14px; color: #e6edf3; font-weight: 600; }
10
11
  select { background: #21262d; color: #c9d1d9; border: 1px solid #30363d; padding: 4px 8px; border-radius: 6px; }
11
- pre { margin: 0; padding: 16px 16px 52px; font-family: "CaskaydiaCove Nerd Font Mono", "Cascadia Code", "Fira Code", "JetBrains Mono", "Noto Sans Mono", "Hack", Consolas, "Courier New", monospace; font-size: 13px; line-height: 1.5; white-space: pre-wrap; overflow: auto; height: calc(100% - 52px); box-sizing: border-box; color: #c9d1d9; }
12
+ pre { margin: 0; padding: 16px; flex: 1 1 auto; min-height: 0; font-family: "CaskaydiaCove Nerd Font Mono", "Cascadia Code", "Fira Code", "JetBrains Mono", "Noto Sans Mono", "Hack", Consolas, "Courier New", monospace; font-size: 13px; line-height: 1.5; white-space: pre-wrap; overflow: auto; box-sizing: border-box; color: #c9d1d9; }
13
+ #xt { display: none; padding: 8px 12px; flex: 1 1 auto; min-height: 0; box-sizing: border-box; overflow: auto; }
14
+ body.debug #xt { display: flex; }
15
+ #xt > .xterm { margin: auto; }
16
+ body.debug #term { display: none; }
12
17
  .row { display: flex; align-items: stretch; }
13
18
  .row .t { box-sizing: border-box; flex: 0 0 172px; color: #8b949e; padding: 0 10px 0 6px; border-right: 1px solid #30363d; white-space: pre; }
14
19
  .row .c { flex: 1; padding-left: 12px; white-space: pre; }
@@ -23,21 +28,21 @@ body:not(.show-time) .row .t { display: none; }
23
28
  ::-webkit-scrollbar-corner { background: #161b22; }
24
29
  * { scrollbar-width: thin; scrollbar-color: #30363d #161b22; }
25
30
  .to-bottom-btn {
26
- position: fixed; right: 24px; bottom: 24px; display: none;
27
- background: #238636; color: #fff; border: none; border-radius: 20px;
28
- padding: 8px 16px; font-size: 13px; cursor: pointer; z-index: 10;
29
- box-shadow: 0 4px 12px rgba(0,0,0,.4);
31
+ display: none; margin-left: auto;
32
+ background: #238636; color: #fff; border: none; border-radius: 6px;
33
+ padding: 4px 10px; font-size: 12px; cursor: pointer; white-space: nowrap;
30
34
  }
31
35
  .to-bottom-btn:hover { background: #2ea043; }
32
36
  .sep hr { border: none; border-top: 1px dashed #30363d; margin: 8px 0; }
33
37
  .del-btn { background: none; border: 1px solid #30363d; color: #f85149; border-radius: 4px; cursor: pointer; padding: 2px 8px; font-size: 14px; line-height: 1; display: none; }
34
38
  .del-btn:hover { background: #f85149; color: #fff; }
35
39
  .del-btn.show { display: inline-block; }
36
- #cmdbar { position: fixed; bottom: 8px; left: 16px; right: 16px; display: flex; gap: 6px; }
40
+ #cmdbar { flex: 0 0 auto; display: flex; gap: 6px; padding: 8px 16px; border-top: 1px solid #30363d; }
37
41
  #cmdInput { flex: 1; box-sizing: border-box; background: #0d1117; color: #c9d1d9; border: 1px solid #30363d; border-radius: 6px; padding: 8px 12px; font-family: "CaskaydiaCove Nerd Font Mono", "Cascadia Code", "Fira Code", "JetBrains Mono", "Noto Sans Mono", "Hack", Consolas, "Courier New", monospace; font-size: 13px; outline: none; resize: none; max-height: 120px; overflow-y: auto; }
38
42
  #cmdInput:focus { border-color: #58a6ff; }
39
43
  #cmdInput:disabled { opacity: 0.4; }
40
44
  #cmdKey { flex: 0 0 auto; width: 72px; text-align: center; background: #21262d; color: #c9d1d9; border: 1px solid #30363d; border-radius: 6px; padding: 8px 6px; font-size: 12px; white-space: nowrap; overflow: hidden; cursor: crosshair; user-select: none; display: flex; align-items: center; justify-content: center; transition: border-color .15s; }
41
45
  #cmdKey.capture { border-color: #e67e22; animation: pulse 0.6s ease-in-out infinite alternate; }
42
46
  #cmdKey.disabled { opacity: 0.35; cursor: default; }
47
+ .tgl.disabled { opacity: 0.35; pointer-events: none; }
43
48
  @keyframes pulse { from { opacity: 0.6; } to { opacity: 1; } }