> Šī tulkojuma valodas pārskatīšana vēl turpinās. Neskaidrību gadījumā salīdziniet ar [oriģinālu angļu valodā](https://www.sm.ch-j.eu/docs/i18n/en/remote-editor-latency.md). # Attālināta redaktora saglabāšana un latentuma uzraudzība ## Pamatcēloņi Iepriekšējais redaktors augšupielādēja savu darba failu mērķa vecāku direktorijā, ko bieži vien nevar ierakstīt SSH kontā ar `/etc` vai `/var`. SFTP pārvārds piegādāta nav atļauta sudo ceļš, bāzes konfliktu pārbaude, drošības metadatu verifikācija vai uzticams pārrakstīt semantika. Tās kļūdu apstrādātājs izdzēsa pagaidu kopiju, noņemot atgūšanas materiālu pat tad, kad pabeigšana bija neskaidra. Sesijas statuss iepriekš atklāts tikai savienojuma stāvoklī. Nebija ICMP vai autentificēta SSH atbildes reakcijas mērījuma, kas panesa termināla indikatoru. ## Saglabāt protokolu 1. Fiksēts SSH palīgs atver regulāru, vienas saites failu, izmantojot deskriptora relatīvo operācijas un `O_NOFOLLOW` katram ceļa komponentam. Tajā ir ietverts saturs, SHA-256 hash, ierīce/inode, UID, GID, pilns atļauju biti, nanosekundes izmaiņu/izmaiņu laiks un visas lasāmās paplašinātās atribūtus. Core pārbauda hash un decodes strikts UTF-8, saglabājot BOM. Katrs dokuments saņem necaurspīdīgu `editId`, tvērienu tā spraudnis, termināla sesija un servera identitāte. 2. Neprivileģēta sagatavošanas operācija atrisina autentiskā konta darbību mājās caur `pwd.getpwuid(os.getuid())`, rada `$HOME/ch-j-sm/` ar režīmu `0700` un izveido privātu, ekskluzīva atjaunošanas žurnālu. Nekaitīga māja, symlink darba telpa vai darba telpa pieder citam kontam tiek noraidīta. 3. Pamata augšupielādē slēpto, izlases 128- bits `.tmp` darba fails caur SFTP kur: ekskluzīva izveide (`wx`), režīms `0600` un sešdesmit sekunžu kanāla/ielādes noildze. Žurnālā ir iekļauts mērķis, sākotnējais sākumstāvoklis un sagaidāmais darba hash; tas nesatur pilnvaras. 4. **Viens SSH exec veic visu finalizāciju**, pēc izvēles esošais sudo izpildītājs. Palīgs droši atver un nomāc privāto darba kopiju, kā arī izskalo to. Tas bloķē sākotnējo inode, pārbauda tās bāzes līnijas, izveido ekskluzīvu mērķa failu blakus mērķim, raksta visu saturu, piemēro un pārbauda metadatus, pārbauda oriģinālo vēlreiz, un izskalo aizstājēju. 5. Viena un tā pati direktorāts `os.replace` Atmosfēriski aizstāj mērķi. Vecāks Mape ir izskalots un galīgais ceļš, hash, inode un metadati ir pārbaudīta. Sākotnējais ceļš paliek pieejams līdz aizstāšanai. Darba fails nekad netiek pārvietots pa failu sistēmām un nav izņemts ar finalizācijas palīdzību. 6. Pēc tam, kad Core saņem pārbaudītus panākumus, atsevišķs tīrīšana vēlreiz pārbauda galīgo saturu un drošības metadatus pirms darba datnes un žurnāla noņemšanas. Tīrīšanas kļūda joprojām ziņo par apstiprinātu saglabāšanu ar `recoveryAvailable: true`. Neizdevās augšupielādēt, neizdevās sudo, konflikts, metadatu kļūda vai neveiksmīga aizstāšana saglabā oriģinālo un jebkuru palaišanas materiālu. Nepilnīgas augšupielādes tiek identificētas kā tādas, un tās nevar atgūt kā pilnīgu rediģēto dokumentu. Pazaudēts SSH komunikācijas, trūkstošais izejas statuss, noildze un negaidīti pabeigšanas rezultāti tiek ziņots kā **nezināms**, nekad kā saglabāts. Kodols bloķē vēl vienu, izņemot uz neskaidra dokumenta; nav automātiska aizstājēja atkārtošanās. ## Metadati, privilēģijas un drošības robežas Palīdzētājs saglabā un pārbauda UID, GID un visi POSIX atļauju biti, tostarp izpildāms, setuid, setgid un lipīgi biti. Tas reproducē Linux paplašinātās baitu atribūtus, tostarp POSIX ACL, iespējas un SELinux etiķetes. Īpašumtiesības un failu saturs tiek noteikts pirms drošības atribūti, jo raksti / zvanīt var noskaidrot iespējas vai īpašu atļauju bitiem. Izņem mantojuma mērķa atribūtus, kuru oriģinālā nav. Modifikācijas laiks atspoguļo jauno rakstīt un netiek nokopēts no oriģināla. Nelasāms vai nemainīgs atribūts izslēdz darbību; metadati netiek klusi nomesti. IMA/EVM paraksti ir nepārprotami noraidīti, jo satura/jodu savienojošo integritātes parakstu kopēšana tos nederētu. Symlinks mērķa vai mājas ceļā, grūti saistīts failus un neregulāri faili tiek noraidīti. Netiek lietots neviens vietējs vai vājāks SFTP pārrakstīt atkļūdojumu. Parastās ierakstītie saglabā kā SSH kontu. Aizsargājami ietaupījumi prasa skaidru `{ sudo: true }`; sudo parole ir fakultatīva paroles bez parolēm. Paroles tiek apstiprinātas un nodotas tikai kanālam stdin, nekad iekšā komandu, žurnāli, darba failu, pierakstīšanās vai attālināta kļūda. Sakne SSH sesijas izmanto esošo tiešo saknes izpildītāju. Neizdevās atļaut oriģinālu un darba kopiju atstāt neskartu. Visi saglabā izpildīto kā root (tiešā root) SSH vai sudo) noraida arī mērķa direktoriju/nozares pārstāvjus, kas pieder citiem kontiem vai ir to reģistrā, vai kuriem ir piekļuve ACL, nevis uzticas priviliģētam ceļam, ko kontrolē cits konts. Fiksētais palīgs darbojas ar `python3 -I -B`: tas ignorē lietotāju Python celiņi, darba direktoriju un lietotāja vietnes pakotnēm, un raksta bez baitekoda. Ceļi un JSON argumenti Core ir kotēti šellakā. Spraudņi nekad nesaņem patvaļīgus SSH exec vai SFTP rokturi. Esošā smilšu kaste CSP, manifesta atļaujas, datora atslēgas verifikācija un atjaunināšana joprojām tiek izmantota. ## Spraudnis API un atlikusī Monako integrācija **Atsevišķi izplatītais Monako/Failu pārvaldnieks UI nav šajā iziešanā. Tā UI integrācija, sudo ātri, netīro bufera apstrādes un tulkojumi nevarēja īstenot vai pārbaudīt šeit.** Komplektēts spraudnis avots ir Hash & Checksum spraudnis. Failu pārvaldnieka aizstājēja avots netika izgudrots. Esošās metodes joprojām ir pieejamas. Piedevu metodes/varianti tiek pakļauti iepriekš ielādētai smilšu kastei un ar atļauju pārbaudītajam darba laikam: ```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. ``` Atveseļošanās metodes pieņemt fakultatīvu galīgo `{ sudo: true, sudoPassword }` argumentu, pārbaudot mērķi prasa pacelšanos. Tie saglabā autentificētu lietotāja darbtelpu pat tad, kad tiek izpildīts sudo. Žurnāli izdzīvot lietotņu restart un SSH Atvienoties; atgūšana nekad automātiski neatkārto pabeigšanas. Pirms nepārprotamas buferšķīduma saglabāšanas, to atkārtoti pārskatīs pret tikko atvērtu mērķi. `files.read` Sargi nolasa, pārbauda un apstrādā. `files.write` Sargi ietaupa un atjauno attīrīšanu. `writeText` joprojām noraida, ja esošie spraudņi nedarbojas; `saveText` atgriež strukturētu `{ ok, value/error }` aploksni, jo Electron pilieni ir pielāgotas īpašības noraidītajos kļūdu objektos. Mantojums trīs arguments `writeText` var izmantot viena atvērtā dokumenta bāzes līniju. Vairāki dzīvu dokumentu tam pašam ceļam prasa `editId`; neskaidri mantotie zvani neizdodas droši, nevis izvēlas cita dokumenta bāzes līniju. Spraudņiem jāizlaiž neizlietotie rokturi. Ārējais UI jābūt displejs ietaupījums uzreiz, saglabāt buferus netīri par neveiksmēm, piedāvāt sudo tikai pēc atļaujas / autentifikācijas neveiksmes, parādīt konfliktus bez pārrakstīšanas, un piedāvāt atgūšanu pēc savienojuma zaudējuma vai nezināmu iznākumu. Tai ir jātulko šīs valstis čehu, vācu un angļu valodā. Ierosinātā valsts 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 | ## Latentās definīcijas un dzīves cikls **Ping** ir latentums, par kuru ziņo faktiskais klienta puse ICMP atbalsis uz atrisināto IP, ko izmanto SSH. Pamata atsaucas uz platformas ping izpildāmību asinchroniski ar fiksētu argumentu masīvu, bez korpusa vai administratora palaišanas prasību. Linux, macOS (ieskaitot `ping6`) un Windows argumenti tiek izvēlēti atsevišķi. Bloķēta ICMP, trūkstoša izpildāmība, noildze, nederīga izeja vai tikai augšējā robeža ar Windows atbilde, piemēram `<1ms` rada nepieejamu vērtību, nevis izgudrotu numuru. **SSH RTT** ir monotonisks `performance.now()` ilgums fiksētu `true` exec pieprasījumu par esošo autentificēto SSH klientu. Tas ietver kanālu iestatīšanu, serveru apstrādi un atbildes piegādi; tas nav tīrs tīkls RTT vai SSH pieteikšanās ilgums. Pārtulkots indikatora paskaidrumu izskaidro šo atšķirību. Monitorings sākas, tiklīdz savienojas termināls. Probes darbojas vienlaicīgi un asinchroniski, ar piecu sekunžu pieprasījumu / procesa noildze. Nākamo paraugu ieplāno divpadsmit sekundes pēc iepriekšējā parauga pabeigšanas, novēršot pārklāšanos. Atvienojiet abortus ICMP, attīra taimeris, atceļ vēl nepabeigto SSH darbu un noskaidro vērtības. Ieraksta identitātes pārbaudes neļauj iepriekšēju savienojumu publicēt pēc atkalpievienošanās. ICMP kļūme nekad nemaina SSH savienojuma stāvokli. Latents ceļo iekšpusē esošo `state` notikums / `ssh:state` IPC lietderīgā slodze: ```js latency: { pingMs: 24.1, sshRttMs: 31.25, measuredAt: "…" } ``` Nepieejami numuri ir `null`. Kompaktā termināla indikators izmanto milisekundes, lokalizētu nepieejamu tekstu un čehu/German/English etiķetes. Tas slēpjas uz atvienošanās. Nebija vajadzīgas papildu renderēšanas iespējas vai IPC pieprasījums. ## Validācija un darbības ierobežojumi - Palaist no `app/`: `npm ci`, pēc tam `npm test`. - Galīgais vietējais rezultāts: **179 testi; 163 ir pagājis, 0 neizdevās, 16 izlaists**. Visi izlaidumi ir Linux failu sistēmas gadījumi šajā macOS datorā. `npm ci`, Python sintakses apkopošana un `git diff --check` veiksmīgi pabeigta. - Testi aptver kodolu taupīšanu/reģenerāciju, sudo protokolu un paroles pārrakstīšanu, reāls POSIX čaula citējot naidīgu ceļu, konfliktiem, augšupielādes, neizdevās tīrīšanas, neskaidri rezultāti, vienlaikus dokumenti, IPC atļaujas un latentā dzīves cikls. - Linux failu sistēmas testi veic nosūtīto Python ievades punktu, izmantojot privātu pārbaudes kontu-mājas meklēšana: īpašnieks/mode/xattrs, POSIX ACL, symlinks/hardlinks, FIFO, augšupielādes un metadatu neveiksmes, aizstāšanas neveiksmju, mērķa sacīkstēm, nezināmiem pēcnomaiņas rezultātiem un atgūšanai. Šablonu sistēmu pieturas izmanto `/dev/shm` un citu failu sistēmu, ja tā ir pieejama. Šie testi izlaist uz navLinux saimnieki; trūkstošās ACL/atsevišķo failu sistēmas iekārtas ir skaidri izlaistas. - Pievienotais Linux GitHub darbību darbs tiek veikts pilnībā un atkārto failu sistēmu saknes. Šī darbplūsma nav nosūtīta no šī darba koka. - Vietējā validācija tika veikta macOS. Python avota sintakse tika pārbaudīta ar tiešo Komandrindas rīki Python izpildfailu. Īsts macOS Atdota atpakaļ cilpa ICMP dūmu pārbaude `0.071 ms`. Nav dzīvu attālinātu SSH servera, Windows ieskrējiena laika, Linux skrējiena, SELinux izvēršanas vai ārējā Monako UI pārbaude tika veikta lokāli. - Attālināta teksta rediģēšanai tagad nepieciešams Linux un Python 3 ar deskriptora relatīvo failu sistēmas/ xattr atbalsts. Tulka trūkums nepārprotami neizdodas. Šī Core tīši atsakās no nedrošiem metadatiem, saitēm un direktoriju konfigurācijām. - Slēgt ir padomdevēja: nesadarbīgi procesi joprojām var sacensties šaurajā intervāls starp pēdējo sākotnējo pārbaudi un atomu pārdēvēšanu. Linux piegādā bez vispārējas atomu satura-hash salīdzināšanai un aizvietošanai darbības. Pārbaudes konstatē izmaiņas pirms šī intervāla; saglabātas darba kopijas atbalsta atgūšanu pēc tam. - Atveseļošanas dati paliek attālinātajā kontā līdz apstiprinātai tīrīšanas. Nepilnīga, Konfliktēti un negaidāmi žurnāli nekad klusi netiek atmesti. Nav automātiskas atjaunošanas faila derīguma termiņa beigu un nav piespiedu pārrakstīt opciju. - `npm ci` ziņots 17 Atzinumi par atkarību no revīzijas rezultātiem (9 vidēji smagi, 8 augstu). Šī izmaiņa nemaina atkarību vai pieteikuma atjauninājuma uzticamības modeli. Lietotājs lūdza saglabāt izmaiņas esošajā darbkoku, pašlaik `feature/hash-checksum-plugin`; filiāles slēdzis vai nesaistīta tīrīšana netika veikta. ## Faili mainīti šim uzdevumam - `src/main/files/remoteFileService.js` - `src/main/files/remoteEditor.py` (jauns) - `src/main/sessions/sessionManager.js` - `src/main/sessions/latencyMonitor.js` (jauns) - `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` (jauns) - `test/remoteEditorProtocol.test.js` (jauns) - `test/remoteEditorLinux.test.js` (jauns) - `test/fixtures/remoteEditorLinux.py` (jauns) - `test/latencyMonitor.test.js` (jauns) - `README.md` - `docs/remote-editor-latency.md` (šis fails) - `../.github/workflows/remote-editor-tests.yml` (jauns)