Add SSH connections: saved hosts manager and hierarchical shell picker

This commit is contained in:
megaproxy 2026-05-25 19:47:37 +01:00
parent 4e5bc7e081
commit 872fb0e80e
14 changed files with 1324 additions and 171 deletions

View file

@ -16,6 +16,7 @@ import {
onPaneData,
onPaneExit,
type PaneId,
type SpawnSpec,
} from "../ipc";
// ---------------------------------------------------------------------------
@ -45,8 +46,10 @@ function stringToB64(s: string): string {
// ---------------------------------------------------------------------------
interface XtermPaneProps {
distro?: string;
cwd?: string;
/** Spec describing what to spawn into this pane's PTY. Read once at mount;
* changing it later does NOT respawn callers force a respawn by
* changing the React `key` (see Pane.svelte / LeafPane). */
spec: SpawnSpec;
onStatus?: (msg: string, ok: boolean) => void;
/** Fired once when the backend PTY is alive and we have its PaneId. */
onSpawn?: (paneId: PaneId) => void;
@ -69,8 +72,7 @@ const DEFAULT_XTERM_FONT_SIZE = 13;
// ---------------------------------------------------------------------------
export default function XtermPane({
distro,
cwd,
spec,
onStatus,
onSpawn,
onInput,
@ -152,7 +154,7 @@ export default function XtermPane({
const rows = term!.rows;
try {
paneId = await spawnPane({ distro, cwd, cols, rows });
paneId = await spawnPane({ spec, cols, rows });
if (destroyed) {
void killPane(paneId);
return;
@ -287,8 +289,9 @@ export default function XtermPane({
fitRef.current = null;
paneIdRef.current = null;
};
// distro/cwd are only used at spawn time; intentionally omitted from deps
// so remounting doesn't happen if a parent re-renders with the same values.
// spec is read once at mount; intentionally omitted from deps so we
// don't remount on parent re-renders. Callers force a respawn by
// bumping the React `key` (changeShell swaps the leaf id for that).
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);