Skip to content

feat(remote-server): Live-Verzeichnis und Vordergrundbefehl getrennter Sessions (#509) - #540

Merged
iret77 merged 2 commits into
mainfrom
fix/509-daemon-live-metadaten
Oct 9, 2026
Merged

iret77 merged 2 commits into
mainfrom
fix/509-daemon-live-metadaten

Conversation

@iret77

@iret77 iret77 commented Oct 9, 2026 •

Copy link
Copy Markdown
Collaborator

Worum es geht

Zweiter Teil von #509 (erster Teil: #539). Sessions, die nicht in diesem Fenster offen sind, zeigten unter Verbindungen bisher nur ihr Startverzeichnis. Für normale Tabs schickt der Client kein Verzeichnis mit, die Zeile blieb also leer bzw. fiel auf „Host · Terminal“ zurück. Gemeint sind getrennte und verwaiste Sessions sowie solche, die in einem anderen Fenster oder auf einem anderen Gerät offen sind. Der Daemon kannte weder das aktuelle Verzeichnis noch den Vordergrundbefehl einer PTY.

Änderungen

Protokoll (additiv, hinter Capability)

  • SessionInfo.live = 10 vom Typ SessionLiveMetadata { cwd, foreground_command }.
  • Neue Capability session-live-metadata-v1 (crates/zaplex_remote_session/src/types.rs). Nur Linux-Daemons bieten sie an, macOS-Daemons lassen sie ehrlich weg. Die Konstante liegt außerhalb von app/src/remote_server/**, gehört aber zum Capability-Flag.

Daemon (app/src/remote_server/session_live.rs, nur target_os = "linux")

  • Beim ListSessions liest der Daemon aus /proc. Feld 8 (tpgid) aus /proc/<shell>/stat nennt die Vordergrund-Prozessgruppe der PTY. Die Shell ist Session-Leader mit der PTY als Controlling-TTY (setsid + TIOCSCTTY im Spawn).
  • Eine Gruppe aus einer fremden Kernel-Session wird ignoriert (Schutz bei PID-Wiederverwendung).
  • Verzeichnis: /proc/<pid>/cwd des Vordergrundprozesses, sonst das der Shell.
  • Befehl: erstes Wort von argv[0], bei bekannten Interpretern (node, python, …) der Skriptname, sonst comm. Als Skript zählt nur ein Pfad oder eine Datei mit Skriptendung. Inline-Code (-c, -e, --eval, -p), Modulnamen und Optionswerte fallen auf den Interpreternamen zurück. Argumente verlassen den Host nie. Am leeren Prompt bleibt der Befehl leer.
  • Ist der Leader einer Vordergrund-Pipeline schon beendet (cat app.log | less), zählt das neueste lebende Mitglied derselben Prozessgruppe und Session.

Client (headless_connect.rs)

  • live wird nur von Daemons mit der Capability übernommen (discard_unsupported_live_metadata). Alte Daemons fallen ehrlich auf das Startverzeichnis bzw. „Host · Terminal“ zurück.
  • Die Titelanreicherung schreibt ohne Agent keinen Verzeichnisnamen mehr in den Titel. Die Zeile bildet „Host · Verzeichnis“ wie eine Pane. Agent-Titel („Claude · …“) bleiben unverändert.

Panel (ssh_manager/panel.rs)

  • Identität aus dem Live-Verzeichnis, sonst aus dem Startverzeichnis.
  • Fester Metadaten-Slot: Vordergrundbefehl, dann „zuletzt geöffnet vor …“. Neben einer Agent-Identität entfällt der Befehl.
  • Beispiel: Titel host · api, darunter claude · zuletzt geöffnet vor 3 Stunden.

Spezifikation: #spec C6 in docs/ui/cockpit-sidebar-connections.html, die Fixture connections-session-rows.html (Headless-Prüfung: passed, 186 Assertions), PRODUCT §2 und TECH (Connections).

Tests (neu, im CI-Filter von pr-check.yml)

  • remote_server::session_live::tests: Vordergrundjob mit Verzeichnis und Programmname (Argumente bleiben draußen), leerer Prompt, Interpreter-CLI, unlesbares Verzeichnis (Rückfall auf die Shell), Prozessgruppe aus fremder Session, verschwundene Shell, Inline-Code bei python -c/node -e/perl -ne/ruby -e (nur der Interpretername), Modul- und Optionsoperanden, umgeschriebene Prozesstitel, Pipeline mit beendetem Leader, Pipeline ohne Überlebende
  • live_metadata_is_ignored_without_the_capability (headless_connect)
  • detached_session_row_uses_daemon_live_cwd_and_foreground_command
  • old_daemon_without_live_metadata_falls_back_honestly
  • supported_features_advertises_live_session_metadata_on_linux / …_omits_…_without_proc
  • angepasst: unmatched_agent_inventory_never_preserves_a_shell_title (Titel bleibt jetzt leer, Verzeichnis bleibt Identitätsquelle)

Verifikation – ausdrücklich nicht gelaufen

  • Compile, Clippy und Tests sind nicht gelaufen. Lokale Builds sind nicht erlaubt, und auf PRs läuft nur no-new-cjk. Compile, Clippy und alle Tests kommen mit dem nächsten gebündelten ci-batch auf main (pr-check.yml und Workspace-nextest).
  • Gelaufen sind rustfmt --check auf den geänderten Dateien, git diff --check, script/check-compact-row-actions, die Headless-Fixture-Prüfung, ein eigenes Review und ein Codex-Zweitreview (siehe unten).
  • Die /proc-Logik ist mit einem Fake-/proc getestet. Den echten Daemon auf einem Host prüft erst die Laufzeit.

Review

Codex-Zweitreview (gpt-6, read-only), drei Befunde, alle berechtigt und im zweiten Commit behoben:

  1. Datenschutz (hoch): Bei python3 -c "…" wurde Inline-Code als Befehlsname gemeldet. Jetzt meldet der Daemon nur echte Skriptdateien, sonst den Interpreternamen. Dazu kommen Negativtests. Die eigene Prüfung hatte denselben Fund. Auch umgeschriebene Prozesstitel wie npm run dev … liefern nur noch ihr erstes Wort.
  2. Compile (hoch): Zwei vollständige SessionInfo-Literale in crates/remote_server/src/client_tests.rs hätten mit E0063 nicht kompiliert. Sie haben jetzt live: None. Die übrigen Literale im Repo nutzen ..Default::default().
  3. Pipeline (mittel): Nach dem Ende des Gruppen-Leaders blieb der Befehl leer. Das ist jetzt behoben; die Suche über /proc läuft nur in diesem seltenen Fall.

Kompatibilität

Offen / Abhängigkeiten

Refs #509

🤖 Generated with Claude Code


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

iret77 and others added 2 commits October 10, 2026 00:36
…r Sessions melden

Getrennte oder anderswo offene Zaplex-Sessions zeigten unter Verbindungen
nur ihr Startverzeichnis, bei normalen Tabs also nichts (#509).

- Proto: additives Feld `SessionInfo.live` (`SessionLiveMetadata` mit
  `cwd` und `foreground_command`) hinter der Capability
  `session-live-metadata-v1`, nur von Linux-Daemons angeboten.
- Daemon: `remote_server::session_live` liest beim `ListSessions` aus
  `/proc` die Vordergrund-Prozessgruppe der PTY (`tpgid` der Shell), deren
  Verzeichnis (sonst das der Shell) und den Programmnamen. Argumente
  verlassen den Host nie; eine Gruppe aus fremder Session wird ignoriert.
- Client: `live` nur von Daemons mit der Capability übernehmen; der Titel
  trägt nur noch die Agent-Identität, sonst bildet die Zeile
  „Host · Verzeichnis“ aus dem Live- bzw. Startverzeichnis.
- Panel: Vordergrundbefehl im festen Metadaten-Slot vor „zuletzt geöffnet“.
- Spezifikation (C6, PRODUCT, TECH, Fixture) und CI-Testfilter.

Lokal weder kompiliert noch getestet; Compile und Tests laufen im
nächsten ci-batch.
…Testliterale

Befunde aus dem Codex-Zweitreview:
- Interpreter melden nur echte Skriptdateien (Pfad oder Skriptendung).
  Inline-Code (-c, -e, --eval, -p), Modulnamen und Optionswerte fallen auf
  den Interpreternamen zurück, damit keine Argumentinhalte den Host
  verlassen. Umgeschriebene Prozesstitel liefern nur ihr erstes Wort.
- Ist der Leader einer Vordergrund-Pipeline beendet, zählt das neueste
  lebende Mitglied derselben Prozessgruppe und Session.
- SessionInfo-Literale in crates/remote_server/src/client_tests.rs um das
  neue Feld live ergänzt.

Refs #509

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@iret77
iret77 merged commit 4e3ab3c into main Oct 9, 2026
1 check passed
@iret77
iret77 deleted the fix/509-daemon-live-metadaten branch October 9, 2026 23:15
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