enterprise-ssh-mcp-server 0.3.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.md +266 -0
- package/dist/buffers.d.ts +42 -0
- package/dist/buffers.js +123 -0
- package/dist/buffers.js.map +1 -0
- package/dist/env-profiles.d.ts +62 -0
- package/dist/env-profiles.js +417 -0
- package/dist/env-profiles.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1805 -0
- package/dist/index.js.map +1 -0
- package/dist/remote-edit.d.ts +91 -0
- package/dist/remote-edit.js +426 -0
- package/dist/remote-edit.js.map +1 -0
- package/dist/remote-path.d.ts +4 -0
- package/dist/remote-path.js +24 -0
- package/dist/remote-path.js.map +1 -0
- package/dist/runtime-config.d.ts +36 -0
- package/dist/runtime-config.js +130 -0
- package/dist/runtime-config.js.map +1 -0
- package/dist/session-registry.d.ts +9 -0
- package/dist/session-registry.js +35 -0
- package/dist/session-registry.js.map +1 -0
- package/dist/sftp-ops.d.ts +46 -0
- package/dist/sftp-ops.js +306 -0
- package/dist/sftp-ops.js.map +1 -0
- package/dist/ssh-session.d.ts +146 -0
- package/dist/ssh-session.js +618 -0
- package/dist/ssh-session.js.map +1 -0
- package/dist/tool-result.d.ts +11 -0
- package/dist/tool-result.js +67 -0
- package/dist/tool-result.js.map +1 -0
- package/dist/transfer-manager.d.ts +60 -0
- package/dist/transfer-manager.js +339 -0
- package/dist/transfer-manager.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-config.js","sourceRoot":"","sources":["../src/runtime-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SshSession, type ConnectInput, type SessionSummary } from "./ssh-session.js";
|
|
2
|
+
export declare class SessionRegistry {
|
|
3
|
+
private readonly sessions;
|
|
4
|
+
connect(input: ConnectInput): Promise<SessionSummary>;
|
|
5
|
+
get(sessionId: string): SshSession;
|
|
6
|
+
list(): SessionSummary[];
|
|
7
|
+
disconnect(sessionId: string): Promise<SessionSummary>;
|
|
8
|
+
disconnectAll(): Promise<SessionSummary[]>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { McpToolError } from "./tool-result.js";
|
|
2
|
+
import { SshSession } from "./ssh-session.js";
|
|
3
|
+
export class SessionRegistry {
|
|
4
|
+
sessions = new Map();
|
|
5
|
+
async connect(input) {
|
|
6
|
+
const session = await SshSession.connect(input);
|
|
7
|
+
this.sessions.set(session.id, session);
|
|
8
|
+
return session.summary();
|
|
9
|
+
}
|
|
10
|
+
get(sessionId) {
|
|
11
|
+
const session = this.sessions.get(sessionId);
|
|
12
|
+
if (session === undefined) {
|
|
13
|
+
throw new McpToolError("ssh_session_not_found", "SSH session id was not found", { sessionId });
|
|
14
|
+
}
|
|
15
|
+
return session;
|
|
16
|
+
}
|
|
17
|
+
list() {
|
|
18
|
+
return [...this.sessions.values()].map((session) => session.summary());
|
|
19
|
+
}
|
|
20
|
+
async disconnect(sessionId) {
|
|
21
|
+
const session = this.get(sessionId);
|
|
22
|
+
const summary = await session.disconnect();
|
|
23
|
+
this.sessions.delete(sessionId);
|
|
24
|
+
return summary;
|
|
25
|
+
}
|
|
26
|
+
async disconnectAll() {
|
|
27
|
+
const summaries = [];
|
|
28
|
+
for (const session of this.sessions.values()) {
|
|
29
|
+
summaries.push(await session.disconnect());
|
|
30
|
+
}
|
|
31
|
+
this.sessions.clear();
|
|
32
|
+
return summaries;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=session-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../src/session-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,UAAU,EAA0C,MAAM,kBAAkB,CAAC;AAEtF,MAAM,OAAO,eAAe;IACT,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEnD,KAAK,CAAC,OAAO,CAAC,KAAmB;QACtC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAChD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACvC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAEM,GAAG,CAAC,SAAiB;QAC1B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,YAAY,CAAC,uBAAuB,EAAE,8BAA8B,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QACjG,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,IAAI;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,SAAiB;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,KAAK,CAAC,aAAa;QACxB,MAAM,SAAS,GAAqB,EAAE,CAAC;QACvC,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YAC7C,SAAS,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Attributes, FileEntryWithStats, InputAttributes, SFTPWrapper, Stats } from "ssh2";
|
|
2
|
+
export interface FileAttributesJson {
|
|
3
|
+
mode: number;
|
|
4
|
+
modeOctal: string;
|
|
5
|
+
permissionsOctal: string;
|
|
6
|
+
uid: number;
|
|
7
|
+
gid: number;
|
|
8
|
+
size: number;
|
|
9
|
+
atime: number;
|
|
10
|
+
mtime: number;
|
|
11
|
+
}
|
|
12
|
+
export interface FileStatsJson extends FileAttributesJson {
|
|
13
|
+
type: string;
|
|
14
|
+
}
|
|
15
|
+
export interface DirectoryEntryJson {
|
|
16
|
+
filename: string;
|
|
17
|
+
longname: string;
|
|
18
|
+
attrs: FileStatsJson;
|
|
19
|
+
}
|
|
20
|
+
export interface RemoteReadResult {
|
|
21
|
+
data: string;
|
|
22
|
+
encoding: "utf8" | "base64";
|
|
23
|
+
bytesRead: number;
|
|
24
|
+
truncated: boolean;
|
|
25
|
+
}
|
|
26
|
+
export type SmallWriteFlag = "w" | "wx" | "a" | "ax";
|
|
27
|
+
export declare function attributesToJson(attrs: Attributes): FileAttributesJson;
|
|
28
|
+
export declare function statsToJson(stats: Stats): FileStatsJson;
|
|
29
|
+
export declare function entryToJson(entry: FileEntryWithStats): DirectoryEntryJson;
|
|
30
|
+
export declare function sftpStat(sftp: SFTPWrapper, remotePath: string, followSymlinks: boolean): Promise<Stats>;
|
|
31
|
+
export declare function sftpReadDir(sftp: SFTPWrapper, remotePath: string): Promise<FileEntryWithStats[]>;
|
|
32
|
+
export declare function sftpMkdir(sftp: SFTPWrapper, remotePath: string, attrs?: InputAttributes): Promise<void>;
|
|
33
|
+
export declare function sftpMkdirRecursive(sftp: SFTPWrapper, remotePath: string, attrs?: InputAttributes): Promise<void>;
|
|
34
|
+
export declare function sftpUnlink(sftp: SFTPWrapper, remotePath: string): Promise<void>;
|
|
35
|
+
export declare function sftpRmdir(sftp: SFTPWrapper, remotePath: string): Promise<void>;
|
|
36
|
+
export declare function sftpRemove(sftp: SFTPWrapper, remotePath: string, recursive: boolean): Promise<void>;
|
|
37
|
+
export declare function sftpRename(sftp: SFTPWrapper, sourcePath: string, destinationPath: string): Promise<void>;
|
|
38
|
+
export declare function sftpChmod(sftp: SFTPWrapper, remotePath: string, mode: number | string): Promise<void>;
|
|
39
|
+
export declare function sftpChown(sftp: SFTPWrapper, remotePath: string, uid: number, gid: number): Promise<void>;
|
|
40
|
+
export declare function sftpUtimes(sftp: SFTPWrapper, remotePath: string, atime: Date, mtime: Date): Promise<void>;
|
|
41
|
+
export declare function sftpReadlink(sftp: SFTPWrapper, remotePath: string): Promise<string>;
|
|
42
|
+
export declare function sftpSymlink(sftp: SFTPWrapper, targetPath: string, linkPath: string): Promise<void>;
|
|
43
|
+
export declare function sftpRealpath(sftp: SFTPWrapper, remotePath: string): Promise<string>;
|
|
44
|
+
export declare function sftpWriteFile(sftp: SFTPWrapper, remotePath: string, data: Buffer, mode: number | undefined, flag: SmallWriteFlag): Promise<void>;
|
|
45
|
+
export declare function sftpReadFileLimited(sftp: SFTPWrapper, remotePath: string, encoding: "utf8" | "base64", maxBytes: number): Promise<RemoteReadResult>;
|
|
46
|
+
export declare function isMissingPathError(error: Error): boolean;
|
package/dist/sftp-ops.js
ADDED
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
import { McpToolError } from "./tool-result.js";
|
|
2
|
+
import { joinRemotePath, normalizeRemotePath, splitRemotePath } from "./remote-path.js";
|
|
3
|
+
export function attributesToJson(attrs) {
|
|
4
|
+
return {
|
|
5
|
+
mode: attrs.mode,
|
|
6
|
+
modeOctal: `0${attrs.mode.toString(8)}`,
|
|
7
|
+
permissionsOctal: `0${(attrs.mode & 0o777).toString(8).padStart(3, "0")}`,
|
|
8
|
+
uid: attrs.uid,
|
|
9
|
+
gid: attrs.gid,
|
|
10
|
+
size: attrs.size,
|
|
11
|
+
atime: attrs.atime,
|
|
12
|
+
mtime: attrs.mtime,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function statsToJson(stats) {
|
|
16
|
+
return {
|
|
17
|
+
...attributesToJson(stats),
|
|
18
|
+
type: classifyStats(stats),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export function entryToJson(entry) {
|
|
22
|
+
return {
|
|
23
|
+
filename: entry.filename,
|
|
24
|
+
longname: entry.longname,
|
|
25
|
+
attrs: statsToJson(entry.attrs),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export function sftpStat(sftp, remotePath, followSymlinks) {
|
|
29
|
+
return new Promise((resolve, reject) => {
|
|
30
|
+
const callback = (err, stats) => {
|
|
31
|
+
if (err != null) {
|
|
32
|
+
reject(wrapSftpError("stat", remotePath, err));
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
resolve(stats);
|
|
36
|
+
};
|
|
37
|
+
if (followSymlinks) {
|
|
38
|
+
sftp.stat(remotePath, callback);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
sftp.lstat(remotePath, callback);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
export function sftpReadDir(sftp, remotePath) {
|
|
45
|
+
return new Promise((resolve, reject) => {
|
|
46
|
+
sftp.readdir(remotePath, (err, list) => {
|
|
47
|
+
if (err != null) {
|
|
48
|
+
reject(wrapSftpError("readdir", remotePath, err));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
resolve(list);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
export function sftpMkdir(sftp, remotePath, attrs) {
|
|
56
|
+
return new Promise((resolve, reject) => {
|
|
57
|
+
const callback = (err) => {
|
|
58
|
+
if (err != null) {
|
|
59
|
+
reject(wrapSftpError("mkdir", remotePath, err));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
resolve();
|
|
63
|
+
};
|
|
64
|
+
if (attrs !== undefined) {
|
|
65
|
+
sftp.mkdir(remotePath, attrs, callback);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
sftp.mkdir(remotePath, callback);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
export async function sftpMkdirRecursive(sftp, remotePath, attrs) {
|
|
72
|
+
const normalized = normalizeRemotePath(remotePath);
|
|
73
|
+
const parts = splitRemotePath(normalized);
|
|
74
|
+
let current = normalized.startsWith("/") ? "/" : "";
|
|
75
|
+
for (const part of parts) {
|
|
76
|
+
current = current === "/" ? `/${part}` : current.length === 0 ? part : joinRemotePath(current, part);
|
|
77
|
+
try {
|
|
78
|
+
const stats = await sftpStat(sftp, current, false);
|
|
79
|
+
if (!stats.isDirectory()) {
|
|
80
|
+
throw new McpToolError("remote_path_not_directory", "Remote path exists but is not a directory", {
|
|
81
|
+
path: current,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (!isMissingPathError(error)) {
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
await sftpMkdir(sftp, current, attrs);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export function sftpUnlink(sftp, remotePath) {
|
|
94
|
+
return new Promise((resolve, reject) => {
|
|
95
|
+
sftp.unlink(remotePath, (err) => {
|
|
96
|
+
if (err != null) {
|
|
97
|
+
reject(wrapSftpError("unlink", remotePath, err));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
resolve();
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
export function sftpRmdir(sftp, remotePath) {
|
|
105
|
+
return new Promise((resolve, reject) => {
|
|
106
|
+
sftp.rmdir(remotePath, (err) => {
|
|
107
|
+
if (err != null) {
|
|
108
|
+
reject(wrapSftpError("rmdir", remotePath, err));
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
resolve();
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
export async function sftpRemove(sftp, remotePath, recursive) {
|
|
116
|
+
const stats = await sftpStat(sftp, remotePath, false);
|
|
117
|
+
if (!stats.isDirectory()) {
|
|
118
|
+
await sftpUnlink(sftp, remotePath);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
if (!recursive) {
|
|
122
|
+
throw new McpToolError("recursive_required", "Remote path is a directory; pass recursive=true to remove it", {
|
|
123
|
+
path: remotePath,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
const entries = await sftpReadDir(sftp, remotePath);
|
|
127
|
+
for (const entry of entries) {
|
|
128
|
+
if (entry.filename === "." || entry.filename === "..") {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
await sftpRemove(sftp, joinRemotePath(remotePath, entry.filename), true);
|
|
132
|
+
}
|
|
133
|
+
await sftpRmdir(sftp, remotePath);
|
|
134
|
+
}
|
|
135
|
+
export function sftpRename(sftp, sourcePath, destinationPath) {
|
|
136
|
+
return new Promise((resolve, reject) => {
|
|
137
|
+
sftp.rename(sourcePath, destinationPath, (err) => {
|
|
138
|
+
if (err != null) {
|
|
139
|
+
reject(new McpToolError("sftp_rename_failed", err.message, { sourcePath, destinationPath }));
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
resolve();
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
export function sftpChmod(sftp, remotePath, mode) {
|
|
147
|
+
return new Promise((resolve, reject) => {
|
|
148
|
+
sftp.chmod(remotePath, mode, (err) => {
|
|
149
|
+
if (err != null) {
|
|
150
|
+
reject(wrapSftpError("chmod", remotePath, err));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
resolve();
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
export function sftpChown(sftp, remotePath, uid, gid) {
|
|
158
|
+
return new Promise((resolve, reject) => {
|
|
159
|
+
sftp.chown(remotePath, uid, gid, (err) => {
|
|
160
|
+
if (err != null) {
|
|
161
|
+
reject(wrapSftpError("chown", remotePath, err));
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
resolve();
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
export function sftpUtimes(sftp, remotePath, atime, mtime) {
|
|
169
|
+
return new Promise((resolve, reject) => {
|
|
170
|
+
sftp.utimes(remotePath, atime, mtime, (err) => {
|
|
171
|
+
if (err != null) {
|
|
172
|
+
reject(wrapSftpError("utimes", remotePath, err));
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
resolve();
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
export function sftpReadlink(sftp, remotePath) {
|
|
180
|
+
return new Promise((resolve, reject) => {
|
|
181
|
+
sftp.readlink(remotePath, (err, target) => {
|
|
182
|
+
if (err != null) {
|
|
183
|
+
reject(wrapSftpError("readlink", remotePath, err));
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
resolve(target);
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
export function sftpSymlink(sftp, targetPath, linkPath) {
|
|
191
|
+
return new Promise((resolve, reject) => {
|
|
192
|
+
sftp.symlink(targetPath, linkPath, (err) => {
|
|
193
|
+
if (err != null) {
|
|
194
|
+
reject(new McpToolError("sftp_symlink_failed", err.message, { targetPath, linkPath }));
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
resolve();
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
export function sftpRealpath(sftp, remotePath) {
|
|
202
|
+
return new Promise((resolve, reject) => {
|
|
203
|
+
sftp.realpath(remotePath, (err, absolutePath) => {
|
|
204
|
+
if (err != null) {
|
|
205
|
+
reject(wrapSftpError("realpath", remotePath, err));
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
resolve(absolutePath);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
export function sftpWriteFile(sftp, remotePath, data, mode, flag) {
|
|
213
|
+
return new Promise((resolve, reject) => {
|
|
214
|
+
const options = mode === undefined ? { flag } : { flag, mode };
|
|
215
|
+
sftp.writeFile(remotePath, data, options, (err) => {
|
|
216
|
+
if (err != null) {
|
|
217
|
+
reject(wrapSftpError("writeFile", remotePath, err));
|
|
218
|
+
return;
|
|
219
|
+
}
|
|
220
|
+
resolve();
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
export function sftpReadFileLimited(sftp, remotePath, encoding, maxBytes) {
|
|
225
|
+
return new Promise((resolve, reject) => {
|
|
226
|
+
const chunks = [];
|
|
227
|
+
let bytesRead = 0;
|
|
228
|
+
let resolved = false;
|
|
229
|
+
let truncated = false;
|
|
230
|
+
const finish = () => {
|
|
231
|
+
if (resolved) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
resolved = true;
|
|
235
|
+
const buffer = Buffer.concat(chunks, bytesRead);
|
|
236
|
+
resolve({
|
|
237
|
+
data: encoding === "base64" ? buffer.toString("base64") : buffer.toString("utf8"),
|
|
238
|
+
encoding,
|
|
239
|
+
bytesRead,
|
|
240
|
+
truncated,
|
|
241
|
+
});
|
|
242
|
+
};
|
|
243
|
+
const stream = sftp.createReadStream(remotePath);
|
|
244
|
+
stream.on("data", (chunk) => {
|
|
245
|
+
if (resolved) {
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
const remaining = maxBytes - bytesRead;
|
|
249
|
+
if (chunk.length <= remaining) {
|
|
250
|
+
chunks.push(chunk);
|
|
251
|
+
bytesRead += chunk.length;
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
if (remaining > 0) {
|
|
255
|
+
chunks.push(chunk.subarray(0, remaining));
|
|
256
|
+
bytesRead += remaining;
|
|
257
|
+
}
|
|
258
|
+
truncated = true;
|
|
259
|
+
finish();
|
|
260
|
+
stream.destroy();
|
|
261
|
+
});
|
|
262
|
+
stream.on("end", finish);
|
|
263
|
+
stream.on("close", finish);
|
|
264
|
+
stream.on("error", (err) => {
|
|
265
|
+
if (resolved) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
reject(wrapSftpError("readFile", remotePath, err));
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
export function isMissingPathError(error) {
|
|
273
|
+
if (error instanceof McpToolError) {
|
|
274
|
+
return error.code === "sftp_stat_failed" && /no such file|not found|failure/i.test(error.message);
|
|
275
|
+
}
|
|
276
|
+
const errno = error;
|
|
277
|
+
return errno.code === "ENOENT" || /no such file|not found/i.test(error.message);
|
|
278
|
+
}
|
|
279
|
+
function wrapSftpError(action, remotePath, error) {
|
|
280
|
+
return new McpToolError(`sftp_${action}_failed`, error.message, { action, remotePath });
|
|
281
|
+
}
|
|
282
|
+
function classifyStats(stats) {
|
|
283
|
+
if (stats.isDirectory()) {
|
|
284
|
+
return "directory";
|
|
285
|
+
}
|
|
286
|
+
if (stats.isFile()) {
|
|
287
|
+
return "file";
|
|
288
|
+
}
|
|
289
|
+
if (stats.isSymbolicLink()) {
|
|
290
|
+
return "symlink";
|
|
291
|
+
}
|
|
292
|
+
if (stats.isBlockDevice()) {
|
|
293
|
+
return "block_device";
|
|
294
|
+
}
|
|
295
|
+
if (stats.isCharacterDevice()) {
|
|
296
|
+
return "character_device";
|
|
297
|
+
}
|
|
298
|
+
if (stats.isFIFO()) {
|
|
299
|
+
return "fifo";
|
|
300
|
+
}
|
|
301
|
+
if (stats.isSocket()) {
|
|
302
|
+
return "socket";
|
|
303
|
+
}
|
|
304
|
+
return "unknown";
|
|
305
|
+
}
|
|
306
|
+
//# sourceMappingURL=sftp-ops.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sftp-ops.js","sourceRoot":"","sources":["../src/sftp-ops.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { type PseudoTtyOptions, type SFTPWrapper } from "ssh2";
|
|
2
|
+
import { ByteCollector, type WireEncoding } from "./buffers.js";
|
|
3
|
+
export interface ConnectInput {
|
|
4
|
+
name?: string;
|
|
5
|
+
host: string;
|
|
6
|
+
port: number;
|
|
7
|
+
username: string;
|
|
8
|
+
password?: string;
|
|
9
|
+
privateKey?: string;
|
|
10
|
+
privateKeyPath?: string;
|
|
11
|
+
passphrase?: string;
|
|
12
|
+
agent?: string;
|
|
13
|
+
agentForward: boolean;
|
|
14
|
+
tryKeyboard: boolean;
|
|
15
|
+
keyboardResponses: string[];
|
|
16
|
+
keepaliveIntervalMs: number;
|
|
17
|
+
keepaliveCountMax: number;
|
|
18
|
+
readyTimeoutMs: number;
|
|
19
|
+
connectionTimeoutMs: number;
|
|
20
|
+
hostHash?: string;
|
|
21
|
+
expectedHostHash?: string;
|
|
22
|
+
strictVendor: boolean;
|
|
23
|
+
debug: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface SessionSummary {
|
|
26
|
+
id: string;
|
|
27
|
+
name?: string;
|
|
28
|
+
host: string;
|
|
29
|
+
port: number;
|
|
30
|
+
username: string;
|
|
31
|
+
connected: boolean;
|
|
32
|
+
createdAt: string;
|
|
33
|
+
lastUsedAt: string;
|
|
34
|
+
shellCount: number;
|
|
35
|
+
localTunnelCount: number;
|
|
36
|
+
remoteTunnelCount: number;
|
|
37
|
+
lastError?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface ExecInput {
|
|
40
|
+
command: string;
|
|
41
|
+
env?: Record<string, string>;
|
|
42
|
+
stdin?: string;
|
|
43
|
+
stdinEncoding: WireEncoding;
|
|
44
|
+
outputEncoding: WireEncoding;
|
|
45
|
+
timeoutMs: number;
|
|
46
|
+
maxOutputBytes: number;
|
|
47
|
+
pty?: PseudoTtyOptions | boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface ExecResult {
|
|
50
|
+
command: string;
|
|
51
|
+
exitCode: number | null;
|
|
52
|
+
signal: string | null;
|
|
53
|
+
timedOut: boolean;
|
|
54
|
+
durationMs: number;
|
|
55
|
+
stdout: ReturnType<ByteCollector["snapshot"]>;
|
|
56
|
+
stderr: ReturnType<ByteCollector["snapshot"]>;
|
|
57
|
+
}
|
|
58
|
+
export interface ShellOpenInput {
|
|
59
|
+
env?: Record<string, string>;
|
|
60
|
+
allocatePty: boolean;
|
|
61
|
+
pty?: PseudoTtyOptions;
|
|
62
|
+
ringBufferBytes: number;
|
|
63
|
+
}
|
|
64
|
+
export interface ShellSummary {
|
|
65
|
+
id: string;
|
|
66
|
+
openedAt: string;
|
|
67
|
+
lastUsedAt: string;
|
|
68
|
+
closed: boolean;
|
|
69
|
+
bufferedBytes: number;
|
|
70
|
+
exitCode: number | null;
|
|
71
|
+
exitSignal: string | null;
|
|
72
|
+
}
|
|
73
|
+
export interface ShellReadInput {
|
|
74
|
+
shellId: string;
|
|
75
|
+
maxBytes: number;
|
|
76
|
+
encoding: WireEncoding;
|
|
77
|
+
drain: boolean;
|
|
78
|
+
}
|
|
79
|
+
export interface LocalForwardInput {
|
|
80
|
+
localHost: string;
|
|
81
|
+
localPort: number;
|
|
82
|
+
targetHost: string;
|
|
83
|
+
targetPort: number;
|
|
84
|
+
}
|
|
85
|
+
export interface RemoteForwardInput {
|
|
86
|
+
remoteHost: string;
|
|
87
|
+
remotePort: number;
|
|
88
|
+
targetHost: string;
|
|
89
|
+
targetPort: number;
|
|
90
|
+
}
|
|
91
|
+
export interface TunnelSummary {
|
|
92
|
+
id: string;
|
|
93
|
+
type: "local" | "remote";
|
|
94
|
+
bindHost: string;
|
|
95
|
+
bindPort: number;
|
|
96
|
+
targetHost: string;
|
|
97
|
+
targetPort: number;
|
|
98
|
+
openedAt: string;
|
|
99
|
+
connectionCount: number;
|
|
100
|
+
lastError?: string;
|
|
101
|
+
}
|
|
102
|
+
export declare class SshSession {
|
|
103
|
+
readonly id: string;
|
|
104
|
+
private readonly client;
|
|
105
|
+
private readonly name?;
|
|
106
|
+
private readonly host;
|
|
107
|
+
private readonly port;
|
|
108
|
+
private readonly username;
|
|
109
|
+
private readonly createdAt;
|
|
110
|
+
private readonly shells;
|
|
111
|
+
private readonly localTunnels;
|
|
112
|
+
private readonly remoteTunnels;
|
|
113
|
+
private sftpPromise;
|
|
114
|
+
private connected;
|
|
115
|
+
private lastUsedAt;
|
|
116
|
+
private lastError?;
|
|
117
|
+
private constructor();
|
|
118
|
+
static connect(input: ConnectInput): Promise<SshSession>;
|
|
119
|
+
summary(): SessionSummary;
|
|
120
|
+
disconnect(): Promise<SessionSummary>;
|
|
121
|
+
rekey(): Promise<object>;
|
|
122
|
+
exec(input: ExecInput): Promise<ExecResult>;
|
|
123
|
+
openShell(input: ShellOpenInput): Promise<ShellSummary>;
|
|
124
|
+
listShells(): ShellSummary[];
|
|
125
|
+
writeShell(shellId: string, data: string, encoding: WireEncoding): ShellSummary;
|
|
126
|
+
readShell(input: ShellReadInput): object;
|
|
127
|
+
resizeShell(shellId: string, rows: number, cols: number, height: number, width: number): ShellSummary;
|
|
128
|
+
closeShell(shellId: string): ShellSummary;
|
|
129
|
+
getSftp(): Promise<SFTPWrapper>;
|
|
130
|
+
startLocalForward(input: LocalForwardInput): Promise<TunnelSummary>;
|
|
131
|
+
startRemoteForward(input: RemoteForwardInput): Promise<TunnelSummary>;
|
|
132
|
+
listTunnels(): TunnelSummary[];
|
|
133
|
+
stopTunnel(tunnelId: string): Promise<TunnelSummary>;
|
|
134
|
+
private open;
|
|
135
|
+
private installConnectionEventHandlers;
|
|
136
|
+
private ensureConnected;
|
|
137
|
+
private touch;
|
|
138
|
+
private getShell;
|
|
139
|
+
private shellSummary;
|
|
140
|
+
private handleLocalForwardConnection;
|
|
141
|
+
private handleRemoteForwardConnection;
|
|
142
|
+
private stopLocalTunnel;
|
|
143
|
+
private stopRemoteTunnel;
|
|
144
|
+
private localTunnelSummary;
|
|
145
|
+
private remoteTunnelSummary;
|
|
146
|
+
}
|