@thesashadev/ssh-mcp-server 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-manager.js","sourceRoot":"","sources":["../src/ssh-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Download a remote file to the local machine with 5 fallback strategies.
3
+ *
4
+ * Strategies (tried in order):
5
+ * 1. SFTP fastGet — high-speed parallel download
6
+ * 2. SFTP createReadStream — streamed download
7
+ * 3. SCP via exec + stdout — cat remotePath > local
8
+ * 4. Base64 via exec — base64 remotePath, decode locally
9
+ * 5. Chunked read via exec — dd with offset/count
10
+ */
11
+ export declare function downloadFile(params: {
12
+ serverId: string;
13
+ remotePath: string;
14
+ localPath: string;
15
+ overwrite?: boolean;
16
+ }): Promise<string>;
17
+ //# sourceMappingURL=download.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.d.ts","sourceRoot":"","sources":["../../src/tools/download.ts"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiFlB"}
@@ -0,0 +1,207 @@
1
+ import { createWriteStream, writeFileSync } from 'fs';
2
+ import { basename, dirname } from 'path';
3
+ import { getSftp, getConnection } from '../ssh-manager.js';
4
+ import { escapeRemotePath, normalizeRemotePath, ensureLocalDir } from '../utils/path-utils.js';
5
+ /**
6
+ * Download a remote file to the local machine with 5 fallback strategies.
7
+ *
8
+ * Strategies (tried in order):
9
+ * 1. SFTP fastGet — high-speed parallel download
10
+ * 2. SFTP createReadStream — streamed download
11
+ * 3. SCP via exec + stdout — cat remotePath > local
12
+ * 4. Base64 via exec — base64 remotePath, decode locally
13
+ * 5. Chunked read via exec — dd with offset/count
14
+ */
15
+ export async function downloadFile(params) {
16
+ const { serverId, remotePath: rawRemotePath, localPath, overwrite = true } = params;
17
+ const remotePath = normalizeRemotePath(rawRemotePath);
18
+ // Check local file existence
19
+ if (!overwrite) {
20
+ try {
21
+ const { statSync } = await import('fs');
22
+ statSync(localPath);
23
+ return `Error: Local file "${localPath}" already exists and overwrite=false.`;
24
+ }
25
+ catch { }
26
+ }
27
+ // Ensure local parent directory exists
28
+ try {
29
+ await ensureLocalDir(dirname(localPath));
30
+ }
31
+ catch (err) {
32
+ return `Error: Cannot create local directory "${dirname(localPath)}": ${err.message}`;
33
+ }
34
+ const errors = [];
35
+ const fileName = basename(remotePath);
36
+ const startTime = Date.now();
37
+ // Get remote file size for reporting
38
+ let fileSize = null;
39
+ try {
40
+ const sftp = await getSftp(serverId);
41
+ fileSize = await new Promise((resolve) => {
42
+ sftp.stat(remotePath, (err, stats) => {
43
+ resolve(err ? null : stats.size);
44
+ });
45
+ });
46
+ }
47
+ catch { }
48
+ // Strategy 1: SFTP fastGet
49
+ try {
50
+ await strategy1_sftpFastGet(serverId, remotePath, localPath);
51
+ const duration = ((Date.now() - startTime) / 1000).toFixed(1);
52
+ return `SUCCESS: downloaded via SFTP fastGet\nfile: ${fileName}${fileSize !== null ? ` (${formatSize(fileSize)})` : ''}\nsaved_to: ${localPath}\nduration: ${duration}s`;
53
+ }
54
+ catch (err) {
55
+ errors.push(`Strategy 1 (SFTP fastGet): ${err.message}`);
56
+ }
57
+ // Strategy 2: SFTP stream
58
+ try {
59
+ await strategy2_sftpStream(serverId, remotePath, localPath);
60
+ const duration = ((Date.now() - startTime) / 1000).toFixed(1);
61
+ return `SUCCESS: downloaded via SFTP stream\nfile: ${fileName}${fileSize !== null ? ` (${formatSize(fileSize)})` : ''}\nsaved_to: ${localPath}\nduration: ${duration}s`;
62
+ }
63
+ catch (err) {
64
+ errors.push(`Strategy 2 (SFTP stream): ${err.message}`);
65
+ }
66
+ // Strategy 3: SCP via cat
67
+ try {
68
+ await strategy3_scpCat(serverId, remotePath, localPath);
69
+ const duration = ((Date.now() - startTime) / 1000).toFixed(1);
70
+ return `SUCCESS: downloaded via SCP cat\nfile: ${fileName}\nsaved_to: ${localPath}\nduration: ${duration}s`;
71
+ }
72
+ catch (err) {
73
+ errors.push(`Strategy 3 (SCP cat): ${err.message}`);
74
+ }
75
+ // Strategy 4: Base64 decode
76
+ try {
77
+ await strategy4_base64(serverId, remotePath, localPath);
78
+ const duration = ((Date.now() - startTime) / 1000).toFixed(1);
79
+ return `SUCCESS: downloaded via base64\nfile: ${fileName}\nsaved_to: ${localPath}\nduration: ${duration}s`;
80
+ }
81
+ catch (err) {
82
+ errors.push(`Strategy 4 (Base64): ${err.message}`);
83
+ }
84
+ // Strategy 5: Chunked dd
85
+ try {
86
+ await strategy5_chunkedDd(serverId, remotePath, localPath);
87
+ const duration = ((Date.now() - startTime) / 1000).toFixed(1);
88
+ return `SUCCESS: downloaded via chunked dd\nfile: ${fileName}\nsaved_to: ${localPath}\nduration: ${duration}s`;
89
+ }
90
+ catch (err) {
91
+ errors.push(`Strategy 5 (chunked dd): ${err.message}`);
92
+ }
93
+ return `FAILED: download failed, all 5 strategies exhausted\nremote: ${remotePath}\nlocal: ${localPath}\n\nerrors:\n${errors.map((e, i) => ` ${i + 1}. ${e}`).join('\n')}`;
94
+ }
95
+ // --- Strategy Implementations ---
96
+ async function strategy1_sftpFastGet(serverId, remotePath, localPath) {
97
+ const sftp = await getSftp(serverId);
98
+ return new Promise((resolve, reject) => {
99
+ sftp.fastGet(remotePath, localPath, {
100
+ concurrency: 64,
101
+ chunkSize: 65536,
102
+ }, (err) => {
103
+ if (err)
104
+ reject(err);
105
+ else
106
+ resolve();
107
+ });
108
+ });
109
+ }
110
+ async function strategy2_sftpStream(serverId, remotePath, localPath) {
111
+ const sftp = await getSftp(serverId);
112
+ return new Promise((resolve, reject) => {
113
+ const readStream = sftp.createReadStream(remotePath);
114
+ const writeStream = createWriteStream(localPath);
115
+ readStream.on('error', (err) => reject(err));
116
+ writeStream.on('error', (err) => reject(err));
117
+ writeStream.on('close', () => resolve());
118
+ readStream.pipe(writeStream);
119
+ });
120
+ }
121
+ async function strategy3_scpCat(serverId, remotePath, localPath) {
122
+ const client = await getConnection(serverId);
123
+ const escaped = escapeRemotePath(remotePath);
124
+ return new Promise((resolve, reject) => {
125
+ client.exec(`cat ${escaped}`, (err, stream) => {
126
+ if (err)
127
+ return reject(err);
128
+ const writeStream = createWriteStream(localPath);
129
+ let stderr = '';
130
+ stream.stderr.on('data', (data) => { stderr += data.toString(); });
131
+ writeStream.on('error', (e) => reject(e));
132
+ writeStream.on('close', () => {
133
+ if (stderr.trim()) {
134
+ reject(new Error(`cat stderr: ${stderr.trim()}`));
135
+ }
136
+ else {
137
+ resolve();
138
+ }
139
+ });
140
+ stream.on('close', (code) => {
141
+ writeStream.end();
142
+ if (code !== 0 && code !== null) {
143
+ reject(new Error(`cat exited with code ${code}: ${stderr}`));
144
+ }
145
+ });
146
+ stream.pipe(writeStream);
147
+ });
148
+ });
149
+ }
150
+ async function strategy4_base64(serverId, remotePath, localPath) {
151
+ const client = await getConnection(serverId);
152
+ const escaped = escapeRemotePath(remotePath);
153
+ const b64Data = await execCollect(client, `base64 ${escaped}`);
154
+ const clean = b64Data.replace(/\s/g, '');
155
+ const buffer = Buffer.from(clean, 'base64');
156
+ writeFileSync(localPath, buffer);
157
+ }
158
+ async function strategy5_chunkedDd(serverId, remotePath, localPath) {
159
+ const client = await getConnection(serverId);
160
+ const escaped = escapeRemotePath(remotePath);
161
+ // Get file size first
162
+ const sizeOutput = await execCollect(client, `stat -c '%s' ${escaped} 2>/dev/null || stat -f '%z' ${escaped} 2>/dev/null`);
163
+ const fileSize = parseInt(sizeOutput.trim(), 10);
164
+ if (isNaN(fileSize)) {
165
+ throw new Error('Cannot determine remote file size');
166
+ }
167
+ const CHUNK_SIZE = 262144; // 256KB chunks
168
+ const chunks = [];
169
+ for (let offset = 0; offset < fileSize; offset += CHUNK_SIZE) {
170
+ const count = Math.min(CHUNK_SIZE, fileSize - offset);
171
+ const b64Chunk = await execCollect(client, `dd if=${escaped} bs=1 skip=${offset} count=${count} 2>/dev/null | base64`);
172
+ const clean = b64Chunk.replace(/\s/g, '');
173
+ chunks.push(Buffer.from(clean, 'base64'));
174
+ }
175
+ writeFileSync(localPath, Buffer.concat(chunks));
176
+ }
177
+ // --- Helpers ---
178
+ function execCollect(client, command) {
179
+ return new Promise((resolve, reject) => {
180
+ client.exec(command, (err, stream) => {
181
+ if (err)
182
+ return reject(err);
183
+ let output = '';
184
+ let stderr = '';
185
+ stream.on('data', (data) => { output += data.toString(); });
186
+ stream.stderr.on('data', (data) => { stderr += data.toString(); });
187
+ stream.on('close', (code) => {
188
+ if (code !== 0 && code !== null) {
189
+ reject(new Error(`Command failed (exit ${code}): ${stderr || output}`));
190
+ }
191
+ else {
192
+ resolve(output);
193
+ }
194
+ });
195
+ });
196
+ });
197
+ }
198
+ function formatSize(bytes) {
199
+ if (bytes < 1024)
200
+ return `${bytes}B`;
201
+ if (bytes < 1024 * 1024)
202
+ return `${(bytes / 1024).toFixed(1)}KB`;
203
+ if (bytes < 1024 * 1024 * 1024)
204
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
205
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)}GB`;
206
+ }
207
+ //# sourceMappingURL=download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/tools/download.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Execute a command via SSH.
3
+ * Supports sync mode (wait for completion) and async mode (return immediately).
4
+ */
5
+ export declare function executeCommand(params: {
6
+ serverId: string;
7
+ command: string;
8
+ cwd?: string;
9
+ timeoutMs?: number;
10
+ async?: boolean;
11
+ commandId?: string;
12
+ }): Promise<string>;
13
+ //# sourceMappingURL=execute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/tools/execute.ts"],"names":[],"mappings":"AA+BA;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBlB"}
@@ -0,0 +1,195 @@
1
+ import { randomUUID } from 'crypto';
2
+ import { getConnection } from '../ssh-manager.js';
3
+ import { cleanOutput, formatCommandResult } from '../utils/output-format.js';
4
+ import { escapeRemotePath } from '../utils/path-utils.js';
5
+ const asyncCommands = new Map();
6
+ // Cleanup old finished commands after 30 min
7
+ setInterval(() => {
8
+ const cutoff = Date.now() - 30 * 60 * 1000;
9
+ for (const [id, cmd] of asyncCommands) {
10
+ if (cmd.status !== 'running' && cmd.startedAt < cutoff) {
11
+ asyncCommands.delete(id);
12
+ }
13
+ }
14
+ }, 60000).unref();
15
+ /**
16
+ * Execute a command via SSH.
17
+ * Supports sync mode (wait for completion) and async mode (return immediately).
18
+ */
19
+ export async function executeCommand(params) {
20
+ // If commandId is provided, we're checking status of an async command
21
+ if (params.commandId) {
22
+ return getAsyncStatus(params.commandId);
23
+ }
24
+ const { serverId, command, cwd, timeoutMs = 30000, async: isAsync = false } = params;
25
+ // Wrap command with cd if cwd specified
26
+ let fullCommand = command;
27
+ if (cwd) {
28
+ fullCommand = `cd ${escapeRemotePath(cwd)} && ${command}`;
29
+ }
30
+ const client = await getConnection(serverId);
31
+ if (isAsync) {
32
+ return startAsyncCommand(serverId, fullCommand, command, timeoutMs);
33
+ }
34
+ return runSyncCommand(client, fullCommand, timeoutMs);
35
+ }
36
+ async function runSyncCommand(client, command, timeoutMs) {
37
+ return new Promise((resolve) => {
38
+ const startTime = Date.now();
39
+ let stdout = '';
40
+ let stderr = '';
41
+ let timedOut = false;
42
+ const timeout = setTimeout(() => {
43
+ timedOut = true;
44
+ try {
45
+ stream?.close();
46
+ }
47
+ catch { }
48
+ }, timeoutMs);
49
+ let stream;
50
+ client.exec(command, (err, s) => {
51
+ if (err) {
52
+ clearTimeout(timeout);
53
+ resolve(formatCommandResult({
54
+ stdout: '',
55
+ stderr: err.message,
56
+ exitCode: -1,
57
+ timedOut: false,
58
+ duration: Date.now() - startTime,
59
+ }));
60
+ return;
61
+ }
62
+ stream = s;
63
+ s.on('data', (data) => {
64
+ stdout += data.toString('utf-8');
65
+ // Cap buffer at 5MB to prevent memory issues
66
+ if (stdout.length > 5 * 1024 * 1024) {
67
+ stdout = stdout.slice(-2 * 1024 * 1024);
68
+ }
69
+ });
70
+ s.stderr.on('data', (data) => {
71
+ stderr += data.toString('utf-8');
72
+ if (stderr.length > 2 * 1024 * 1024) {
73
+ stderr = stderr.slice(-1 * 1024 * 1024);
74
+ }
75
+ });
76
+ s.on('close', (code, signal) => {
77
+ clearTimeout(timeout);
78
+ resolve(formatCommandResult({
79
+ stdout,
80
+ stderr,
81
+ exitCode: code,
82
+ signal,
83
+ timedOut,
84
+ duration: Date.now() - startTime,
85
+ }));
86
+ });
87
+ s.on('error', (streamErr) => {
88
+ clearTimeout(timeout);
89
+ resolve(formatCommandResult({
90
+ stdout,
91
+ stderr: stderr + '\n' + streamErr.message,
92
+ exitCode: -1,
93
+ timedOut: false,
94
+ duration: Date.now() - startTime,
95
+ }));
96
+ });
97
+ });
98
+ });
99
+ }
100
+ async function startAsyncCommand(serverId, fullCommand, displayCommand, timeoutMs) {
101
+ const id = randomUUID().slice(0, 12);
102
+ const asyncCmd = {
103
+ id,
104
+ serverId,
105
+ command: displayCommand,
106
+ stdout: '',
107
+ stderr: '',
108
+ exitCode: null,
109
+ signal: null,
110
+ status: 'running',
111
+ startedAt: Date.now(),
112
+ };
113
+ asyncCommands.set(id, asyncCmd);
114
+ const client = await getConnection(serverId);
115
+ client.exec(fullCommand, (err, stream) => {
116
+ if (err) {
117
+ asyncCmd.status = 'error';
118
+ asyncCmd.error = err.message;
119
+ return;
120
+ }
121
+ asyncCmd.stream = stream;
122
+ // Set timeout
123
+ if (timeoutMs > 0) {
124
+ setTimeout(() => {
125
+ if (asyncCmd.status === 'running') {
126
+ asyncCmd.status = 'timeout';
127
+ try {
128
+ stream.close();
129
+ }
130
+ catch { }
131
+ }
132
+ }, timeoutMs).unref();
133
+ }
134
+ stream.on('data', (data) => {
135
+ asyncCmd.stdout += data.toString('utf-8');
136
+ // Cap buffer
137
+ if (asyncCmd.stdout.length > 5 * 1024 * 1024) {
138
+ asyncCmd.stdout = asyncCmd.stdout.slice(-2 * 1024 * 1024);
139
+ }
140
+ });
141
+ stream.stderr.on('data', (data) => {
142
+ asyncCmd.stderr += data.toString('utf-8');
143
+ if (asyncCmd.stderr.length > 2 * 1024 * 1024) {
144
+ asyncCmd.stderr = asyncCmd.stderr.slice(-1 * 1024 * 1024);
145
+ }
146
+ });
147
+ stream.on('close', (code, signal) => {
148
+ if (asyncCmd.status === 'running') {
149
+ asyncCmd.status = 'done';
150
+ }
151
+ asyncCmd.exitCode = code;
152
+ asyncCmd.signal = signal;
153
+ });
154
+ stream.on('error', (streamErr) => {
155
+ asyncCmd.status = 'error';
156
+ asyncCmd.error = streamErr.message;
157
+ });
158
+ });
159
+ return `Command started asynchronously.\nCommand ID: ${id}\nUse this ID with command_id parameter to check status and output later.`;
160
+ }
161
+ function getAsyncStatus(commandId) {
162
+ const cmd = asyncCommands.get(commandId);
163
+ if (!cmd) {
164
+ return `Command "${commandId}" not found. It may have expired (commands are cleaned up after 30 minutes).`;
165
+ }
166
+ const elapsed = ((Date.now() - cmd.startedAt) / 1000).toFixed(1);
167
+ const parts = [
168
+ `Command: ${cmd.command}`,
169
+ `Server: ${cmd.serverId}`,
170
+ `Status: ${cmd.status.toUpperCase()}`,
171
+ `Running for: ${elapsed}s`,
172
+ ];
173
+ if (cmd.exitCode !== null) {
174
+ parts.push(`Exit code: ${cmd.exitCode}`);
175
+ }
176
+ if (cmd.signal) {
177
+ parts.push(`Signal: ${cmd.signal}`);
178
+ }
179
+ if (cmd.error) {
180
+ parts.push(`Error: ${cmd.error}`);
181
+ }
182
+ const cleanStdout = cleanOutput(cmd.stdout);
183
+ const cleanStderr = cleanOutput(cmd.stderr);
184
+ if (cleanStdout) {
185
+ parts.push(`\n--- STDOUT (latest) ---\n${cleanStdout}`);
186
+ }
187
+ if (cleanStderr) {
188
+ parts.push(`\n--- STDERR ---\n${cleanStderr}`);
189
+ }
190
+ if (!cleanStdout && !cleanStderr && cmd.status === 'running') {
191
+ parts.push('(no output yet)');
192
+ }
193
+ return parts.join('\n');
194
+ }
195
+ //# sourceMappingURL=execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/tools/execute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Upload a local file to a remote server with 5 fallback strategies.
3
+ *
4
+ * Strategies (tried in order):
5
+ * 1. SFTP fastPut — high-speed parallel transfer
6
+ * 2. SFTP createWriteStream — streamed transfer
7
+ * 3. SCP via exec + stdin pipe — cat > remotePath
8
+ * 4. Base64 via exec — encode/decode
9
+ * 5. Chunked echo via exec — small base64 chunks appended
10
+ */
11
+ export declare function uploadFile(params: {
12
+ serverId: string;
13
+ localPath: string;
14
+ remotePath: string;
15
+ overwrite?: boolean;
16
+ }): Promise<string>;
17
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/tools/upload.ts"],"names":[],"mappings":"AAMA;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkElB"}