clusev/resources/views/livewire
boban 07fe404ce9 feat(terminal): web terminal — per-server SSH + Clusev host PTY (xterm.js + node sidecar)
A dedicated /terminal page with a target rail: one terminal per fleet server (SSH)
plus one for the Clusev host itself. php-fpm cannot hold an interactive PTY, so a
small Node sidecar (ws + ssh2 + node-pty) bridges xterm.js to the PTY.

Flow: the Livewire page mints a single-use, 60s TerminalSession token and dispatches
it to an Alpine xterm island; the browser opens a same-origin WS (/terminal/ws,
proxied by nginx in dev / Caddy in prod to terminal:3000); the sidecar burns the
token at an internal resolve endpoint (shared-secret header, private network only)
for a connection spec, then opens an SSH PTY (decrypted credential, never sent to the
browser) or a local host PTY. Real shell = native Tab/Shift-Tab completion.

Security:
- token burned ATOMICALLY (single conditional UPDATE) — no double-open race
- resolve endpoint guarded by hash_equals shared secret, exempt from CSRF + PanelScheme
  host enforcement (private net only), returns decrypted creds over the internal net
- sidecar enforces same-origin on the WS upgrade (hostname match, port-agnostic)
- single-use 60s tokens, swept daily so the table can't grow unbounded

Verified in-browser (R12): host + server terminals connect, accept keyboard input,
run commands, Tab-complete; cross-origin WS rejected; zero console errors. 9 feature
tests cover minting, the resolve spec, single-use burn, expiry, and locked creds.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 03:21:10 +02:00
..
audit feat(audit): paginate the log + DB-wide search (v0.9.50) 2026-06-21 23:58:27 +02:00
auth fix(ui): themed x-checkbox component (accent, visible check) for login-protection + remember-me 2026-06-20 20:04:47 +02:00
files fix(files): responsive file rows + restore button cursor (v0.9.55) 2026-06-22 06:06:32 +02:00
help feat(wg): WireGuard help topic (registration + DE/EN content + test) 2026-06-20 22:46:04 +02:00
modals feat(ssh-keys): name an added SSH key so it is identifiable 2026-06-25 00:53:49 +02:00
release feat(release): publish + yank UI, strings, audit labels 2026-06-23 03:28:49 +02:00
servers fix(metrics): move the history chart x-axis labels below the plot 2026-06-25 01:55:49 +02:00
services fix(ui): add wire:key to list rows — stops "pending is not defined" (v0.9.53) 2026-06-22 00:44:03 +02:00
settings fix(ui): add wire:key to list rows — stops "pending is not defined" (v0.9.53) 2026-06-22 00:44:03 +02:00
system fix(ui): add wire:key to list rows — stops "pending is not defined" (v0.9.53) 2026-06-22 00:44:03 +02:00
terminal feat(terminal): web terminal — per-server SSH + Clusev host PTY (xterm.js + node sidecar) 2026-06-25 03:21:10 +02:00
versions fix(versions): dev box lists BOTH its source and the public repo 2026-06-24 23:51:28 +02:00
wireguard ux(wg): endpoint field is host-only (no apparent double port) (v0.9.47) 2026-06-21 23:25:44 +02:00
dashboard.blade.php fix(dashboard): readable audit labels in the recent-events panel (v0.9.52) 2026-06-22 00:27:13 +02:00
server-switcher.blade.php feat(i18n): bilingual foundation (DE/EN) + localize auth/dashboard/servers/fleet/account 2026-06-13 22:36:16 +02:00