> Selle tõlke keeleline läbivaatamine on pooleli. Ebaselguse korral võrrelge [ingliskeelse originaaliga](https://www.sm.ch-j.eu/docs/i18n/en/remote-editor-latency.md). # Kaugredaktori salvestamine ja latentsi jälgimine ## Juured Eelmine redaktor laadis oma tööfaili üles sihtkataloogi, mida SSH konto `/etc` või `/var` all ei saa sageli kirjutada. SFTP ümbernimetamine ei andnud luba sudo tee, lähtetaseme konfliktikontroll, turvametaandmete kontroll või usaldusväärne semantika ülekirjutamine. Selle viga käitleja kustutas ajutise koopia, eemaldades taastusmaterjali isegi siis, kui lõpetamine oli ebakindel. Seansi olek on varem avatud ainult ühenduse olekule. ICMP-d ega kinnitatud SSH vastuse mõõtmist terminali indikaatoril ei olnud. ## Protokolli salvestamine 1. Fikseeritud SSH abiline avab tavalise ühe lingiga faili, kasutades deskriptorit operatsioonid ja `O_NOFOLLOW` iga liini komponent. See salvestab sisu, SHA-256 hash, seade/inode, UID, GID, täielik luba bitid, nanosekundit muutmise / muutmise korda ja kõik loetavad laiendatud atribuudid. Core kontrollib hash ja dekodeerib range UTF-8, säilitades BOM. Iga dokument saab läbipaistmatu `editId`, ulatus selle plugin, terminali seanss ja serveri identiteet. 2. Privileegeerimata ettevalmistusoperatsioon lahendab kinnitatud konto kodu kaudu `pwd.getpwuid(os.getuid())`, loob `$HOME/ch-j-sm/` režiimiga `0700` ja loob era-, eksklusiivne taastamise ajakirja. Ebaturvaline kodu, sümlinki tööruum või mõnele teisele kontole kuuluv tööruum lükatakse tagasi. 3. Tuum laadib üles peidetud, juhusliku 128- biti `.tmp` tööfaili kaudu SFTP koos eksklusiivne loomine (`wx`), režiim `0600` ja kuuekümne sekundiline kanal/ülelaadimise aeg. Ajakiri sisaldab sihtmärki, algset lähtejoont ja oodatavat töötavat hašišit; see ei sisalda volikirju. 4. **ONE SSH exec täidab kogu finalization**, valikuliselt läbi olemasolev sudo täideviija. Abiline avab ja hoiab privaatse koopia lahti ning laseb selle alla. See lukustab algse inode, kontrollib oma lähtejoone, loob eksklusiivne sihtfaili kõrval eesmärk, kirjutab kogu sisu, kohaldatakse ja kontrollib metaandmeid, kontrollib originaal uuesti ja loputab asendus. 5. Sama-direktori `os.replace` aatomiga asendab sihtmärgi. Vanem kataloog on uhutud ja lõplik asukoht, hash, inood ja metaandmed on kontrollitud. Algne tee jääb kättesaadavaks kuni asendamiseni. Tööfaili ei liigutata kunagi üle failisüsteemide ja seda ei eemaldata kunagi finaliseerimise teel. 6. Kui Core saab kontrollitud edu, eraldi puhastamine kontrollib finaal sisu ja turvalisuse metaandmed enne tööfaili ja päeviku eemaldamist. Puhastamise ebaõnnestumine teatab endiselt kinnitatud salvestamisest `recoveryAvailable: true` abil. Ebaõnnestunud üleslaadimine, nurjus sudo, konflikt, metaandmete viga või ebaõnnestunud asendamine hoiab alles originaalse ja mis tahes lavastatud materjali. Ebatäielikud üleslaadimised on sellistena määratletud ja neid ei saa taastada täieliku muudetud dokumendina. Kadunud SSH side, puuduvad väljumise staatus, aeg maha ja ootamatu finaliseerimise tulemused on teatatud kui **unthand**, kunagi salvestatud. Core blokeerib veel ühe salvestava dokumendi, automaatset asendamist ei proovita uuesti. ## Metaandmed, õigused ja ohutuspiirid Abiline säilitab ja kontrollib UID-, GID- ja kõiki POSIX-i õiguste bitte, sealhulgas käivitatavat, setuidset, seadistatud ja kleepuvat bitti. See paljundab Linux laiendatud atribuute baiti, sealhulgas POSIX ACL-e, võimeid ja SELinux'i silte. Omandi ja faili sisu on seatud enne turvalisuse atribuudid, sest kirjutab / cown saab selge võimeid või eriloa bitid. Päritud sihtkoha atribuudid, mis originaalis puuduvad, eemaldatakse. Muutmisaeg peegeldab uut kirjutamist ja seda ei kopeerita originaalist. Lugematu või kirjeldamatu atribuut katkestab operatsiooni; metaandmeid ei jäeta vaikselt maha. IMA/EVM allkirjad lükatakse selgesõnaliselt tagasi, sest sisu/indode-sidet sisaldavate terviklikkuse allkirjade kopeerimine muudaks need kehtetuks. Sümviidad sihtmärgil või kodurajal, raskesti seotud failid ja ebaregulaarsed failid lükatakse tagasi. Ei kasutata kohasisest ega nõrgemat SFTP varukoopia ülekirjutamist. Tavapärane kirjutatav salvestab käivitamise SSH kontona. Kaitstud salvestab nõuab selgesõnalist `{ sudo: true }`; paroolita sudo jaoks on sudo parool vabatahtlik. Paroolid on valideeritud ja edasi ainult kanal stdin, kunagi sees käsk, päevik, tööfail, logija või võrgu viga. Juur SSH seansid kasutavad olemasolevat otse root testamenditäitjat. Vigane luba jätab originaali ja töökoopia puutumata. Kõik salvestab administraatorina (otsejuur SSH või sudo), samuti lükkab tagasi teiste kontode omanduses olevad või kirjutatavad sihtkataloogid/tantsurid või juurdepääsuga ACL, selle asemel et usaldada mõne teise konto poolt kontrollitavat privilegeeritud asukohanime. Fikseeritud abiline töötab `python3 -I -B`- ga: ignoreerib kasutaja Pythoni asukohti, töökataloogi ja saidipakette ning ei kirjuta baidikoodi. Teed ja JSON argumendid on shelliga noteeritud tuum. Pluginad ei saa kunagi suvalise SSH eksec või SFTP käepidemeid. Olemasolevad liivakast, CSP, manifesti õigused, masinavõtme kontroll ja ajakohastamine kontroll on veel kasutusel. ## Plugin API ja ülejäänud Monaco integratsioon **Eriti jaotatud Monaco/File Manager UI puudub sellest kassast. Selle UI integratsiooni, sudo kiire, määrdunud puhvri käitlemise ja tõlkeid ei saa siin rakendada ega testida.** Plugina komplekteeritud allikas on Hash & Checksum plugin. Failihalduri asendusallikat ei leiutatud. Olemasolevad meetodid on endiselt kättesaadavad. Lisameetodid/valikud puutuvad kokku liivakastis eellaadimise ja loaga kontrollitud tööajaga: ```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. ``` Recovery meetodid aktsepteerivad vabatahtlik lõplik `{ sudo: true, sudoPassword }` argument kontrollimisel eesmärk nõuab kõrgust. Nad säilitavad autenditud kasutaja tööruumi isegi siis, kui seda tehakse läbi sudo. Päevikud jäävad ellu rakenduse taaskäivitamise ja SSH taasühendamise korral; taastamine ei kordu kunagi automaatselt. Vaadata uuesti puhvri vastu värskelt avatud eesmärk enne selgesõnaliselt salvestada. `files.read` valvurid loeb, kontrollib ja käepide vabastamist. `files.write` valvurid säästab ja taastuspuhastus. `writeText` endiselt lükkab tagasi olemasolevate pluginate nurjumise; `saveText` tagastab struktureeritud `{ ok, value/error }` ümbriku, sest Electron jätab tagasilükatud veaobjektidele kohandatud omadused. Laias laastus kolmekordne `writeText` võib kasutada ühe avatud dokumendi lähtekoodi. Sama tee mitu otsedokumenti nõuavad `editId`; mitmetähenduslikud pärandkõned ei õnnestu turvaliselt, selle asemel et valida teise dokumendi lähtejoon. Pluginad peaksid vabastama kasutamata käepidemed. Väline UI peab salvestama kohe, hoidma puhvrid määrdunud rike, pakkuma sudo alles pärast loa / autentimise ebaõnnestumisi, näitama konflikte ilma ülekirjutamiseta ja pakkuda taastumine pärast ühenduse kadu või tundmatu tulemus. See peab tõlkima need riigid tšehhi, saksa ja inglise keeles. Soovitatud oleku koopia: | 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 | ## Lennuaja määratlused ja elutsükkel **Ping** on tegelik kliendipoolne ICMP Echo vastus lahendatud IP poolt SSH. Core tugineb platvormi ping käivitatav asünkroonselt fikseeritud argument massiivi, ilma shell või administraator käivitamise nõue. Linux, macOS (sealhulgas `ping6`) ja Windows argumendid valitakse eraldi. Blokeeritud ICMP, puuduv käivitatav, ajapiirang, vigane väljund või ülemine seotud ainult Windows vastus, nagu `<1ms` ei anna kättesaamatut väärtust, mitte leiutatud numbrit. **SSH RTT** on `performance.now()` ühetooniline `true` fikseeritud kestus, mis kehtib olemasoleva autenditud SSH kliendi suhtes. See hõlmab kanali seadistust, serveri töötlemis- ja reageerimisteenust; see ei ole puhas võrk RTT või SSH sisselogimise kestus. Tõlkitud näitaja kohtspikker selgitab seda vahet. Jälgimine algab kohe, kui terminal on ühendatud. Proobid töötavad samaaegselt ja asünkroonselt, viie sekundilise päringu/protsessi aegumisega. Järgmine proov on kavandatud 12 sekundit pärast eelmise valimi lõpetamist, vältides kattumist. Katkestab ICMP katkestamise, puhastab taimerid, tühistab ootel SSH töö ja puhastab väärtused. Salvestuse identiteedikontroll takistab ühenduse eelnevat avaldamist pärast taasühendamist. ICMP rike ei muuda kunagi SSH ühenduse olekut. Latentsus reisib sees olemasoleva `state` sündmus / `ssh:state` IPC koormus: ```js latency: { pingMs: 24.1, sshRttMs: 31.25, measuredAt: "…" } ``` Saadaolevad numbrid on `null`. Kompaktne terminal indikaator kasutab millisekundeid, lokaliseeritud kättesaamatu tekst ja Czech/German/English sildid. See peidab end lahtiühendamisel. Ei olnud vaja täiendavat renderdamisvõimsust ega IPC taotlust. ## Valideerimine ja kasutuspiirangud - Käivitada `app/`: `npm ci`, seejärel `npm test`. - Kohalik tulemus: **179 katsed; 163 läbitud, 0 nurjus, 16 vahele jäetud**. Kõik vahelejätmised on Linux failisüsteemi juhtudel see macOS masin. `npm ci`, Pythoni süntaksi koostamine ja `git diff --check` edukalt lõpetatud. - Testid hõlmavad Core salvestab/taastab, sudo protokolli ja parooli Redaction, tegelik POSIX shell tsiteerib vaenulikke teid, konflikte, üleslaadimisi, ebaõnnestunud puhastamist, ebakindlaid tulemusi, samaaegselt dokumente, IPC õigusi ja latency elutsüklit. - Linux failisüsteemi testid kasutavad saadetud Pythoni sisendpunkti, kasutades privaatset test konto kodu otsing: omanik/mode/xattrs, POSIX ACLs, sümlingid/kõvad lingid, FIFOd, üleslaadimine ja metaandmed rike, asendusvead, sihtrassid, tundmatud asendusjärgsed tulemused ja taastumine. Ristfailisüsteem kasutab võimaluse korral `/dev/shm` ja muud failisüsteemi. Need testid jäetakse vahele mitte-Linux masinatel; puuduv ACL/eraldi failisüsteem on selgesõnaliselt vahele jäetud. - Lisatud Linux GitHub Toimingud töötab kogu sviit ja kordab failisüsteemi juhul kui juur. Seda töövoogu ei ole sellest töötavast puust välja saadetud. - Kohalik valideerimine oli macOS. Pythoni lähtekoodi süntaksit kontrolliti otse Käsurea Tööriistad Pythoni käivitatav. Tõeline macOS silmus tagasi ICMP suitsu kontrolli tagastatud `0.071 ms`. Kohalikult ei testitud SSH serverit, Windows tööaega, Linux runtime'i, SELinuxi kasutamist ega väljaspool Monaco UI-d. - Kaugteksti redigeerimine nõuab nüüd Linux ja Python 3 koos deskriptoriga failisüsteemi/xattr toetuse. Puuduv tõlk ebaõnnestub selgesõnaliselt. See tuum keeldub tahtlikult ohtlike metaandmete, linkide ja kataloogide konfiguratsioonidest. - Lukustamine on nõuandev: koostööst hoiduvad protsessid võivad endiselt rassi kitsas viimase algtaseme kontrolli ja aatomi ümbernimetamise vaheline intervall. Linux tarnib ei üldise aatomi sisu-hash võrdlus-ja-asendi operatsiooni. Kontroll tuvastab muutused enne seda intervalli; säilinud töökoopiad toetavad taastumist hiljem. - Recovery andmed jäävad kaugkontole kuni kinnitatud puhastamiseni. Ei ole täielik, Vastuolulisi ja kontrollimatuid päevikuid ei jäeta kunagi vaikselt kõrvale. Puudub automaatne taastamise faili aegumise ja sunnitud ülekirjutamise võimalus. - `npm ci` teatas 17 sõltuvuse auditi tulemustest (9 mõõdukas, 8 kõrge). See muutus ei muuda sõltuvust ega rakenduse ajakohastatud usaldusmudelit. Kasutaja soovis säilitada muudatused olemasolevas tööpuus, praegu `feature/hash-checksum-plugin`; harude lülitit ega sõltumatut puhastamist ei teostatud. ## Selle ülesande jaoks muudetud failid - `src/main/files/remoteFileService.js` - `src/main/files/remoteEditor.py` (uus) - `src/main/sessions/sessionManager.js` - `src/main/sessions/latencyMonitor.js` (uus) - `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` (uus) - `test/remoteEditorProtocol.test.js` (uus) - `test/remoteEditorLinux.test.js` (uus) - `test/fixtures/remoteEditorLinux.py` (uus) - `test/latencyMonitor.test.js` (uus) - `README.md` - `docs/remote-editor-latency.md` (see fail) - `../.github/workflows/remote-editor-tests.yml` (uus)