feat: v0.3.0 版本 - SSH终端、SFTP、端口转发功能实现

核心功能:
- SSH终端: 密码/密钥认证、XTerm.js终端、多主题配色、IP高亮
- SFTP管理: 双栏文件管理、上传下载、传输队列
- 端口转发: 本地/远程转发、SOCKS5动态代理、规则管理

架构改进:
- 拆分大型组件 (SFTPView/TabBar/Sidebar)
- 添加统一日志和错误处理
- 修复React严格模式下的终端黑屏问题

UI更新:
- 新增端口转发视图
- 更新UI预览文档
- 左侧栏右键菜单支持SFTP快捷打开
This commit is contained in:
Logan.Li committed 2026-04-06 01:20:47 +08:00
1 parent cf1c054381
commit 484d850abd
105 files changed
+25330 -64

No files matched your search

+113
View File
@@ -0,0 +1,113 @@
// Type declarations for Electron IPC API exposed via preload
interface SSHConfig {
host: string
port?: number
username: string
password?: string
privateKey?: string
passphrase?: string
agent?: string
readyTimeout?: number
keepaliveInterval?: number
}
interface Session {
id: string
name: string
host: string
port: number
username: string
authType: 'password' | 'key' | 'agent'
password?: string
privateKey?: string
passphrase?: string
group?: string
tags?: string[]
}
interface IPCResponse<T = any> {
success: boolean
error?: string
connectionId?: string
shellId?: string
sftpId?: string
sessions?: Session[]
session?: Session
files?: any[]
result?: any
value?: any
path?: string
boundPort?: number
}
interface ElectronAPI {
// SSH
sshConnect: (config: SSHConfig) => Promise<IPCResponse>
sshDisconnect: (connectionId: string) => Promise<IPCResponse>
sshExec: (connectionId: string, command: string) => Promise<IPCResponse>
sshCreateShell: (connectionId: string, options?: any, shellId?: string) => Promise<IPCResponse>
sshShellWrite: (shellId: string, data: string) => Promise<IPCResponse>
sshShellResize: (shellId: string, cols: number, rows: number) => Promise<IPCResponse>
sshForwardLocal: (connectionId: string, localPort: number, remoteHost: string, remotePort: number) => Promise<IPCResponse>
sshForwardRemote: (connectionId: string, remotePort: number, localHost: string, localPort: number) => Promise<IPCResponse>
sshForwardDynamic: (connectionId: string, localPort: number) => Promise<IPCResponse>
// Sessions
sessionGetAll: () => Promise<IPCResponse>
sessionGetById: (id: string) => Promise<IPCResponse>
sessionCreate: (session: Partial<Session>) => Promise<IPCResponse>
sessionUpdate: (id: string, updates: Partial<Session>) => Promise<IPCResponse>
sessionDelete: (id: string) => Promise<IPCResponse>
// SFTP
sftpConnect: (connectionId: string) => Promise<IPCResponse>
sftpListDirectory: (sftpId: string, path: string) => Promise<IPCResponse>
sftpUpload: (sftpId: string, localPath: string, remotePath: string) => Promise<IPCResponse>
sftpDownload: (sftpId: string, remotePath: string, localPath: string) => Promise<IPCResponse>
sftpRename: (sftpId: string, oldPath: string, newPath: string) => Promise<IPCResponse>
sftpDelete: (sftpId: string, path: string, isDirectory: boolean) => Promise<IPCResponse>
sftpMkdir: (sftpId: string, path: string) => Promise<IPCResponse>
// Settings
settingsGet: (key: string) => Promise<IPCResponse>
settingsSet: (key: string, value: any) => Promise<IPCResponse>
// Dialogs
showSaveDialog: (options: any) => Promise<{ canceled: boolean; filePath?: string }>
showOpenDialog: (options: any) => Promise<{ canceled: boolean; filePaths?: string[] }>
// File operations
readFile: (filePath: string) => Promise<{ success: boolean; data?: string; error?: string }>
writeFile: (filePath: string, data: string) => Promise<{ success: boolean; error?: string }>
// Local filesystem
getHomePath: () => Promise<{ success: boolean; path?: string; error?: string }>
getDownloadsPath: () => Promise<string>
localReadDir: (dirPath: string) => Promise<IPCResponse>
localGetStats: (filePath: string) => Promise<IPCResponse>
localDelete: (filePath: string) => Promise<IPCResponse>
localRename: (oldPath: string, newPath: string) => Promise<IPCResponse>
localMkdir: (dirPath: string) => Promise<IPCResponse>
// App
getVersion: () => Promise<string>
// Events
onMenuNewSession: (callback: () => void) => void
onMenuQuickConnect: (callback: () => void) => void
onMenuImportSessions: (callback: () => void) => void
onMenuExportSessions: (callback: () => void) => void
onShellData: (callback: (event: any, connectionId: string, shellId: string, data: Buffer) => void) => void
onSFTPProgress: (callback: (event: any, sftpId: string, progress: any) => void) => void
removeListener: (channel: string, callback: (...args: any[]) => void) => void
removeAllListeners: (channel: string) => void
}
declare global {
interface Window {
electronAPI: ElectronAPI
}
}
export {}