Skip to content

fix(ui): Pane-Identität im Dateimanager-Modus und bei Hostwechsel - #536

Merged
iret77 merged 2 commits into
mainfrom
fix/461-pane-identitaet-host
Oct 9, 2026
Merged

iret77 merged 2 commits into
mainfrom
fix/461-pane-identitaet-host

Conversation

@iret77

@iret77 iret77 commented Oct 9, 2026 •

Copy link
Copy Markdown
Collaborator

Worum es geht

Schließt die zwei offenen Lücken aus #461 (Codebefund vom 06.10.). Beide Punkte bestanden auf main (0ba54c049) unverändert.

1. Dateimanager-Modus zeigt Host · Verzeichnis

  • SftpBrowserView bindet beim Erzeugen ein Hostlabel wie eine Terminal-Pane (PaneConfiguration::terminal_identity_host): lokal Lokal, remote SshServerInfo.host des Registry-Knotens. Das ist dasselbe Feld, das Terminal-Panes über bind_ssh_pane_node erhalten. Ersatzweise gilt der Knotenname, sonst Remote-Session.
  • Titel und Tooltip kommen aus der zentralen terminal_identity(host, cwd, fallback). Die Signatur ist unverändert, damit die Sessionliste unter Verbindungen sie weiter nutzen kann. SFTP: /pfad entfällt mitsamt den i18n-Schlüsseln fm-title-sftp und sftp-local-file-manager-title.
  • PaneGroup::refresh_terminal_titles nimmt sichtbare Dateimanager-Panes mit ihrer eigenen Identität in die Kollisionsauflösung auf. Nur eine echte Kollision zeigt den vollen Pfad. Als Suffix-Schlüssel dient über einer Terminal-Pane deren persistente Session; ein eigenständiger Dateimanager nutzt seine Pane-ID.
  • Die Kopfzeile des Dateimanagers liest den aufgelösten Titel. Der volle Pfad bleibt über die Breadcrumb-Leiste erreichbar; die Standard-Kopfzeile hat keinen Tooltip-Platz.

2. Hostwechsel in der Shell bindet das Host-Label neu

Ich habe keinen eigenen Detektor gebaut, sondern vorhandene Signale verwendet (TerminalView::identity_host_and_directory):

  • Das gebundene Label gilt nur, solange die aktive Shell nachweislich die eigene Shell der Pane ist. Das prüft dieselbe Logik, die der Dateimanager vor der Verzeichnisübergabe nutzt: Daemon-Wurzel, classic_ssh_root_session_id bzw. lokale Shell ohne Subshell.
  • Ein manuelles ssh mit Shell-Integration (Zaplexify, Legacy-SSH) benennt den hostname, den die neue Shell beim Bootstrap meldet. exit zeigt wieder Lokal bzw. das gebundene Label.
  • Precmd-Metadaten lösen das Update jetzt auch bei einem Sessionwechsel mit gleichem Verzeichnis aus.
  • Grenze (ehrlicher Fallback): Ein interaktives ssh ohne Shell-Integration meldet weder Host noch Verzeichnis. Die Pane zeigt dann Remote-Session · Terminal statt Lokal · <alter Ordner>. Erkannt wird das über die vorhandene Zaplexify-Erkennung parse_interactive_ssh_command. Andere Werkzeuge wie mosh und Sprünge innerhalb einer solchen Sitzung bleiben unsichtbar. Eine klassische SSH-Pane, deren eigene Verbindung nie bootstrappt, behält ihr gebundenes Label.

Tests und Spezifikation

  • Neu: pane_identity_follows_the_shell_across_a_manual_ssh_hop_and_exit und bound_host_names_only_the_panes_own_shell (Terminal-View, über echte Precmd-Events), außerdem file_manager_mode_keeps_the_host_and_directory_identity (Workspace: zwei Dateimanager mit gleichem Basename, Kollision und Auflösung). Alle drei sind in der Testauswahl von pr-check.yml eingetragen.
  • specs/GH-160/PRODUCT.md und TECH.md sind um einen Abschnitt zu fix(ui): Pane-Identität aus Host und Verzeichnis, Tabtitel aus aktivem Pane #461 ergänzt, docs/ui/cockpit-sidebar-connections.html #spec P3 nachgezogen.

Verifikation

  • Compile, Clippy und Tests: nicht gelaufen. Lokale Builds sind ausgeschlossen. Sie laufen im nächsten gebündelten ci-batch auf main.
  • Statisch geprüft: rustfmt --check auf den geänderten Dateien (nur eigene Hunks) und git diff --check.
  • Review: eigenes Review und ein Codex-Zweitreview (read-only); Ergebnisse stehen unten im Thread.
  • Keine native Abnahme in diesem PR.

Refs #461


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

@iret77

iret77 commented Oct 9, 2026

Copy link
Copy Markdown
Collaborator Author

Review

Eigenes Review: Ich habe Schichtgrenzen, Lock-Reihenfolge, Sichtbarkeiten und Testpfade geprüft. Neue TerminalModel::lock()-Aufrufe in identity_host_and_directory (is_long_running, command_to_string, active_session_is_local) sind kurzlebig und laufen nacheinander. Keiner der Aufrufer von update_pane_configuration hält den Modell-Lock.

Codex-Zweitreview (read-only, gpt-6-astra, Effort high) auf 676c0cb1d, zwei Findings:

  1. Daemon-Wurzelshell könnte bei gleichem Hostnamen von Client und Server als Lokal erscheinen. Widerlegt. Sessions markiert eine daemon-gehostete Wurzelshell mit mark_daemon_hosted, bevor sie sichtbar wird (app/src/terminal/model/session.rs, Kommentar „nothing may see it as local“). is_local() ist für sie also immer false, und der Wurzel-Nachweis greift.
  2. Terminal und Dateimanager schreiben dasselbe Verzeichnis unterschiedlich (~ gegenüber absolutem Pfad). Bestätigt und behoben in a0991a381. Der lokale Dateimanager nutzt jetzt user_friendly_path wie das Terminal, mit Testfall Local · ~. Remote kennt der Dateimanager das Home-Verzeichnis nicht, dort bleibt der Pfad absolut (in TECH.md festgehalten).

Compile, Clippy und Tests: nicht gelaufen, sie folgen im nächsten gebündelten ci-batch.

iret77 added 2 commits October 9, 2026 18:51
Der Dateimanager-Modus zeigt dieselbe Identität `Host · Verzeichnis`
wie die Terminal-Pane, lokal und remote, über die zentrale Ableitung
`terminal_identity`. Die Pane-Gruppe löst Kollisionen auch für
Dateimanager-Panes auf; nur eine echte Kollision zeigt den vollen Pfad.

Das gebundene Hostlabel gilt nur, solange die aktive Shell die eigene
Shell der Pane ist. Ein manuelles `ssh` oder `exit` benennt den Host,
den die aktive Shell beim Bootstrap meldet; ein Sessionwechsel mit
gleichem Verzeichnis aktualisiert die Anzeige. Ein interaktives `ssh`
ohne Shell-Integration zeigt ehrlich `Remote-Session · Terminal`.

Regressionstests, CI-Testauswahl und Spezifikation (GH-160, HTML-Spec P3)
nachgezogen. Compile und Tests nicht gelaufen; sie folgen im nächsten
gebündelten ci-batch.

Refs #461
Zweitreview-Finding: Terminal und Dateimanager schrieben dasselbe lokale
Verzeichnis unterschiedlich (~ gegenüber absolutem Pfad). Der lokale
Dateimanager nutzt jetzt dieselbe Schreibweise; Test und TECH-Spezifikation
ergänzt.

Refs #461
@iret77
iret77 force-pushed the fix/461-pane-identitaet-host branch from a0991a3 to b0e82de Compare October 9, 2026 16:51
@iret77
iret77 merged commit dd867dd into main Oct 9, 2026
1 check passed
iret77 added a commit that referenced this pull request Oct 9, 2026
… nach #536)

Seit #536 heißt der Pane-Kopf eines Dateimanagers `Host · Verzeichnis` mit
dem SSH-Host des Registry-Eintrags (der Anzeigename nur ersatzweise), lokal
mit dem Label der lokalen Terminal-Pane und `~` für das Home-Verzeichnis.
Die Ziel-Labels nutzten noch den Anzeigenamen und "lokal" – Fußzeile und
Pane-Kopf hätten dieselbe Pane verschieden benannt.

- Ziel-Labels übernehmen jetzt genau das Host-Label des Pane-Kopfs und
  schreiben ein lokales Home als `~`.
- Nach dem Rebase hätte die eigene Host-Variable im Konstruktor die aus
  #536 überschattet und vor `set_identity_host` verschoben (Compile-
  Fehler); der Konstruktor nutzt jetzt das Host-Label aus #536 für beide.
- Beim (Re-)Connect setzen Ziel-Label und Pane-Kopf den Host aus dem
  Server-Snapshot der tatsächlichen Verbindung.
- Nicht mehr genutzte Schlüssel `fm-label-local` und `fm-label-remote-host`
  entfernt; der unbekannte Host heißt wie bei Terminal-Panes.
- Der native Nachweis prüft die Fußzeile über den eindeutigen
  Verzeichnisnamen, unabhängig von der `~`-Kürzung.
@iret77
iret77 deleted the fix/461-pane-identitaet-host branch October 9, 2026 22:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant