> Šio vertimo kalbinė peržiūra dar vyksta. Jei tekstas neaiškus, palyginkite su [anglišku originalu](https://www.sm.ch-j.eu/docs/i18n/en/remote-editor-latency.md). # Nutolęs redaktoriaus įrašymas ir latentinis stebėjimas ## Pagrindinės priežastys Ankstesnis redaktorius įkėlė savo darbinį failą į tikslo pradinį katalogą, kuris dažnai negali būti įrašytas iš SSH paskyra `/etc` arba `/var`. SFTP pervardija pateikta ne autorizuotas sudo kelias, bazinis konflikto patikrinimas, saugumo metaduomenų patikrinimas ar patikimas perrašymas semantika. Jo klaidų tvarkytojas ištrynė laikiną kopiją, pašalinti atkūrimo medžiagą net tada, kai užbaigimas buvo neaiškus. Seanso būsena, anksčiau atskleista tik prijungimo būsenoje. Nebuvo ICMP ar autentiško SSH atsako matavimo, kuriuo būtų galima įvertinti terminalą. ## Įrašymo protokolas 1. Fiksuotas SSH pagalbininkas atidaro reguliarų, vieno ryšio failą naudojant deskriptorių- santykinį operacijos ir `O_NOFOLLOW` kiekvienam kelio komponentui. Jame yra nurodytas turinys, SHA-256 hash, įrenginys/inode, UID, GID, pilni leidimo bitai, nanosekundžių keitimo/pakeitimo laikas ir visi perskaitomi išplėstiniai požymiai. Core patikrinti hash ir decodes griežtai UTF-8, išsaugant BOM. Kiekvienas dokumentas gauna nepermatomą `editId`, aprėpiantį jo įskiepį, terminalo seansą ir serverio tapatybę. 2. Neprivilegijuota paruošimo operacija išsprendžia sąskaitos autentiškumą namuose per `pwd.getpwuid(os.getuid())`, sukuria `$HOME/ch-j-sm/` su režimu `0700` ir sukuria privatų, išskirtinį atkūrimo žurnalą. Nesaugus namas, simlinkis darbo erdvė, ar darbo erdvė priklauso kitam paskyrai yra atmetami. 3. Šerdis įkelia paslėptą, atsitiktinę 128- bitų `.tmp` darbo failas per SFTP kai: išskirtinis kūrimas (`wx`), režimas `0600` ir šešiasdešimt sekundžių kanalo/išsiuntimo pertrauka. Žurnale yra tikslas, pradinė išeitis ir numatoma darbo hash; jame nėra jokių duomenų. 4. **Vienas SSH exec atlieka visą užbaigtumą**, pasirinktinai per esamos sudo vykdomosios operacijos. Padėjėjas saugiai atidaro, paleidžia privačią darbinę kopiją ir nuplauna ją. Jis užrakina originalų inode, tikrina savo pradinį lygį, sukuria išskirtinį paskirties failą šalia tikslo, rašo visą turinį, taiko ir tikrina metaduomenis, tikrina originalą vėl, ir nuplauna pakaitalą. 5. Ta pati katalogo `os.replace` atominiu būdu pakeičia tikslą. Tėvas Aplankas yra nuplautas ir patikrinamas galutinis kelias, hash, inode ir metaduomenys. Pradinis kelias išlieka iki pakeitimo. Darbinis failas niekada neperkeltas per failų sistemas ir nėra pašalintas užbaigiant darbą. 6. Po to, kai Core gauna patikrintą sėkmę, atskiras valymas pakartotinai patikrina galutinį turinį ir saugumo metaduomenis prieš pašalinant darbo failą ir žurnalą. Valymo klaida vis dar praneša apie patvirtintą įrašymą su `recoveryAvailable: true`. Nepavyko įkelti, nepavyko sudo, konfliktas, metaduomenų klaida arba nepavyko pakeisti originalios ir bet kokios pakopinės medžiagos. Neišsamūs įkelimai yra identifikuojami kaip tokie ir negali būti susigrąžinti kaip išsamus redaguotas dokumentas. Prarasta SSH bendravimas, trūksta išėjimo būsena, laiko tarpai ir netikėti užbaigimo rezultatai yra pranešama kaip **nežinomas**, niekada neišgelbėjo. Core blokuoja kitą įrašyti nežinomą dokumentą; nėra automatinio pakeitimo bandyti. ## Metaduomenys, privilegijos ir saugos ribos Padėjėjas išsaugo ir tikrina UID, GID ir visi POSIX leidimų bitai, įskaitant vykdomąjį, setuid, setgid ir lipnus bits. Jis atkuria Linux išplėstas savybes baitui, įskaitant POSIX ACL, galimybes ir SELINux etiketes. Nuosavybė ir failo turinys yra nustatyti prieš saugumo atributus, nes rašo / rašyti gali aiškiai galimybes ar specialių leidimo bitai. Paveldėtos paskirties savybės, kurių nėra originale, pašalinamos. Pakeitimo laikas atspindi naują rašymą ir nėra nukopijuotas iš originalo. Neįskaitomas arba nepakeičiamas požymis panaikina operaciją; metaduomenys nėra tyliai numesti. IMA/EVM parašai aiškiai atmetami, nes kopijavimo turinio ir (arba) jo sąsajų vientisumo parašų naudojimas jiems netektų galios. Symlinks taikinyje arba namų kelyje, sunkiai susieti failai ir nereguliarūs failai atmetami. Nėra vietoje arba silpnesnė SFTP Perrašyti atsarginę kopiją. Įprastai įrašomas išsaugo kaip veikia SSH paskyra. Saugomi įrašai reikalauja aiškaus `{ sudo: true }`; sudo slaptažodis yra neprivalomas beslapčio Sudo. Slaptažodžiai yra patvirtinti ir perduoti tik kanalo stdin, niekada viduje komandą, žurnalas, darbo failas, žurnalo ar nuotolinės klaidos. Šaknis SSH seansai naudoja esamą tiesioginį root egzekutorių. Nepavyko leisti originalo ir darbinės kopijos palikti nepaliestos. Visi išsaugo kaip root (tiesioginis šaknies SSH arba sudo) taip pat atmeta tikslinės aplankai / išradėjai, nuosavybės teise turintys ar įrašomi kitų sąskaitų, arba turinčios ACL prieigą, užuot pasitikėję privilegijuotu keliu, valdomu kitos paskyros. Fiksuotas pagalbininkas veikia su `python3 -I -B`: jis ignoruoja vartotojo Python kelius, darbinį katalogą ir vartotojo svetainės paketus bei rašo be baiteko. Core kotiruojami keliai ir JSON argumentai. Įskiepiai niekada negauna savavališkų SSH exec ar SFTP rankenų. Esama smėlio dėžė, CSP, manifesto leidimai, mazgo rakto tikrinimas ir atnaujinimas tebenaudojamas. ## Įskiepis API ir likusi Monako integracija **Atskirai paskirstytas Monakas/Failų valdyklės UI nėra šiame čekyje. Jo UI integracija, sudo greitai, purvinas buferinis tvarkymo ir vertimai negali būti įgyvendintas ar išbandyti čia.** Komplektuotas įskiepiai šaltinis yra Hash & Checksum įskiepiai. Neparašytas joks pakaitinis failų tvarkyklės šaltinis. Esamus metodus galima taikyti ir toliau. Priedo metodus ir (arba) variantus veikia iš anksto įkrautas smėlio dėžės vanduo ir patikrinta važiavimo trukmė, kuriai suteiktas leidimas: ```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. ``` Tikrinant taikinį, priimti neprivalomą galutinį `{ sudo: true, sudoPassword }` argumentą reikia pakilimo. Jie išsaugo autentifikuotą vartotojo darbinę erdvę net kai ji vykdoma per sudo. Žurnalai išgyventi programą iš naujo ir SSH Atjunkite; atgavimas niekada automatiškai neatnaujina užbaigimo. Prieš aiškiai ją išsaugodami, iš naujo paruoškite regeneruotą buferį. `files.read` sargybiniai nuskaito, tikrina ir tvarko paleidimą. `files.write` apsaugos priemonės išsaugomos ir atkūrimas valymas. `writeText` vis dar atmeta nesėkmę esantiems įskiepiams; `saveText` sugrąžina struktūrizuotą `{ ok, value/error }` voką, nes Electron lašai naudoja pasirinktines savybes paneigtuose klaidų objektuose. Paveldėtas trijų argumentų `writeText` gali naudoti vieno atviro dokumento bazinę vertę. Keliems gyviems dokumentams tam pačiam keliui reikia `editId`; dviprasmiški senieji skambučiai nėra saugūs užuot pasirinkę kito dokumento pradinį dydį. Įskiepiai turėtų išleisti nepanaudotas rankenas. Išorinis UI turi rodyti iš karto išsaugoti buferius nešvaru ant gedimo, pasiūlyti sudo tik po leidimo / tapatinimo nesėkmės, parodyti konfliktus be perrašymo, ir pasiūlyti atkūrimo po prisijungimo praradimo ar nežinomą rezultatą. Ji turi versti šias valstybes čekų, vokiečių ir anglų kalbomis. Siūloma valstybinė kopija: | 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 | ## Laisvumo apibrėžtys ir gyvavimo ciklas **Ping** yra faktinio kliento ICMP aido atsakymo į išspręstą IP, kurį naudoja SSH. Pagrindinis nurodo platformos Ping vykdomoji asinchroniškai su fiksuoto argumentų masyvas, be korpuso ar administratoriaus paleidimo reikalavimas. Linux, macOS (įskaitant `ping6`) ir Windows argumentai parenkami atskirai. Užblokuotas ICMP, trūkstamas vykdomasis failas, laiko tarpas, netinkama išvestis arba tik viršutinė riba Windows atsakymas, pvz., `<1ms`, sukuria neprieinamą vertę, o ne išrastą numerį. **SSH RTT** yra monotoninė `performance.now()` trukmė fiksuotas `true` exec užklausa dėl esamo autentiškumo SSH kliento. Tai apima kanalų sąranką, serverių apdorojimą ir atsako pristatymą; tai nėra grynas tinklas RTT arba SSH prisijungimo trukmė. Išverstas indikatorius tooltip paaiškina šį skirtumą. Stebėsena pradedama, kai tik prisijungia terminalas. Probes paleisti vienu metu ir asinchroniškai, su penkių sekundžių užklausa / proceso laukimo. Kitas mėginys yra numatytas praėjus dvylikai sekundžių po ankstesnio bandinio užbaigimo, siekiant išvengti persidengimo. Atjungti abortus ICMP, išvalyti laikmačius, atšaukti laukiant SSH darbą ir išsiaiškinti reikšmes. Įrašų tapatumo tikrinimas neleidžia iš anksto prisijungti po pakartotinio prisijungimo. ICMP klaida niekada nepasikeitė SSH prijungimo būsena. Platumas keliauja esamo `state` renginio / `ssh:state` IPC naudingosios apkrovos viduje: ```js latency: { pingMs: 24.1, sshRttMs: 31.25, measuredAt: "…" } ``` Neprieinami skaičiai yra `null`. Kompaktiškas terminalo indikatorius naudoja milisekundes, lokalizuotą neprieinamą tekstą ir čechų/German/English etiketes. Jis slepiasi atsijungęs. Nereikėjo papildomų piešėjo vykdymo pajėgumų arba IPC prašymo. ## Patvirtinimas ir eksploatacinės ribos - Vykdyti iš `app/`: `npm ci`, tada `npm test`. - Galutinis vietinis rezultatas: **179 tyrimams; 163 praėjo, 0 nepavyko, 16 praleistas**. Visi praleidimai yra Linux failų sistemos atvejai šiame macOS mazge. `npm ci`, Python sintaksės kompiliavimas ir `git diff --check` sėkmingai užbaigtas. - Bandymai apima Core išsaugojimus/atkūrimą, sudo protokolą ir slaptažodžio pakeitimus, realus POSIX apvalkalas cituojant priešiškas kelius, konfliktai, įkeltos, nepavyko valymas, neaiškių rezultatų, kartu dokumentai, IPC leidimus ir latentinis gyvavimo ciklas. - Linux failų sistemos testai atlikti išsiųstą Python įvesties tašką, naudojant privatų patikrinti paskyros-namo paieška: nuosavybės/mode/xattrs, POSIX ACL, symlinks/hardlinks, FIFO, įkelti ir metaduomenų nesėkmės, pakeitimo klaidos, tikslinės lenktynės, nežinomi po keitimo rezultatai ir atsigavimas. Cross-filesystem sustojimo naudojama `/dev/shm` ir kita failų sistema, kai yra. Šie testai praleisti ne-Linux mazgų; trūksta ACL/atskiro failo sistemos įrenginių, yra aiškiai praleista. - Pridėtas Linux GitHub veiksmų darbas atlieka visą komplektą ir kartoja failų sistemą atvejai kaip šaknis. Šis darbas nebuvo išsiųstas iš šio darbinio medžio. - Vietinis validavimas buvo atliktas macOS. Python šaltinio sintaksė buvo patikrinta su tiesioginiu Komandinės eilutės įrankiai Python vykdomasis. Tikras macOS Grąžinta ICMP dūmų patikros kilpa `0.071 ms`. Nėra gyvo nutolusio SSH serveris, Windows paleidimo laikas, Linux , SELINux įdiegimas arba išorinis Monako UI buvo išbandytas vietoje. - Nutolusio teksto redagavimui dabar reikia Linux ir Python 3 su deskriptoriumi santykiniu failų sistemos/ xattr palaikymas. Trūksta vertėjo aiškiai nepavyksta. Šis Core sąmoningai atsisako nesaugių metaduomenų, nuorodų ir katalogų konfigūracijos. - Užrakinimas yra patariamasis: nebendradarbiavimo procesai vis dar gali lenktynes siauras intervalas nuo paskutinio pradinio patikrinimo iki atominio pervadinimo. Linux nepristato bendro atominio turinio-hash palyginimo ir keitimo operacijos. Patikrinimai nustato pokyčius prieš tą intervalą; išlaikytos darbinės kopijos palaiko atsigavimą po to. - Atkūrimo duomenys lieka nutolusioje sąskaitoje iki patvirtinto valymo. Neišsamus, Konfliktiniai ir nematyti žurnalai niekada tyliai neatmetami. Nėra automatinio atkūrimo failo galiojimo pabaigos ir priverstinio perrašymo parinktį. - `npm ci` buvo pranešta 17 priklausomumo audito išvados (9 vidutinio sunkumo, 8 didelis). Šis pakeitimas nepakeičia priklausomybės arba programos atnaujinimo patikimumo modelio. Naudotojas paprašė išlaikyti esamo darbinio medžio pakeitimus, šiuo metu `feature/hash-checksum-plugin`; filialų jungiklis ar nesusijęs valymas nebuvo atliktas. ## Failai pakeisti šiam tikslui - `src/main/files/remoteFileService.js` - `src/main/files/remoteEditor.py` (naujas) - `src/main/sessions/sessionManager.js` - `src/main/sessions/latencyMonitor.js` (naujas) - `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` (naujas) - `test/remoteEditorProtocol.test.js` (naujas) - `test/remoteEditorLinux.test.js` (naujas) - `test/fixtures/remoteEditorLinux.py` (naujas) - `test/latencyMonitor.test.js` (naujas) - `README.md` - `docs/remote-editor-latency.md` (šis failas) - `../.github/workflows/remote-editor-tests.yml` (naujas)