{# Plan 61/2b W3 — Jarvis slide-out dock. FAB (bottom-right) + drawer that wraps the existing per-machine chat (`` + machine-chat.js). Reuses the `machinePresence` Alpine store and `/api/admin/overview/fleet-machines` to resolve the fleet's jarvis_id. Hidden silently when no Jarvis is bound. Keyboard: cmd+\ / ctrl+\ — toggle esc — close (when input not focused) #}
{# Plan 62 — FAB removed. The dock now opens from the navbar button in base.html (next to the theme toggle) plus the footer button and the cmd+\\ shortcut. The dock's own state (jarvisId, presence, crossFleet) is still useful for the navbar trigger — it reads Alpine.store('jarvisDock') to render its presence dot. Drawer — always sidebar style, FLUSH WITH THE TOP EDGE (inset-y-0). 420px on lg+ (main content gets padding-right via body.jarvis-dock-open CSS so the chat lives BESIDE the page); mobile falls back to full width overlay. #}
{# Header — fixed 56px row at the top. z-10 + solid bg so chat content (which fills calc(100vh-56px) below) never bleeds up over it. #}

Jarvis

{# Body: chat OR switch-fleet pane. The chat pane resolves per-machine-chat against `jarvisId`, but a cross-fleet machine_id is hidden by RLS on the chat endpoints — so we never mount it there. Instead we surface a clear handoff to the fleet switcher. #}