Memories / Dokumentation

Auf dieser Seite

Architektur und Protokoll v1

Speicherung

Das Datenbankschema besteht aus header, state und checkpoints. Abgesehen von Formatmetadaten, Salt und Zeilenfolgenummern sind die Werte authentifizierter Chiffretext. Auch Journale enthalten Chiffretext. Es gibt keinen dauerhaften FTS-Index im Klartext. Autorisierte gewöhnliche Erinnerungen werden in überlappende, Unicode-sichere Abschnitte aufgeteilt und mit Jieba tokenisiert, bevor sie in einen SQLite-FTS5-Index im Arbeitsspeicher gelangen. Der Cache wird anhand der Richtlinie, Revision und des Quarantänestatus des Tresors identifiziert und zwischen Abfragen wiederverwendet; Bearbeitungen, Synchronisierung und Richtlinienänderungen machen ihn ungültig, und das Sperren leert ihn. Temporäre SQLite-Daten werden bewusst nur im Arbeitsspeicher gehalten. Vektoren werden normalisiert und ausschließlich im Arbeitsspeicher zwischengespeichert; weder Klartextindizes noch Embeddings gelangen in Sicherungs- oder Synchronisierungsdaten.

Der aus dem Passwort abgeleitete Schlüssel umhüllt einen zufälligen Hauptschlüssel; dieser verschlüsselt den Zustand und lokale Checkpoints. Jede Berechtigungsepoche hat einen Tresorschlüssel, und jede Revision hat einen zufälligen Datenschlüssel, der unter ihrem Epochenschlüssel umhüllt wird. Inhalte werden serialisiert und in einzeln authentifizierte Abschnitte von 256 KiB aufgeteilt, deren Position und Gesamtzahl in die zugehörigen Daten eingebunden sind. Die Revisionssignatur umfasst die Asset-ID, Vorgänger, den Richtlinienkopf, die Tombstone-Markierung, den Chiffretext und das Gerätezertifikat.

Änderungen werden auf einem geklonten Zustand vorbereitet und zusammen mit dem verschlüsselten Zustand und Checkpoint in einer SQLite-Transaktion mit synchronous=FULL festgeschrieben. Lese- und Ausführungsabsichten werden vor der Auslieferung festgeschrieben. Ein Datenträgerfehler verhindert daher die Auslieferung; ein Absturz nach dem Festschreiben der Absicht kann ein unbekanntes Ergebnis hinterlassen.

Eine exklusive Betriebssystemsperre erlaubt einen kooperierenden lokalen Schreiber. Die Initialisierung erstellt eine vollständige Datenbank im selben Verzeichnis, schließt und synchronisiert sie und veröffentlicht sie anschließend, ohne ein vorhandenes Ziel zu überschreiben. Eine unterbrochene Vorbereitung verhindert keinen erneuten Versuch. Jedes Gerät benötigt seinen eigenen lokalen Speicher; das Kopieren laufender SQLite-Dateien über einen Cloud-Synchronisierungsclient bietet keine geräteübergreifende Transaktionssicherheit.

Identitäten und Transport

Ed25519-Benutzerschlüssel zertifizieren Ed25519-Signaturschlüssel und X25519-Austauschschlüssel der Geräte. Zertifikate allein reichen nicht aus: Jede Tresorrichtlinie autorisiert Geräte ausdrücklich. Geräteschlüssel sind unabhängig, auch bei Geräten desselben Benutzers. Die anfängliche Signierbefugnis des Benutzers wird genehmigten persönlichen Geräten in einem authentifizierten, für den Empfänger verschlüsselten Paket übermittelt; diese Befugnis kann die Geräte-Zulassungsliste eines Tresors nach dem Widerruf eines Geräts nicht umgehen.

Eine Hülle enthält eine Formatversion, den Geräteschlüssel des Absenders, den Austauschschlüssel des Empfängers, einen kurzlebigen öffentlichen X25519-Schlüssel, AEAD-Nutzdaten und eine Ed25519-Signatur. HKDF leitet den Transportschlüssel ab. Empfängeridentität und kurzlebiger Schlüssel werden authentifiziert. Das beitretende Gerät verwendet eine ablaufende signierte Anfrage und bindet sich ausdrücklich an den öffentlichen Schlüssel des genehmigenden Geräts; Anfragen werden erst nach erfolgreichem Festschreiben verbraucht.

Die erste Veröffentlichung verwendet Anfrage-/Genehmigungszeichenfolgen und Dateien anstelle des QR-Scannens per Kamera. Fingerabdrücke sind vollständige SHA-256-Hashes; verkürzte Werte in Listen dürfen niemals als alleinige Genehmigungsprüfung dienen.

Richtlinien und Zusammenführung

Tresorrichtlinien sind signierte lineare Historien mit Mitgliedschaft, Rolle, Geräte-Zulassungsliste, monoton wachsender Menge widerrufener Geräte und Epoche. Rollenprüfungen verwenden die vorherige Richtlinie. Gewöhnliche Benutzer dürfen ein weiteres Gerät für ihre eigene Identität autorisieren, ohne die Mitgliedschaft zu ändern. Ein Admin darf die Mitgliedschaft von Admin, Editor und Reader ändern und das Gerät eines Mitglieds autorisieren. Ein Admin darf keinen Owner hinzufügen, entfernen oder ändern, keine Geräte widerrufen und kein Eigentum übertragen. Owner dürfen dies. Eine Eigentumsübertragung behält genau einen Owner bei.

Asset-Historien bilden einen inhaltsadressierten DAG, den alle bearbeitbaren Arten gemeinsam nutzen (Erinnerung, Karte — einschließlich Wissen, Brain, Persona und Metadaten geschützter Karten —, Datei und Zugangsdaten). Jedes Speichern fügt eine signierte Revision hinzu; es gibt keinen separaten Historien-Speicher nur für das Wiki und keine automatische Bereinigung. history listet Revisionen mit Autor und Zusammenfassung auf; diff liefert eine vereinheitlichte Textprojektion (Titel, strukturierte Metadaten, Textkörper) zwischen zwei Revisionen oder gegenüber dem aktuellen HEAD. Dateivergleiche lassen binäre Nutzdaten aus; geheime Inhalte von Zugangsdaten bleiben über Lesen/Vergleichen unzugänglich. Mehrere unverbrauchte Revisionen eines Assets sind Konflikte; eine Auflösungsrevision benennt alle sichtbaren Vorgänger. Ein Tombstone entfernt das Asset aus aktuellen Ansichten, ohne die Historie zu löschen.

Die Synchronisierung validiert vollständige Richtlinien-, Revisions- und Audit-Historien vor der Zusammenführung in einen Kandidatenzustand. Unbekannte Schreibvorgänge aus abgelösten Epochen werden unter Quarantäne gestellt. Lokale Offline-Schreibvorgänge, die in einem eingehenden neueren Richtliniensnapshot fehlen, werden ebenfalls unter Quarantäne gestellt. Quarantäne kann nur lokal überprüft und erneut angewendet werden; ein nicht vertrauenswürdiges eingehendes Feld kann sie nicht aufheben.

Richtlinienverzweigungen erfordern eine Owner-Signatur über den ausgewählten Kopf und die gesamte verworfene Richtlinienkette. Der Unterzeichner muss auf beiden Zweigen Owner sein. Verworfene Richtlinien bleiben für historische Revisionen und Revisionen unter Quarantäne überprüfbar. Eine erfolgreiche Auflösung führt die ausgewählte Richtlinie fort und rotiert ihren Schlüssel. Konkurrierende oder inkompatible Auflösungen werden sicher abgewiesen.

Lokale API

service::Request ist die gemeinsame typisierte Operationsschnittstelle, serialisiert mit dem Diskriminator op in Snake Case. Unbekannte Felder auf oberster Ebene werden abgewiesen. Lokales IPC verwendet JSON-Frames mit vorangestellter 32-Bit-Länge in Big Endian (Version-1-Wrapper Wire). Optionales HTTP-/WebSocket-Listening und Relay-RPC verwenden nach der Token-Authentifizierung dieselbe binäre WebSocket-JSON-Rahmung (AuthFrame, dann Wire). MCP-Fähigkeiten werden vor der Weiterleitung separat geprüft. RunBound wird wie RemoteExec weitergeleitet: run_bound_prepare autorisiert und entschlüsselt unter der Servicesperre, der IPC-Thread führt das Programm ohne Sperre aus, und run_bound_finish protokolliert das Ergebnis. Ausführungsbindungen liegen im gerätelokalen State.run_bindings, nicht in einem Tresor.

Netzwerktransporte dürfen token-authentifizierte gerahmte Requests übertragen. Tokens stammen ausschließlich aus Flags/Umgebungsvariablen (niemals TOML), werden in konstanter Zeit verglichen und beim Sperren des Speichers gelöscht. Entfernte Aufrufer verwenden stabile Namensräume für erhöhte Rechte (ws:remote / relay:remote), die keine lokale cli:{pid}-Rechteerhöhung erben; Entsperren und sudo über eine entfernte Verbindung erhöhen die Rechte dieses Namensraums, sodass einmalige CLI-Verbindungen die erhöhten Rechte behalten. Desktop-HTTP-/Relay-Hosts leiten die vollständige handle_client-Schnittstelle weiter (mit denselben Rechteprüfungen wie lokales IPC). Mobile FFI und Share behalten die plattformspezifische Sperrliste bei und führen auf dem Telefon keine ausschließlich für Desktops vorgesehenen Funktionen ein. HTTP-Listening verwendet standardmäßig Loopback; Bindungen außerhalb von Loopback erfordern --allow-non-loopback und eine Warnung. Einfaches HTTP/WS benötigt keine Zertifikate; --tls-cert / --tls-key aktivieren HTTPS/WSS. Relay-RPC verwendet außerhalb der Vertrauensgrenze WSS mit einer Raum-ID hoher Entropie plus Token; die Tresorsynchronisierung behält /v1/channel bei. Die WebUI bietet eine schreibgeschützte Statusprojektion und einen eingeschränkten Editor für gewöhnliche Karten und ist kein Request-Transport. Siehe entfernter Daemon und SECURITY.md.

Optionale Autorisierungs-Center ([[centers]] in der Konfiguration) verbieten lokales Selbst-Bootstrapping und die lokale Ausstellung von MCP-Grants; Aufnahme und Grants werden als vom Center signierte Tickets mit ausdrücklichen Geltungsbereichen verteilt (allow_all / read / write / read_write / read_write_delete). Siehe Center.

Der optionale gehostete Center-Modus (--data DIR) besitzt einen separaten verschlüsselten Store im Daemon-Format unter DIR/store/, der mit einem vom Betreiber verwahrten Serverpasswort geöffnet wird. Sein HTTP-Inhalts-RPC verwendet einen geschlossenen Grant-Dispatcher pro Tresor in Service; operationslokale Rechteerhöhung umfasst geschützte/private Inhalte und Anhänge, ohne die MCP-Autorisierung des Daemons zu ändern. Dies ist serverseitige Verschlüsselung, keine Ende-zu-Ende-Verschlüsselung auf Clientseite. Separate Admin-HTTP-Routen verwalten gehostetes Sperren/Entsperren und dauerhafte benannte Grants in DIR/members.json, das nur für den Eigentümer zugänglich ist. Signierte Entsperrtickets autorisieren ausschließlich das lokale Entsperren des Geräts per Passwort; Geräteschlüssel gelangen niemals zu einem Center, das nur Tickets verwaltet. Ein einzelner [[centers]]-Eintrag mit mode = "saas" lässt das Inhalts-RPC des Daemons dieses gehostete Backend und dessen Bearer aus der Umgebung verwenden, ohne parallelen lokalen Inhaltspfad oder Erhöhung von MCP-Fähigkeiten. Geräte-/Admin-Steuerungen gehören nicht zur Grant-Inhaltsschnittstelle. Siehe gehosteter Center-Tresor für Grenzen und Migration.

Die mobile ABI wird in crates/ffi/memories.h deklariert. Handles sind numerische Registry-IDs, keine rohen Rust-Zeiger. Jede zurückgegebene Zeichenfolge muss genau einmal mit memories_free freigegeben werden. Ungültiges JSON erzeugt einen allgemeinen Fehler, ohne die Eingabe wiederzugeben. memories_lock_all erhöht beim Wechsel in den Hintergrund eine globale Sperrgeneration und unterdrückt verspätete Antworten laufender Anfragen. Die Registry speichert referenzgezählte Servicesperren pro Handle; Netzwerkarbeit hält weder Registry- noch Schreibsperre. Ein beschäftigtes Handle wendet eine ausstehende Sperre vor seiner nächsten Anfrage an. Mobile schließt Prozessausführung und die Erstellung von MCP-Grants aus.

Die Flutter-Modusauswahl (mobile/lib/app_mode.dart) leitet Standalone an die lokale Bibliothek und Center/SaaS an HostedCenterPage weiter. Hier bedeutet Center einen selbst gehosteten Server mit gehosteter Speicherung; SaaS wählt den festen Endpunkt https://memories.ivjn.us. Beide verwenden dieselben Rust-FFI-Operationen hosted_* und HostedClient; die Auswahl verändert weder das Daemon-TOML, noch nimmt sie ein ticketverwaltetes Gerät auf oder verschiebt Daten zwischen Speichern.

Der gewählte Modus ist eine nicht geheime Einstellung. Center und SaaS speichern jeweils ein URL-/Token-Profil im sicheren Plattformspeicher. Ein Wechsel sperrt den lokalen Service, beendet die Freigabe und gibt die gehostete Seite/Sitzung frei. Der Wechsel in den Hintergrund leert gehostete Inhalte und macht verspätete Antworten ungültig; die erneute Verbindung bei Rückkehr erfolgt ausdrücklich. Siehe mobile Konfiguration für Profilschlüssel und Upgrade-Verhalten sowie die mobile Anleitung für Benutzerschritte.

Desktop-Tray und Statusprojektion

Request::DesktopStatus liefert eine typisierte Projektion des Initialisierungs-/Sperrzustands, der Bibliotheks- und Verbindungsanzahl, konfigurierter Anbieterarten und der Synchronisierungswarteschlangen. Sie läuft vor der Weiterleitung entsperrter Operationen und klont oder schreibt weder den verschlüsselten Zustand fest, berührt keine Inaktivitäts-/Rechteerhöhungstimer und legt keine Kennungen, Kontozusammenfassungen, Inhalte oder Zugangsdaten offen. Antworten im gesperrten Zustand enthalten keine Details. Die bestehende MCP-Zulassungsliste verweigert diese Anfrage.

Die CLI-Bibliothek beherbergt das lokale Dashboard und das Windows-/macOS-Tray. Sowohl memories tray als auch der eigenständige Starter memories-tray verwenden eine native Ereignisschleife im Hauptthread. HTTP-Server und begrenzter Worker für Statusabfragen laufen separat, sodass ein beschäftigter Daemon weder Tray noch Browser blockieren kann. Die Abfrage ruft die benachbarte CLI über das normale, vom Betriebssystem authentifizierte IPC auf, mit Frist und Bereinigung des Kindprozesses. Die HTTP-Schnittstelle liefert eingebettete Ressourcen, die feste Statusprojektion und eine ausdrücklich begrenzte Zulassungsliste zur Bearbeitung gewöhnlicher Karten/Typen. Sie kann weder entsperren, Rechte erhöhen, Geheimnisse offenlegen noch beliebige Serviceanfragen weiterleiten. Siehe SECURITY.md für ihre Token- und Browser-Origin-Grenze sowie Desktop-Nutzung.

Retrieval und Modellorchestrierung

search::Cache besitzt höchstens zwei Tresorindizes, jeweils begrenzt auf 10,000 Abschnitte, 16 MiB Quelltext/Metadaten und 32 MiB Vektoren. Vor der Indexierung schließt er private Inhalte, Zugangsdaten, Dateien, gelöschte Inhalte, Inhalte unter Quarantäne und Konfliktinhalte aus. BM25 gewichtet Titel/Textkörper/Metadaten mit 5/1/2. Die Vektorsuche verwendet Kosinusähnlichkeit; die hybride Suche kombiniert beide Ranglisten mittels Reciprocal-Rank Fusion. Die standardmäßige Neubewertung verstärkt Abfragedeckung und exakte Phrasenübereinstimmungen innerhalb einer begrenzten Kandidatenmenge. Ein konfigurierter Modellendpunkt kann eine gelernte Neubewertung durchführen.

Retrieve, RagIndex, RagStatus und RagAsk behalten Tresorautorisierung und MCP-Grant-Geltungsbereiche bei. IPC führt Modellarbeit außerhalb des Service-Mutex aus und überprüft Entsperrgeneration, Grant-Gültigkeit, Zugriff und Quellrevisionsstempel vor/nach externer Arbeit und vor der Auslieferung erneut. Signierte Absichten gehen Inferenz/Export voraus; Erfolg/Fehlschlag und ausgelieferte Quell-IDs werden ohne Prompts oder Schlüssel protokolliert. Quell-Asset-/Revisionsreferenzen verwenden die gemeinsame Kurz-ID-Projektion; Abschnittshashes und Zitatmarkierungen wie [S1] sind keine Asset-IDs.

rag::Runtime lädt native ONNX-Inferenz und die festgelegten EmbeddingGemma-Q4- Ressourcen bei Bedarf oder ruft eine konfigurierte Gemini-/kompatible Embedding-URL auf. Sie unterstützt außerdem konfigurierte Generierungs- und Neubewertungs-URLs, über Umgebungsvariablen referenzierte API-Schlüssel, Proxys und Wiederholungen. Native Modelldateien sind öffentliche Modelldaten; verschlüsselte Benutzerdatensätze werden niemals zu Modellgewichten. Abgerufener Text ist in Generierungs-Prompts nicht vertrauenswürdiges Material, und zurückgegebene Zitat-IDs werden gegen die ausgewählten Quellen validiert. Dies validiert Referenzen, nicht die sachliche Richtigkeit modellgenerierter Texte.

Mobile FFI erhält die verbesserte lexikalische Suche und unterstützt BM25 retrieve. Modellgestützte Operationen verwenden derzeit den konfigurierten Desktop-Daemon; diese Veröffentlichung ergänzt Flutter um keine Oberfläche für Modellkonfiguration oder Modellinferenz.

Kryptografische Desktop-Aufträge

jobs::Job beschreibt Werkzeuge, festgelegte Eingabedateien/-bäume, Zugangsdatenbindungen, geordnete Schritte, Bereinigung und einen neuen Ausgabepfad. Die crypto-Rezepte der CLI erstellen diesen Plan für S/MIME/OpenPGP und Android-/iOS-Signierung. Die Genehmigung wird geprüft, bevor Kurz-IDs aufgelöst werden, sodass ihr Hash genau die dem Aufrufer angezeigten Referenzen bindet. Der Service prüft lokale Rechteerhöhung und Tresorzugriff, löst ausschließlich Zugangsdaten-Assets auf, schreibt eine Ausführungsabsicht fest und ruft dann den gemeinsamen Core-Runner auf.

Der Runner prüft Werkzeuge erneut, kopiert und überprüft Eingaben, materialisiert Zugangsdaten in einem privaten Arbeitsverzeichnis, führt Befehle ohne Shell aus, unterdrückt deren Ausgabe und veröffentlicht nur ein erfolgreiches Artefakt. Die Platzhalterexpansion ersetzt ausschließlich Pfade und interpretiert Pfadinhalte nicht rekursiv. Die MCP-Zulassungsliste und die mobile FFI verweigern Prozessaufträge. Die bestehende run-Semantik bleibt unverändert.

Skills für KI-Clients

memories inject ist eine ausschließlich in der CLI verfügbare Installationsoperation. skills.rs bettet die versionierte crates/cli/skills/memories/SKILL.md in die ausführbare Datei ein und installiert sie in dokumentierten Erkennungsverzeichnissen von Codex, OpenCode oder Claude Code. Sie läuft vor der Erstellung des Datenverzeichnisses und öffnet niemals den Speicher oder ruft den Daemon auf. Benutzer- und Projektgeltungsbereiche teilen denselben Anweisungstext; Speicherpfade, Tresor-IDs, Grant-Tokens oder geheimes Material werden nicht darin eingesetzt.

Der Installer prüft alle Ziele vorab, bewahrt identische Dateien, erfordert --force bei abweichendem Inhalt, weist verlinkte Skill-Dateien/-Verzeichnisse ab und veröffentlicht jede Datei über eine synchronisierte temporäre Datei in ihrem Zielverzeichnis. Neue Dateien werden veröffentlicht, ohne eine gleichzeitig erstellte Datei zu überschreiben. Dies ist Atomarität pro Datei, keine clientübergreifende Transaktion. Vorhandene benachbarte Ressourcen und Clientkonfigurationen bleiben erhalten. Der Skill leitet gewöhnliche Suche, Retrieval mit Zitaten, konfigurierte Antworten und Schreibvorgänge über bestehende MCP- oder CLI-Schnittstellen; er fügt keine Autorisierungsfähigkeiten hinzu.

Cloud-Autorisierung

Die Desktop-CLI führt Browser-OAuth mit PKCE, einem Loopback-Callback und festen Anbieterendpunkten aus. CloudBegin erstellt unter sudo ein ablaufendes, an Aufrufer/Anbieter/Client gebundenes Ticket. Netzwerkanfragen laufen außerhalb des Daemons; CloudComplete prüft Ticket und aktuelle Autorisierung vor dem Festschreiben. Sperren, Abmelden und Neustarten machen ausstehende Tickets ungültig und verhindern, dass verspätete Ergebnisse die Anmeldung wiederherstellen.

State.cloud_accounts speichert Tokens verschlüsselt auf dem lokalen Gerät. Der Status liefert ausschließlich Kontometadaten; Sicherungen, Kopplung, Tresorsynchronisierung und MCP schließen die Tokens aus. Eine Anmeldung begründet keine Tresormitgliedschaft.

Cloud-Objektsynchronisierung

State.cloud_sync hält dauerhafte Ausgangs-/Eingangsbelege im selben verschlüsselten Zustandsblob. CloudSyncEnqueue schreibt die exakten serialisierten Hüllenbytes und einen signierten Deskriptor vor jeglicher Transport-E/A. Objekt-IDs sind SHA-256-Hashes dieser Bytes; Wiederholungen verwenden sie erneut. CloudSyncWork liefert Chiffretext und Listing-Cursor ohne OAuth-Tokens. sync::execute führt begrenzte put/get/list-Operationen ohne den Service-Mutex aus. CloudSyncAck prüft eine prozesslokale Sitzungsgeneration und schreibt dann Upload-Markierungen, entdeckte IDs, heruntergeladene Bytes und Tresorzusammenführungen gemeinsam fest. Deskriptoren, die vor ihren Objekten ankommen, bleiben ausstehend. Sperren, Entsperren und Abmelden erhöhen die Sitzung, sodass verspätete Bestätigungen keinen Import auslösen können. memories cloud sync fordert den Daemon auf, Tokens zu erneuern und über die Anwendungsordner von OneDrive oder Google Drive hoch- und herunterzuladen; diese HTTP-Arbeit läuft außerhalb der Schreibsperre. Tokens werden niemals über IPC zurückgegeben. Tests verwenden außerdem MemoryTransport und Loopback-Graph-/Drive-Testumgebungen. Abgeschlossene Warteschlangennutzdaten werden zu Hashbelegen und Veröffentlichungsstempeln pro Anbieter/Empfänger verdichtet. Belege bleiben lokal und löschen keine Cloud-Historie. Fehlende Objekte werden mit einer dauerhaft gespeicherten exponentiellen Verzögerung erneut angefordert; die Kapazität ausstehender Einträge begrenzt durch Rückstau die Auflistung. Anbieter-Worker arbeiten pro Konto seriell und verweigern Erneuerungs-/Importergebnisse aus einer ungültig gewordenen Sitzung. IPC-Weiterleitung verwendet höchstens 16 gleichzeitige Verbindungen.

Siehe Synchronisierungsentwurf und Autorisierungsanleitung.

Entfernte Sitzungen

Der Desktop-Daemon besitzt SSH-, FTP-, TCP-, MySQL-, Redis- und PostgreSQL-Verbindungen. RemoteOpen validiert die Host-Zulassungsliste der Zugangsdaten, protokolliert eine Verbindungsabsicht und verbindet sich dann außerhalb der Schreibsperre. SSH authentifiziert sich mit Passwort-Zugangsdaten oder einem importierten privaten OpenSSH-Schlüssel, optional zusätzlich mit OpenSSH-Zertifikat-Zugangsdaten. CredentialGenerate erstellt SSH-Schlüssel und TLS-Zertifikate unter sudo; der private Schlüssel wird als Zugangsdaten gespeichert und niemals zurückgegeben. CredentialPublic leitet öffentliche SSH-Schlüssel oder PEM-Zertifikate aus diesem gespeicherten Material ab. Datenbanksitzungen aktivieren TLS standardmäßig und können optionale PEM-CA-Zugangsdaten (tls_ca) an den Vertrauensspeicher des Clients anhängen. Die Prüfung des Hostnamens ist erforderlich; Zertifikat-Pinning ist nicht implementiert. Jede Anweisung wird als Ticket vorgeschlagen, dessen Fingerabdruck Sitzung, Sequenz und kanonische Anweisung umfasst. RemoteApprove ist einmalig verwendbar und an den Aufrufer mit erhöhten Rechten gebunden; RemoteExec führt ausschließlich dieses Ticket auf der bestehenden Sitzung aus. Sperren, Ablauf der Inaktivitätsfrist und Abmelden verwerfen laufende Verbindungen und ausstehende Tickets. Dateioperationen verwenden FTP; SSH- und Datenbanksitzungen akzeptieren exec/query. ProxyStart bindet einen Loopback-Listener nach denselben Prüfungen der Zugangsdaten und Host-Zulassungsliste wie RemoteOpen. Lokale Clients verbinden sich ohne Geheimnisse; der Daemon hält die vorgelagerte SSH- oder Datenbankauthentifizierung. proxy.start protokolliert die Verbindungsabsicht vor dem Binden; proxy.stop protokolliert die Beendigungsabsicht. Der gebundene Socket wird direkt an Tokio übergeben, ohne Zeitfenster für Schließen/Neubinden. PostgreSQL SSLRequest und MySQL SSLRequest gehen dem TLS-Upgrade voraus; Redis verwendet direktes TLS. PostgreSQL SCRAM prüft sowohl Nonce als auch Serversignatur. MySQL unterstützt native und Caching-SHA-256-Authentifizierung, einschließlich Plugin-Wechseln; ein vollständiger Passwortaustausch erfordert TLS. Datenbank-Handshakes haben eine Frist von 30 Sekunden, Paketgrenzen von 64 KiB und eine Grenze von 16 Clients pro Listener. Der lokale Datenbankabschnitt ist unverschlüsselt, und Anmelde-/Datenbankstartfelder überschreiben nicht die konfigurierte vorgelagerte Identität. Lokale Clients autorisieren uneingeschränkte entfernte Anweisungen innerhalb der Berechtigungen dieses Kontos. Loopback bietet keine Authentifizierung pro Benutzer. Sperren, Ablauf der Tresor-Inaktivitätsfrist, ausdrückliches Beenden und Freigabe des Services brechen Listener und aktive Sitzungen ab. Proxys haben eine maximale Lebensdauer von 30 Minuten; Datenverkehr verlängert die Tresorentsperrung nicht. MCP kann keine Proxys verwalten. Der Service besitzt jeden Proxy-Worker und wartet beim Beenden/Sperren auf dessen Abschluss, sodass eine erfolgreiche Antwort nicht mit einer Verbindung kollidieren kann, die noch Anweisungen weiterleitet.

Ausführung von Konfigurationsdateien

memories file exec kombiniert die bestehende autorisierte Read-Anfrage mit CLI-lokaler Dateimaterialisierung und Prozessüberwachung. Es führt keine neue Serviceanfrage, Dateiart, Kryptografie oder Ausführungsberechtigung für Mobile/MCP ein. Der Daemon protokolliert die Dateiauslieferung über den bestehenden Lesepfad; anschließend führt die CLI den Kindprozess im Vordergrund aus, ohne die Servicesperre zu belegen. Die CLI besitzt den temporären Klartextsnapshot, bis der direkte Kindprozess endet; spätere Tresoränderungen oder Sperren verändern oder widerrufen diesen bereits ausgelieferten Snapshot nicht.

Wiederherstellung

Sicherungen enthalten den signierten lokalen Zustand und geheimes Wiederherstellungsmaterial unter einer unabhängigen Argon2id-/AEAD-Hülle. Die Wiederherstellung erzeugt neue Geräteschlüssel und unabhängige Tresor-IDs und bewahrt aktuelle Inhalte und Konfliktköpfe. Ursprüngliche signierte Historien bleiben in einem verschlüsselten schreibgeschützten Archiv erhalten. Die Wiederherstellung behauptet nicht, dass eine historische gemeinsame Mitgliedschaft noch aktuell ist. Rein gerätelokale Tresore, Cloud-Autorisierungen und Cloud-Ausgangs-/Eingangsbelege sind ausgeschlossen; jedes wiederhergestellte Gerät meldet sich separat bei Cloud-Anbietern an.

Karten und sichere Projektionen

Kind::Card teilt die Autorisierung gewöhnlicher Erinnerungen; typisierte Metadaten werden innerhalb verschlüsselter Revisionen gespeichert. CardLink ergänzt gerichtete Kanten innerhalb desselben Tresors. Graphen projizieren nur aktuelle, eindeutige sichtbare Knoten und Kanten, deren beide Endpunkte sichtbar sind. Die Suche verwendet den oben beschriebenen begrenzten FTS5-Cache im Arbeitsspeicher und umfasst gewöhnliche Textkörper, Tags/Quellen und zugelassene Metadaten geschützter Karten. Geheime Inhalte von Zugangsdaten gelangen niemals in diesen Index. Suche/Liste/Graph legen eine sichere summary-Projektion offen; Kartenlesevorgänge behalten die undurchsichtige Zugangsdatenreferenz bei, lösen jedoch niemals deren Wert auf.

protected_card validiert eine Konto-/env-/Token-/TOTP-/HOTP-Eingabe (einschließlich Import einer otpauth-URI), schreibt Zugangsdaten und deren Karte in einen Kandidatenzustand und schreibt beide gemeinsam fest. Generisches put kann keine geschützten Referenzen anhängen oder ersetzen. Geheimnisoperationen lösen aktuelle Zugangsdatenrevisionen auf und überprüfen deren Art. otp_code implementiert RFC 6238 (TOTP) und RFC 4226 (HOTP), erhöht den HOTP-Zähler im selben Commit und protokolliert die Auslieferungsabsicht vor der Rückgabe eines Codes. Die Erstellung von HTTP-Headern markiert Bearer-/Cookie-Werte als sensibel; Weiterleitungen sind deaktiviert, und Antworten werden unterdrückt.

Erinnerungs- und Karteninhalte können außerdem eine secrets-Map von einem stabilen Label zu einer kanonischen Zugangsdaten-Asset-ID enthalten. protect_secret ersetzt exakte Übereinstimmungen im Textkörper durch {{secret:LABEL}} und erstellt die Zugangsdaten in derselben Transaktion. Generisches put verlangt unveränderte bestehende Zuordnungen und kann sie weder erfinden noch auf andere Ziele richten. CLI- und mobile Bearbeitungen übernehmen die bestehende Map. MCP card_write lässt die Map aus, sodass Aktualisierungen von Karten mit Geheimnisreferenzen an der Validierung scheitern. Die Clientprojektion verkürzt ausschließlich typisierte Zugangsdaten-IDs und belässt Textkörpermarkierungen stabil. Die Wiederherstellung aus Sicherungen bewahrt eindeutige Asset-IDs, sodass die Zuordnungen die Wiederherstellung überstehen. credential_copy löst ein Label, eine geschützte Karte oder direkt Zugangsdaten auf, erfordert lokale Rechteerhöhung und schreibt eine Audit-Absicht fest, bevor UTF-8-Klartext an den Zwischenablageclient zurückgegeben wird. MCP weist beide neuen Operationen ab. Keine generische Lese-, Such- oder Graphoperation löst ein Geheimnis auf. Signierte historische Textkörper bleiben durch die Ersetzung unverändert; siehe die Wiki- und Zwischenablagegrenzen in SECURITY.md.

Der Service liefert {"secret":"..."} ausschließlich an den autorisierten lokalen Aufrufer der Kopieroperation. Die CLI verarbeitet diese Antwort in clipboard.rs und liefert {"copied":true} in ihrer normalen Ausgabehülle erst nach erfolgreichem Schreiben in die Zwischenablage zurück. Mobile verwendet den Zwischenablagekanal von Flutter und prüft vor der Auslieferung seine Lebenszyklusgeneration. Das Audit protokolliert credential.copy mit delivery_intent, keinen Erfolgsbeleg der Betriebssystem-Zwischenablage. Siehe Nutzungsanleitung.

State.local_vaults markiert rein gerätelokale Tresore innerhalb des verschlüsselten lokalen Zustands. local_config protokolliert vom Client gesammelte Versions- und Verzeichnismetadaten in einem solchen Tresor. Die Gerätegenehmigung filtert diese Tresore heraus; direkter Mitgliedschaftsexport und Synchronisierung werden abgewiesen; store::backup entfernt sie aus seinem exportierten Snapshot. Eindeutige Asset-IDs überstehen die Wiederherstellung in einem neuen Tresor und bewahren Graph- sowie Karten-zu-Zugangsdaten-Referenzen, während ursprüngliche signierte Historien archiviert bleiben.