SSD Nodes Learn 🎉 VPS od $5.50/mies.
Przewodniki Matt ConnorAutor: Matt Connor · Zaktualizowano 2026-08-13

Compartment: jak działa szyfrowana pamięć agenta offline

Dowiedz się, jak Compartment zabezpiecza dane agenta lokalnie bez dostępu do sieci. Analizujemy model zagrożeń, ryzyko utraty klucza oraz działanie szyfrowania w wersji 4.6.0.

Czym Compartment różni się od innych rozwiązań

Compartment to magazyn pamięci agenta, który przechowuje każdy rekord w formie zaszyfrowanej na maszynie, na której został utworzony, i nigdy nie komunikuje się z usługą sieciową. Dwa założenia odróżniają go od reszty rozwiązań w dziedzinie pamięci agentów. Magazyn (vault) stanowi jeden zabezpieczony plik, który otwiera wyłącznie hasło użytkownika, a proces tworzenia embeddingów przebiega lokalnie, dzięki czemu tekst pamięci nigdy nie jest wysyłany na zewnątrz w celu konwersji na wektor. Wersja 4.6.0 została wydana 10 sierpnia 2026 r., licencja to Apache-2.0, a instalacja odbywa się z PyPI.

Jest to deklaracja dotycząca modelu zagrożeń, dlatego niniejszy przewodnik traktuje ją jako taką. Szyfrowanie danych w spoczynku oraz architektura offline chronią określoną listę elementów. Pozostawiają one jednak inne kwestie otwarte i to właśnie w tej luce pojawiają się problemy dnia drugiego.

Niniejszy przewodnik opiera się na dokumentacji projektu oraz informacjach o wydaniu, odczytanych 11 sierpnia 2026 r. Compartment dostarcza aplikację desktopową, element paska menu w systemie macOS oraz ikonę w obszarze powiadomień w systemie Windows, obok narzędzia wiersza poleceń; monitu o hasło nie można obsłużyć z poziomu zautomatyzowanego kontenera. Poniższe informacje należy traktować jako udokumentowane zachowanie, a nie zachowanie zweryfikowane w ramach niniejszego opracowania. Przed powierzeniem narzędziu jakichkolwiek rzeczywistych danych, należy uruchomić je na dodatkowej maszynie.

Co faktycznie chroni szyfrowanie danych w spoczynku

Magazyn jest zabezpieczony szyfrem XChaCha20-Poly1305, czyli algorytmem AEAD (szyfrowanie uwierzytelnione z danymi towarzyszącymi), a sloty kluczy przechowujące klucz główny są zabezpieczone funkcją Argon2id – funkcją skrótu hasła zaprojektowaną tak, aby była wolna i wymagała dużej ilości pamięci. Wynikają z tego dwie kwestie. Kopia pliku na skradzionym dysku, w starej kopii zapasowej lub załączona do zgłoszenia serwisowego to jedynie ciąg bajtów. Ponadto pojedynczy zmieniony bit powoduje niepowodzenie uwierzytelnienia podczas otwierania pliku, więc uszkodzenie danych staje się wyraźnym błędem, a nie błędnym wynikiem.

Wektory osadzeń (embedding vectors) również są szyfrowane, co ma większe znaczenie, niż mogłoby się wydawać. Osadzenie nie jest skrótem. Badania nad inwersją osadzeń wykazały możliwość odzyskania czytelnych fragmentów oryginalnego tekstu wyłącznie na podstawie samego wektora, więc indeks wektorowy w postaci jawnej przechowywany obok zaszyfrowanej bazy danych jest niemal równoznaczny z pozostawieniem bazy danych otwartą. Compartment nie zapisuje na dysku żadnego indeksu w postaci jawnej.

Usunięcie danych jest trwałe. Każdy rekord posiada własny klucz, a compartment forget --shred niszczy ten klucz, dzięki czemu pozostawiony tekst zaszyfrowany nie może zostać odszyfrowany przez nikogo, w tym przez użytkownika. Warto porównać to z wierszem usuniętym z pliku bazy danych, który zazwyczaj pozostaje czytelny w wolnych stronach pamięci, dopóki nie zostanie nadpisany.

Praca w trybie offline to druga połowa zabezpieczeń. Żadne dane nie są przesyłane, więc nie istnieje konto dostawcy przechowujące Twoje dane, ani klucz API, przez który mogłyby wyciec.

Czego Compartment nie chroni

Zabezpieczenie kończy się na granicy skarbca, a granica ta znajduje się bliżej, niż się wydaje.

Agent odczytuje tekst jawny. Funkcja Recall odszyfrowuje pamięć i przekazuje tekst agentowi. Jeśli agentem jest model hostowany, pamięć trafia do dostawcy modelu wewnątrz kolejnego promptu, dokładnie tak samo jak wszystko inne w oknie kontekstowym. Szyfrowanie w spoczynku chroni plik. Nie chroni jednak procesu pobierania danych. Dlatego zasady opisane w utrzymywanie sekretów poza zasięgiem agentów AI nie ulegają rozluźnieniu tylko dlatego, że magazyn jest zaszyfrowany: hasło zapisane jako pamięć to hasło, które automatycznie wklejasz do promptu.

Odblokowany skarbiec na działającej maszynie jest otwarty. Notatki dotyczące bezpieczeństwa projektu mówią o tym wprost. Gdy skarbiec jest odblokowany, klucz główny i zestaw roboczy znajdują się w pamięci RAM, Python nie gwarantuje wyczyszczenia bufora, a plik wymiany lub obraz hibernacji mogą zapisać tę pamięć na dysku. Złośliwe oprogramowanie działające na Twoim użytkowniku nigdy nie musi łamać szyfru, ponieważ może wysłać zapytanie do już odblokowanego skarbca.

Tożsamość wywołującego jest deklaratywna. Przestrzenie nazw mogą być ograniczane dla każdego wywołującego, ale nazwa wywołującego pochodzi z procesu hosta, więc host, który podaje nieprawdziwą nazwę, otrzymuje uprawnienia, o które wnioskuje. Uprawnienia przestrzeni nazw to kwestia organizacji, a nie granica bezpieczeństwa przed wrogim programem lokalnym.

Niszczenie danych nie obejmuje kopii. forget --shred niszczy klucz wewnątrz bieżącego pliku. Kopia zapasowa wykonana przed zniszczeniem nadal zawiera ten rekord i nadal otwiera się za pomocą hasła z tamtego dnia.

Słabe hasło kończy dyskusję. Argon2id sprawia, że każda próba odgadnięcia jest kosztowna. Nie chroni jednak hasła, które znajduje się na liście słów.

Instalacja Compartment z przypiętej wersji

Compartment wymaga środowiska Python 3.11 lub nowszego. Projekt rozwija się dynamicznie – do 10 sierpnia 2026 roku w serwisie PyPI opublikowano trzydzieści wersji – dlatego należy przypiąć konkretną wersję zamiast pobierać najnowszą dostępną w dniu instalacji.

python3 --version
pip install "compartment==4.6.0"
compartment --version
compartment init

compartment --version powinno wyświetlić przypisaną wersję. Jeśli powłoka zwróci compartment: command not found, katalog instalacyjny nie znajduje się w zmiennej PATH; w większości systemów jest to ~/.local/bin. pipx install compartment==4.6.0 oraz uv tool install compartment==4.6.0 pozwalają uniknąć tego problemu poprzez samodzielne zarządzanie ścieżkami.

compartment init dwukrotnie prosi o podanie hasła, nie wyświetlając żadnych znaków. To hasło jest jedynym kluczem. Projekt nie generuje żadnego hasła ani frazy odzyskiwania, co jest działaniem celowym: oprogramowanie nie przechowuje żadnych danych uwierzytelniających, których nie posiada użytkownik.

Przed podłączeniem jakichkolwiek zasobów należy zweryfikować wynik.

compartment status

Poprawnie działający skarbiec (vault) zgłasza stan odblokowany. Jeśli zgłasza stan zablokowany, należy uruchomić compartment unlock i wprowadzić hasło. Restart powoduje ponowne zablokowanie, ponieważ dane uwierzytelniające utrzymujące skarbiec w stanie otwartym zależą od sekretu generowanego przy każdym uruchomieniu systemu. W systemie macOS compartment unlock --keychain pozwala na zachowanie stanu po restarcie poprzez zapisanie tych danych w systemowym pęku kluczy (keychain).

Gdzie faktycznie znajdują się dane

Domyślny magazyn to ~/.compartment/memory.vault. Wskaż inną lokalizację za pomocą --vault PATH w dowolnym poleceniu lub używając zmiennej środowiskowej COMPARTMENT_VAULT.

Ten jeden plik stanowi całą bazę danych. Otwiera się on nagłówkiem zawierającym wersję formatu oraz sloty kluczy Argon2id, następnie zaszyfrowany ładunek, a na końcu wpisy dziennika dodawane w miarę pojawiania się nowych wspomnień. Każdy wpis dziennika jest opatrzony informacją o długości oraz sumą kontrolną CRC (cyclic redundancy check) tej długości, dzięki czemu zapis przerwany przez awarię jest rozpoznawany jako wpis ucięty, a nie odczytywany jako poprawne dane. Kompaktowanie serializuje magazyn, zapisuje plik tymczasowy, wykonuje fsync, a następnie zmienia jego nazwę na docelową, co oznacza, że czytelnik nigdy nie zobaczy częściowo zapisanego magazynu.

Użyteczny wniosek: skrypt kopii zapasowej kopiuje dokładnie jedną ścieżkę. Niewygodny wniosek: nie można przeszukiwać pliku za pomocą grep ani naprawiać go w edytorze tekstu. Jeśli potrzebujesz wspomnień, które można odczytać za pomocą cat i zatwierdzić w git, zwykłe lokalne pliki pamięci Memmy stanowią przeciwny kompromis. Oba rozwiązania są sensowne, w zależności od tego, czy obawiasz się kradzieży laptopa, czy awarii narzędzia.

compartment uninstall usuwa oprogramowanie, zachowując magazyn. Użyj flagi --purge tylko wtedy, gdy jest to zamierzone działanie.

Integracja z agentem

Jedno polecenie integruje obsługiwanego klienta.

compartment integrate --list
compartment integrate claude

W przypadku Claude Code, który tworzy wpis serwera MCP (model context protocol) oraz hook PostToolUse w ~/.claude/settings.json, wykonując najpierw kopię zapasową pliku, instaluje umiejętność /compartmentalize w ~/.claude/skills/ i dodaje zarządzany blok do ~/.claude/CLAUDE.md informujący agenta, że Compartment zastępuje używaną dotychczas pamięć opartą na plikach. Potwierdź obie części:

compartment hook status
compartment recent

Aby zarejestrować serwer ręcznie:

claude mcp add --scope user compartment -- \
    compartment --vault ~/.compartment/memory.vault --caller claude-code serve

Każdy inny host obsługujący MCP przyjmuje ten sam serwer pod własną nazwą wywołującą.

{ "mcpServers": { "compartment": {
    "command": "compartment",
    "args": ["--vault", "/path/to/memory.vault",
             "--caller", "your-agent-name", "serve"] } } }

Nadaj każdemu hostowi inną wartość --caller. Jest to etykieta rejestrowana w dzienniku audytu oraz klucz, na podstawie którego przyznawane są uprawnienia do przestrzeni nazw, więc współdzielona nazwa czyni oba te elementy bezużytecznymi.

Jeśli Claude Code zapisywał już fakty we własnych plikach pamięci, compartment import-claude --dry-run pokaże, co zostanie przeniesione, zanim jakakolwiek operacja zostanie wykonana. Najpierw przeczytaj co Claude Code przechowuje w swoich plikach pamięci, ponieważ importowanie rocznych notatek do nowego skarbca sprawia, że magazyn pamięci zapełnia się informacjami, których nikt nie zamierzał zachowywać.

Szybkość lokalnego skarbca

Są to wartości publikowane przez projekt dla skarbca o rozmiarze osobistym. Pochodzą one z dokumentacji projektu, a nie z testów przeprowadzonych w tym środowisku.

ChartCompartment published local latency, milliseconds
The data behind this chart
[
  {
    "label": "Store one memory, end to end",
    "latency_ms": 40
  },
  {
    "label": "Embed one memory, bundled model",
    "latency_ms": 25
  },
  {
    "label": "Hybrid search, median",
    "latency_ms": 11.6
  },
  {
    "label": "Vector search at 20k records, p95",
    "latency_ms": 0.68
  }
]

Zapisanie jednego wspomnienia zajmuje według specyfikacji 40 ms, a przeszukiwanie wektorowe dla dwudziestu tysięcy rekordów trwa 0.68 ms dla 95. percentyla. Argument projektu za utrzymywaniem pamięci lokalnie opiera się na arytmetyce: pojedyncza runda sieciowa do hostowanego API pamięci często kosztuje więcej niż 11.6 ms mediany pełnego wyszukiwania hybrydowego w tym rozwiązaniu.

Dwa szczegóły konstrukcyjne wyjaśniają te wyniki wyszukiwania. Poniżej dwudziestu tysięcy rekordów Compartment porównuje zapytanie z każdym wektorem, więc odzyskiwanie danych jest z założenia dokładne, a nie przybliżone. Powyżej tej liczby system przełącza się na HNSW (hierarchical navigable small world), czyli indeks przybliżony, który poświęca niewielką część dokładności na rzecz szybkości. Skarbiec rejestruje również skrót SHA-256 modelu osadzeń (embedding model) i odmawia otwarcia w przypadku użycia innego modelu, ponieważ wektory z dwóch różnych modeli można porównać bez wystąpienia błędu, jednak zwracane wyniki są wtedy bezwartościowe.

Kopie zapasowe i plik, który otworzysz za rok

Zamknięty skarbiec to pojedynczy przenośny plik, więc jego przeniesienie jest zwykłym kopiowaniem.

compartment lock
scp ~/.compartment/memory.vault other-machine:
compartment --vault memory.vault unlock

Najpierw zamknij skarbiec. Kopiowanie w trakcie zapisu przez agenta może przechwycić wpis dziennika w połowie dopisywania. Choć ramkowanie CRC pozwala czytnikowi pominąć ten fragment końcowy, zawarta w nim pamięć zostaje utracona. compartment lock --sign pieczętuje plik manifestem Ed25519, dzięki czemu maszyna docelowa może zweryfikować integralność kopii bez posiadania hasła.

Ponieważ plik jest już zapieczętowany, zwykła pamięć masowa w chmurze jest akceptowalnym miejscem przechowywania. W tym punkcie szyfrowanie danych w spoczynku przynosi bezpośrednią korzyść: cel kopii zapasowej nigdy nie widzi zawartości pamięci.

Dwa ostrzeżenia. Niszczenie danych nie obejmuje kopii zapasowych, więc rekord zaszyfrowany i usunięty dzisiaj pozostaje czytelny w kopii z zeszłego tygodnia dla każdego, kto posiada ówczesne hasło. Ponadto compartment export --plaintext zapisuje cały skarbiec w postaci niezaszyfrowanej; jest to właściwe narzędzie do migracji na inne rozwiązanie, ale niewłaściwy plik do pozostawienia w ~/Downloads.

Przechowuj niewiele kopii i oznaczaj je datami. Magazyn pamięci staje się obciążeniem, gdy nikt go nie porządkuje, co stanowi główny argument w dlaczego nieaktualne pamięci agenta po cichu psują wyszukiwanie.

Obsługa kluczy, rotacja i drugi składnik uwierzytelniania

compartment rekey
compartment 2fa enable
compartment 2fa status

rekey zmienia hasło poprzez ponowne zaszyfrowanie klucza głównego w slocie klucza bieżącego pliku. Stare kopie zachowują poprzednie hasło, ponieważ te bajty zostały zabezpieczone przed zmianą i nic nie modyfikuje ich wstecznie. Należy również przeprowadzić rotację kopii lub zaakceptować fakt, że wycofane hasło nadal otwiera dany zasób.

2fa enable dodaje plik klucza jako drugi składnik uwierzytelniania, łączony z hasłem podczas wyprowadzania klucza, dzięki czemu oba elementy są wymagane do otwarcia sejfu. Podwaja to również liczbę rzeczy, które można utracić. Przechowuj plik klucza poza maszyną, na której znajduje się sejf.

W przypadku skryptów i CI (ciągłej integracji) hasło może być przekazywane przez zmienną środowiskową COMPARTMENT_PASSPHRASE, a unlock --passphrase-stdin odczytuje je z potoku. Należy preferować potok. Zmienna środowiskowa jest możliwa do odczytania przez inne procesy należące do tego samego użytkownika i często trafia do logów zadań.

Historia audytu jest powiązana łańcuchem skrótów, a compartment audit verify analizuje go i zgłasza pierwsze uszkodzone ogniwo. Uruchamiaj to narzędzie po każdym przywracaniu danych, ponieważ jest to moment, w którym ujawnia się cicho ucięty plik.

Co się dzieje w przypadku utraty hasła

Nic się nie dzieje i tak zostało to zaprojektowane. Nie istnieje procedura resetowania, fraza odzyskiwania ani adres, pod który można napisać, ponieważ kopia klucza nie istnieje poza pamięcią użytkownika i opcjonalnym plikiem klucza. Magazyn pozostaje plikiem zawierającym losowo wyglądające bajty.

Plan odzyskiwania nie dotyczy zatem magazynu. Dotyczy on hasła. Należy zapisać je w menedżerze haseł w dniu uruchomienia compartment init. Następnie należy je przetestować: zablokować magazyn, odblokować go przy użyciu wyłącznie zapisanych danych, a po uzyskaniu dostępu pozwolić agentowi na rozpoczęcie wypełniania magazynu.

Komora lub serwer pamięci

Komora z założenia jest pojedynczą maszyną. Udostępnianie danych oznacza kopiowanie zablokowanego pliku lub eksport i import. Brak jest mechanizmu współbieżnego zapisu, więc laptop i stacja robocza wskazujące na ten sam plik będą nadpisywać swoje zmiany.

Gdy kilka maszyn wymaga dostępu do tej samej pamięci w tym samym czasie, pojawia się problem serwerowy. Własny serwer pamięci Mem0 na VPS rozwiązuje to zagadnienie: jeden punkt końcowy, wielu klientów i pamięć, która istnieje niezależnie od laptopa. Koszt tego rozwiązania należy ocenić jasno. Serwer uruchamia proces, który może odczytywać przechowywane dane, więc model zagrożeń obejmuje teraz VPS oraz każdego, kto ma dostęp do jego API.

Wybór zależy od rodzaju ryzyka, które jest najbardziej istotne. Jeśli obawiasz się kradzieży laptopa lub dostępu dostawcy do notatek, silniejszym rozwiązaniem jest zaszyfrowany lokalny magazyn. Jeśli problemem jest agent, który traci pamięć w momencie zmiany urządzenia, lepszym rozwiązaniem jest serwer.

FAQ

Co faktycznie chroni szyfrowanie Compartment?

Chroni plik. Magazyn jest zabezpieczony algorytmem XChaCha20-Poly1305, jego sloty kluczy są owinięte za pomocą Argon2id, a wektory osadzeń również podlegają szyfrowaniu. Dzięki temu skradziony dysk lub stara kopia zapasowa zawierają jedynie nieczytelne dane. Ochrona nie obejmuje odblokowanego magazynu na działającej maszynie, ponieważ klucz główny znajduje się w pamięci RAM, gdy magazyn jest otwarty. Mechanizm ten nie reguluje również działań agenta po tym, jak funkcja przywołania (recall) zwróci dane w postaci jawnej.

Czy jeśli Compartment działa w trybie offline, moje wspomnienia są prywatne względem dostawcy modelu?

Tylko do momentu ich przywołania. Przechowywanie i wyszukiwanie odbywają się bez dostępu do sieci, a model osadzeń działa lokalnie, więc w momencie zapisu żadne dane nie opuszczają maszyny. Podczas odczytu agent otrzymuje tekst jawny. Jeśli jest to model hostowany, wspomnienie trafia do promptu i jest przesyłane do dostawcy tak samo, jak reszta okna kontekstowego. Nigdy nie przechowuj danych uwierzytelniających jako wspomnień.

Co się stanie, jeśli zgubię hasło do Compartment?

Magazyn jest nieodwracalnie utracony, co jest działaniem zamierzonym. Compartment nie generuje ziarna ani frazy odzyskiwania i nie przechowuje żadnych danych uwierzytelniających poza tymi, które posiadasz, więc nie ma czego resetować. Umieść hasło w menedżerze haseł, przechowuj plik klucza 2FA na innym urządzeniu niż to, na którym znajduje się magazyn, i upewnij się, że potrafisz odblokować kopię, zanim umieścisz w magazynie jakiekolwiek istotne dane.

Czy dwie maszyny mogą współdzielić jeden magazyn Compartment?

Nie w tym samym czasie. Zablokowany magazyn to pojedynczy, przenośny plik. Zalecaną procedurą jest zablokowanie go, skopiowanie, a następnie odblokowanie na drugiej maszynie za pomocą --vault. Dostęp współbieżny nie jest obsługiwany, więc zapisywanie do jednego pliku z dwóch maszyn spowoduje utratę wspomnień. W takich przypadkach należy uruchomić serwer pamięci.

#agent-memory#compartment#encryption#offline#privacy