59 lines
1.3 KiB
Go
59 lines
1.3 KiB
Go
package session
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"sort"
|
|
|
|
"agentu/internal/safeio"
|
|
)
|
|
|
|
const sessionIndexFile = "index.json"
|
|
|
|
type sessionIndex struct {
|
|
Sessions []SessionMeta `json:"sessions"`
|
|
}
|
|
|
|
func metaFromSession(sess *Session) SessionMeta {
|
|
return SessionMeta{
|
|
ID: sess.ID,
|
|
Name: sess.Name,
|
|
CreatedAt: sess.CreatedAt,
|
|
UpdatedAt: sess.UpdatedAt,
|
|
Provider: sess.Provider,
|
|
Model: sess.Model,
|
|
MessageCount: len(sess.Messages),
|
|
}
|
|
}
|
|
|
|
func (s *Store) saveIndexFromSessions(metas []SessionMeta) error {
|
|
sort.Slice(metas, func(i, j int) bool {
|
|
return metas[i].UpdatedAt.After(metas[j].UpdatedAt)
|
|
})
|
|
idx := sessionIndex{Sessions: metas}
|
|
data, err := json.MarshalIndent(idx, "", " ")
|
|
if err != nil {
|
|
return fmt.Errorf("marshal session index: %w", err)
|
|
}
|
|
path := filepath.Join(s.dir, sessionIndexFile)
|
|
return safeio.AtomicWriteFile(path, data, 0o644)
|
|
}
|
|
|
|
func (s *Store) loadIndex() ([]SessionMeta, error) {
|
|
path := filepath.Join(s.dir, sessionIndexFile)
|
|
data, err := os.ReadFile(path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var idx sessionIndex
|
|
if err := json.Unmarshal(data, &idx); err != nil {
|
|
return nil, err
|
|
}
|
|
sort.Slice(idx.Sessions, func(i, j int) bool {
|
|
return idx.Sessions[i].UpdatedAt.After(idx.Sessions[j].UpdatedAt)
|
|
})
|
|
return idx.Sessions, nil
|
|
}
|