#[non_exhaustive]pub struct InboundMessageMeta {
pub kind: InboundKind,
pub sender_id: Option<String>,
pub msg_id: Option<String>,
pub inbound_ts: Option<DateTime<Utc>>,
pub reply_to_msg_id: Option<String>,
pub has_media: bool,
pub origin_session_id: Option<Uuid>,
}Expand description
Per-turn metadata about the inbound message that triggered the agent turn.
Stamped on every tool call dispatched to a stdio
extension or an MCP server (under
params._meta.nexo.inbound). All fields except kind are
optional; consumers must tolerate absence and branch
gracefully.
§Example — external user message
use nexo_tool_meta::{InboundKind, InboundMessageMeta};
let meta = InboundMessageMeta::external_user("+5491100", "wa.ABCD1234");
assert_eq!(meta.kind, InboundKind::ExternalUser);
assert_eq!(meta.sender_id.as_deref(), Some("+5491100"));
assert_eq!(meta.msg_id.as_deref(), Some("wa.ABCD1234"));§Example — internal system tick
use nexo_tool_meta::{InboundKind, InboundMessageMeta};
let meta = InboundMessageMeta::internal_system();
assert_eq!(meta.kind, InboundKind::InternalSystem);
assert!(meta.sender_id.is_none());
assert!(meta.msg_id.is_none());Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.kind: InboundKindOrigin discriminator. Always present when the bucket is.
sender_id: Option<String>Provider-native sender id (E.164 phone, telegram_user_id,
RFC822 from-address, slack U-id, …). None for kinds
other than ExternalUser and for paths where the provider
does not expose a sender id (e.g. webhook with no auth).
msg_id: Option<String>Provider-native message id (single canonical, no shortened
alias). Used for idempotency, dedupe, and as the
reply_to_msg_id target on subsequent turns. When a
debounce window collapses several inbound messages into a
single turn, this carries the id of the first message
in the batch.
inbound_ts: Option<DateTime<Utc>>Inbound timestamp in UTC. Wire shape: RFC3339 string via
chrono’s serde adapter. Producers must clamp wildly-skewed
provider timestamps to now() before emitting.
reply_to_msg_id: Option<String>Provider-native id of the message this one replies to.
None when the inbound is not a reply.
has_media: booltrue when the inbound carries non-text media
(image/audio/video/file/sticker). Microapps gate
media-aware tools on this; the actual bytes/URLs live in
arguments, not in _meta.
origin_session_id: Option<Uuid>Origin session id when kind == InterSession (delegation
receive). None otherwise.
Implementations§
Source§impl InboundMessageMeta
impl InboundMessageMeta
Sourcepub fn external_user(
sender_id: impl Into<String>,
msg_id: impl Into<String>,
) -> Self
pub fn external_user( sender_id: impl Into<String>, msg_id: impl Into<String>, ) -> Self
Build the minimum meta for an external user message (channel plugin / webhook / MCP-channel inbound).
Sourcepub fn internal_system() -> Self
pub fn internal_system() -> Self
Build the meta for a heartbeat / scheduler tick or a
yaml-declared internal_system event-subscriber binding.
Sourcepub fn inter_session(origin_session_id: Uuid) -> Self
pub fn inter_session(origin_session_id: Uuid) -> Self
Build the meta for an inter-agent delegation receive.
origin_session_id is required — None would be
indistinguishable from internal_system.
Sourcepub fn with_reply_to(self, reply_to_msg_id: impl Into<String>) -> Self
pub fn with_reply_to(self, reply_to_msg_id: impl Into<String>) -> Self
Builder: layer the reply-to message id.
Sourcepub fn with_media(self) -> Self
pub fn with_media(self) -> Self
Builder: flag that the inbound carries non-text media.
Trait Implementations§
Source§impl Clone for InboundMessageMeta
impl Clone for InboundMessageMeta
Source§fn clone(&self) -> InboundMessageMeta
fn clone(&self) -> InboundMessageMeta
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for InboundMessageMeta
impl Debug for InboundMessageMeta
Source§impl<'de> Deserialize<'de> for InboundMessageMeta
impl<'de> Deserialize<'de> for InboundMessageMeta
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl PartialEq for InboundMessageMeta
impl PartialEq for InboundMessageMeta
Source§fn eq(&self, other: &InboundMessageMeta) -> bool
fn eq(&self, other: &InboundMessageMeta) -> bool
self and other values to be equal, and is used by ==.Source§impl Serialize for InboundMessageMeta
impl Serialize for InboundMessageMeta
Source§impl TS for InboundMessageMeta
impl TS for InboundMessageMeta
Source§type WithoutGenerics = InboundMessageMeta
type WithoutGenerics = InboundMessageMeta
WithoutGenerics should just be Self.
If the type does have generic parameters, then all generic parameters must be replaced with
a dummy type, e.g ts_rs::Dummy or (). The only requirement for these dummy types is that
EXPORT_TO must be None. Read moreSource§type OptionInnerType = InboundMessageMeta
type OptionInnerType = InboundMessageMeta
std::option::Option<T>, then this associated type is set to T.
All other implementations of TS should set this type to Self instead.Source§fn docs() -> Option<String>
fn docs() -> Option<String>
TS is derived, docs are
automatically read from your doc comments or #[doc = ".."] attributesSource§fn decl_concrete(cfg: &Config) -> String
fn decl_concrete(cfg: &Config) -> String
TS::decl().
If this type is not generic, then this function is equivalent to TS::decl().Source§fn decl(cfg: &Config) -> String
fn decl(cfg: &Config) -> String
type User = { user_id: number, ... }.
This function will panic if the type has no declaration. Read moreSource§fn inline(cfg: &Config) -> String
fn inline(cfg: &Config) -> String
{ user_id: number }.
This function will panic if the type cannot be inlined.Source§fn inline_flattened(cfg: &Config) -> String
fn inline_flattened(cfg: &Config) -> String
Source§fn visit_generics(v: &mut impl TypeVisitor)where
Self: 'static,
fn visit_generics(v: &mut impl TypeVisitor)where
Self: 'static,
Source§fn output_path() -> Option<PathBuf>
fn output_path() -> Option<PathBuf>
T should be exported, relative to the output directory.
The returned path does not include any base directory. Read moreSource§fn visit_dependencies(v: &mut impl TypeVisitor)where
Self: 'static,
fn visit_dependencies(v: &mut impl TypeVisitor)where
Self: 'static,
Source§fn dependencies(cfg: &Config) -> Vec<Dependency>where
Self: 'static,
fn dependencies(cfg: &Config) -> Vec<Dependency>where
Self: 'static,
Source§fn export(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
fn export(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
TS::export_all. Read moreSource§fn export_all(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
fn export_all(cfg: &Config) -> Result<(), ExportError>where
Self: 'static,
TS::export. Read more