fix(session): address review regressions

This commit is contained in:
Hoshina
2026-04-13 22:51:44 +08:00
parent 0c6ad33a9c
commit c5c5ea22d6
7 changed files with 119 additions and 64 deletions
+35 -2
View File
@@ -374,6 +374,11 @@ func (s *JSONLStore) promoteAliasHistoryLocked(
return false, nil
}
previousJSONL, hadPreviousJSONL, err := s.readRawJSONL(sessionKey)
if err != nil {
return false, err
}
now := time.Now()
if canonicalMeta.CreatedAt.IsZero() {
canonicalMeta.CreatedAt = now
@@ -387,10 +392,13 @@ func (s *JSONLStore) promoteAliasHistoryLocked(
canonicalMeta.Summary = aliasSummary
}
if err := s.writeMeta(sessionKey, canonicalMeta); err != nil {
if err := s.rewriteJSONL(sessionKey, aliasHistory); err != nil {
return false, err
}
if err := s.rewriteJSONL(sessionKey, aliasHistory); err != nil {
if err := s.writeMeta(sessionKey, canonicalMeta); err != nil {
if rollbackErr := s.restoreRawJSONL(sessionKey, previousJSONL, hadPreviousJSONL); rollbackErr != nil {
return false, fmt.Errorf("memory: write promoted meta: %w (rollback jsonl: %v)", err, rollbackErr)
}
return false, err
}
return true, nil
@@ -410,6 +418,31 @@ func (s *JSONLStore) sessionHasVisibleContentLocked(sessionKey string, meta Sess
return len(history) > 0, nil
}
func (s *JSONLStore) readRawJSONL(sessionKey string) ([]byte, bool, error) {
data, err := os.ReadFile(s.jsonlPath(sessionKey))
if os.IsNotExist(err) {
return nil, false, nil
}
if err != nil {
return nil, false, fmt.Errorf("memory: read jsonl: %w", err)
}
return data, true, nil
}
func (s *JSONLStore) restoreRawJSONL(sessionKey string, data []byte, existed bool) error {
path := s.jsonlPath(sessionKey)
if !existed {
if err := os.Remove(path); err != nil && !os.IsNotExist(err) {
return fmt.Errorf("memory: remove jsonl rollback: %w", err)
}
return nil
}
if err := fileutil.WriteFileAtomic(path, data, 0o644); err != nil {
return fmt.Errorf("memory: restore jsonl rollback: %w", err)
}
return nil
}
// readMessages reads valid JSON lines from a .jsonl file, skipping
// the first `skip` lines without unmarshaling them. This avoids the
// cost of json.Unmarshal on logically truncated messages.