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.
Flattened, keyFor-ready aliases (identical values to chat.id / senderInfo.id).
When the message was sent, in epoch milliseconds (every provider: transports that
report seconds multiply by 1000; one that reports none uses the receive time, never
0). Checked by assertInboundContract from @botmesh/core/testing.
OptionalquotedOptionalmediaOptionallocationThe shared location of a type: 'location' message, when the transport sends
coordinates. body stays the place name/address (or '') for text matching.
Provider-native payload (proto.IWebMessageInfo, webhook JSON, gateway obj).
The single normalized inbound message.
chatId/senderIdare ALREADY stable and resolved — the stability contract (seeIProvider) guarantees the same human yields the samesenderId(and chat the samechatId) for the session, soConversationRuntime.keyFor(${chatId}:${senderId})is safe for ANY conforming provider. Field namesfrom/sender/body/type/isGroupare duplicated to matchRuntimeMessage/MessageContextso the object flows into the dispatcher/runtime unchanged.