import { z } from 'zod';
import { createReadStream, statSync } from 'fs';
import { SessionManager } from '../core/session-manager.js';
export const schema = z.object({
session_id: z.string(),
local_path: z.string(),
remote_path: z.string(),
});
const LARGE_FILE_WARNING = 50 * 1024 * 1024; // 50MB
export async function scpUpload(params: z.infer<typeof schema>) {
const client = SessionManager.getInstance().getSession(params.session_id);
if (!client) {
return { success: false, error: 'Session not found' };
}
try {
const stats = statSync(params.local_path);
const warning = stats.size > LARGE_FILE_WARNING ? 'Large file transfer' : undefined;
const sftp = await client.getSftp();
return new Promise((resolve) => {
const readStream = createReadStream(params.local_path);
const writeStream = sftp.createWriteStream(params.remote_path);
writeStream.on('close', () => {
resolve({ success: true, bytes_transferred: stats.size, warning });
});
writeStream.on('error', (err: Error) => {
resolve({ success: false, error: err.message });
});
readStream.pipe(writeStream);
});
} catch (err: any) {
return { success: false, error: err.message };
}
}