# Shared Kernel

Types and constants that are **intentionally shared** across multiple bounded
contexts (domains). Changing anything here affects every consumer, so changes
require coordination.

## Files

| File | Contents |
|---|---|
| `user.models.ts` | `User`, `UserStatus`, `UserRole`, `RoomMember` |
| `room.models.ts` | `Room`, `RoomSettings`, `RoomPermissions`, `Channel`, `ChannelType` |
| `message.models.ts` | `Message`, `Reaction`, `DELETED_MESSAGE_CONTENT` |
| `moderation.models.ts` | `BanEntry` |
| `voice-state.models.ts` | `VoiceState`, `ScreenShareState` |
| `chat-events.ts` | `ChatEventType`, `ChatEvent`, `ChatInventoryItem` |
| `direct-message-contracts.ts` | `DirectMessage`, delivery status, P2P DM event payloads |
| `media-preferences.ts` | `LatencyProfile`, `ScreenShareQuality`, quality presets |
| `signaling-contracts.ts` | `SignalingMessage`, `SignalingMessageType` |
| `attachment-contracts.ts` | `ChatAttachmentAnnouncement`, `ChatAttachmentMeta` |

## When to add here vs. in a domain

Add to shared-kernel when a type is referenced by **two or more domains** or by
**infrastructure + store**. If a type is only used inside one domain, keep it
in that domain's `domain/` folder.

## Backward compatibility

`core/models/index.ts` re-exports everything from this folder so existing
`import { X } from 'core/models'` lines keep working. **New code** should
import directly from `shared-kernel/` for clarity.
