> Trwa korekta językowa tego tłumaczenia. W razie wątpliwości porównaj z [angielskim oryginałem](https://www.sm.ch-j.eu/docs/i18n/en/remote-editor-latency.md). # Monitorowanie zdalnego edytora oszczędności i latencji ## Przyczyny korzeniowe Poprzedni edytor przenieśł swój plik roboczy do katalogu docelowego, który często nie może być napisany przez SSH rachunek na `/etc` lub `/var`. SFTP nazwisko nazwy nie podało autoryzowanej ścieżki sudo, kontrola konfliktów, weryfikacja metadanych bezpieczeństwa lub niezawodne nadpisywanie semantyki. Jego obsługa obsługiwacza błędów usunęła tymczasową kopię, usunęła materiał odzyskiwania nawet po niepewnym zakończeniu. Status sesji wcześniej naświetlał tylko stan połączenia. Nie było żadnego ICMP ani uwierzytelnionego SSH pomiar odpowiedzi na podłożenie wskaźnika końcowego. ## Zapisz protokół 1. Ustalony plik pomocniczy SSH otwiera regularny plik jednolitej linki przy użyciu deskryptor-relatywnego operacje i `O_NOFOLLOW` dla każdego elementu ścieżki. Zapisuje zawartość. SHA-256 hash, urządzenie/inode, UID, GID, kompletne bity zezwolenia, nanosekundowe modyfikacje/czasy zmian i wszystkie rozszerzone atrybuty. Podstawa potwierdza hasz i dekoduje ścisły UTF-8, zachowując BOM. Każdy dokument jest nieprzezroczysty `editId`, rozszerzony do wtyczki, sesji terminalowej i tożsamości serwera. 2. Operacja przygotowawcza nieprzywilegowana rozwiązuje uwierzytelnione konto dom przez `pwd.getpwuid(os.getuid())`, tworzy `$HOME/ch-j-sm/` z trybem `0700`, i tworzy prywatny, ekskluzywny czasopismo odzyskiwania. Niebezpieczny dom, symboliczny obszar roboczy lub praca robocza należąca do innego konta zostaje odrzucony. 3. Wysyłanie rdzenia ukryte, losowe 128- bit `.tmp` plik roboczy przez SFTP z wyłączne stworzenie (`wx`), tryb `0600` i sześćdziesiątgodzinny czas przerwy na kanał/załadunek. Czasopismo zawiera docelowy, oryginalny punkt wyjściowy i oczekiwany hash pracy; nie zawiera uwierzytelnienia. 4. **Jeden SSH exec wykonuje całą finalizację**, opcjonalnie poprzez istniejący wykonawca sudo. Pomocnik bezpiecznie otwiera i hases prywatną kopię roboczą i uwalnia ją. Zamyka oryginalne inode, sprawdza jego podstawę odniesienia, tworzy wyłączny plik docelowy obok celu, pisze wszystkie zawartości, stosuje i potwierdza metadane, sprawdza oryginał ponownie, i splaszuje wymianę. 5. Ten sam katalog `os.replace` atomowo zastępuje cel. Rodzic katalog jest spłukany, a ostateczna ścieżka, hash, inode i metadane są sprawdzane. Oryginalna ścieżka pozostaje dostępna do czasu zastąpienia. Plik roboczy nigdy nie jest przemieszczany w pliki plików i nigdy nie jest usuwany przez finalizację. 6. Po uzyskaniu zweryfikowanego sukcesu, oddzielne czyszczenie ponownie sprawdza finał zawartość i metadane bezpieczeństwa przed usunięciem pliku roboczego i dziennika. Niepowodzenie wyczyszczenia wciąż zgłasza potwierdzone zapisywanie z `recoveryAvailable: true`. Niepowodzenie wysyłania, nieudanego sudo, konfliktu, błędu metadanych lub niepowodzenia zastąpienia zachowuje oryginalny i dowolny scenariusz. Niekompletne przesyłki są zidentyfikowane jako takie i nie mogą być odzyskane jako kompletny edytowany dokument. Zgubione SSH komunikacja, brak statusu wyjścia, limity czasowe i nieoczekiwane wyniki finalizacji są zgłaszane jako **nieznany**, nigdy tak uratowano. Zablokowanie drugiego zapisu na niepewnym dokumencie; nie ma automatycznego powtórzania. ## Metadane, przywileje i granice bezpieczeństwa Pomocnik zachowuje i sprawdza UID, GID i wszystkie bity zezwolenia POSIX, w tym wykonywane, setuid, setgid i lepkie bity. Reprodukuje rozszerzony atrybut Linux bajt dla bajtu, w tym POSIX ACL, możliwości i etykiety SELinux. Właściwość i zawartość pliku są ustawione przed atrybutami bezpieczeństwa, ponieważ pisanie/chownia może oczyścić możliwości lub specjalne bity zezwolenia. Usuwane są dziedziczne cechy docelowe, które nie występują w oryginału. Czas modyfikacji odzwierciedla nowy zapis i nie jest skopiowany z oryginału. Atrybut nieprzeczytany lub niereprezentabilny przerywa operację; metadane nie są cicho usunięte. Podpisy IMA/EVM są wyraźnie odrzucone, ponieważ kopiowanie zawartości/inode-wiązane podpisy integralności unieważniłyby je. Odrzuca się powiązania w ścieżce docelowej lub domowej, twardo powiązane pliki i nieregularne pliki. Brak miejsca lub słabszy SFTP Wykorzystywane jest zamienne zastąpienie. Zwyczajne zapisywanie oszczędza jako SSH konto. Ochrona oszczędności wymaga wyraźnie `{ sudo: true }`; hasło sudo jest opcjonalne dla sudo bez hasła. Hasła są zweryfikowane i przekazywane tylko na kanale stdin, nigdy nie znajdującym się w poleceniu, dzienniku, pliku roboczym, logerze lub błędzie zdalnym. Sesje root SSH używają istniejącego bezpośredniego wykonującego root. Nieudane zezwolenie pozostawia oryginalny i roboczy egzemplarz nietknięty. Wszystkie zapisy wykonywane jako root (bezpośredni root SSH lub sudo) odrzucają również katalogi docelowe/wyznaczniki posiadane lub zapisywane przez inne konta, lub przenoszące ACL dostęp, zamiast uwierzyć uprzywilejowanej nazwie ścieżki kontrolowanej przez inne konto. Stabilny pomocnik działa z `python3 -I -B`: ignoruje ścieżki użytkownika Python, katalog roboczy i pakiety witryny użytkownika i nie pisze żadnego bajtowego kodu. Ścieżki i JSON Argumenty są cytowane w Core. Wtyczki nigdy nie otrzymują arbitralnego SSH exec lub SFTP Uchwyty. Istniejąca piaskowoda, CSP, uprawnienia manifestowe, weryfikacja klucza hosta i certyfikacja aktualizacji pozostają w trakcie eksploatacji. ## Plugin API oraz pozostała integracja Monako **Oddzielnie rozproszony UI Monako/File Manager jest nieobecny w tym wymeldowaniu. Integracja UI, sudo szybkie, brudny-buffer obsługa i tłumaczenia nie mogły zostać wdrożone lub testowane tutaj.** Źródłem wtyczki pakowanego jest wtyczka Hash & Checksum. Nie wymyślono źródła zastępczego menedżera plików. Dostępne są istniejące metody. Metody/opcje dodatku są narażone przez wstępne obciążenie z piaskownikiem i czas trwania sprawdzony zezwoleniem: ```js const opened = await chjPlugin.files.readText(sessionId, path); // For a protected read, explicitly pass { sudo: true, sudoPassword }. const result = await chjPlugin.files.saveText(sessionId, path, editor.getValue(), { editId: opened.editId, sudo: true, // Include only after the user authorizes elevation. sudoPassword // Omit for passwordless sudo; never persist this value. }); if (result.ok && result.value.status === "saved") { // Mark this exact submitted editor version as saved. Later edits stay dirty. } else { // Keep the Monaco model dirty. Translate result.error.code/status. // result.error.recoveryId/recoveryPath identify retained working material. } await chjPlugin.files.closeText(opened.editId); const recovery = await chjPlugin.files.listRecovery(sessionId); const copy = await chjPlugin.files.readRecovery(sessionId, recoveryId); // Review copy.status and copy.text; open a fresh document before another save. await chjPlugin.files.cleanupRecovery(sessionId, recoveryId); // Cleanup rejects anything whose target is not currently confirmed. ``` Metody odzyskiwania akceptują opcjonalne ostateczne `{ sudo: true, sudoPassword }` argumenty podczas inspekcji celu wymagają podniesienia. Zachowują one uwierzytelnioną pracę użytkownika, nawet po wykonaniu przez sudo. Dzienniki przetrwają restartowanie aplikacji i SSH ponowne połączenie; odzyskanie nigdy automatycznie nie powtarza finalizacji. Przegląd odzyskanego bufora w stosunku do świeżie otwartego celu przed jego wyraźnym zachowaniem. `files.read` strażnicy czytają, kontrolują i uwalniają. `files.write` Strażnicy oszczędzają i odzyskują oczyszczenie. `writeText` nadal odrzuca w przypadku awarii dla istniejących wtyczek; `saveText` zwraca ustrukturyzowany `{ ok, value/error }` koperta Electron wyrzuca właściwości własny na odrzucone obiekty Błąd. Trzy-argumenty dziedzictwa `writeText` może korzystać z wartości wyjściowej pojedynczego otwartego dokumentu. Wiele dokumentów na żywo dla tej samej ścieżki wymaga `editId`; Dwuznakie połączenia z dziedzictwem nie są bezpieczne zamiast wybierania podstawowych zasad innego dokumentu. Wtyczki powinny uwolnić niewykorzystane uchwyty. Zewnętrzny interfejs interfejsu musi natychmiast wyświetlać zapisywanie, utrzymać bufory brudne przy awarii, oferować sudo tylko po niepowodzeniach zezwolenia/autentyfikacji, pokazywać konflikty bez przepisywania i oferować odzyskanie po utracie połączenia lub nieznanym wyniku. Musi to przetłumaczyć te państwa po czesku, niemieckim i angielskim. Zasugerowana kopia stanu: | State | Czech | German | English | | --- | --- | --- | --- | | Saving | Ukládání… | Wird gespeichert… | Saving… | | Confirmed | Uloženo | Gespeichert | Saved | | Failure | Uložení selhalo | Speichern fehlgeschlagen | Save failed | | Sudo required | Vyžadováno oprávnění sudo | sudo-Autorisierung erforderlich | Sudo authorization required | | Conflict | Původní soubor byl změněn | Originaldatei wurde geändert | Original file changed | | Disconnected | Spojení bylo přerušeno | Verbindung unterbrochen | Connection lost | | Unknown | Výsledek uložení není znám | Speicherergebnis unbekannt | Save result unknown | | Recovery | Obnova je dostupná | Wiederherstellung verfügbar | Recovery available | ## Definicje łatelności i cyklu życia **Ping** jest latencją zgłoszoną przez rzeczywistą odpowiedź ICMP na echo klienta na rozwiązane IP używane przez SSH. Podstawa wywołuje platformę pingu asynchronnie z ustaloną tablicą argumentów, bez wymagania uruchomienia pokoła lub administratora. Linux, macOS (w tym `ping6`) oraz Windows argumenty są wybierane oddzielnie. Blokowany ICMP, brak wykonania, limit czasu, nieprawidłowe wyjście lub tylko górne wiązanie Windows odpowiedź, jak np. `<1ms` produkuje niedostępną wartość, a nie wymyśloną liczbę. **SSH RTT** jest monotoniczne `performance.now()` czas trwania stałego `true` Wykonywanie wniosku w sprawie istniejącego uwierzytelnionego SSH Klient. Obejmuje ustawienie kanału, przetwarzanie serwera i dostarczenie odpowiedzi; nie jest to czysta sieć RTT lub SSH czas trwania logowania. Przetłumaczone podpowiedź wskaźnika wyjaśnia to rozróżnienie. Monitorowanie rozpoczyna się od momentu połączenia terminala. Soby działają równocześnie i asynchronicznie, z pięciosekundowym czasem czasu zapytania/procesu. Następna próbka jest zaplanowana 12 sekund po zakończeniu poprzedniej próbki, zapobiegając nakładaniu się. Odłączanie przerwań ICMP, oczyszcza czasomierze, anuluje oczekiwanie SSH praca i oczyszczanie wartości. Kontrole tożsamości rejestracyjnej uniemożliwiają opublikowanie wcześniejszych połączeń po połączeniu. Niepowodzenie ICMP nigdy nie zmienia się SSH stan połączenia. Łatency podróżują wewnątrz istniejącego `state` zdarzenie / `ssh:state` Ładunek IPC: ```js latency: { pingMs: 24.1, sshRttMs: 31.25, measuredAt: "…" } ``` Niedostępne są liczby `null`. Wskaźnik kompaktowy wykorzystuje milisekundy, lokalizowany niedostępny tekst i czeski/German/English etykiet. Ukrywa się przy rozłączeniu. Nie wymagano dodatkowej zdolności wykonania wytwarzacza lub żądania IPC. ## Limity weryfikacji i operacyjnych - Uciekaj od `app/`: `npm ci`Więc... `npm test`. - Wynik końcowy lokalnego: **179 testy; 163 Przeszedłem, 0 nie powiodło się, 16 przeskoczony**. Wszystkie przeskoki są to Linux Sprawy systemu plików w tym zakresie macOS - Gość. `npm ci`, kompilacja z Pythona i `git diff --check` pomyślnie zakończone. - Testy obejmują core zaoszczędza/odzyskuje, protokoł sudo i zmianę hasła, realny powłoka POSIX cytując wrogie ścieżki, konflikty, przesyłanie, nieudane czyszczenie, niepewne wyniki, równoczesne dokumenty, pozwolenia IPC i cykl życia latency. - Linux testy systemu plików ćwiczą wysłany punkt wpisu do Python, używając prywatnego Wyszukiwanie konta-domu testowego: własność/mode/xattrs, POSIX ACL, linki symboliczne/hardlinks, FIFO, przesyłki i awarie metadanych, awarie zamienne, wyścigi docelowe, nieznane wyniki po zastąpieniu i odzyskiwanie. Wykorzystanie systemu cross-filesystem `/dev/shm` i kolejne systemy plików, jeśli są dostępne. Badania te przeskakują na nie-Linux hosty; brak urządzeń ACL/oddzielnych plików są wyraźnie przeskoczone. - Dodano Linux GitHub Zadanie akcji prowadzi kompletny pakiet i powtarza system plików przypadki jako korzeń. Ten przepływ pracy nie został wysłany z tego drzewa. - Walidacja lokalna była w macOS. Syntaksya źródła Python została sprawdzona za pomocą bezpośredniej Narzędzia wykonywalne z Python. Prawdziwy macOS zwrócono kontrolę dymu ICMP `0.071 ms`. Brak żywego zdalnego serwera SSH, Windows runtime, Linux uruchamiania, rozmieszczania SELinux lub zewnętrznego interfejsu Monaco testowano lokalnie. - Zdalna edycja tekstu wymaga teraz Linux i Python 3 z deskryptorem odnoszącym się Obsługa systemu plików/xattr. Brak interpretera zawiodł się wyraźnie. Ten rdzeń celowo odmawia niebezpieczeństw metadanych, linków i konfiguracji katalogów. - Blokowanie jest doradztwem: niewspółpracujące procesy mogą nadal biegnąć w wąskich odstęp między ostatnim kontrolowaniem wyjściowym a nazwą atomową. Linux nie dostarcza ogólnej zawartości atomowej-hash porównanie-i-zamienne działanie. Sprawdza zmiany przed tym odstępem czasu; zachowanie roboczych kopii wsparcia odzyskania później. - Dane odzyskiwania pozostają na zdalnym koncie do czasu potwierdzenia czyszczenia. Niedokończone, niepowtarzalne i niepodważalne czasopianki nigdy nie są cicho odrzucane. Nie ma automatycznego wygaśnięcia pliku odzysku i nie ma opcji przymusowego nadpisywania. - `npm ci` zgłoszone 17 Wyniki audytu zależności (9 umiarkowana, 8 wysoka). Ta zmiana nie zmienia zależności ani modelu zaufania programu. Użytkownik żądał zachowania zmian w istniejącym drzewie roboczym, obecnie `feature/hash-checksum-plugin`; nie wykonano przełącznika oddziału ani niepowiązanego sprzątania. ## Pliki zmienione dla tego zadania - `src/main/files/remoteFileService.js` - `src/main/files/remoteEditor.py` (nowy) - `src/main/sessions/sessionManager.js` - `src/main/sessions/latencyMonitor.js` (nowy) - `src/main/plugins/pluginRuntime.js` - `src/preload/pluginPreload.js` - `src/renderer/app.js` - `src/renderer/index.html` - `src/renderer/styles.css` - `src/renderer/i18n.js` - `test/remoteFileService.test.js` - `test/sessionManager.test.js` - `test/pluginRuntime.test.js` - `test/remoteEditor.test.js` (nowy) - `test/remoteEditorProtocol.test.js` (nowy) - `test/remoteEditorLinux.test.js` (nowy) - `test/fixtures/remoteEditorLinux.py` (nowy) - `test/latencyMonitor.test.js` (nowy) - `README.md` - `docs/remote-editor-latency.md` (to plik) - `../.github/workflows/remote-editor-tests.yml` (nowy)