Multi-host phase 1: API tokens, auto TLS with pinned fingerprints, hub-side node manager + reverse proxy (WebSockets included), machine switcher in the rail, Machines page

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Mitchell-Johnson
2026-09-18 11:35:29 -07:00
co-authored by Claude Fable 5.1
parent fc42675e9f
commit 7dcdb5dc98
15 changed files with 960 additions and 56 deletions
+3 -2
View File
@@ -7,15 +7,16 @@ import { Spinner } from './ui'
export interface Group { id: string; label: string; icon: ReactNode; soon?: boolean; page?: boolean }
interface Props {
groups: Group[]; terms: Term[]; active: string | null; view: string; creating?: boolean
groups: Group[]; terms: Term[]; active: string | null; view: string; creating?: boolean; header?: ReactNode
onSelect: (id: string) => void; onView: (id: string) => void; onNew: () => void
onRename: (t: Term) => void; onClose: (t: Term) => void
}
export default function Rail({ groups, terms, active, view, creating, onSelect, onView, onNew, onRename, onClose }: Props) {
export default function Rail({ groups, terms, active, view, creating, header, onSelect, onView, onNew, onRename, onClose }: Props) {
const [open, setOpen] = useState<string>('terminal')
return (
<nav className="rail">
{header}
{groups.map((g) => {
const expanded = !g.page && open === g.id
const isPage = !!g.page && view === g.id