# core:model

All `@Serializable` data classes -- domain models, DTOs, request/response wrappers. This is the shared contract between network, data, and feature modules.

## What This Module Provides

- **Domain models**: `User`, `Conversation`, `Message`, `MessageContentPart`, `Agent`, `Preset`, `Prompt`, `PromptGroup`, `ConversationTag`, `SharedLink`, `FileObject`, `Balance`, `StartupConfig`, `ModelSpec`, `ServerConnection`
- **Enums**: `EModelEndpoint`, `ContentType`, `StepType`, `ToolCallType`, `FeedbackRating`, `Provider`
- **StreamEvent sealed hierarchy**: `ContentDelta`, `ToolCallStart`, `ToolCallComplete`, `ThinkingDelta`, `Final`, `Sync`, `Error`, `Created`, `Step`, `AttachmentCreated`
- **Request/response wrappers**: `LoginRequest`, `LoginResponse`, `RegisterRequest`, `ChatRequest`, `ConvoUpdateBody`, `ForkConvoRequest`, etc.

## Key Patterns

- **`arg` wrapper for mutation endpoints**: The backend reads `req.body.arg` on conversation update/delete/archive. Request bodies use: `{ "arg": { "conversationId": "...", "title": "..." } }`. See `ConvoUpdateBody` / `ConvoDeleteBody`.
- **Nullable fields with defaults**: Most fields are nullable with `= null` defaults. The backend schema is loose (Mongoose + Zod). Always use `@SerialName` when the JSON key differs from Kotlin naming.
- **`ignoreUnknownKeys = true`**: The server may add new fields at any time. Never assume the response shape is exhaustive.

## Directory Convention

- Top-level: domain model classes (Conversation.kt, Message.kt, etc.)
- `request/`: Request body data classes (LoginRequest, ChatRequest, etc.)
- `response/`: API response wrappers (LoginResponse, ConversationListResponse, etc.)

## Rules

- **Pure Kotlin only.** NO Android framework dependencies. No `Context`, no `Parcelable`.
- Only dependency beyond `:core:common` is `kotlinx-serialization-json`.
- Use `@Serializable` on every data class. Use `@SerialName` for snake_case JSON fields.
- Use `JsonObject` / `JsonElement` for truly polymorphic/mixed-type fields (e.g., `Agent.avatar`, `Feedback.tag`).
- Convention plugins: `librechat.mobile.library` + `librechat.kotlin.serialization`.
