> Deze vertaling wordt taalkundig herzien. Vergelijk onduidelijke passages met het [Engelse origineel](https://www.sm.ch-j.eu/docs/i18n/en/remote-editor-latency.md). # Opslaan van editor op afstand en latency monitoring ## Hoofdoorzaken De vorige editor heeft zijn werkbestand geüpload naar de oudermap van het doel, die vaak niet door het SSH-account kan worden geschreven onder `/etc` of `/var`. SFTP hernaam geleverd geen geautoriseerde sudo pad, baseline conflict check, security metadata verificatie of betrouwbare overschrijven semantiek. De foutafhandeling verwijderde de tijdelijke kopie, het verwijderen van terugwinningsmateriaal zelfs toen de voltooiing was onzeker. Sessiestatus eerder alleen de verbindingsstatus blootgesteld. Er was geen ICMP of geauthentificeerd SSH-responsmeting die de terminalindicator voedde. ## Protocol opslaan 1. Een vaste SSH-helper opent een normaal, single-link bestand met behulp van descriptor-relatief operaties en `O_NOFOLLOW` voor elke padcomponent. Het vangt de inhoud, SHA-256 hash, apparaat/inode, UID, GID, volledige toestemming bits, nanosecond wijziging / verandering tijden en alle leesbare uitgebreide attributen. Core controleert de hash en decodeert strikte UTF-8, met behoud van een BOM. Elk document krijgt een ondoorzichtige `editId`, scoped naar zijn plugin, terminal sessie en server-identiteit. 2. Een onbevoorrechte voorbereidingsoperatie lost de geauthentiseerde rekening op home via `pwd.getpwuid(os.getuid())`, maakt `$HOME/ch-j-sm/` met de modus `0700` en creëert een privé, exclusief recovery journaal. Een onveilig huis, symlink werkruimte of een werkplek die eigendom is van een ander account wordt afgewezen. 3. Core uploadt een verborgen, willekeurige 128-bit `.tmp` werkbestand via SFTP met exclusieve creatie (`wx`), modus `0600` en een zestig seconden channel/upload timeout. Het journaal bevat het doel, de oorspronkelijke basislijn en de verwachte werkhash; het bevat geen referenties. 4. **One SSH exec voert de volledige afwerking** uit, optioneel via het bestaande sudo-uitvoerder. De helper opent en hasht de privé werkkopie veilig en spoelt het door. Het vergrendelt de originele inode, controleert zijn basislijn, creëert een exclusief bestemmingsbestand naast het doel, schrijft alle inhoud, past en controleert metadata, controleert het origineel opnieuw, en spoelt de vervanging. 5. Een zelfde-directory `os.replace` vervangt atomair het doel. De ouder directory is doorgespoeld en het laatste pad, hash, inode en metadata worden geverifieerd. Het oorspronkelijke pad blijft tot vervanging beschikbaar. Het werkbestand wordt nooit verplaatst over bestandssystemen en wordt nooit verwijderd door de definitieve versie. 6. Nadat Core een geverifieerd succes heeft gekregen, controleert een aparte opruiming de finale opnieuw. inhoud en beveiligingsmetadata voordat het werkbestand en het journaal worden verwijderd. Het opruimen is nog steeds een bevestigde opslag met `recoveryAvailable: true`. Een mislukte upload, mislukte sudo, conflict, metadatafout of mislukte vervanging houdt het origineel en elk geënsceneerd materiaal. Onvolledige uploads worden als zodanig geïdentificeerd en kunnen niet worden hersteld als een volledig bewerkt document. Verloren SSH communicatie, ontbrekende exit status, time-outs en onverwachte afronding resultaten worden gerapporteerd als **unknown**, nooit zoals opgeslagen. Core blokkeert een andere opslag op een onzeker document; er is geen automatische vervanging opnieuw proberen. ## Metadata, privileges en veiligheidsgrenzen De helper bewaart en controleert UID, GID en alle POSIX-toestemmingsbits, inclusief uitvoerbare, setuid, setgid en plakkerige bits. Het reproduceert Linux uitgebreide attributen byte voor byte, inclusief POSIX ACLs, mogelijkheden en SELinux labels. Eigenschap en bestandsinhoud worden ingesteld vóór beveiligingsattributen, omdat writes/chown mogelijkheden of speciale toestemming bits kan wissen. Erfde doelattributen die afwezig zijn op het origineel worden verwijderd. De wijzigingstijd weerspiegelt de nieuwe schrijfwijze en wordt niet van het origineel gekopieerd. Een onleesbaar of niet-representeerbaar attribuut breekt de operatie af; metadata worden niet stil gedropt. IMA/EVM-signaturen worden uitdrukkelijk afgewezen omdat het kopiëren van content/inode-gebonden integriteitshandtekeningen deze ongeldig zou maken. Symlinks in het doel of thuispad, hard-linked bestanden en niet-reguliere bestanden worden afgewezen. Er wordt geen in-place of zwakkere SFTP overschrijven terugval gebruikt. Gewone beschrijfbare slaat draaien als de SSH-account. Beschermde opslag vereist expliciete `{ sudo: true }`; een sudo wachtwoord is optioneel voor wachtwoordloze sudo. Wachtwoorden worden gevalideerd en alleen doorgegeven op kanaal stdin, nooit in het commando, journal, werkbestand, logger of remote error. Root SSH sessies gebruiken de bestaande directe root uitvoerder. Foute autorisatie laat het origineel en werkkopie intact. Alle opgeslagen bestanden worden uitgevoerd als root (direct root SSH of sudo) weigeren ook doel directories/ancestors eigendom van of schrijfbaar door andere accounts, of het dragen van een toegang ACL, in plaats van het vertrouwen van een bevoorrechte padnaam gecontroleerd door een ander account. De vaste helper draait met `python3 -I -B`: het negeert gebruikerspaden Python, de werkmap en gebruikerssite pakketten, en schrijft geen bytecode. Paden en JSON argumenten zijn shell-geciteerd in Core. Plugins nooit willekeurige SSH exec of SFTP handvatten ontvangen. Bestaande sandbox, CSP, manifeste permissies, host-key verificatie en update verificatie blijven in gebruik. ## Plugin API en resterende Monaco integratie **De apart gedistribueerde Monaco/File Manager UI is afwezig in deze kassa. De UI integratie, sudo prompt, vuile-buffer behandeling en vertalingen kon hier niet worden geïmplementeerd of getest.** De gebundelde plugin bron is de Hash & Checksum plugin. Er is geen vervangende File Manager bron uitgevonden. De bestaande methoden blijven beschikbaar. Toevoegingsmiddelmethoden/opties worden blootgesteld aan de voorbelasting en door toestemming gecontroleerde runtime: ```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. ``` Herstelmethoden accepteren een optioneel laatste `{ sudo: true, sudoPassword }` argument wanneer het inspecteren van een doel vereist verhoging. Ze behouden de geauthentiseerde gebruikerswerkruimte zelfs wanneer uitgevoerd via sudo. Journals overleven app herstart en SSH opnieuw verbinden; herstel nooit automatisch herhaalt de afronding. Bekijk een herstelde buffer tegen een nieuw geopend doel voordat expliciet opslaan. `files.read` bewakers lezen, inspecteren en loslaten. `files.write` bewakers bespaart en herstel opruimen. `writeText` wijst nog steeds af bij falen voor bestaande plugins; `saveText` geeft een gestructureerde `{ ok, value/error }`-envelop terug omdat Electron aangepaste eigenschappen laat vallen op geweigerde Foutobjecten. Een legacy drie-argument `writeText` kan de basislijn van een enkel open document gebruiken. Meerdere live-documenten voor hetzelfde pad vereisen `editId`; dubbelzinnige legacy-oproepen falen veilig in plaats van het kiezen van de basislijn van een ander document. Plugins moeten ongebruikte handvatten vrijgeven. De externe UI moet onmiddellijk opslaan, buffers vuil houden bij een storing, sudo alleen aanbieden na toestemming/authenticatie mislukkingen, conflicten tonen zonder overschrijven en herstel bieden na verbinding verlies of een onbekende uitkomst. Het moet deze landen vertalen in het Tsjechisch, Duits en Engels. Voorgestelde staat kopie: | 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 | ## Moeitedefinities en levenscyclus **Ping** is de latentie die wordt gerapporteerd door een werkelijke client-side ICMP echo antwoord op het opgelost IP gebruikt door SSH. Core roept het platform ping uitvoerbaar asynchroon met een vaste argument array, zonder een shell of beheerder opstarten vereiste. Linux, macOS (inclusief `ping6`) en Windows argumenten worden apart geselecteerd. Geblokkeerde ICMP, een ontbrekend uitvoerbaar programma, een timeout, ongeldige uitvoer of een Windows-antwoord bovengrens zoals `<1ms` produceren een niet beschikbare waarde, geen uitgevonden getal. **SSH RTT** is de monotone `performance.now()`-duur van een vaste `true` exec-verzoek over de bestaande geauthentiseerde SSH client. Het omvat kanaal setup, server verwerking en response delivery; het is niet pure netwerk RTT of SSH login duur. De vertaalde indicator tooltip verklaart dit onderscheid. Monitoring begint zodra de terminal verbinding maakt. De sondes draaien gelijktijdig en asynchroon, met een vijf-seconden verzoek/proces timeout. Het volgende monster is gepland twaalf seconden nadat het vorige monster voltooid, voorkomen overlapping. Ontkoppelt ICMP, ontruimt timers, annuleert lopende SSH werk en clears waarden. Record identiteitscontroles verhinderen dat een voorafgaande verbinding wordt gepubliceerd na het opnieuw verbinden. ICMP-storing verandert nooit de SSH-verbindingstoestand. Latency reist binnen de bestaande `state` gebeurtenis / `ssh:state` IPC payload: ```js latency: { pingMs: 24.1, sshRttMs: 31.25, measuredAt: "…" } ``` Niet beschikbare nummers zijn `null`. De compacte terminal indicator gebruikt milliseconden, gelokaliseerde niet-beschikbare tekst en Czech/German/English labels. Het verbergt zich bij het verbreken van de verbinding. Er was geen extra uitvoermogelijkheid voor renderers of IPC-verzoek nodig. ## Validatie- en operationele grenzen - Uitvoeren van `app/`: `npm ci`, dan `npm test`. - Laatste lokale resultaat: **179 testen; 163 geslaagd, 0 mislukt, 16 overgeslagen**. Allemaal overgeslagen zijn de Linux bestandssysteem gevallen op deze macOS host. `npm ci`, Python syntax compilatie en `git diff --check` succesvol voltooid. - De tests hebben betrekking op core saves/recovery, sudo protocol en password redactie, echte POSIX shell citeren van vijandige paden, conflicten, uploads, mislukte opruiming, onzekere uitkomsten, gelijktijdige documenten, IPC-machtigingen en latency lifecycle. - Linux filesystem tests oefenen de verzonden Python entry point, met behulp van een private test account-home lookup: eigendom/mode/xattrs, POSIX ACLs, symbolische koppelingen/hardlinks, FIFO's, uploaden en metadata falen, vervanging van storingen, doelraces, onbekende resultaten na vervanging en herstel. Cross-filesystem enscenering maakt gebruik van `/dev/shm` en een ander bestandssysteem indien beschikbaar. Deze tests slaan over op niet-Linux hosts; ontbrekende ACL/separaat-bestandssysteem faciliteiten worden expliciet overgeslagen. - De toegevoegde Linux GitHub Actions taak draait de complete suite en herhaalt bestandssysteem gevallen als root. Deze workflow is niet vanuit deze werkboom verzonden. - Lokale validatie was op macOS. Python bron syntaxis werd gecontroleerd met de directe Command Line Tools Python uitvoerbaar. Een echte macOS loopback ICMP rookcontrole gaf `0.071 ms` terug. Geen live remote SSH server, Windows-runtime, Linux uitvoeringstijd, SELinux implementatie of externe Monaco UI is lokaal getest. - Tekstbewerking op afstand vereist nu Linux en Python 3 met descriptor-relatief ondersteuning voor bestandssysteem/xattr. Een ontbrekende tolk faalt expliciet. Deze kern weigert opzettelijk onveilige metadata, links en mapconfiguraties. - Vergrendeling is adviserend: niet-meewerkende processen kunnen nog steeds racen in de smalle interval tussen de laatste basischeck en atoomhernoeming. Linux levert geen algemene atomaire content-hash-vergelijk-en-vervang operatie. Controles detecteren veranderingen vóór dat interval; bewaarde werkkopieën ondersteunen herstel na afloop. - Herstelgegevens blijven op de remote account tot een bevestigde opruiming. Onvolledig, conflicterende en oncontroleerbare dagboeken worden nooit stilletjes weggegooid. Er is geen automatische verlopend herstel-bestand en geen geforceerde overschrijven optie. - `npm ci` rapporteerde 17-dependence audit bevindingen (9 matig, 8 hoog). Deze verandering verandert niet afhankelijkheden of het update vertrouwensmodel van de applicatie. De gebruiker verzocht wijzigingen in de bestaande werkboom te behouden, momenteel `feature/hash-checksum-plugin`; er werd geen branch switch of niet-gerelateerde opruiming uitgevoerd. ## Bestanden gewijzigd voor deze taak - `src/main/files/remoteFileService.js` - `src/main/files/remoteEditor.py` (nieuw) - `src/main/sessions/sessionManager.js` - `src/main/sessions/latencyMonitor.js` (nieuw) - `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` (nieuw) - `test/remoteEditorProtocol.test.js` (nieuw) - `test/remoteEditorLinux.test.js` (nieuw) - `test/fixtures/remoteEditorLinux.py` (nieuw) - `test/latencyMonitor.test.js` (nieuw) - `README.md` - `docs/remote-editor-latency.md` (dit bestand) - `../.github/workflows/remote-editor-tests.yml` (nieuw)