LoadSessionV2 carrega uma sessão completa com suporte a formato v2 e legacy.
(name string)
| 162 | |
| 163 | // LoadSessionV2 carrega uma sessão completa com suporte a formato v2 e legacy. |
| 164 | func (sm *SessionManager) LoadSessionV2(name string) (*SessionData, error) { |
| 165 | filePath := sm.getSessionPath(name) |
| 166 | if _, err := os.Stat(filePath); os.IsNotExist(err) { |
| 167 | return nil, fmt.Errorf("sessão '%s' não encontrada", name) |
| 168 | } |
| 169 | |
| 170 | data, err := os.ReadFile(filePath) //#nosec G304 -- path supplied by user/agent through validated tool surface (boundary check upstream) |
| 171 | if err != nil { |
| 172 | sm.logger.Error("Erro ao ler o arquivo da sessão", zap.String("path", filePath), zap.Error(err)) |
| 173 | return nil, fmt.Errorf("erro ao ler o arquivo da sessão: %w", err) |
| 174 | } |
| 175 | |
| 176 | // Try v2 format first |
| 177 | var sd SessionData |
| 178 | if err := json.Unmarshal(data, &sd); err == nil && sd.Version >= 2 { |
| 179 | sm.logger.Info("Sessão v2 carregada com sucesso", zap.String("session", name)) |
| 180 | return &sd, nil |
| 181 | } |
| 182 | |
| 183 | // Fallback: legacy format (plain []models.Message) |
| 184 | var legacy []models.Message |
| 185 | if err := json.Unmarshal(data, &legacy); err != nil { |
| 186 | sm.logger.Error("Erro ao desserializar a sessão", zap.String("session", name), zap.Error(err)) |
| 187 | return nil, fmt.Errorf("arquivo de sessão corrompido: %w", err) |
| 188 | } |
| 189 | |
| 190 | sm.logger.Info("Sessão legacy carregada com sucesso (migrada para v2)", zap.String("session", name)) |
| 191 | return &SessionData{ |
| 192 | Version: 2, |
| 193 | ChatHistory: legacy, |
| 194 | }, nil |
| 195 | } |
| 196 | |
| 197 | // ListSessions lista todas as sessões salvas. |
| 198 | func (sm *SessionManager) ListSessions() ([]string, error) { |
no test coverage detected