> Jezična revizija ovog prijevoda je u tijeku. Ako je odlomak nejasan, pogledajte [engleski izvornik](https://www.sm.ch-j.eu/docs/i18n/en/remote-editor-latency.md). # Daljinski uređivač štednje i latency nadzor ## Korijenski uzroci Prethodni uređivač je ubacio svoju radnu datoteku u ciljni matični direktorij, koji često ne može biti zapisan od strane SSH račun pod `/etc` ili `/var`. SFTP preimenovanje nije dostavilo ovlaštenu sudo putanju, početnu provjeru sukoba, sigurnosnu provjeru metapodataka ili pouzdanu prepisku semantika. Njegova rukovodilac grešaka izbrisao privremenu kopiju, uklanjanje materijala za oporavak čak i kada je dovršetak bio neizvjesan. Status sesije je prethodno razotkrio samo stanje veze. Nije bilo ICMP-a ni autentificirane SSH mjera odgovora, mjeranjem pokazatelja za terminal. ## Spremi protokol 1. Fiksni SSH pomoćnik otvara redovnu, jednolink datoteku pomoću deskriptor- relative operacije i `O_NOFOLLOW` za svaku komponentu putanje. Ona zauzima sadržaj, SHA-256 hash, uređaj/inode, UID, GID, kompletni bitovi dozvole, nanosekundna modifikacija/promjena vremena i svi čitljivi prošireni atributi. Jezgra potvrđuje hash i dekodira strogo UTF-8, čuvanje BOM. Svaki dokument dobiva neproziran `editId`, opsegnut na njegov priključak, terminal sesija i identitet poslužitelja. 2. Neprivilegirana operacija pripreme rješava autentičan račun Dom kroz `pwd.getpwuid(os.getuid())`, stvara `$HOME/ch-j-sm/` sa načinom rada `0700`, i stvara privatni, ekskluzivni časopis oporavka. Odbačena je nesigurna kuća, simbolička radna površina ili radna površinа u vlasništvu drugog računa. 3. Jezgro šalje skriveno, nasumično 128-bit `.tmp` radna datoteka kroz SFTP s ekskluzivna kreacija (`wx`), način rada `0600` i šezdeset sekundi vremenskog ograničenja kanala i opterećenja. Dnevnik sadrži cilj, izvornu osnovnu vrijednost i očekivani radni hash; ne sadrži akreditive. 4. **Jedan SSH exec izvršava cijelu finalizaciju**, opcionalno kroz postojeći izvršitelj suda. Pomoćnik se sigurno otvara i pogađa privatnu radnu kopiju i ispušta je. Ona zaključava originalnu inode, provjerava svoju osnovnu vrijednost, stvara ekskluzivnu odredišnu datoteku pored cilja, piše sve sadržaje, primjenjuje i potvrđuje metapodatke, provjera originala ponovno, i ispušta zamjenu. 5. Izaberite direktorij `os.replace` Atomski zamjenjuje metu. Roditelj imenik je isprazan i konačna putanja, hash, inode i metapodaci su provjereni. Izvorna putanja ostaje dostupna do zamjene. Radna datoteka nikada nije premještena preko datotečnih sustava i nikada se ne uklanja finalizacijom. 6. Nakon što Core primi potvrđen uspjeh, zasebno čišćenje ponovno provjeri finale sadržaj i sigurnosni metapodaci prije uklanjanja radne datoteke i dnevnika. Neuspjeh čišćenja još uvijek prijavi potvrđeno spremanje pomoću `recoveryAvailable: true`. Neuspješno slanje, neuspješan sudo, sukob, pogreška metapodataka ili neuspjela zamjena čuva izvorni i bilo koji iscenirani materijal. Nedovršena upisivanja su identificirana kao takva i ne mogu se vratiti kao kompletni uređeni dokument. Izgubljeno SSH Prijavljen je status komunikacije, nedostajućeg izlaza, vremenska ograničenja i neočekivani rezultati finalizacije kao **nepoznato**, nikada kao spašen. Jezgro blokira još jednu spremu na nesigurnom dokumentu; nema automatskog ponovnog zamjene. ## Metapodaci, privilegije i sigurnosne granice Pomoćnik čuva i potvrđuje UID, GID i sve POSIX dozvole bitove, uključujući izvršne, setuid, setgid i ljepljive bite. Reproducira Linux prošireni atributi bajt za bajt, uključujući POSIX ACL-ove, mogućnosti i SELinux oznake. Vlasništvo i sadržaj datoteke su postavljeni prije sigurnosnih atributa, jer pisanje/chown može čistiti sposobnosti ili posebne dozvole bitova. Uklanjaju se nasljedni atributi odredišta koji su odsutni na izvorniku. Vrijeme promjene odražava novi zapis i nije kopiran iz originala. Nečitljiv ili nereprezentativan atribut prekida operaciju; metapodaci nisu tiho ispušteni. Potpisi IMA/EVM-a izričito se odbacuju jer bi ih kopiranje sadržaja/inode vezanih za integritet nevažeće. Simulinks u ciljnoj ili domaćoj stazi, tvrdo-povezane datoteke i neregularne datoteke su odbijene. Nema na mjestu ili slabije SFTP Koristi se zamjenska datoteka za prepisivanje. Obično zapisivanje uštedi kao SSH Račun. Zaštićeno štednje zahtijeva izričito `{ sudo: true }`; sudo lozinka je opciona za sudo bez lozinke. Lozinke se validiraju i prenose samo na kanalu stdin, nikada unutar naredbe, dnevnika, radne datoteke, logera ili udaljene greške. Korijenski SSH sesije koriste postojeći direktni izvršitelj roota. Neuspješno odobrenje ostavlja originalnu i radnu kopiju netaknutu. Sve spremanje izvršeno kao root (direktni root SSH ili sudo) također odbacuje ciljne direktorije/rezervatore u vlasništvu ili zapisivanju od strane drugih računa, ili nosi pristup ACL, umjesto da vjeruje privilegirano ime putanje kontrolirano drugim računom. Fiksni pomoćnik radi sa `python3 -I -B`: ignorira korisnika Python putanje, radni imenik i pakete korisničkih stranica, i ne piše bajt kod. Putevi i JSON argumenti su citirani u jezgri. Priključci nikada ne primaju proizvoljne SSH Izvršni ili SFTP Ruke. Postojeća pješčanica, CSP, dozvole manifest, provjera host-ključa i ažuriranje ostala u uporabi. ## Dodatak API i preostale Monako integracije **Odvojeno raspoređeni UI Monako/File Manager nije u ovom odjavu. Njezina integracija UI-a, sudo brzo, prljavi-buffer rukovanje i prijevodi nisu mogli biti implementirani ili testirani ovdje.** Izvor paketnog dodatka je Hash & Kontrolna suma dodatak. Nije izumio izvor zamijene upravitelja datoteka. Postojeće metode dostupne. Metode/opcije dodatka izložene su prethodnom utovarom u zaštićenoj kutiji i provjerenim dopuštenim radnim vremenom: ```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. ``` Metode oporavka prihvaćaju opcionalni final `{ sudo: true, sudoPassword }` Argument pri pregledu cilja zahtijeva povišenje. Oni zadržavaju radnu površinu korisnika koji je autentičan čak i kada je izvršen kroz sudo. Novinari preživljavaju ponovno pokretanje aplikacije i SSH se ponovno povezuju; oporavak nikada automatski ne ponavlja finalizaciju. Pregledati povratni spremnik na svježe otvorenu metu prije izričitog spremanja. `files.read` Stražari čitaju, pregledaju i puštaju ručku. `files.write` Stražari štede i čišćenje. `writeText` i dalje odbija neuspjeh za postojeće dodatke; `saveText` vraća strukturiran `{ ok, value/error }` Koverta Electron Ispušta vlastita svojstva na odbačene objekte greške. Nasljedstvo tri-argument `writeText` može koristiti početnu vrijednost jednog otvorenog dokumenta. Višestruki živi dokumenti za istu putanju zahtijevaju `editId`; dvosmisleno nasljeđe poziva ne uspijeju sigurno umjesto da odaberu početnu vrijednost drugog dokumenta. Priključci trebaju otpustiti neiskorištene ručke. Vanjski korisnički interfejs mora odmah prikazati ušteđevinu, zadržati bafere prljave na neuspjehu, ponuditi sudo samo nakon neuspješnog dozvole/autentifikacije, pokazati sukobe bez prepisivanja, te ponuditi oporavak nakon gubitka veze ili nepoznatog ishoda. Mora prevesti ove države na češkom, njemačkom i engleskom jeziku. Predložena kopija stanja: | 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 | ## Definicije zakretnosti i životni ciklus **Ping** je latencija prijavljena od strane stvarnog klijentskog odjeka ICMP-a na rješeni IP koji koristi SSH. Jezgra poziva platformu ping izvršne asynhronno s fiksnim nizom argumenta, bez zahtjeva za pokretanjem ljuske ili administratora. Linux, macOS (uključujući `ping6`) i Windows argumenti su odabrani odvojeno. Blokiran ICMP, nedostajuća izvršna datoteka, vremensko ograničenje, neispravan izlaz ili odgovor sa gornjim vezanim Windows- om kao što je `<1ms` proizvodi nedostupnu vrijednost, a ne izmišljeni broj. **SSH RTT** je monotonična `performance.now()` trajanje fiksnog `true` izvršni zahtjev preko postojećeg autentificiranog SSH -Klijent. Uključuje podešavanje kanala, obradu poslužitelja i isporuku odgovora; to nije čista mreža RTT ili SSH trajanje prijave. Prevedeni indikator napojnica objašnjava ovu razliku. Praćenje počinje čim se terminal poveže. Sobe se pokreću istovremeno i asinhronno, s pet sekundi vremenskog ograničenja za zahtjev/proces. Sljedeći uzorak je zakazan 12 sekundi nakon završetka prethodnog uzorka, sprečavajući preklapanje. Prekida prekid rada ICMP-a, čisti timerere, otkazuje čekanje SSH rad i čišćenje vrijednosti. Provjera identiteta zapisa sprečava da se prethodna veza objavi nakon ponovnog povezivanja. Neuspjeh ICMP-a nikad se ne mijenja SSH stanje povezivanja. Latency putuje unutar postojećeg `state` događaj / `ssh:state` IPC opterećenje: ```js latency: { pingMs: 24.1, sshRttMs: 31.25, measuredAt: "…" } ``` Nedostupni brojevi su `null`. Kompaktni indikator terminala koristi milisekunde, lokalizirani nedostupan tekst i češki/German/English etikete. Krije se na isključenju. Nisu potrebne dodatne mogućnosti izvođenja reflektora ili zahtjev za IPC-om. ## Ovjeravanje i operativne granice - Pokreni od `app/`: `npm ci`, onda `npm test`. - Konačni lokalni rezultat: **179 ispitivanja; 163 Prošao je, 0 nije uspjelo, 16 preskoči**. Sve preskoke jesu Linux Datotečni slučajevi macOS Domaćin. `npm ci`, Python kompilacija sintakse `git diff --check` uspješno završeno. - Testovi pokrivaju Core sprema/oporavlja, sudo protokol i redakcija lozinke, real POSIX ljuska citira neprijateljske staze, sukobe, uploads, neuspješno čišćenje, nesigurne ishode, istovremene dokumente, IPC dozvole i latency životni ciklus. - Linux Testovi datotečnog sustava vježbaju isporučeni Python ulazna točka, koristeći privatni test-home pretraživanje računa: vlasništvo/mode/xattrs, POSIX ACL-ovi, simboličke linkove/tvrde veze, FIFO-ovi, neuspjeh u slanju i metapodataka, zamjenski promašaj, ciljne utrke, nepoznati ishodi nakon zamjene i oporavak. Upotreba međudatotečnog sistema `/dev/shm` i još jedan datotečni sustav kada je dostupan. Ovi testovi preskaču na ne-Linux domaćinima; nedostaju ACL/odvojeni objekti sustava izričito preskaču. - Dodano Linux GitHub Posao radnji pokreće kompletan apartman i ponavlja datotečni sistem slučajeve kao korijen. Ovaj radni tok nije poslat s ovog radnog stabla. - Uključena je lokalna potvrda macOS. Python sintaksa izvora je provjerena s izravnim Naredbeni alati Python izvršni program. Prava macOS petlja ICMP provjera dima vratio `0.071 ms`. Nema živog daljinskog SSH poslužitelj, Windows vrijeme trčanja, Linux Runtime, SELinux raspoređivanje ili vanjski Monaco korisnički interfejs testiran je lokalno. - Udaljeno uređivanje teksta sada zahtijeva Linux i Python 3 s deskriptor-relativno Podrška za datotečni sistem/xattr. Nedostaje tumač izričito neuspjeh. Ovo jezgro namerno odbija nesigurne metapodatke, linkove i direktorijske konfiguracije. - Blokiranje je savjetovanje: nesuradnji procesi još uvijek mogu utrkivati u uskom interval između posljednje osnovne provjere i atomskog preimenovanja. Linux opskrba nema općeg atomskog sadržaja-hash usporediti-i-zamijeniti rad. Provjerava promjene prije tog intervala; zadržao radne kopije oporavak nakon toga. - Podaci o povratku ostaju na udaljenom računu sve dok se ne potvrdi čišćenje. Nedovršena, Konfliktne i neogledave časopise se nikad ne odbacuju tiho. Nema automatskog isteka datoteke za oporavak i nema opcije za prisilno prepisivanje. - `npm ci` prijavljeno 17 Zaključci ovisnosti (9 umjereno, 8 visoka). Ova promjena ne mijenja ovisnosti ili ažuriranje programa. Korisnik je zatražio zadržavanje promjena u postojećem radnom stablu, trenutno `feature/hash-checksum-plugin`; nije provedena zamjenska grana ili nepovezano čišćenje. ## Datoteke su izmijenjene za ovaj zadatak - `src/main/files/remoteFileService.js` - `src/main/files/remoteEditor.py` (novi) - `src/main/sessions/sessionManager.js` - `src/main/sessions/latencyMonitor.js` (novi) - `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` (novi) - `test/remoteEditorProtocol.test.js` (novi) - `test/remoteEditorLinux.test.js` (novi) - `test/fixtures/remoteEditorLinux.py` (novi) - `test/latencyMonitor.test.js` (novi) - `README.md` - `docs/remote-editor-latency.md` (ova datoteka) - `../.github/workflows/remote-editor-tests.yml` (novi)