@hyzyn/dsh-tty 0.18.2 → 0.19.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 +85 -34
- package/README.md +65 -29
- package/client.js +51 -37
- package/lib/index.d.ts +367 -1
- package/lib/index.js +420 -138
- package/lib/index.js.map +1 -1
- package/lib/known-hosts.d.ts +7 -1
- package/lib/known-hosts.js +26 -12
- package/lib/known-hosts.js.map +1 -1
- package/lib/probe.d.ts +2 -2
- package/lib/probe.js +8 -36
- package/lib/probe.js.map +1 -1
- package/lib/sftp.d.ts +63 -10
- package/lib/sftp.js +244 -44
- package/lib/sftp.js.map +1 -1
- package/lib/shell-integration.js +33 -13
- package/lib/shell-integration.js.map +1 -1
- package/lib/ssh.d.ts +21 -7
- package/lib/ssh.js +114 -19
- package/lib/ssh.js.map +1 -1
- package/lib/tunnels.js +67 -13
- package/lib/tunnels.js.map +1 -1
- package/package.json +7 -2
- package/scripts/build-client.mjs +30 -0
- package/scripts/integration.mjs +1691 -0
- package/scripts/lib/test-sshd.mjs +314 -0
- package/scripts/live.mjs +68 -0
- package/scripts/preview/harness.html +75 -0
- package/scripts/preview/harness.js +875 -0
- package/scripts/preview/mock-host.js +365 -0
- package/scripts/preview.mjs +502 -0
- package/scripts/probe-route-smoke.mjs +111 -0
- package/scripts/probe-smoke.mjs +143 -0
- package/scripts/probe.mjs +240 -0
- package/scripts/sftplimits-smoke.mjs +92 -0
- package/scripts/ssh-smoke.mjs +593 -0
- package/scripts/tui-smoke.mjs +112 -0
- package/scripts/windows-smoke.mjs +179 -0
package/lib/known-hosts.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import type { HostKeyRecord } from './ssh.js';
|
|
2
2
|
/**
|
|
3
3
|
* 解析 known_hosts 文本。candidates 用于还原 hashed 条目(传连接簿里的
|
|
4
|
-
* 主机名即可;无 hashed 条目时可省略)。返回按 host:port
|
|
4
|
+
* 主机名即可;无 hashed 条目时可省略)。返回按 host:port 聚合的记录
|
|
5
|
+
* (同机的全部指纹进同一条记录的 fingerprints,保序去重)。
|
|
5
6
|
*/
|
|
6
7
|
export declare function parseKnownHosts(text: string, candidates?: string[]): HostKeyRecord[];
|
|
8
|
+
/** 同 parseKnownHosts,另带 truncated 标记(导入 >500 条时 UI 明确提示有遗漏,不再静默)。 */
|
|
9
|
+
export declare function parseKnownHostsDetailed(text: string, candidates?: string[]): {
|
|
10
|
+
entries: HostKeyRecord[];
|
|
11
|
+
truncated: boolean;
|
|
12
|
+
};
|
package/lib/known-hosts.js
CHANGED
|
@@ -13,10 +13,13 @@
|
|
|
13
13
|
* 反解,仅在调用方提供 candidates(连接簿里的主机名及其 [host]:port
|
|
14
14
|
* 变体)时按候选匹配还原;
|
|
15
15
|
* - `@cert-authority` / `@revoked` 行与注释跳过;无法识别的 keytype 跳过;
|
|
16
|
-
* - 同 host:port
|
|
17
|
-
*
|
|
16
|
+
* - 同 host:port 的多条(如 rsa + ed25519 两种类型)**并入同一条记录的多
|
|
17
|
+
* 指纹集合**(0.19.0 起):ssh2 优先协商 ed25519,只留第一条时 RSA 在前
|
|
18
|
+
* 的老机器导入后必然假 MITM 告警;单机指纹上限 8。
|
|
18
19
|
*/
|
|
19
20
|
import { createHash, createHmac } from 'node:crypto';
|
|
21
|
+
/** 单个 host:port 保留的指纹上限(server 的 keytype 有限,正常 ≤4;防异常输入撑爆)。 */
|
|
22
|
+
const MAX_FINGERPRINTS_PER_HOST = 8;
|
|
20
23
|
const KEY_TYPE_RE = /^(ssh-(rsa|dss)|ecdsa-sha2-[a-z0-9-]+|ssh-ed25519|sk-(rsa|ecdsa-sha2-[a-z0-9-]+)@openssh\.com)$/;
|
|
21
24
|
/** hashed 条目:|1|<base64 salt>|<base64 hmac> */
|
|
22
25
|
const HASHED_RE = /^\|1\|([A-Za-z0-9+/=]+)\|([A-Za-z0-9+/=]+)$/;
|
|
@@ -81,12 +84,17 @@ function matchHashedToken(token, candidates) {
|
|
|
81
84
|
}
|
|
82
85
|
/**
|
|
83
86
|
* 解析 known_hosts 文本。candidates 用于还原 hashed 条目(传连接簿里的
|
|
84
|
-
* 主机名即可;无 hashed 条目时可省略)。返回按 host:port
|
|
87
|
+
* 主机名即可;无 hashed 条目时可省略)。返回按 host:port 聚合的记录
|
|
88
|
+
* (同机的全部指纹进同一条记录的 fingerprints,保序去重)。
|
|
85
89
|
*/
|
|
86
90
|
export function parseKnownHosts(text, candidates = []) {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
91
|
+
return parseKnownHostsDetailed(text, candidates).entries;
|
|
92
|
+
}
|
|
93
|
+
/** 同 parseKnownHosts,另带 truncated 标记(导入 >500 条时 UI 明确提示有遗漏,不再静默)。 */
|
|
94
|
+
export function parseKnownHostsDetailed(text, candidates = []) {
|
|
95
|
+
const byKey = new Map();
|
|
96
|
+
let truncated = false;
|
|
97
|
+
outer: for (const rawLine of text.split(/\r?\n/)) {
|
|
90
98
|
const line = rawLine.trim();
|
|
91
99
|
if (line === '' || line.startsWith('#'))
|
|
92
100
|
continue;
|
|
@@ -116,14 +124,20 @@ export function parseKnownHosts(text, candidates = []) {
|
|
|
116
124
|
}
|
|
117
125
|
for (const { host, port } of resolved) {
|
|
118
126
|
const key = `${host}:${port}`;
|
|
119
|
-
|
|
127
|
+
const existing = byKey.get(key);
|
|
128
|
+
if (existing === undefined) {
|
|
129
|
+
if (byKey.size >= 500) {
|
|
130
|
+
truncated = true;
|
|
131
|
+
break outer;
|
|
132
|
+
}
|
|
133
|
+
byKey.set(key, { host, port, fingerprints: [fingerprint] });
|
|
120
134
|
continue;
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
135
|
+
}
|
|
136
|
+
if (!existing.fingerprints.includes(fingerprint) && existing.fingerprints.length < MAX_FINGERPRINTS_PER_HOST) {
|
|
137
|
+
existing.fingerprints.push(fingerprint);
|
|
138
|
+
}
|
|
125
139
|
}
|
|
126
140
|
}
|
|
127
|
-
return
|
|
141
|
+
return { entries: [...byKey.values()], truncated };
|
|
128
142
|
}
|
|
129
143
|
//# sourceMappingURL=known-hosts.js.map
|
package/lib/known-hosts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"known-hosts.js","sourceRoot":"","sources":["../src/known-hosts.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"known-hosts.js","sourceRoot":"","sources":["../src/known-hosts.ts"],"names":[],"mappings":"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"}
|
package/lib/probe.d.ts
CHANGED
|
@@ -16,8 +16,8 @@ export interface ProbeResult {
|
|
|
16
16
|
state: 'unknown' | 'matched' | 'recorded' | 'mismatch';
|
|
17
17
|
/** 服务端 host key 的 sha256 指纹(hostHash:'sha256' 下 hostVerifier 收到的原样值)。 */
|
|
18
18
|
fingerprint: string;
|
|
19
|
-
/**
|
|
20
|
-
known?: string;
|
|
19
|
+
/** 已记录指纹集合(mismatch 时展示对照;0.19.0 起一机多指纹)。 */
|
|
20
|
+
known?: string[];
|
|
21
21
|
/** mismatch 时的完整指引文案(与 spawnSsh 一致)。 */
|
|
22
22
|
error?: string;
|
|
23
23
|
};
|
package/lib/probe.js
CHANGED
|
@@ -22,46 +22,18 @@
|
|
|
22
22
|
*/
|
|
23
23
|
import { Client } from 'ssh2';
|
|
24
24
|
import { connect as netConnect } from 'node:net';
|
|
25
|
-
import { buildConnectConfig, sshTarget } from './ssh.js';
|
|
25
|
+
import { buildConnectConfig, classifyError, sshTarget } from './ssh.js';
|
|
26
26
|
/** TCP 预检超时(毫秒):DNS 解析 + 建连。 */
|
|
27
27
|
export const PROBE_TCP_TIMEOUT_MS = 6_000;
|
|
28
28
|
/** ssh2 握手/认证阶段超时(毫秒);覆盖 buildConnectConfig 的 readyTimeout。 */
|
|
29
29
|
export const PROBE_AUTH_TIMEOUT_MS = 8_000;
|
|
30
30
|
/** 把底层错误分类为人类可读诊断;原文保留在返回串里便于对照排查。 */
|
|
31
|
-
|
|
32
|
-
if (message === 'Host key verification failed') {
|
|
33
|
-
return '主机密钥校验失败(TOFU 不匹配,见 hostkey 指引)';
|
|
34
|
-
}
|
|
35
|
-
if (message.includes('All configured authentication methods failed')) {
|
|
36
|
-
return '认证被拒绝:所有认证方式均失败(用户名/密码/密钥是否正确,或服务端是否允许该认证方式)';
|
|
37
|
-
}
|
|
38
|
-
if (message.includes('Timed out')) {
|
|
39
|
-
return '超时:主机无响应或认证协商超时(检查地址 / 端口 / 防火墙 / 网络)';
|
|
40
|
-
}
|
|
41
|
-
const lower = message.toLowerCase();
|
|
42
|
-
if (lower.includes('econnrefused'))
|
|
43
|
-
return '连接被拒绝(ECONNREFUSED):端口未监听或服务未启动';
|
|
44
|
-
if (lower.includes('enetunreach'))
|
|
45
|
-
return '网络不可达(ENETUNREACH):路由不通或主机离线';
|
|
46
|
-
if (lower.includes('ehostunreach'))
|
|
47
|
-
return '主机不可达(EHOSTUNREACH)';
|
|
48
|
-
if (lower.includes('eai_again') || lower.includes('eai_noname') || lower.includes('enotfound'))
|
|
49
|
-
return 'DNS 解析失败:主机名无法解析';
|
|
50
|
-
if (lower.includes('getaddrinfo'))
|
|
51
|
-
return 'DNS 解析失败:主机名无法解析';
|
|
52
|
-
if (lower.includes('unable to exchange encryption keys') || lower.includes('encryption') || lower.includes('kex')) {
|
|
53
|
-
return '密钥交换失败:服务端可能不是 SSH 服务,或加密算法不兼容';
|
|
54
|
-
}
|
|
55
|
-
if (lower.includes('keepalive'))
|
|
56
|
-
return '连接保活超时(keepalive)';
|
|
57
|
-
if (lower.includes('protocol'))
|
|
58
|
-
return '协议错误:' + message;
|
|
59
|
-
return message;
|
|
60
|
-
}
|
|
61
|
-
/** 与 spawnSsh 的 applyHostKeyPolicy 一致的 TOFU 指引文案。 */
|
|
31
|
+
/** 与 spawnSsh 的 applyHostKeyPolicy 一致的 TOFU 指引文案(多指纹集合版)。 */
|
|
62
32
|
function mismatchMessage(target, host, port, known, current) {
|
|
63
|
-
|
|
64
|
-
|
|
33
|
+
const shown = known.slice(0, 3).map((f) => `sha256:${f}`).join(' / ');
|
|
34
|
+
const more = known.length > 3 ? ` 等 ${String(known.length)} 把` : '';
|
|
35
|
+
return (`SSH 主机密钥指纹变更:${target} 已记录 ${shown}${more},本次为 sha256:${current}。` +
|
|
36
|
+
'可能是主机重装或换钥匙,也可能是中间人(MITM)冒充;确认安全后,到 插件配置 → 终端面板 → SSH 主机密钥记录 删除该主机再重连。');
|
|
65
37
|
}
|
|
66
38
|
/** 收集 hostVerifier 收到的指纹(ssh2 可能对多 host key 调用多次,取最后一次)。 */
|
|
67
39
|
function makeHostKeyVerifier(options) {
|
|
@@ -72,7 +44,7 @@ function makeHostKeyVerifier(options) {
|
|
|
72
44
|
return (hash) => {
|
|
73
45
|
seen = hash;
|
|
74
46
|
const known = store?.get(spec.host, port);
|
|
75
|
-
if (known === undefined) {
|
|
47
|
+
if (known === undefined || known.length === 0) {
|
|
76
48
|
if (store !== undefined) {
|
|
77
49
|
// 完整 TOFU:新指纹当场持久化(与 spawnSsh 的 hostVerifier 同语义)
|
|
78
50
|
store.record(spec.host, port, hash);
|
|
@@ -84,7 +56,7 @@ function makeHostKeyVerifier(options) {
|
|
|
84
56
|
}
|
|
85
57
|
return true;
|
|
86
58
|
}
|
|
87
|
-
if (known
|
|
59
|
+
if (known.includes(hash)) {
|
|
88
60
|
onResult({ state: 'matched', fingerprint: hash, known });
|
|
89
61
|
return true;
|
|
90
62
|
}
|
package/lib/probe.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"probe.js","sourceRoot":"","sources":["../src/probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAE7B,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"probe.js","sourceRoot":"","sources":["../src/probe.ts"],"names":[],"mappings":"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"}
|
package/lib/sftp.d.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import type { ReadStream, WriteStream } from 'ssh2';
|
|
2
2
|
import type { HostKeyStore, SshSpec } from './ssh.js';
|
|
3
|
+
/**
|
|
4
|
+
* remove 的路径护栏(0.19.0,纵深防御):递归删除按账号权限生效、无二次确认、
|
|
5
|
+
* 无干跑——根目录 / home / 纯相对跳跃段一次调用就是整树删除。挂在 SftpManager
|
|
6
|
+
* 层而非只在 agent 工具层,loopback 上的构造请求(面板路由透传原始 path)同样
|
|
7
|
+
* 被拦;「必然是误操作」的形态才拒,具体某个子目录仍由调用方负责。
|
|
8
|
+
*/
|
|
9
|
+
export declare function assertRemovableRemotePath(raw: string): string;
|
|
3
10
|
export interface SftpEntryInfo {
|
|
4
11
|
name: string;
|
|
5
12
|
isDir: boolean;
|
|
@@ -46,8 +53,14 @@ export interface SftpDownload {
|
|
|
46
53
|
}
|
|
47
54
|
export interface SftpUpload {
|
|
48
55
|
stream: WriteStream;
|
|
49
|
-
/** 写入完成(流 close
|
|
56
|
+
/** 写入完成(流 close,覆盖写含 rename 落盘)resolve,写入失败 reject——路由 await 它再回包。 */
|
|
50
57
|
done: Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* 实际写入的路径:覆盖写 = 同目录临时分片(`.dsh-part-<uuid>`,成功后 rename
|
|
60
|
+
* 覆盖目标);追加写 = 目标本身。取消 / 中断后的半截清理一律按它来——
|
|
61
|
+
* 不能删目标(覆盖写的目标还是原文件,删了就是毁数据)。
|
|
62
|
+
*/
|
|
63
|
+
writePath: string;
|
|
51
64
|
}
|
|
52
65
|
/**
|
|
53
66
|
* 传输任务(0.12.0):双栏 ⇨/⇦ 的服务端直传任务化——start 立刻返回 id,
|
|
@@ -108,29 +121,68 @@ export declare class SftpManager {
|
|
|
108
121
|
/**
|
|
109
122
|
* 删除文件 / 目录。目录不带 recursive 时走 rmdir(非空会明确报错);
|
|
110
123
|
* 带 recursive 时 readdir 深度优先逐个 unlink/rmdir。符号链接一律按
|
|
111
|
-
* 文件 unlink
|
|
124
|
+
* 文件 unlink(不跟随)。入口过 assertRemovableRemotePath 护栏(根目录 /
|
|
125
|
+
* home / 相对跳跃段直接拒绝——agent 工具与面板 HTTP 路由共用本方法)。
|
|
112
126
|
*/
|
|
113
127
|
remove(spec: SshSpec, path: string, recursive: boolean): Promise<void>;
|
|
114
|
-
/**
|
|
115
|
-
|
|
116
|
-
|
|
128
|
+
/**
|
|
129
|
+
* 下载:返回只读流(路由负责 pipe 到 HTTP 响应与销毁)。
|
|
130
|
+
* 先 stat 探测(0.19.0):「路径不存在 / 是目录」在这里变成明确报错——
|
|
131
|
+
* 此前 stat 失败被吞、路由已 writeHead(200),客户端见 res.ok===true 后以
|
|
132
|
+
* TypeError 断流收场,状态行只剩「Failed to fetch」这类无信息文案。
|
|
133
|
+
*/
|
|
134
|
+
openDownload(spec: SshSpec, path: string, options?: {
|
|
135
|
+
offset?: number;
|
|
136
|
+
}): Promise<SftpDownload>;
|
|
137
|
+
/**
|
|
138
|
+
* 上传:返回可写流与完成信号(路由 pipe 请求体,await done 后回包)。
|
|
139
|
+
*
|
|
140
|
+
* 覆盖写原子化(0.19.0):`flags:'w'` 直接写目标会先截断原文件,途中任何
|
|
141
|
+
* 失败(磁盘满 / 权限变化 / 通道断 / 客户端断连)都留下「原文件被毁 + 半截
|
|
142
|
+
* 新文件」。改为写同目录临时分片 `.dsh-part-<uuid>`,流正常收尾后 posix-rename
|
|
143
|
+
* (不支持该扩展的 server 退 unlink+rename)覆盖目标;失败 / 取消统一清理
|
|
144
|
+
* 分片,原文件全程不受影响。done 只在分片真正落盘(rename 成功)后 resolve。
|
|
145
|
+
*/
|
|
117
146
|
openUpload(spec: SshSpec, path: string, append?: boolean): Promise<SftpUpload>;
|
|
147
|
+
/**
|
|
148
|
+
* 同目录崩溃残留分片回收:`<basename>.dsh-part-*` 且 mtime 超过阈值才删
|
|
149
|
+
* (并发上传的新分片 mtime 很新,不会被误删);一切失败静默。
|
|
150
|
+
*/
|
|
151
|
+
private reapStaleParts;
|
|
152
|
+
/** WriteStream 的 done Promise(close 即 resolve,error reject);onClose 钩子供覆盖写路径塞落盘逻辑。 */
|
|
153
|
+
private streamDone;
|
|
154
|
+
/**
|
|
155
|
+
* 覆盖落盘:优先 posix-rename@openssh.com(原子覆盖,OpenSSH 系全支持);
|
|
156
|
+
* server 不支持该扩展时退 unlink+rename——窗口极小(新内容已在分片里完整
|
|
157
|
+
* 落盘),不会出现「截断后写一半」的旧问题。
|
|
158
|
+
*/
|
|
159
|
+
private renameOverwrite;
|
|
118
160
|
/**
|
|
119
161
|
* 本机文件 / 目录 → 远程(双栏「→ 传输」)。目录递归建目录后逐个上传;
|
|
120
|
-
* 同名文件直接覆盖(openUpload
|
|
121
|
-
* signal
|
|
162
|
+
* 同名文件直接覆盖(openUpload 走临时分片 + rename,见其注释)。不经过
|
|
163
|
+
* 浏览器,字节不出宿主进程。signal 中止时销毁读写流并清理半截的远程
|
|
164
|
+
* 分片(删除失败只记日志)。
|
|
165
|
+
*
|
|
166
|
+
* 符号链接:根路径按用户显式选择跟随(fsStat);子项一律跳过(含指到
|
|
167
|
+
* 文件的链接)——`current -> .` 这类环会让递归永不收敛,直到 ENAMETOOLONG
|
|
168
|
+
* 或磁盘灌满;depth 兜底只为防未来的回归,不是主防线。
|
|
122
169
|
*/
|
|
123
|
-
uploadFromLocal(spec: SshSpec, localPath: string, remotePath: string, options?: SftpTransferOptions): Promise<void>;
|
|
170
|
+
uploadFromLocal(spec: SshSpec, localPath: string, remotePath: string, options?: SftpTransferOptions, depth?: number): Promise<void>;
|
|
124
171
|
/**
|
|
125
172
|
* 远程文件 / 目录 → 本机(双栏「← 传输」)。目录递归建本地目录后逐个下载;
|
|
126
|
-
* 同名文件直接覆盖('w'
|
|
173
|
+
* 同名文件直接覆盖('w' 写流)。符号链接不作为目录下钻(readdir attrs 的
|
|
174
|
+
* isDirectory 跟随 isSymbolicLink 才算目录)——防 `current -> .` 环;根路径
|
|
175
|
+
* 是链接时按文件下载(读取跟随目标,指向目录则传输报错)。
|
|
127
176
|
* signal 中止时销毁读写流并删除半截的本机文件(删除失败只记日志)。
|
|
128
177
|
*/
|
|
129
|
-
downloadToLocal(spec: SshSpec, remotePath: string, localPath: string, options?: SftpTransferOptions): Promise<void>;
|
|
178
|
+
downloadToLocal(spec: SshSpec, remotePath: string, localPath: string, options?: SftpTransferOptions, depth?: number): Promise<void>;
|
|
130
179
|
/**
|
|
131
180
|
* 带字节计数与取消感知的 pipe:source→sink 之间插一个 PassThrough 只做
|
|
132
181
|
* 「数了就转发」;取消时 destroy 它——pipeline 随即结束并销毁两端流,
|
|
133
182
|
* 不留悬挂的 SFTP 句柄,也不会误报成「传输失败」。
|
|
183
|
+
* abort 监听器在管道收尾时摘除:signal 是整个任务共用的(每个文件都挂
|
|
184
|
+
* 一个),不摘的话 N 文件 = N 个常驻监听器,取消时 N 个已结束的 meter
|
|
185
|
+
* 齐刷刷被 destroy(Node 会报 MaxListenersExceededWarning)。
|
|
134
186
|
*/
|
|
135
187
|
private pipeCounted;
|
|
136
188
|
/** 删远端文件(取消后的半截清理):失败只记日志,不影响取消本身。 */
|
|
@@ -139,6 +191,7 @@ export declare class SftpManager {
|
|
|
139
191
|
* 预扫描总字节数(直传进度分母):目录递归累加文件大小,只数「源头一侧」
|
|
140
192
|
* ——up 数本机、down 数远程(对侧尚未创建,数不到也不该数)。目的是让
|
|
141
193
|
* 进度条有真实百分比:纯统计(不搬运),单项失败按 0 计、不阻断传输。
|
|
194
|
+
* 与传输本体同一套符号链接规则(子项跳过)+ 取消检查——统计也会走环。
|
|
142
195
|
*/
|
|
143
196
|
private estimateBytes;
|
|
144
197
|
/** 开一个可取消的直传任务(路由 /transfer 的 start 分支)。 */
|