# feature:conversations

## Screen
`ConversationListScreen` -- the drawer content showing all conversations. Sealed interface: `ConversationsRoute : NavKey` with routes `Conversations` and `ArchivedConversations` (both `@Serializable` data objects).

## Pagination
- Cursor-based via `ConversationRepository.loadNextPage(cursor, tags)`
- `nextCursor: String?` in UI state; null = no more pages
- `loadMore()` called when LazyColumn nears the end
- Pull-to-refresh via `refresh()` which resets to first page

## Date Grouping
- `DateGroupHeader` renders section labels: Today, Yesterday, Previous 7 Days, Previous 30 Days, month-year
- Conversations are flattened into a sealed `ConversationListItem` (DateHeader | ConvoItem)

## Search
- `ConversationSearchBar` with 500ms debounce (via coroutine delay)
- `onSearchQueryChanged()` cancels previous search job, waits 500ms, calls `SearchRepository.search()`
- When search is active, normal pagination is disabled (`hasMore = false`)
- Clear search restores normal conversation list

## Tags
- `TagFilterBar` displays `FilterChip` per tag (multi-select toggle)
- `TagPicker` for assigning tags to a conversation
- Tags fetched via `TagRepository.getTags()`, hidden if `count == 0`
- `toggleTag()` / `clearTagFilter()` reload conversations with new filter

## CRUD Actions (via `ConversationActions` component)
| Action | API | Notes |
|--------|-----|-------|
| Rename | `POST /api/convos/update` | Inline rename, max 100 chars |
| Archive | `POST /api/convos/archive` | `{ conversationId, isArchived: true }` |
| Delete | `DELETE /api/convos` | Confirmation dialog required |
| Duplicate | `POST /api/convos/duplicate` | Navigates to new conversation |
| Fork | `POST /api/convos/fork` | From message context menu in chat, not here |
| Share | `POST /api/share` | Only if `sharedLinksEnabled` in server config |

## Export / Import
- `ConversationExporter` supports `ExportFormat.JSON` and `ExportFormat.MARKDOWN`
- Export is client-side: fetches messages, serializes locally, emits `ExportReady` event
- `ExportFormatPicker` component for format selection
- `ConversationImporter` parses JSON (LibreChat/ChatGPT format) via `POST /api/convos/import`
- File I/O uses SAF (Storage Access Framework)

## Events
`ConversationListEvent` sealed interface for one-shot UI events: `ShareLinkCopied`, `NavigateToConversation`, `ShowError`, `ExportReady`, `ImportSuccess`
