> Jazyková revízia tohto prekladu prebieha. Pri nejasnostiach porovnajte [anglický originál](https://www.sm.ch-j.eu/docs/i18n/en/remote-editor-latency.md). # Diaľkový editor - monitorovanie ukladania a latencie ## Koreňové príčiny Predchádzajúci editor nahral svoj pracovný súbor do rodičovského adresára cieľa, ktorý často nemôže byť napísaný z účtu SSH v rámci `/etc` alebo `/var`. Premenovanie SFTP neobsahuje žiadnu povolenú cestu sudo, základný test konfliktu, overenie bezpečnostných metadát alebo spoľahlivé prepísanie sémantiky. Jeho chybový správca vymazal dočasnú kópiu, čím odstránil rekuperačný materiál aj v prípade, keď nebolo možné dokončiť. Stav sedenia predtým odhalil len stav pripojenia. ICMP alebo overené meranie odozvy SSH nebolo napájajúce koncový ukazovateľ. ## Uložiť protokol 1. Pevný pomocník SSH otvorí pravidelný súbor s jedným odkazom pomocou deskriptora-relatívneho operácie a `O_NOFOLLOW` pre každú zložku trasy. Zachytáva obsah, SHA-256 hašh, zariadenie/inode, UID, GID, kompletné povoľovacie bity, nanosekundové modifikácia/zmena časov a všetky čitateľné rozšírené atribúty. Jadro overuje hash a dekóduje prísne UTF-8, zachovanie BOM. Každý dokument dostane nepriehľadné `editId`, scaped do svojho pluginu, terminálovej relácie a identity servera. 2. Neprivilegovaná prípravná operácia vyrieši overené účty domov cez `pwd.getpwuid(os.getuid())`, vytvára `$HOME/ch-j-sm/` s režimom `0700` a vytvára súkromný, exkluzívny recovery časopis. Nebezpečný domov, symlink pracovná plocha alebo pracovný priestor vlastnený iným účtom je odmietnutý. 3. Jadro nahrá skrytý, náhodný 128-bit `.tmp` pracovný súbor cez SFTP exkluzívna tvorba (`wx`), režim `0600` a 60-sekundový kanál/čas nahrávania. Časopis obsahuje cieľovú, pôvodnú základnú a očakávanú pracovnú hash; neobsahuje žiadne údaje. 4. **One SSH exec vykonáva celú finalizáciu**, voliteľne prostredníctvom existujúci exekútor sudo. Pomocník bezpečne otvorí a hašuje súkromnú pracovnú kópiu a spláchne ju. Zamkne pôvodnú inode, skontroluje jej východiskovú hodnotu, vytvorí exkluzívny cieľový súbor vedľa cieľa, zapíše všetok obsah, použije a overí metaúdaje, znovu skontroluje originál a spláchne výmenu. 5. Rovnaký-directory `os.replace` atómovo nahrádza cieľ. Rodičia adresár je spláchnutý a finálna cesta, hash, inode a metadáta sú overené. Pôvodná trasa zostáva k dispozícii až do nahradenia. Pracovný súbor sa nikdy nepresúva cez súborové systémy a nie je odstránený finalizáciou. 6. Potom, čo Core dostane overený úspech, samostatné vyčistenie znovu skontroluje finále obsah a bezpečnostné metaúdaje pred odstránením pracovného súboru a denníka. Zlyhanie čistenia stále hlási potvrdenú úsporu so systémom `recoveryAvailable: true`. Zlyhalo nahrávanie, zlyhalo sudo, konflikt, chyba metadát alebo neúspešná náhrada udržuje originálny a akýkoľvek zinscenovaný materiál. Neúplné uploady sú identifikované ako také a nemožno ich získať späť ako kompletný upravený dokument. Stratená komunikácia SSH, chýbajúci stav odchodu, časové prestávky a neočakávané výsledky ukončenia sú hlásené ako **unnown**. Jadro blokuje ďalšie uložiť na neistý dokument; nie je automatická výmena retry. ## Metaúdaje, oprávnenia a bezpečnostné hranice Pomocník uchováva a overuje UID, GID a všetky POSIX povolené bity vrátane spustiteľných, setuid, setagidných a lepkavých bitov. Reprodukuje rozšírené atribúty Linux pre bajte, vrátane ACL POSIX, schopností a štítkov SELinux. Vlastníctvo a obsah súboru sú nastavené pred bezpečnostnými atribútmi, pretože zápisy/zápis môžu vymazať schopnosti alebo špeciálne dáta. Dedičné cieľové atribúty, ktoré chýbajú na origináli, sú odstránené. Čas zmeny odráža nový zápis a nie je skopírovaný z originálu. Nečitateľný alebo nereprezentovateľný atribút ruší operáciu; metadáta nie sú potichu upustené. Podpisy IMA/EVM sa výslovne zamietajú, pretože kopírovanie obsahu/nezávislých podpisov integrity by ich zrušilo. Symlinky v cieľovej alebo domácej ceste, ťažko prepojené súbory a nepravidelné súbory sú odmietnuté. Nie je použitý žiadny in-place ani slabší SFTP prepísať backback. Bežné zapisovateľné ukladá beh ako účet SSH. Chránené ukladanie vyžaduje explicitné `{ sudo: true }`; sudo heslo je voliteľné pre bezheslo sudo. Heslá sú overené a odovzdávané len na kanáli stdin, nikdy vnútri príkazu, denník, pracovný súbor, logger alebo vzdialené chyba. Root SSH sedenia použiť existujúce priame root executor. Neúspešné povolenie ponecháva originál a pracovnú kópiu neporušenú. Všetky ukladá ako root (priamy koreň SSH alebo sudo) tiež odmieta cieľových adresárov / prekladateľov vlastnených alebo zapisovateľných inými účtami, alebo nesúci prístup ACL, skôr než dôverovať privilegované meno cesty kontrolované iným účtom. Pevný pomocník beží so `python3 -I -B`: ignoruje používateľské Python cesty, pracovný adresár a balíky užívateľských stránok a nepíše žiadny bajtecode. Trasy a argumenty JSON sú shell-quoted v Core. Pluginy nikdy nedostávajú ľubovoľné rukoväte SSH alebo SFTP. Existujúce pieskovisko, CSP, manifest práva, overenie host-key a overovanie aktualizácie zostávajú v platnosti. ## Modul API a zostávajúce Monako integrácie **Separátne distribuovaný Monako/File Manager UI nie je prítomný v tejto pokladni. Jeho UI integrácia, sudo prompt, špinavé-buffer manipuláciu a preklady nemohli byť implementované alebo testované tu.** Zväzok plugin zdroj je Hash & Checksum plugin. Nebol vynájdený žiadny náhradný zdroj správcu súborov. Existujúce metódy sú naďalej dostupné. Metódy/možnosti doplnkovej látky sú vystavené pred načítaním a kontrolou povoleného času: ```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. ``` Metódy zotavenia akceptujú voliteľný konečný argument `{ sudo: true, sudoPassword }` pri kontrole cieľa vyžaduje zvýšenie. Zachovávajú overené užívateľské pracovné priestory aj keď sú spustené cez sudo. Časopisy prežijú reštart aplikácie a SSH sa znovu pripojí; obnova nikdy automaticky nezopakuje finalizáciu. Preskúmať obnovený nárazník proti čerstvo otvorenému cieľu pred explicitným uložením. Stráže `files.read` čítajú, kontrolujú a rukoväte. Stráže `files.write` šetria a obnovujú čistenie. `writeText` stále odmieta pri zlyhaní existujúcich pluginov; `saveText` vracia štruktúrované obálky `{ ok, value/error }`, pretože Electron kvapky vlastné vlastnosti na odmietnuté objekty chyby. Pôvodný tri-argument `writeText` môže použiť základ jedného otvoreného dokumentu. Viaceré živé dokumenty pre rovnakú cestu vyžadujú `editId`; nejednoznačné pôvodné hovory zlyhajú bezpečne namiesto výberu iného dokumentu ako základu. Moduly by mali uvoľniť nepoužité rukoväte. Externé UI musí okamžite zobraziť ukladanie, udržiavať pufre špinavé pri zlyhaní, ponúkať sudo len po nedodržaní povolenia/preverenia, ukázať konflikty bez prepísania a ponúknuť obnovu po strate spojenia alebo neznámy výsledok. Tieto štáty musí preložiť v češtine, nemčine a angličtine. Navrhovaná štátna kópia: | 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 | ## Definície nečinnosti a životný cyklus **Ping** je latencia nahlásená skutočnou odpoveďou ICMP na vyriešený IP použitým SSH na strane klienta. Core sa odvoláva na platformu ping spustiteľné asynchrónne s pevným pole argument, bez požiadavky shell alebo správcu štartu. Linux, macOS (vrátane `ping6`) a Windows argumenty sa vyberajú osobitne. Zablokovaný ICMP, chýbajúci spustiteľný údaj, časový limit, neplatný výstup alebo odpoveď Windows iba na hornú hranicu, ako je napríklad `<1ms`, produkujú nedostupnú hodnotu, nie vynájdené číslo. **SSH RTT** je monotónny `performance.now()` trvanie pevné `true` exec žiadosť nad existujúce overené SSH klienta. Zahŕňa nastavenie kanálov, spracovanie serverov a doručenie odpovedí; nie je to čistá sieť RTT alebo SSH prihlasovacie trvanie. Preložený indikátor nástroj vysvetľuje toto rozlíšenie. Monitorovanie sa začne hneď, ako sa terminál pripojí. Sondy bežia súčasne a asynchrónne, s päťsekundovou žiadosťou/procesný časový limit. Ďalšia vzorka je naplánovaná na dvanásť sekúnd po dokončení predchádzajúcej vzorky, čím sa zabráni prekrývaniu. Odpojenie ruší ICMP, vymaže časovače, zruší kým SSH nebude fungovať a odstráni hodnoty. Zaznamenajte kontroly totožnosti, ktoré zabraňujú predchádzajúcemu publikovaniu odkazu po opätovnom pripojení. Zlyhanie ICMP nikdy nemení stav pripojenia SSH. Latency cestuje v rámci existujúceho `state` udalosti / `ssh:state` IPC užitočné zaťaženie: ```js latency: { pingMs: 24.1, sshRttMs: 31.25, measuredAt: "…" } ``` Nedostupné čísla sú `null`. Kompaktný terminálový indikátor používa milisekundy, lokalizovaný nedostupný text a etikety Czech/German/English. Skrýva sa na odpojení. Nebola potrebná žiadna dodatočná schopnosť vykonať kresbu alebo žiadosť o IPC. ## Validácia a prevádzkové limity - Bež z `app/`: `npm ci`, potom `npm test`. - Konečný lokálny výsledok: **179 testy; 163 prešiel, 0 zlyhal, 16 vyskočil**. Všetky skipsy sú prípady súborového systému Linux na tomto hostiteľovi macOS. `npm ci`, Python syntax kompilácie a `git diff --check` úspešne dokončená. - Testy sa vzťahujú na Core šetrí/obnovenie, sudo protokol a heslo reaction, skutočný POSIX shell cituje nepriateľské cesty, konflikty, nahrávanie, neúspešné čistenie, neisté výsledky, súbežné dokumenty, IPC povolenia a latencie životný cyklus. - Testy súborového systému Linux vykonávajú dodávaný Python vstupný bod pomocou súkromného test account-home vyhľadávanie: vlastníctvo/mode/xattrs, POSIX ACLs, symlinky/hardlinky, FIFO, nahrávanie a poruchy metaúdajov, zlyhanie výmeny, cieľové preteky, neznáme výsledky po výmene a obnova. Cross-filesystem inscenation používa `/dev/shm` a iný súborový systém, ak je k dispozícii. Tieto testy preskočiť na non-Linux hosts; chýbajúce ACL / samostatný súborový systém zariadenia sú výslovne preskočené. - Pridaná Linux GitHub Akčná úloha spustí kompletný súbor a opakuje súborový systém prípady ako koreň. Tento pracovný tok nebol odoslaný z tohto pracovného stromu. - Miestna validácia bola na macOS. Python zdroj syntax bola overená s priamym Nástroje príkazového riadku Python spustiteľné. Skutočná spätná slučka macOS ICMP smoke check vrátila `0.071 ms`. Žiadny živý vzdialený server SSH, Windows Runtime, Linux runtime, SELinux nasadenie alebo externé Monako UI bol testovaný lokálne. - Remote text editácia teraz vyžaduje Linux a Python 3 s deskriptorom-relatívne podpora súborového systému/xattr. Chýbajúci tlmočník zlyhá výslovne. Toto jadro zámerne odmieta nebezpečné metaúdaje, odkazy a konfigurácie adresárov. - Zamykanie je poradenstvo: nespolupracujúcich procesov môže stále pretekať v úzkych interval medzi poslednou kontrolou pred začiatkom liečby a atómovým premenovaním. Linux nedodáva žiadny celkový atómový obsah, porovnávanú a nahradenú operáciu. Kontroly odhaľujú zmeny pred týmto intervalom; následne si ponechá pracovné kópie podporujúce obnovenie. - Údaje o obnove zostávajú na vzdialenom účte až do potvrdeného vyčistenia. Neúplné, Konfliktné a nepozorovateľné denníky nie sú nikdy potichu vyradené. Neexistuje automatická recovery-súbor vypršanie a žiadna nútená možnosť prepísať. - `npm ci` oznámila zistenia auditu závislosti 17 (9 stredne vysoká, 8 vysoká). Táto zmena nemení závislosti ani model aktualizácie dôvery aplikácie. Užívateľ požiadal o zachovanie zmien v existujúcom pracovnom strome, v súčasnosti `feature/hash-checksum-plugin`; nebol vykonaný žiadny prepínač pobočky alebo nesúvisiace čistenie. ## Súbory zmenené pre túto úlohu - `src/main/files/remoteFileService.js` - `src/main/files/remoteEditor.py` (nové) - `src/main/sessions/sessionManager.js` - `src/main/sessions/latencyMonitor.js` (nové) - `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` (nové) - `test/remoteEditorProtocol.test.js` (nové) - `test/remoteEditorLinux.test.js` (nové) - `test/fixtures/remoteEditorLinux.py` (nové) - `test/latencyMonitor.test.js` (nové) - `README.md` - `docs/remote-editor-latency.md` (tento súbor) - `../.github/workflows/remote-editor-tests.yml` (nové)