package session import ( "context" "log" "github.com/sipeed/picoclaw/pkg/memory" "github.com/sipeed/picoclaw/pkg/providers" ) // JSONLBackend adapts a memory.Store into the SessionStore interface. // Write errors are logged rather than returned, matching the fire-and-forget // contract of SessionManager that the agent loop relies on. type JSONLBackend struct { store memory.Store } // NewJSONLBackend wraps a memory.Store for use as a SessionStore. func NewJSONLBackend(store memory.Store) *JSONLBackend { return &JSONLBackend{store: store} } func (b *JSONLBackend) AddMessage(sessionKey, role, content string) { if err := b.store.AddMessage(context.Background(), sessionKey, role, content); err != nil { log.Printf("session: add message: %v", err) } } func (b *JSONLBackend) AddFullMessage(sessionKey string, msg providers.Message) { if err := b.store.AddFullMessage(context.Background(), sessionKey, msg); err != nil { log.Printf("session: add full message: %v", err) } } func (b *JSONLBackend) GetHistory(key string) []providers.Message { msgs, err := b.store.GetHistory(context.Background(), key) if err != nil { log.Printf("session: get history: %v", err) return []providers.Message{} } return msgs } func (b *JSONLBackend) GetSummary(key string) string { summary, err := b.store.GetSummary(context.Background(), key) if err != nil { log.Printf("session: get summary: %v", err) return "" } return summary } func (b *JSONLBackend) SetSummary(key, summary string) { if err := b.store.SetSummary(context.Background(), key, summary); err != nil { log.Printf("session: set summary: %v", err) } } func (b *JSONLBackend) SetHistory(key string, history []providers.Message) { if err := b.store.SetHistory(context.Background(), key, history); err != nil { log.Printf("session: set history: %v", err) } } func (b *JSONLBackend) TruncateHistory(key string, keepLast int) { if err := b.store.TruncateHistory(context.Background(), key, keepLast); err != nil { log.Printf("session: truncate history: %v", err) } } // Save persists session state. Since the JSONL store fsyncs every write // immediately, the data is already durable. Save runs compaction to reclaim // space from logically truncated messages (no-op when there are none). func (b *JSONLBackend) Save(key string) error { return b.store.Compact(context.Background(), key) } // Close releases resources held by the underlying store. func (b *JSONLBackend) Close() error { return b.store.Close() }