MemoDokümantasyon
TR

Veri Katmanı ve Kalıcılık

Tüm Memo verileri diskinizde yaşar — bulut senkronizasyonunu siz etkinleştirmedikçe hiçbir şey uzaktan depolanmaz. Veri katmanı, yapılandırılmış veriler için SQLite ve yapılandırma için JSON/YAML kullanır.

Veri Dizin Yapısı

data/
├── memory/
│   └── memory.db              # RAG vektör deposu (SQLite + sqlite-vec + FTS5)
├── sessions/
│   └── sessions.db            # Sohbet geçmişi, oturum üst verisi
├── models/
│   ├── downloaded/            # GGUF model dosyaları
│   └── model-cache.json       # İndirme kataloğu önbelleği
├── providers.json             # Harici sağlayıcı yapılandırmaları (API anahtarları şifreli)
├── orchestra.json             # Orkestra modu rol atamaları
├── permissions.json           # Ajan aracı izin politikaları
├── calendar/
│   └── calendar.db            # Etkinlikler, hatırlatıcılar, tekrarlama kuralları
├── whatsapp/
│   ├── whatsapp.db            # Mesajlar, kişiler, sohbet üst verisi
│   └── media/                 # Önbelleğe alınmış profil fotoğrafları ve medya
├── mood/
│   └── mood.db                # Duygu motoru durumu
├── proactive/
│   └── proactive.db           # Niyet geçmişi, alışkanlıklar, öğrenme durumu
├── routines/                  # Rutin tanımları (JSON) — zamanlama, prompt/agent yükü, saat dilimi offset'i
├── tasklists/                 # Otonom görev döngüsü listeleri (JSON)
├── stats/                     # Kalıcı LLM kullanım olayları (Ayarlar → İstatistikler)
├── agent-backups/             # Ajanın dosya-düzenleme güvenlik anlık görüntüleri
├── profile/                   # Öğrenilen zaman örüntüleri, bekleyen proaktif öneriler
├── permissions.json           # Ajan araç izin politikaları
├── skills/                    # Yüklenmiş beceri SKILL.md dosyaları
│   └── <beceri-adı>/
│       └── SKILL.md
├── cloudsync/
│   └── sync-state.json        # Son senkronizasyon zaman damgası, dosya hash'leri
├── config/
│   └── config.yaml            # Çalışma zamanı yapılandırması (config/ kopyası)
├── identity/
│   ├── system-prompt.yaml     # Aktif kişilik tanımı
│   └── incognito-prompt.yaml  # Gizli mod kişiliği
├── machine.key                # Donanımdan türetilmiş şifreleme anahtarı (0600)
└── backups/                   # Manuel .memo arşiv dışa aktarımları


v3.3.3 öncesinde .memo yedeklemesi yalnızca sessions/, providers.json, orchestra.json, memory/, whatsapp/, mood/ dizinlerini içeriyordu — takvim, profile/, routines/, tasklists/, stats/, agent-backups/, skills/, permissions.json ve en kritik olarak machine.key (providers.json'daki şifreli API anahtarlarını çözen anahtar) yedeğe hiç girmiyordu. Artık hepsi dahil — models/ hariç, o zaten ayrı bir seçenekle isteğe bağlı. Bilinçli olarak hâlâ hariç: cihaza özel Drive senkron imleci (sync_token.json), makineye özel tsnet kimliği ve yedeklemenin kendi anlık görüntü dizini (backups/).

Depolama Motorları

SQLite + sqlite-vec

Tüm ilişkisel ve vektör verileri için birincil depolama motoru:

-- Hafıza deposu şeması
CREATE TABLE memories (
    id TEXT PRIMARY KEY,
    content TEXT NOT NULL,
    timestamp DATETIME NOT NULL,
    importance INTEGER DEFAULT 1,
    retrieval_count INTEGER DEFAULT 0,
    pinned INTEGER DEFAULT 0,
    soft_deleted INTEGER DEFAULT 0,
    deleted_at DATETIME
);

CREATE VIRTUAL TABLE memory_vec USING vec0(
    embedding FLOAT[768],
    chunk TEXT
);

CREATE VIRTUAL TABLE memory_fts USING fts5(
    content,
    tokenize='unicode61'
);

vec0, nicemleme ile yaklaşık en yakın komşu (ANN) araması için sqlite-vec'in sanal tablosudur. Kosinüs uzaklığı ile O(log n) vektör benzerlik sorguları sağlar.

FTS5, doğru Unicode kelime sınırı işleme için unicode61 belirteçleyicisi ile anahtar kelime düzeyinde arama sağlar.

JSON Dosyaları

Yapılandırma ve hafif durum:

// providers.json
{
  "providers": {
    "openai": {
      "enabled": true,
      "api_key_encrypted": "AES256:GCM:base64...",
      "model": "gpt-4o",
      "context_window": 128000,
      "priority": 1
    },
    "claude": {
      "enabled": true,
      "api_key_encrypted": "AES256:GCM:base64...",
      "model": "claude-sonnet-4-20250514",
      "context_window": 200000,
      "priority": 2
    }
  }
}

API anahtarları, data/machine.key dosyasından türetilen bir anahtar kullanılarak AES-256-GCM ile şifrelenir:

// internal/encryption/crypto.go
func Encrypt(plaintext []byte, key []byte) ([]byte, error) {
    // Rastgele 12 bayt nonce ile AES-256-GCM
    // Çıktı formatı: nonce || ciphertext || tag
}

func Decrypt(ciphertext []byte, key []byte) ([]byte, error) {
    // Tag'i doğrula, yerinde şifre çöz
}

YAML Yapılandırması

# config/config.yaml
user_name: "Buğra"
assistant_name: "Memo"
language: "tr"
theme: "pewter"
memory_enabled: true
web_search_mode: true
embedding_model: "nomic-embed-text-v1.5"
max_memory_results: 10
cloud_sync_interval: 50
reminder_lead_time_minutes: 15

Yapılandırma yazmaları, çökme durumunda bozulmayı önlemek için atomik geçici dosya + yeniden adlandırma kullanır.

RAM Yönetimi

Hafıza Deposu İndeksleme

RAG hafıza deposu tembel yükleme yaklaşımı kullanır:

  1. Başlangıçta RAM'e yalnızca üst veri (ID'ler, zaman damgaları, önem) yüklenir
  2. Gömme vektörleri diskte kalır ve sqlite-vec'in indekslenmiş sanal tablosu aracılığıyla aranır
  3. Tam metin araması tamamen SQLite'ın FTS5 motoru içinde çalışır
  4. Yalnızca en iyi N sonuç (varsayılan 10) bellekte tam olarak gerçekleştirilir

10.000 girişlik bir hafıza tabanı yaklaşık olarak şunu tüketir:

  • Disk üzerinde ~20 MB (gömmeler, metin, üst veri)
  • RAM'de ~2 MB (indeks yapıları, üst veri önbelleği)

Oturum Yönetimi

Sohbet oturumları sayfalandırılmıştır. Sadece aktif oturumun son mesajları (son 100) bellekte tutulur. Eski mesajlar kaydırma sırasında SQLite'tan isteğe bağlı olarak getirilir.

Model Depolama

GGUF model dosyaları diskte normal dosyalar olarak saklanır. Çıkarım sırasında llama.cpp tarafından bellek eşlemeli olarak kullanılırlar — yalnızca aktif olarak hesaplanan katmanlar RAM'i işgal eder. GPU'ya yüklenen katmanlar VRAM'de bulunur.

Veri Bütünlüğü

Atomik Yazmalar

Tüm yapılandırma ve veri dosyaları atomik yazma işlemleri kullanır:

// Kod tabanında kullanılan desen
func AtomicWrite(path string, data []byte) error {
    tmp := path + ".tmp"
    if err := os.WriteFile(tmp, data, 0600); err != nil {
        return err
    }
    return os.Rename(tmp, path)
}

WAL Checkpoint

Dışa aktarmalar ve bulut senkronizasyonundan önce, bir WAL checkpoint bekleyen yazmaları temizler:

db.Exec("PRAGMA wal_checkpoint(TRUNCATE)")

İçe Aktarma Güvenliği

Hafıza içe aktarmaları geçici dosya + atomik yeniden adlandırma kullanır. İçe aktarma sırasında orijinal veritabanı asla yerinde değiştirilmez. Bu, içe aktarma kesintiye uğrarsa bozulmayı önler.

Fabrika Ayarlarına Döndürme Koruması

data/machine.key, veri silme yolunun dışında saklanır. Fabrika ayarlarına döndürme tüm kullanıcı verilerini temizler ancak şifreleme anahtarını korur — bulut yedekleme erişiminin kalıcı olarak kaybedilmesini önler.

Yazma Serileştirme

SQLite yazmaları kanal tabanlı bir kuyruk aracılığıyla serileştirilir:

// internal/database/db.go
type DB struct {
    Write chan func(*sql.DB) // Serileştirilmiş yazma kuyruğu
    Read  *sql.DB            // Eşzamanlı okumalar
}

func (db *DB) Init(path string) error {
    db.Read, _ = sql.Open("sqlite3", path)
    db.Read.Exec("PRAGMA journal_mode=WAL")
    db.Write = make(chan func(*sql.DB), 100)

    go func() {
        for fn := range db.Write {
            fn(db.Read)
        }
    }()
}

Bu, hiçbir iki goroutine'in aynı anda yazma yapmamasını sağlar, eşzamanlı okumalara izin verirken database is locked hatalarını önler.

Yedekleme ve Dışa Aktarma

.memo Arşiv Formatı

.memo dışa aktarımı şunları içeren bir ZIP dosyasıdır:

export.memo
├── memory.db          # RAG vektör deposu
├── sessions.db        # Sohbet geçmişi
├── calendar.db        # Etkinlikler ve hatırlatıcılar
├── whatsapp.db        # Mesajlar ve kişiler
├── mood.db            # Duygu motoru durumu
├── proactive.db       # Öğrenme geçmişi
├── profile/           # Öğrenilen zaman örüntüleri, bekleyen öneriler
├── routines/          # Rutin tanımları
├── tasklists/         # Görev döngüsü listeleri
├── stats/             # Kullanım istatistikleri
├── agent-backups/     # Ajan dosya-düzenleme güvenlik anlık görüntüleri
├── skills/            # Yüklenmiş beceriler
├── providers.json.enc # Şifreli sağlayıcı yapılandırmaları
├── orchestra.json     # Orkestra yapılandırması
├── permissions.json   # Ajan izinleri
├── config.yaml        # Uygulama yapılandırması
├── system-prompt.yaml # Kimlik tanımı
└── machine.key        # Şifreleme anahtarı — v3.3.3'ten itibaren her zaman dahil

Google Drive Senkronizasyonu

Bulut yedeklemeleri, kullanıcı parolasından PBKDF2 (600.000 yineleme) anahtar türetme kullanarak her dosyayı AES-256-GCM ile ayrı ayrı şifreler. Parola olmadan, anahtarsız otomatik şifreleme için makine anahtarı kullanılır.

Şifreli bloklar Google Drive'da gizli bir memo-backup klasörüne yüklenir. Senkronizasyon durum dosyası (sync-state.json), hangi dosyaların senkronize edildiğini ve gereksiz yüklemeleri önlemek için sağlama toplamlarını takip eder.