List ~/.ssh/config hosts in the panel source dropdown

Read-only group below saved connections; hosts resolve HostName/User/
Port/IdentityFile (Include, wildcards, %-tokens) and connect on click.
New ssh-agent auth kind covers hosts without a usable identity file;
ProxyJump/ProxyCommand hosts are shown disabled.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-13 14:10:52 +02:00
co-authored by Claude Fable 5
parent fdf65766b5
commit f4819a58fe
11 changed files with 240 additions and 18 deletions
+5
View File
@@ -7,6 +7,7 @@ import type {
FileEntry,
Result,
SavedConnection,
SshConfigHost,
TransferSnapshot,
} from "./types";
@@ -68,6 +69,10 @@ export type AppRPC = {
deleteConnection: { params: { id: string }; response: Result };
upsertFolder: { params: { folder: ConnFolder }; response: Result<{ id: string }> };
deleteFolder: { params: { id: string }; response: Result };
getSshConfigHosts: {
params: Record<string, never>;
response: Result<{ hosts: SshConfigHost[] }>;
};
// settings
getSettings: {
params: Record<string, never>;
+12 -1
View File
@@ -14,7 +14,8 @@ export type Result<T = object> = ({ ok: true } & T) | { ok: false; error: string
export type AuthConfig =
| { kind: "password"; password: string }
| { kind: "key"; privateKeyPath: string; passphrase?: string };
| { kind: "key"; privateKeyPath: string; passphrase?: string }
| { kind: "agent" };
export interface ConnectionConfig {
host: string;
@@ -35,6 +36,16 @@ export interface ConnFolder {
name: string;
}
/** A concrete host alias resolved from ~/.ssh/config (read-only). */
export interface SshConfigHost {
name: string; // the Host alias as written
hostname: string; // resolved HostName (defaults to alias)
port: number;
username: string;
identityFile?: string; // first existing IdentityFile, absolute path
unsupported?: "proxy"; // ProxyJump/ProxyCommand present — direct connect can't work
}
export interface ConnectionsFile {
version: 1;
folders: ConnFolder[];