read marks the conversation as read up to target, surfacing a
read receipt to the sender where the platform supports one.
space.send(read(message)) is the canonical outbound API;
message.read() and space.read(message) are sugar that delegate here.
Reads are fire-and-forget — providers handle them inside their send
action and the resolved value is undefined.
Granularity is per-platform:
- WhatsApp Business: per-message receipt via
markRead(target.id), which also marks every earlier message in the conversation as read. - iMessage (remote): chat-level
chats.markRead(chatGuid)—targetonly identifies the chat, and every unread message in it is marked read. Local mode rejects withUnsupportedError(warned and skipped). - Telegram / Slack: silently no-op. Neither surfaces read state for bot
conversations (Telegram bot chats are effectively auto-read), so the
signal is vacuously satisfied — same best-effort contract as
typing.