@xiaoqiong0v0/opencode-ssh-tool 0.7.2 → 0.7.5
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.md +16 -12
- package/dist/base-session.d.ts +17 -1
- package/dist/base-session.d.ts.map +1 -1
- package/dist/base-session.js +19 -1
- package/dist/base-session.js.map +1 -1
- package/dist/constants.d.ts +2 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +2 -1
- package/dist/constants.js.map +1 -1
- package/dist/i18n.d.ts +39 -19
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +39 -19
- package/dist/i18n.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +100 -5
- package/dist/index.js.map +1 -1
- package/dist/read-output.d.ts +12 -0
- package/dist/read-output.d.ts.map +1 -0
- package/dist/read-output.js +21 -0
- package/dist/read-output.js.map +1 -0
- package/dist/read-status.d.ts +16 -0
- package/dist/read-status.d.ts.map +1 -0
- package/dist/read-status.js +15 -0
- package/dist/read-status.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +11 -3
- package/dist/server.js.map +1 -1
- package/package.json +2 -2
package/dist/i18n.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAE9B,4CAA4C;AAC5C,MAAM,MAAM,OAAO,GAAG;KAAG,CAAC,IAAI,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK;CAAE,CAAC,MAAM,OAAO,CAAC,CAAC,CAAA;AAavH;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,UAAU,GAAE,IAAW,GAAG,IAAI,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,UAAU,GAAE,IAAW,GAAG,IAAI,CAExD;AAED,kBAAkB;AAClB,eAAO,MAAM,CAAC;aACZ,SAAS;iBACP,EAAE,EAAE,0LAA0L;iBAC9L,EAAE,EAAE,6EAA6E;;aAEnF,OAAO;iBACL,EAAE,EAAE,cAAc;iBAClB,EAAE,EAAE,YAAY;;aAElB,cAAc;iBACZ,EAAE,EAAE,iDAAiD;iBACrD,EAAE,EAAE,iCAAiC;;aAEvC,gBAAgB;iBACd,EAAE,EAAE,kCAAkC;iBACtC,EAAE,EAAE,sBAAsB;;aAE5B,wBAAwB;iBACtB,EAAE,EAAE,6BAA6B;iBACjC,EAAE,EAAE,UAAU;;aAEhB,iBAAiB;iBACf,EAAE,EAAE,6IAA6I;iBACjJ,EAAE,EAAE,uFAAuF;;aAE7F,qBAAqB;iBACnB,EAAE,EAAE,gGAAgG;iBACpG,EAAE,EAAE,6DAA6D;;aAEnE,QAAQ;iBACN,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"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"}
|
package/dist/i18n.js
CHANGED
|
@@ -59,8 +59,8 @@ export const T = {
|
|
|
59
59
|
zh: "service 的 PATH 找不到可执行文件:{cmd}。请改用不含空格的全路径,或 \"powershell\"。",
|
|
60
60
|
},
|
|
61
61
|
term_cli: {
|
|
62
|
-
en: "Unified terminal CLI: SSH
|
|
63
|
-
zh: "
|
|
62
|
+
en: "Unified terminal CLI: SSH / local shell (wsl, pwsh, bash) / container (docker exec); use 'local' for local terminals instead of bash. Subcommands: connect / local / exec / read / send / upload / download / status / disconnect / help; use 'help' for usage. Long-running, stdin-reading or interactive commands: use the default submit, then status/read; never add -w. upload/download use SFTP and require an SSH session. Terminal sessions are scoped to this opencode session: restarting/ending opencode closes them; reconnect after restart. connect/local default to name 'default'; reusing a name (also across SSH/local) closes the old terminal first (running command lost; failed connect does not restore it). Use exec on an existing terminal; use distinct -n names to keep terminals separate.",
|
|
63
|
+
zh: "统一终端 CLI:SSH / 本地 shell(wsl、pwsh、bash)/ 容器(docker exec);本地终端用 'local',不要用 bash 直接跑。子命令:connect / local / exec / read / send / upload / download / status / disconnect / help;用 'help' 查看用法。长命令、需 stdin 或交互的命令:用默认提交后 status/read;禁止 -w。upload/download 走 SFTP,仅支持 SSH 会话。终端会话仅属于当前 opencode 会话,重启或退出 opencode 会关闭,需重新连接。connect/local 未传 -n 时名为 default;同名(包括 SSH 与 local 之间)会先关闭旧终端(运行中命令丢失,新连接失败也不恢复)。已有终端用 exec;并行保留用不同 -n。",
|
|
64
64
|
},
|
|
65
65
|
term_cli_args: {
|
|
66
66
|
en: "Full command line string, e.g. 'local \"wsl bash\"' / 'exec \"ls -la\"' / 'connect user@host' / 'upload ./a.txt ~/a.txt'; defaults to 'help' when empty.",
|
|
@@ -69,6 +69,8 @@ export const T = {
|
|
|
69
69
|
term_cli_help: {
|
|
70
70
|
en: `term_cli unified CLI tool: manage SSH / local (wsl, pwsh, bash) / container (docker exec) terminal sessions.
|
|
71
71
|
Use 'local' for any terminal started on this machine (WSL, Docker containers, local shells).
|
|
72
|
+
Terminal sessions belong to the current opencode session; restarting or ending opencode closes them. Reconnect with connect/local; this is expected, not a crash.
|
|
73
|
+
-n defaults to "default". connect/local with an existing name (also across SSH/local) closes that terminal before attempting the new connection; its running command is lost, and a failed new connection does not restore it. Use exec for more commands in an existing terminal; use distinct -n values to keep terminals separate.
|
|
72
74
|
|
|
73
75
|
Usage: term_cli <subcommand> [args]
|
|
74
76
|
|
|
@@ -81,11 +83,11 @@ Subcommands:
|
|
|
81
83
|
exec "<command>" [--base64 | --file <path>] [-n name] [-w]
|
|
82
84
|
run a command in the terminal (default: submit and return immediately without waiting for the result; -w waits until the command actually finishes — use it only for commands expected to finish quickly; NEVER use -w for long-running / stdin-reading / interactive / server / watch / tail -f / build / install / scan / REPL commands, because -w keeps waiting as long as the command runs and can hang indefinitely; use the default and poll with status/read)
|
|
83
85
|
read [-n name] [-s buffer|history] [-l limit] [--head] [--includeCommand]
|
|
84
|
-
read terminal output:
|
|
86
|
+
read terminal output: with no -s, a running command returns a current buffer snapshot (may be partial) and an idle terminal returns history; -s buffer reads the live buffer; -s history reads completed history. read never waits for completion: use status to wait, then read the final result
|
|
85
87
|
send "<text>" [--base64 | --file <path>] [-n name]
|
|
86
88
|
send text/keystrokes (\\xHH any hex byte, \\t Tab, \\r/\\n Enter, \\x03 Ctrl-C, \\x04 Ctrl-D, \\x1a Ctrl-Z, \\x1b Esc)
|
|
87
89
|
upload <local> <remote> [-n name] [--overwrite] [--mkdir]
|
|
88
|
-
upload a regular file from this machine
|
|
90
|
+
upload a regular file from this machine to the SSH session over SFTP
|
|
89
91
|
local supports ~; remote supports absolute or home-relative paths and ~/ (expanded by SFTP, no shell; ~user unsupported); Windows drive paths must use forward slashes (C:/dir/file)
|
|
90
92
|
fails if the target exists unless --overwrite; parents are not created unless --mkdir
|
|
91
93
|
SSH sessions only; directories and symlinks are rejected; max 256 MiB
|
|
@@ -99,8 +101,8 @@ Subcommands:
|
|
|
99
101
|
show this help
|
|
100
102
|
|
|
101
103
|
Payload input (exec / send):
|
|
102
|
-
--base64 decode base64 (whitespace ignored) to strict UTF-8 text; send sends it raw (no \\n / \\xHH decoding), exec
|
|
103
|
-
--file <path> read a LOCAL UTF-8 file on
|
|
104
|
+
--base64 decode base64 (whitespace ignored) to strict UTF-8 text; send sends it raw (no \\n / \\xHH decoding), exec executes it as a command
|
|
105
|
+
--file <path> read a LOCAL UTF-8 file on this machine (not remote); send sends it raw, exec executes it as a command; strips BOM, rejects NUL; ~ is expanded
|
|
104
106
|
-- end option parsing: exec -- "-x" / send -- "-n" (payload starting with "-")
|
|
105
107
|
For complex quotes or shell-specific escaping, prefer --base64 / --file over guessing outer quotes.
|
|
106
108
|
|
|
@@ -122,6 +124,8 @@ Examples:
|
|
|
122
124
|
`,
|
|
123
125
|
zh: `term_cli 统一命令行工具:管理 SSH / 本地(wsl、pwsh、bash)/ 容器(docker exec)终端会话。
|
|
124
126
|
本机可启动的终端(WSL、Docker 容器、本地 shell)一律用 'local' 子命令。
|
|
127
|
+
终端会话绑定当前 opencode 会话;重启或退出 opencode 后旧终端会关闭,需重新 connect/local;这是正常生命周期,不是崩溃。
|
|
128
|
+
-n 默认 default;connect/local 遇到同名终端(包括 SSH 与 local 之间)会先关闭旧终端再尝试新连接,其中正在运行的命令会丢失,新连接失败也不会恢复旧终端。已有终端继续执行命令请用 exec;需要并行保留请用不同的 -n。
|
|
125
129
|
|
|
126
130
|
用法: term_cli <子命令> [参数]
|
|
127
131
|
|
|
@@ -134,11 +138,11 @@ Examples:
|
|
|
134
138
|
exec "<command>" [--base64 | --file <path>] [-n name] [-w]
|
|
135
139
|
在指定终端执行命令(默认:提交后立即返回、不等结果;-w 等到命令真正结束 —— 只适用于预期很快结束的命令;**禁止**对长时间运行 / 需要 stdin / 交互 / server / watch / tail -f / 构建 / 安装 / 扫描 / REPL 命令加 -w:只要命令没结束 -w 就会一直等,可能永久阻塞;这些命令请用默认模式,再用 status/read 轮询)
|
|
136
140
|
read [-n name] [-s buffer|history] [-l limit] [--head] [--includeCommand]
|
|
137
|
-
|
|
141
|
+
读终端输出:不传 -s 时,命令运行中返回当前 buffer 快照(可能不完整),空闲时返回 history;-s buffer 读实时 buffer;-s history 读已完成历史。read 不等待命令完成:先用 status 等完成,再读最终结果
|
|
138
142
|
send "<text>" [--base64 | --file <path>] [-n name]
|
|
139
143
|
发送文本/按键(\\xHH 任意十六进制字节、\\t Tab、\\r/\\n 回车、\\x03 Ctrl-C、\\x04 Ctrl-D、\\x1a Ctrl-Z、\\x1b Esc)
|
|
140
144
|
upload <local> <remote> [-n name] [--overwrite] [--mkdir]
|
|
141
|
-
通过 SFTP
|
|
145
|
+
通过 SFTP 把本机普通文件上传到 SSH 会话
|
|
142
146
|
local 支持 ~;remote 支持绝对路径、相对 home 路径与 ~/(由 SFTP 展开,不经过 shell;不支持 ~user);Windows 盘符路径必须用正斜杠(C:/dir/file)
|
|
143
147
|
目标已存在默认失败,需加 --overwrite;默认不建父目录,需加 --mkdir
|
|
144
148
|
仅支持 SSH 会话;目录与符号链接会被拒绝;单文件上限 256 MiB
|
|
@@ -152,8 +156,8 @@ Examples:
|
|
|
152
156
|
显示本帮助
|
|
153
157
|
|
|
154
158
|
载荷输入(exec / send):
|
|
155
|
-
--base64 解码 base64(忽略空白)为严格 UTF-8 文本;send 原样发送(不再解释 \\n / \\xHH 等转义),exec
|
|
156
|
-
--file <path>
|
|
159
|
+
--base64 解码 base64(忽略空白)为严格 UTF-8 文本;send 原样发送(不再解释 \\n / \\xHH 等转义),exec 作为命令执行
|
|
160
|
+
--file <path> 读取本机的 UTF-8 文件(不是远程文件);send 原样发送,exec 作为命令执行;剥 BOM、拒绝 NUL;支持 ~ 展开
|
|
157
161
|
-- 终止选项解析:exec -- "-x" / send -- "-n"(载荷以 "-" 开头时)
|
|
158
162
|
复杂引号或目标 shell 专属转义,优先用 --base64 / --file,不要在外层引号里猜转义。
|
|
159
163
|
|
|
@@ -287,8 +291,8 @@ Examples:
|
|
|
287
291
|
zh: "该 SSH 会话的 SFTP 不可用。请用 term_cli connect 重新连接后重试。",
|
|
288
292
|
},
|
|
289
293
|
transfer_err_timeout: {
|
|
290
|
-
en: "Transfer timed out ({seconds}s). The
|
|
291
|
-
zh: "传输超时({seconds}s
|
|
294
|
+
en: "Transfer timed out ({seconds}s). The transfer was aborted; the target file or a temporary file may be partially written.",
|
|
295
|
+
zh: "传输超时({seconds}s)。传输已中止;目标文件或临时文件可能残留部分内容。",
|
|
292
296
|
},
|
|
293
297
|
transfer_err_io: {
|
|
294
298
|
en: "Transfer failed: {reason}",
|
|
@@ -322,7 +326,7 @@ Examples:
|
|
|
322
326
|
st_type: { en: "type", zh: "类型" },
|
|
323
327
|
st_connected: { en: "connected", zh: "已连接" },
|
|
324
328
|
st_busy: { en: "busy", zh: "忙碌" },
|
|
325
|
-
st_pending: { en: "pending", zh: "
|
|
329
|
+
st_pending: { en: "pending", zh: "待读" },
|
|
326
330
|
st_bytes: { en: "bytes", zh: "字节" },
|
|
327
331
|
st_host: { en: "host", zh: "主机" },
|
|
328
332
|
st_program: { en: "program", zh: "程序" },
|
|
@@ -337,8 +341,8 @@ Examples:
|
|
|
337
341
|
zh: "危险命令,已拒绝执行。",
|
|
338
342
|
},
|
|
339
343
|
not_connected: {
|
|
340
|
-
en: "No active terminal.
|
|
341
|
-
zh: "
|
|
344
|
+
en: "No active terminal. Terminal sessions are tied to the current opencode session; after an opencode restart, reconnect with term_cli connect (SSH) or term_cli local.",
|
|
345
|
+
zh: "无活动终端。终端会话绑定当前 opencode 会话;重启 opencode 后请重新用 term_cli connect(SSH)或 term_cli local 建立。",
|
|
342
346
|
},
|
|
343
347
|
rejected_connect: {
|
|
344
348
|
en: "Connection rejected.",
|
|
@@ -349,8 +353,8 @@ Examples:
|
|
|
349
353
|
zh: "终端名非法。仅允许字母、数字、下划线、中划线、点(最多 64 字符),不得含路径分隔符。",
|
|
350
354
|
},
|
|
351
355
|
no_sessions: {
|
|
352
|
-
en: "No active terminals.",
|
|
353
|
-
zh: "
|
|
356
|
+
en: "No active terminals. Terminal sessions are tied to the current opencode session; after an opencode restart, reconnect with connect/local.",
|
|
357
|
+
zh: "当前没有活动的终端会话。终端会话绑定当前 opencode 会话;重启 opencode 后请重新 connect/local。",
|
|
354
358
|
},
|
|
355
359
|
connect_ok: {
|
|
356
360
|
en: "Connected: {user}@{host}:{port} (session {sid}, terminal {name})",
|
|
@@ -360,6 +364,14 @@ Examples:
|
|
|
360
364
|
en: "SSH connection failed",
|
|
361
365
|
zh: "SSH 连接失败",
|
|
362
366
|
},
|
|
367
|
+
connect_conflict: {
|
|
368
|
+
en: "Another terminal with this name was connected concurrently. Wait for it to finish, or retry with a different -n.",
|
|
369
|
+
zh: "同名终端正在并发连接。请等它完成,或改用不同的 -n 重试。",
|
|
370
|
+
},
|
|
371
|
+
connect_cancelled: {
|
|
372
|
+
en: "The terminal set was closed while connecting. Reconnect and retry.",
|
|
373
|
+
zh: "连接期间终端集合已被关闭,请重新连接后重试。",
|
|
374
|
+
},
|
|
363
375
|
unknown_error: {
|
|
364
376
|
en: "Unknown error",
|
|
365
377
|
zh: "未知错误",
|
|
@@ -400,6 +412,14 @@ Examples:
|
|
|
400
412
|
en: "Terminal history (first {n} / total {total})",
|
|
401
413
|
zh: "终端历史(前 {n} 条 / 共 {total} 条)",
|
|
402
414
|
},
|
|
415
|
+
read_busy_buffer_notice: {
|
|
416
|
+
en: "[read source=buffer busy=true]\nWarning: this is a partial buffer snapshot, not the final result; run status and wait for completion before reading the final result.",
|
|
417
|
+
zh: "[read source=buffer busy=true]\n警告:这是 buffer 部分快照,不是最终结果;请先用 status 等待命令完成后再读取最终结果。",
|
|
418
|
+
},
|
|
419
|
+
read_busy_history_notice: {
|
|
420
|
+
en: "[read source=history busy=true]\nWarning: history only contains completed commands; it does not include the current result.",
|
|
421
|
+
zh: "[read source=history busy=true]\n警告:history 只含已完成命令,不含当前结果。",
|
|
422
|
+
},
|
|
403
423
|
web_title: { en: "Terminal Records", zh: "终端记录" },
|
|
404
424
|
web_close: { en: "Close", zh: "关闭" },
|
|
405
425
|
web_loading: { en: "Loading...", zh: "加载中..." },
|
|
@@ -423,8 +443,8 @@ Examples:
|
|
|
423
443
|
zh: "未删除:该终端仍在活动(状态文件尚未陈旧),可能属于其他正在运行的 opencode 实例。",
|
|
424
444
|
},
|
|
425
445
|
web_delete_refused_active: {
|
|
426
|
-
en: "Not deleted: terminal is
|
|
427
|
-
zh: "
|
|
446
|
+
en: "Not deleted: this terminal is still in use by another online instance.",
|
|
447
|
+
zh: "未删除:该终端仍被其他在线实例占用。",
|
|
428
448
|
},
|
|
429
449
|
web_delete_blocked: {
|
|
430
450
|
en: "Cannot delete this terminal (still active or owned by another instance).",
|
package/dist/i18n.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,6DAA6D;AAE7D,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAOvD;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,GAAuB,EAAE,UAAgB;IACzD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,GAAG,CAAA;IAC5C,OAAO,UAAU,CAAA;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,UAAU,GAAS,IAAI;IACjD,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAA;AACpD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,UAAU,GAAS,IAAI;IAChD,OAAO,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,CAAA;AACxD,CAAC;AAED,kBAAkB;AAClB,MAAM,CAAC,MAAM,CAAC,GAAG;IACf,SAAS,EAAE;QACT,EAAE,EAAE,0LAA0L;QAC9L,EAAE,EAAE,6EAA6E;KAClF;IACD,OAAO,EAAE;QACP,EAAE,EAAE,cAAc;QAClB,EAAE,EAAE,YAAY;KACjB;IACD,cAAc,EAAE;QACd,EAAE,EAAE,iDAAiD;QACrD,EAAE,EAAE,iCAAiC;KACtC;IACD,gBAAgB,EAAE;QAChB,EAAE,EAAE,kCAAkC;QACtC,EAAE,EAAE,sBAAsB;KAC3B;IACD,wBAAwB,EAAE;QACxB,EAAE,EAAE,6BAA6B;QACjC,EAAE,EAAE,UAAU;KACf;IACD,iBAAiB,EAAE;QACjB,EAAE,EAAE,6IAA6I;QACjJ,EAAE,EAAE,uFAAuF;KAC5F;IACD,qBAAqB,EAAE;QACrB,EAAE,EAAE,gGAAgG;QACpG,EAAE,EAAE,6DAA6D;KAClE;IACD,QAAQ,EAAE;QACR,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAA;AA8TvD,eAAO,MAAM,eAAe,EAAE,MAirB7B,CAAA;eAGc,eAAe"}
|
package/dist/index.js
CHANGED
|
@@ -22,6 +22,7 @@ import { ensureServer } from "./server-manager.js";
|
|
|
22
22
|
import { startAgent } from "./agent.js";
|
|
23
23
|
import { writeSessionState, removeSessionState, removeAllSessionStates, writeSessionMeta } from "./session-store.js";
|
|
24
24
|
import { precheckBeforeExec } from "./precheck.js";
|
|
25
|
+
import { readBusyNotice } from "./read-output.js";
|
|
25
26
|
/** 默认终端名(不传 name 时用) */
|
|
26
27
|
const DEFAULT_NAME = "default";
|
|
27
28
|
/** 终端名合法字符(字母/数字/下划线/中划线/点),防止路径穿越 */
|
|
@@ -263,6 +264,47 @@ function cleanupAllSessions(sessionID) {
|
|
|
263
264
|
}
|
|
264
265
|
refreshAgent();
|
|
265
266
|
}
|
|
267
|
+
/**
|
|
268
|
+
* 同名终端在 SSH 与 local 之间互斥:connect 与 local 共用 name 查找,
|
|
269
|
+
* 若旧终端留在另一张 map 中,resolveSession 会优先取 SSH,导致 read/exec 落到旧会话。
|
|
270
|
+
* 连接新终端前清掉另一 transport 的同名会话(含 history/state),保持“一个 name 一个终端”。
|
|
271
|
+
* @param sessionID opencode 会话 ID
|
|
272
|
+
* @param name 终端名
|
|
273
|
+
* @param keep 即将建立的 transport
|
|
274
|
+
*/
|
|
275
|
+
function closeConflictingTransport(sessionID, name, keep) {
|
|
276
|
+
if (keep === "ssh") {
|
|
277
|
+
if (getLocalSession(sessionID, name))
|
|
278
|
+
cleanupLocalSession(sessionID, name);
|
|
279
|
+
else {
|
|
280
|
+
// 目录名有前缀冲突:local 终端 X 用 local-X,而 SSH 终端 local-X 也用同一目录;
|
|
281
|
+
// 若 live SSH 终端叫 local-X,不能把它正在写入的历史目录当成 stale local 历史删掉。
|
|
282
|
+
try {
|
|
283
|
+
if (!getSession(sessionID, `local-${name}`)) {
|
|
284
|
+
rmSync(join(cacheRoot(), sessionID, `local-${name}`), { recursive: true, force: true });
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
/* 忽略 */
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
else if (getSession(sessionID, name)) {
|
|
293
|
+
cleanupSession(sessionID, name);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
// 反向前缀冲突:local 终端 X 的历史目录是 local-X;连接 local 终端 local-X 时不能误删 X 的历史。
|
|
297
|
+
const localOwner = name.startsWith("local-") ? getLocalSession(sessionID, name.slice(6)) : undefined;
|
|
298
|
+
if (!localOwner) {
|
|
299
|
+
try {
|
|
300
|
+
rmSync(join(cacheRoot(), sessionID, name), { recursive: true, force: true });
|
|
301
|
+
}
|
|
302
|
+
catch {
|
|
303
|
+
/* 忽略 */
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
266
308
|
// 发送前语法预检已抽到 ./precheck.ts,供 term_exec 与 web run-exec 共用。
|
|
267
309
|
export const OpenCodeSshTool = async () => {
|
|
268
310
|
// 父子会话关系(sessionID → parentID;根的 parentID 为 undefined)
|
|
@@ -388,6 +430,8 @@ export const OpenCodeSshTool = async () => {
|
|
|
388
430
|
old.close();
|
|
389
431
|
map.delete(name);
|
|
390
432
|
}
|
|
433
|
+
// 同名 local 终端若仍存在,会与 SSH 同名会话冲突(read/exec 优先命中 SSH),先清掉。
|
|
434
|
+
closeConflictingTransport(ctx.sessionID, name, "ssh");
|
|
391
435
|
const session = new SshSession(ctx.sessionID, new SessionHistory(join(cacheRoot(), ctx.sessionID), name, cfg.history.maxMessages), name, toolLang, interruptProbeIntervalMs);
|
|
392
436
|
const result = await session.connect({ host, user, port, password: values.password });
|
|
393
437
|
log.tool("ssh_connect", { sessionID: ctx.sessionID, name, host, user, port: port ?? 22 });
|
|
@@ -395,6 +439,18 @@ export const OpenCodeSshTool = async () => {
|
|
|
395
439
|
session.close();
|
|
396
440
|
return `${tr("connect_title_fail", toolLang)}: ${result.error ?? tr("unknown_error", toolLang)}`;
|
|
397
441
|
}
|
|
442
|
+
// await 期间可能已被 disconnect 全部/session.deleted 摘掉 map;重新取,避免写入孤儿 Map。
|
|
443
|
+
const liveMap = getSessionMap(ctx.sessionID);
|
|
444
|
+
if (!liveMap) {
|
|
445
|
+
session.close();
|
|
446
|
+
return tr("connect_cancelled", toolLang);
|
|
447
|
+
}
|
|
448
|
+
map = liveMap;
|
|
449
|
+
// cleanup 与 await 之间可能被并发 local 同名连接抢先;完成后再次确认,避免两张 map 同时存在。
|
|
450
|
+
if (getLocalSession(ctx.sessionID, name)) {
|
|
451
|
+
session.close();
|
|
452
|
+
return tr("connect_conflict", toolLang);
|
|
453
|
+
}
|
|
398
454
|
map.set(name, session);
|
|
399
455
|
hookBusyState(session, ctx.sessionID, name);
|
|
400
456
|
syncSessionState(ctx.sessionID, name, "connect");
|
|
@@ -421,6 +477,8 @@ export const OpenCodeSshTool = async () => {
|
|
|
421
477
|
old.close();
|
|
422
478
|
map.delete(name);
|
|
423
479
|
}
|
|
480
|
+
// 同名 SSH 终端若仍存在,会与 local 同名会话冲突(read/exec 优先命中 SSH),先清掉。
|
|
481
|
+
closeConflictingTransport(ctx.sessionID, name, "local");
|
|
424
482
|
const session = new LocalSession(ctx.sessionID, new SessionHistory(join(cacheRoot(), ctx.sessionID), `local-${name}`, cfg.history.maxMessages), name, toolLang, interruptProbeIntervalMs);
|
|
425
483
|
const result = await session.connect({ command, cwd: values.cwd });
|
|
426
484
|
log.tool("local_connect", { sessionID: ctx.sessionID, name, command });
|
|
@@ -428,6 +486,18 @@ export const OpenCodeSshTool = async () => {
|
|
|
428
486
|
session.close();
|
|
429
487
|
return `${tr("local_connect_title_fail", toolLang)}: ${result.error ?? tr("unknown_error", toolLang)}`;
|
|
430
488
|
}
|
|
489
|
+
// await 期间可能已被 disconnect 全部/session.deleted 摘掉 map;重新取,避免写入孤儿 Map。
|
|
490
|
+
const liveMap = getLocalSessionMap(ctx.sessionID);
|
|
491
|
+
if (!liveMap) {
|
|
492
|
+
session.close();
|
|
493
|
+
return tr("connect_cancelled", toolLang);
|
|
494
|
+
}
|
|
495
|
+
map = liveMap;
|
|
496
|
+
// cleanup 与 await 之间可能被并发 SSH 同名连接抢先;完成后再次确认,避免两张 map 同时存在。
|
|
497
|
+
if (getSession(ctx.sessionID, name)) {
|
|
498
|
+
session.close();
|
|
499
|
+
return tr("connect_conflict", toolLang);
|
|
500
|
+
}
|
|
431
501
|
map.set(name, session);
|
|
432
502
|
hookBusyState(session, ctx.sessionID, name);
|
|
433
503
|
syncSessionState(ctx.sessionID, name, "local");
|
|
@@ -515,17 +585,40 @@ export const OpenCodeSshTool = async () => {
|
|
|
515
585
|
return tr("submitted", toolLang);
|
|
516
586
|
return result.ok ? result.output : result.error ?? tr("exec_failed", toolLang);
|
|
517
587
|
}
|
|
518
|
-
/** read
|
|
588
|
+
/** read:读取终端输出(未显式 -s 时,运行中读只读快照、空闲读 history) */
|
|
519
589
|
async function doRead(args, ctx) {
|
|
520
590
|
const { values } = parseArgs({ args, options: { name: { type: "string", short: "n" }, source: { type: "string", short: "s" }, limit: { type: "string", short: "l" }, head: { type: "boolean" }, includeCommand: { type: "boolean" } }, allowPositionals: true });
|
|
521
591
|
const session = resolveSession(ctx.sessionID, values.name);
|
|
522
592
|
if (!session)
|
|
523
593
|
return tr("not_connected", toolLang);
|
|
524
|
-
|
|
594
|
+
// 无内容日志:只记路由键/终端类型,供排查跨会话命中;不记录 buffer/命令内容。
|
|
595
|
+
const readStatus = session.getStatus();
|
|
596
|
+
log.tool("term_read", {
|
|
597
|
+
sessionID: ctx.sessionID,
|
|
598
|
+
name: values.name ?? DEFAULT_NAME,
|
|
599
|
+
kind: "host" in readStatus ? "ssh" : "local",
|
|
600
|
+
source: values.source,
|
|
601
|
+
busy: readStatus.busy,
|
|
602
|
+
});
|
|
603
|
+
// 显式 -s 非 buffer 的值仍按旧的 history 分支处理(不因 busy 改走快照)
|
|
604
|
+
const explicitSource = values.source === undefined ? undefined : values.source === "buffer" ? "buffer" : "history";
|
|
605
|
+
const busy = session.getStatus().busy === true;
|
|
606
|
+
// 未显式指定来源:运行中给 buffer 只读快照(不消费、不代表最终结果),空闲保持旧的 history 默认
|
|
607
|
+
const source = explicitSource ?? (busy ? "buffer" : "history");
|
|
525
608
|
if (source === "buffer") {
|
|
526
|
-
|
|
527
|
-
|
|
609
|
+
if (explicitSource === "buffer") {
|
|
610
|
+
// 显式 -s buffer 保持旧语义:readBuffer 会消费缓冲,命中完成标记时完成命令(写 history/done/busy)
|
|
611
|
+
const r = await session.readBuffer();
|
|
612
|
+
// 完成标记已收尾时不再提示"部分快照";仍在运行才提示(读取前后都可能变化,按调用后状态为准)
|
|
613
|
+
return readBusyNotice("buffer", session.getStatus().busy === true, toolLang) + r.output;
|
|
614
|
+
}
|
|
615
|
+
// 未显式指定:只读快照,绝不消费;绝不调用 _completeRunning
|
|
616
|
+
const r = await session.peekBuffer();
|
|
617
|
+
if (!r.ok)
|
|
618
|
+
return r.error ?? "";
|
|
619
|
+
return readBusyNotice("buffer", busy, toolLang) + r.output;
|
|
528
620
|
}
|
|
621
|
+
const notice = readBusyNotice("history", busy, toolLang);
|
|
529
622
|
const history = session.getHistory();
|
|
530
623
|
const all = history.getPairs();
|
|
531
624
|
const limit = Math.max(1, parseInt(values.limit ?? "10", 10) || 10);
|
|
@@ -539,7 +632,7 @@ export const OpenCodeSshTool = async () => {
|
|
|
539
632
|
const text = parts.join("\n");
|
|
540
633
|
const url = await resolveHttpUrl();
|
|
541
634
|
const browserLine = url ? tr("browser_full_record", toolLang).replace("{url}", url) : tr(httpUnavailableKey(), toolLang);
|
|
542
|
-
return `${tr(direction === "tail" ? "history_title" : "history_title_head", toolLang).replace("{n}", String(selected.length)).replace("{total}", String(all.length))}\n${text}${browserLine}`;
|
|
635
|
+
return `${notice}${tr(direction === "tail" ? "history_title" : "history_title_head", toolLang).replace("{n}", String(selected.length)).replace("{total}", String(all.length))}\n${text}${browserLine}`;
|
|
543
636
|
}
|
|
544
637
|
/** send:发送文本/按键到终端 */
|
|
545
638
|
async function doSend(args, ctx) {
|
|
@@ -854,6 +947,8 @@ export const OpenCodeSshTool = async () => {
|
|
|
854
947
|
return HELP_TEXT;
|
|
855
948
|
// 统一按根会话 ID 路由(主子会话共享终端)
|
|
856
949
|
const rootID = await findRoot(ctx.sessionID);
|
|
950
|
+
if (rootID !== ctx.sessionID)
|
|
951
|
+
log.info(`cli 路由 caller=${ctx.sessionID} root=${rootID} cmd=${cmd}`);
|
|
857
952
|
const rootCtx = { ...ctx, sessionID: rootID };
|
|
858
953
|
switch (cmd) {
|
|
859
954
|
case "connect": return doConnect(rest, rootCtx);
|