From 16fb2e2c95da9845fb4b51db073d54541a6c6289 Mon Sep 17 00:00:00 2001 From: ZanzyTHEbar Date: Wed, 18 Feb 2026 13:08:50 +0000 Subject: [PATCH] feat(memory): add Sync lifecycle method and graceful shutdown sync MemoryStore.Sync() delegates to underlying replica syncer if available. Agent loop now syncs memory before closing on shutdown, preventing data loss for Turso embedded replicas. --- pkg/agent/loop.go | 4 ++++ pkg/memory/store/memory_store.go | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/pkg/agent/loop.go b/pkg/agent/loop.go index bfa846711..c512f492e 100644 --- a/pkg/agent/loop.go +++ b/pkg/agent/loop.go @@ -274,6 +274,10 @@ func (al *AgentLoop) Run(ctx context.Context) error { func (al *AgentLoop) Stop() { al.running.Store(false) if al.memoryStore != nil { + if err := al.memoryStore.Sync(); err != nil { + logger.WarnCF("agent", "Failed to sync memory before shutdown", + map[string]interface{}{"error": err.Error()}) + } al.memoryStore.Close() } } diff --git a/pkg/memory/store/memory_store.go b/pkg/memory/store/memory_store.go index 32d6fec98..66d4a2767 100644 --- a/pkg/memory/store/memory_store.go +++ b/pkg/memory/store/memory_store.go @@ -500,6 +500,16 @@ func (m *MemoryStore) OffloadToolResult(ctx context.Context, toolName, content, // --- Lifecycle --- +// Sync flushes pending writes to the remote replica (Turso). +// No-op if the underlying delegate doesn't support replication. +func (m *MemoryStore) Sync() error { + type syncer interface{ Sync() error } + if s, ok := m.delegate.(syncer); ok { + return s.Sync() + } + return nil +} + func (m *MemoryStore) Close() error { return m.delegate.Close() }