> Jezikovni pregled tega prevoda še poteka. Ob nejasnostih primerjajte z [angleškim izvirnikom](https://www.sm.ch-j.eu/docs/i18n/en/remote-editor-latency.md). # Spremljanje varčevanja in zamud ## Koreninski vzroki Prejšnji urejevalnik je naložil delovno datoteko v matično imenik cilja, ki je pogosto ni mogoče napisati s strani SSH račun na podlagi `/etc` ali `/var`. SFTP preimenovanje ni podalo dovoljene poti sudo, izhodiščne preverjanje konfliktov, varnostno preverjanje metapodatov ali zanesljivo prepisovanje semantike. Njen upravljalec napak je izbrisal začasno kopijo, odstranjevanje materiala za izterjavo tudi ko je bilo dokončanje negotovo. Status seje je pred tem razkril samo stanje povezave. Ni bilo nobenega ICMP ali avtentifikacije SSH merjenje odziva, ki meri kazalnik za terminal. ## Shrani protokol 1. A fiksna SSH pomočnik odpre redno, eno povezavo datoteko z uporabo deskriptor-relative operacije in `O_NOFOLLOW` za vsako komponento poti. Zaznava vsebino. SHA-256 hash, naprava/inode, UID, GID, popolni biti dovoljenj, nanosekundna sprememba/čas spremembe in vse berljive razširjene atribute. Jedro potrjuje hash in dekodira strogo UTF-8, ohranjanje BOM. Vsak dokument dobi neprozoren `editId`, ki je ogledan na njegov vstavek, terminalsko sejo in strežnik identitete. 2. Neprivilegirani postopek priprave razrešuje avtentikirani račun Domov skozi `pwd.getpwuid(os.getuid())`, ustvarja `$HOME/ch-j-sm/` z načinom `0700`, in ustvari zasebno, izključno revijo za obnovo. Nevaren dom, simbolično delovno mesto ali delovno mesto v lasti drugega računa je zavrnjen. 3. Jedro nalaga skrito, naključno 128-bit `.tmp` delovna datoteka skozi SFTP z izključna ustvarjalnost (`wx`), način `0600` in 60-sekundni časovni preklic kanala/obresti. Revija vsebuje cilj, prvotno izhodiščno vrednost in pričakovano delovno hash; ne vsebuje nobenih pooblastil. 4. **Ena SSH izvršitelj izvaja celoten dokončni postopek**, neobvezno prek obstoječi izvršitelj suda. Pomočnik se varno odpre in porine zasebno delovno kopijo in jo izprazni. Zaklene prvotno inodo, preveri svojo izhodiščno vrednost, ustvari ekskluzivno namembno datoteko poleg cilja, napiše vse vsebine, uporablja in preveri metapodatke, ponovno preveri izvirnik in izprazni zamenjavo. 5. Ista mapa `os.replace` Atomsko zamenja cilj. Starša imenik je izpraznjen in končna pot, hash, inode in metapodatki se preverijo. Izvirna pot je na voljo do zamenjave. Delovna datoteka se nikoli ne premakne po datotečnih sistemih in nikoli ni odstranjena s končno zaključkom. 6. Po preverjenem uspehu jedrnega programa ločeno čiščenje ponovno preveri finalno vsebina in varnostni metapodatki pred odstranitvijo delovne datoteke in dnevnika. Napaka pri čiščenju še vedno poroča o potrjenem prihranku z `recoveryAvailable: true`. Napaka pri pošiljanju, neuspešnem sudo, konfliktu, napaki pri metapodatkih ali neuspeli zamenjavi hrani izvirnik in katerikoli uprizorjeni material. Nepopolna nalaganja so opredeljena kot taka in jih ni mogoče vrniti kot popolni urejeni dokument. Izgubljeno SSH Poročajo o komunikaciji, manjkajočem statusu izstopa, časovnih začasih in nepričakovanih rezultatih dokončanja kot **neznana**, nikoli tako rešeno. Jedro blokira drugo shrani na negotovem dokumentu; ni avtomatskega nadomeščanja. ## Metapodatki, privilegije in varnostne meje Pomočnik ohranja in potrjuje UID, GID in vse dovoljene bite POSIX, vključno z izvršnimi, setuid, setgid in lepljivimi biti. Razmnožuje se. Linux Razširjeni atributi bajt za bajte, vključno s POSIX ACL, zmogljivosti in oznakami SELinux. Lastništvo in vsebina datotek so določeni pred varnostnimi atributi, ker pisci/chown lahko jasno zmogljivosti ali posebni dovoljenje biti. Odstranjeni so dedirani namembni atributi, ki jih ni na izvirniku. Čas spremembe odraža nov zapis in ni prepisan iz prvotnega. Operacijo prekine neprečitljiv ali nepredstavljiv atribut; metapodatki se ne izpustijo tiho. Podpisi IMA/EVM se izrecno zavrnejo, ker bi jih kopiranje vsebine/inode vezane celovitosti razveljavilo. Simulacije v ciljni ali domači poti, trdo povezani datoteke in nepravilne datoteke so zavrnjene. Nobenega domačega ali šibkega SFTP Uporablja se rezervni prepis. Običajno zapisovalno prihranki tečejo kot račun SSH. Zaščiteni prihranki zahtevajo izrecno `{ sudo: true }`; sudo geslo je neobvezno za sudo brez gesla. Gesla so potrjena in prenesena samo na kanalu stdin, nikoli v zaporu, dnevniku, delovni datoteki, logerju ali oddaljeni napaki. Koren SSH seje uporabljajo obstoječi neposredni koreninski izvršitelj. Neuspešno dovoljenje pusti izvirno in delovno kopijo nepoškodovano. Vsi prihranki, ki so bili izvedeni kot koreninec (direktni korenine SSH ali sudo), zavračajo tudi ciljne mape/naročnike, ki so v lasti ali zapisovalni s strani drugih računov, ali ime ACL dostopa, namesto da zaupajo privilegiranemu imenu poti, ki ga nadzoruje drug račun. Fixni pomočnik teče z `python3 -I -B`: ignorira uporabniške pitonske poti, delovno imenik in pakete spletnih strani uporabnika, in ne piše bajtne kode. Potje in JSON Argumenti so citirani v jedru. Vstavki nikoli ne prejemajo samovoljnega SSH izvršni ali SFTP Ročaji. obstoječi peskovnik, CSP, očitna dovoljenja, preverjanje gostiteljskih ključev in preverjanje posodobitev ostajajo v uporabi. ## Vstavek API in preostalo vključevanje Monaka **Posebno razporejen UI Monaco/File Manager ni na voljo v tej odjavi. Njenega povezovanja z UI-jem, sudo hitrega, umazanega ravnanja in prevodov ni bilo mogoče izvajati ali testirati tukaj.** Vira paketnega vstavka je vstavek Hash & Checksum. Nadomestni vir upravljalca datotek ni bil izumljen. Sedanje metode so še vedno na voljo. Metode/možnosti dodatka so izpostavljene s prednalaganjem v peskovnici in preverjenim časom obratovanja: ```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 izterjave sprejmejo neobvezno končno `{ sudo: true, sudoPassword }` pri pregledu tarče je treba povečati. Obdržijo avtentikirano uporabniško delovno mesto tudi ob izvedbi prek sudo. Dnevniki preživljajo ponovno uporabo programa in SSH ponovno povezovanje; okrevanje nikoli samodejno ne ponovi dokončanja. Preden ga izrecno shranite, ponovno pregledajte izterjani blažilnik proti novemu odprtemu cilju. `files.read` stražarji berejo, pregledajo in sproščajo ročaj. `files.write` Varnostniki varčujejo in čistijo. `writeText` še vedno zavrne pri napaki za obstoječe vstavke; `saveText` vrne strukturirano `{ ok, value/error }` kuverta, ker Electron Izpusti lastnosti po meri na zavrnjenih objektih Napake. Triargument zapuščine `writeText` lahko uporabi izhodiščno vrednost enotnega odprtega dokumenta. Več živih dokumentov za isto pot zahteva `editId`; dvosmislene zapuščine klici ne uspejo varno, namesto da bi izbrali izhodišče drugega dokumenta. Vstavki morajo sprostiti neuporabljene ročaje. Zunanji UI mora takoj prikazati varčevanje, ohraniti blažilnike umazane ob neuspehu, ponuditi sudo le po dovoljenju/autentikaciji napake, pokazati konflikte brez prepisa in ponuditi okrevanje po izgubi povezave ali neznan izid. Te države mora prevajati v češkem, nemškem in angleškem jeziku. Predlagana 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 | ## Opredelitev pogojnih vrednosti in življenjski ciklus **Ping** je zamuda, ki jo poroča dejanski odsevek ICMP na strani stranke na strani odlive na rešeni IP, ki jo uporablja SSH. Jedro kliče platformo ping izvedljivo asynhronično z fiksnim argumentom, brez potrebe po zagonu lupine ali administratorja. Linux, macOS (vključno z `ping6`) in Windows argumenti so izbrani ločeno. Blokiran ICMP, manjkajoč izvršni program, začasni čas, neveljaven izhod ali samo zgornji vezan Windows odgovor, kot je `<1ms` proizvaja nedostopno vrednost, ne izmišljeno številko. **SSH RTT** je monotonična `performance.now()` trajanje fiksnega `true` Izvršna zahteva glede obstoječe overjene overitve SSH stranka. Vključuje nastavitev kanalov, obdelavo strežnikov in dostavo odziva; ni čista mreža RTT ali SSH trajanje prijave. Prevedeni indikatorski nasvet pojasnjuje to razliko. Spremljanje se začne takoj, ko se terminal poveže. Sočasno tečejo sočasno in asinhronizirajoč, s pet sekundnim časovnim zaporedjem zahtevka/procesa. Naslednji vzorec je naročen dvanajst sekund po zaključku prejšnjega vzorca, kar prepreči prekrivanje. Preklopi prekinitev ICMP, odstranjuje časnike, odpoveduje nepredvideno SSH delo in jamči vrednote. Preverjanje identitete zabeleži predhodno povezavo, da bi se objavila po ponovnem povezovanju. Neuspeh ICMP se nikoli ne spremeni SSH stanje povezave. Latenčna potovanja znotraj obstoječega `state` dogodk / `ssh:state` IPC tovor: ```js latency: { pingMs: 24.1, sshRttMs: 31.25, measuredAt: "…" } ``` Nedostopne številke so `null`. Kompaktni kazalnik za terminal uporablja milisekunde, lokalizirano nedostopno besedilo in češki/German/English etikete. Skriva se na prekinitvi. Ni bilo potrebno dodatnih zmogljivosti za izvedbo izdelavo ali zahtevek za IPC. ## Omejitve za preverjanje in delovanje - Beži od `app/`: `npm ci`, potem `npm test`. - Končni lokalni rezultat: **179 preskusi; 163 Prešel sem. 0 ni uspelo, 16 preskočen**. Vse preskoke so Linux primeri datotečnih sistemov na tem področju macOS gostitelj. `npm ci`, Python skladbo kompilacije in `git diff --check` uspešno končano. - Preskusi zajemajo Core varčevanje/obnavljanje, sudo protokol in ponovno delovanje gesla, real POSIX lupina citira sovražne poti, konflikte, nalaganje, neuspešno čiščenje, negotove rezultate, sočasni dokumenti, dovoljenja IPC in življenjski ciklus latency. - Linux Preskusi datotečnega sistema vadijo odposlano vhodno točko Python, z uporabo zasebnega test račun-home iskal: lastnik/mode/xattrs, POSIX ACLs, simbolične povezave/hardlinks, FIFO, nalaganje in napake metapodatki, nadomestne napake, ciljne dirke, neznani rezultati po zamenjavi in okrevanje. Uporabe med datotečnimi sistemi `/dev/shm` in drugi datotečni sistem, če je na voljo. Ti testi preskočijo na ne-Linux gostitelji; manjkajo objekti ACL/oddelek-datoteka so izrecno preskočeni. - Dodatek Linux GitHub Delo dejanj vodi celoten paket in ponavlja datotečni sistem primeri kot koren. Ta delovni tok ni bil poslan s tega delalnega drevesa. - Opravljena je bila lokalna validacija macOS. Preverjena je bila sintaksa vira Pythona z neposredno Ukazna vrstica Orodja Python izvedljiva. Resnična. macOS ICMP test dima vračan `0.071 ms`. Ni živega daljinca SSH strežnik Windows čas bežanja, Linux sproščanje, uvajanje SELinuksa ali zunanji Monaco UI je bilo testirano lokalno. - Oddaljeno urejanje besedila zdaj zahteva Linux in Python 3 z deskriptor-relativno Podpora za datotečni sistem/xattr. Manjkajoči tolmač izrecno ne uspe. To jedro namerno zavrača negotove metapodatke, povezave in nastavitve imenika. - Zaklepanje je svetovalno: nesodelujoči procesi lahko še vedno tekmujejo v ozko interval med zadnjim izhodiščnim preverjanjem in atomskim preimenovanjem. Linux ne zagotavlja splošne atomske vsebine-hash primerjave-in-zamenjava delovanja. Preverja spremembe pred tem intervalom; obdrži delovne kopije podpore za izterjavo. - Podatki o izterjavi ostajajo na oddaljenem računu, dokler ni potrjeno čiščenje. Nepopolno, Konfliktnih in nepreglednih revij se nikoli ne zavržejo tiho. Ni avtomatskega izterjave- datoteka in ni možnosti prisilnega prepisa. - `npm ci` prijavljeno 17 Rezultati revizije odvisnosti (9 zmerna, 8 visoka). Ta sprememba ne spreminja odvisnosti ali posodobljenega modela zaupanja programa. Uporabnik je zahteval ohranitev sprememb v obstoječem delovnem drevesu, trenutno `feature/hash-checksum-plugin`; ni bilo izvedeno nobenega stikala podružnice ali nepovezanega čiščenja. ## Datoteke so bile spremenjene za to nalogo - `src/main/files/remoteFileService.js` - `src/main/files/remoteEditor.py` (nova) - `src/main/sessions/sessionManager.js` - `src/main/sessions/latencyMonitor.js` (nova) - `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` (nova) - `test/remoteEditorProtocol.test.js` (nova) - `test/remoteEditorLinux.test.js` (nova) - `test/fixtures/remoteEditorLinux.py` (nova) - `test/latencyMonitor.test.js` (nova) - `README.md` - `docs/remote-editor-latency.md` (to datoteka) - `../.github/workflows/remote-editor-tests.yml` (nova)