chatId/senderId are ALREADY stable
and resolved — the stability contract (see IProvider) guarantees the same
human yields the same senderId (and chat the same chatId) for the session,
so ConversationRuntime.keyFor({senderId}) is safe for ANY
conforming provider. Field names from/sender/body/type/isGroup are
duplicated to match RuntimeMessage/MessageContext so the object flows into
the dispatcher/runtime unchanged.
Type Parameters
Properties
ref
ref.id MUST be unique per logical inbound message within its chat and
stable across redelivery (webhook retry, reconnect replay), or '' when the
transport cannot guarantee that. Core dedupes on chatId + ref.id
(BotConfig.dedupe, on by default); see the INBOUND ID CONTRACT on IProvider.
chat
senderInfo
from
sender
chatId
senderId
isGroup
isBroadcast
fromMe
type
body
timestamp
0). Checked by assertInboundContract from @botmesh/core/testing.
mentions
quoted?
media?
location?
type: 'location' message, when the transport sends
coordinates. body stays the place name/address (or '') for text matching.