# Fortsetzungsdokument: Aufgabe #11 (SSH Copy-Paste + Terminal-Farben) Stand: 2026-09-02, Code-Stand abgeschlossen und regressionsfrei verifiziert; Live-Browser-Test weiterhin ausstehend (siehe Abschnitt 3 + Nachtrag in Abschnitt 4 -- dieselbe Einschraenkung wie bei Teil F). Repo: `ssh_jumphost`, erreichbar ueber die `device_bash`-Bridge unter `$HOME/mnt/ssh_jumphost`. **Einordnung**: Aufgabe #11 ist vom Nutzer nachtraeglich hinzugefuegt worden, nicht Teil von `Umsetzungsauftrag_Sonnet5.md` und hatte bis zu dieser Session keine Detail-Spec -- nur das Stichwort "SSH Copy-Paste + Terminal-Farben" (siehe `FORTSETZUNG_Teil_C.md`/`_D.md`/`_F.md`). Das Scope wurde zu Beginn dieser Session per Rueckfrage geklaert (zwei AskUserQuestion-Antworten): 1. **Copy-Paste**: "kopieren mit markieren des textes und einfuegen mit rechtsklick, wenn es umsetzbar ist sonst mit Rechtsklickkontextmenu." 2. **Terminal-Farben**: "Vom Benutzer waehlbar." Beides betrifft ausschliesslich SSH (`static/js/terminal.js`, `SshTerminalSession`) -- RDP hat ueber Guacamole bereits eine eigene, funktionierende Zwischenablage-Anbindung (`onclipboard` in `rdp.js`) und war nie Teil der Aufgabe (Titel: "**SSH** Copy-Paste"). --- ## 1) SSH Copy-Paste * **Kopieren**: `copyOnSelect: true` bei der `Terminal`-Konstruktion (`_setupTerminal()`). xterm.js kopiert eine Markierung damit sofort in die System-Zwischenablage -- kein Strg+C/Cmd+C mehr noetig. Strg+C OHNE Markierung bleibt unveraendert SIGINT (xterm.js' Standardverhalten, von `copyOnSelect` nicht beruehrt -- kein neues Verhalten, keine Ueberraschung fuer bestehende Nutzung). * **Einfuegen per Rechtsklick**, zweistufig, genau wie gewuenscht: 1. `contextmenu`-Listener auf `this.terminalContainer` (`_wireClipboard()`) ruft `event.preventDefault()` auf (unterdrueckt das native Browser-Kontextmenue) und versucht direkt `navigator.clipboard.readText()` (`_attemptDirectPaste()`). In den meisten Chromium-Browsern reicht ein Rechtsklick als "transiente Aktivierung" fuer diese Berechtigung -- Einfuegen passiert dann sofort, ohne sichtbares Menue. 2. Schlaegt das fehl (kein `navigator.clipboard`, Berechtigung verweigert -- typischerweise Firefox/Safari ausserhalb einer frischen Klick-Geste, oder unsicherer Kontext), erscheint ersatzweise ein winziges Kontextmenue mit einem "Einfuegen"-Eintrag (`_showPasteMenu()`). Dessen Klick ist selbst wieder eine frische Benutzergeste und hat dadurch nochmal bessere Chancen auf die Berechtigung. Schlaegt auch das fehl, zeigt der Status-Bereich der Sitzung einen erklaerenden Hinweis ("... bitte Strg+Umschalt+V verwenden") statt eines stillen No-Ops. 3. Das eigentliche Einfuegen laeuft ueber `this.term.paste(text)` (xterm.js v5 API, bestaetigt durch `.paste=`-Vorkommen in `vendor/xterm.js`) -- das ist KEIN separater Codepfad zum normalen Tippen: `paste()` loest intern denselben `onData`-Callback aus wie eine Tastatureingabe, geht also automatisch durch die bestehende WS-"input"-Sendefunktion. * **CSP-Falle vermieden**: der erste Entwurf positionierte das Ruecksicherungs-Kontextmenue ueber `menu.style.left/top` an der Klickposition -- das haette der Server-CSP (`style-src 'self'`, kein `unsafe-inline`) im echten Browser stillschweigend blockiert (dieselbe Regel, die JS-gesetzte `element.style`-Aenderungen genauso trifft wie `style="..."`-Attribute, siehe app.css-Kopfkommentar zu `.hidden`). Ersetzt durch vier feste CSS-Klassen (`.term-paste-menu-{top,bottom}` x `{left,right}`, app.css), die je nach Klick-Viertel von `.session-shell` gesetzt werden -- keine Pixelgenauigkeit, aber vollstaendig CSP-konform und konsistent mit der einzigen im ganzen Projekt verwendeten Sichtbarkeits-/Positionierungstechnik (Klassen, nie `.style`). * Aufraeumen: `_closePasteMenu()` entfernt das Menue plus seine Dokument-Listener (Klick-daneben/Escape/Scroll) -- aufgerufen aus `dispose()` UND aus `setActive(false)` (ein Umschalten auf eine andere Sitzung soll kein Geister-Kontextmenue im Hintergrund hinterlassen). ## 2) Terminal-Farben (vom Benutzer waehlbar) * Vier feste Farbschemata (`TERMINAL_THEMES`, Modul-Konstante): Standard (dunkel, bisheriges Verhalten unveraendert als Vorgabe), Dunkel/kontrastreich, Solarized Dark, Solarized Light. Bewusst eine kleine feste Auswahl statt eines vollen Theme-Editors -- deckt "vom Benutzer waehlbar" ab, ohne eine neue Einstellungsseite einzufuehren. * `