listConversations method

Future<List<ConversationSummary>> listConversations({
  1. int? limit,
  2. int offset = 0,
  3. String? searchQuery,
})

List all conversations, newest first.

Implementation

Future<List<ConversationSummary>> listConversations({
  int? limit,
  int offset = 0,
  String? searchQuery,
}) async {
  final dir = Directory(_sessionsDir);
  if (!await dir.exists()) return [];

  final summaries = <ConversationSummary>[];

  await for (final entity in dir.list()) {
    if (entity is Directory) {
      final summaryFile = File(p.join(entity.path, 'summary.json'));
      if (await summaryFile.exists()) {
        try {
          final content = await summaryFile.readAsString();
          final json = jsonDecode(content) as Map<String, dynamic>;
          final summary = ConversationSummary.fromJson(json);

          // Apply search filter
          if (searchQuery != null && searchQuery.isNotEmpty) {
            final q = searchQuery.toLowerCase();
            if (!(summary.title?.toLowerCase().contains(q) ?? false) &&
                !(summary.lastUserMessage?.toLowerCase().contains(q) ??
                    false)) {
              continue;
            }
          }

          summaries.add(summary);
        } catch (_) {
          // Skip corrupted summaries
        }
      }
    }
  }

  // Sort by last active time, newest first
  summaries.sort((a, b) => b.lastActiveAt.compareTo(a.lastActiveAt));

  // Apply pagination
  final start = offset.clamp(0, summaries.length);
  final end = limit != null
      ? (start + limit).clamp(0, summaries.length)
      : summaries.length;

  return summaries.sublist(start, end);
}