pub struct AgentEnvelope {Show 22 fields
pub kind: AgentKind,
pub record: Option<RecordId>,
pub conversation: ConversationId,
pub source: AgentId,
pub target: Option<AgentId>,
pub cause: Option<RecordId>,
pub cause_at: Option<LogPosition>,
pub correlation: Option<CorrelationId>,
pub channel: Option<ChannelId>,
pub idempotency_key: Option<IdempotencyKey>,
pub deadline_micros: Option<u64>,
pub sequence: Option<u64>,
pub last: bool,
pub finish_reason: Option<String>,
pub task_state: Option<TaskState>,
pub operation: Option<String>,
pub tool: Option<String>,
pub usage: Option<TokenUsage>,
pub metadata: Option<BTreeMap<String, Value>>,
pub must_understand: u64,
pub body: Vec<u8>,
pub signature: Option<Signature>,
}Expand description
The AGDX envelope: one CBOR named-field decode unit per agent message.
Field semantics, the per-kind validity matrix, and the caps are enforced by
validate, and the per-kind constructors stamp the required shape. Routing
fields (conversation, target, content type) are also stamped as typed
headers so projections and plain Iggy consumers work without decoding
bodies. The envelope is the typed, versioned form of what the headers say.
metadata is the AGDX-native extension slot, distinct from headers (the
substrate and observability dictionary) and body (the content). Foreign
metadata (A2A metadata, MCP _meta) never maps into it. It tunnels whole
inside body, keeping bridge round trips byte-identical.
Fields§
§kind: AgentKind§record: Option<RecordId>Producer-assigned record identity, required on every kind except
chunk (chunks are identified by channel + sequence, saving the
id bytes and a clock-and-entropy call per token).
conversation: ConversationIdAlso the partition key.
source: AgentIdAgent-authorship claim (see the module docs).
target: Option<AgentId>Routing refinement within a shared topic. The topic itself is the
primary address. Consumer-side filtering by target is a convenience,
not a confidentiality control. The topic is the boundary.
cause: Option<RecordId>The causal parent’s record id: the identity half of the causal pointer, stable across replication.
cause_at: Option<LogPosition>The causal parent’s log position: the locator half, an O(1) dereference for raw log walkers, deployment-local.
correlation: Option<CorrelationId>Request/reply pairing. A2A task identity maps onto it.
channel: Option<ChannelId>Chunk grouping when many streams run under one correlation.
idempotency_key: Option<IdempotencyKey>§deadline_micros: Option<u64>Drop-dead time, epoch micros. On a stream-opening message it is also the reader-local abandonment bound: the producer knows its own model timeout, the consumer would be guessing.
sequence: Option<u64>Chunk ordering within a channel.
last: boolTerminal flag: the final chunk of a stream / the final task update.
false is equivalent to absence and is skipped on encode, so only true
has protocol meaning. Maps one-to-one onto A2A’s final.
finish_reason: Option<String>Why a stream or response ended (OTel finish-reason vocabulary: stop, length, content_filter, tool_call, …). A string deliberately: that vocabulary belongs to OTel and the providers, not to us.
task_state: Option<TaskState>§operation: Option<String>OTel gen_ai.operation.name value (chat, execute_tool, …). On
status it is the required discriminator (task, card, progress).
tool: Option<String>OTel gen_ai.tool.name, for tool commands and results.
usage: Option<TokenUsage>§metadata: Option<BTreeMap<String, Value>>AGDX-native scalar extension context. Never foreign metadata.
must_understand: u64Must-understand marker: a bitset of feature bits a receiver MUST
understand to process this message correctly (see features). A
receiver that sees a set bit it does not implement MUST reject or
dead-letter the message rather than mis-handle it (unmet_requirements).
0 (the default, skipped on the wire so pre-marker records stay
byte-identical) means “ignore anything you don’t understand”, the
open-world default. This lets one message demand strict handling of a new
feature without a whole-envelope version bump (a must_understand marker).
body: Vec<u8>The content, codec per the agdx.ct header. Default-empty and skipped
when empty. The validity matrix says which kinds require it.
signature: Option<Signature>A detached signature over the canonical encoding of this envelope with the
signature field absent, domain-separated by SIGNATURE_DOMAIN. Opt-in:
absent (the open-world default, skipped on the wire so an unsigned record
stays byte-identical) means an unsigned record. Verification is SDK-side
against a per-agent key registry, so the wire crate stays crypto-free. A
signature may ride any kind (no matrix row, like metadata).
Implementations§
Source§impl AgentEnvelope
impl AgentEnvelope
Sourcepub fn requiring(self, bits: u64) -> Self
pub fn requiring(self, bits: u64) -> Self
Declare that a receiver MUST understand the feature bits to process this
message. Bits a receiver lacks make it reject the message
(unmet_requirements). Absent bits are
ignore-if-unknown. Additive builder method.
Sourcepub fn unmet_requirements(&self, understood: u64) -> u64
pub fn unmet_requirements(&self, understood: u64) -> u64
The subset of this message’s must_understand
bits NOT present in the receiver’s understood set. Non-zero means the
receiver cannot safely process the message and must reject or
dead-letter it rather than mis-handle a feature it does not implement.
Sourcepub fn command(
record: RecordId,
conversation: ConversationId,
source: AgentId,
correlation: CorrelationId,
body: Vec<u8>,
) -> Self
pub fn command( record: RecordId, conversation: ConversationId, source: AgentId, correlation: CorrelationId, body: Vec<u8>, ) -> Self
A command: expects a reply or effect, so correlation is required.
Sourcepub fn response(
record: RecordId,
conversation: ConversationId,
source: AgentId,
correlation: CorrelationId,
body: Vec<u8>,
) -> Self
pub fn response( record: RecordId, conversation: ConversationId, source: AgentId, correlation: CorrelationId, body: Vec<u8>, ) -> Self
A response: the paired answer to a command (same correlation).
Sourcepub fn event(
record: RecordId,
conversation: ConversationId,
source: AgentId,
body: Vec<u8>,
) -> Self
pub fn event( record: RecordId, conversation: ConversationId, source: AgentId, body: Vec<u8>, ) -> Self
An event: expects nothing.
Sourcepub fn chunk(
conversation: ConversationId,
source: AgentId,
correlation: CorrelationId,
channel: ChannelId,
sequence: u64,
body: Vec<u8>,
) -> Self
pub fn chunk( conversation: ConversationId, source: AgentId, correlation: CorrelationId, channel: ChannelId, sequence: u64, body: Vec<u8>, ) -> Self
A chunk of the stream channel, ordered by sequence. Mark the
final one with terminal.
Sourcepub fn status(
record: RecordId,
conversation: ConversationId,
source: AgentId,
operation: impl Into<String>,
) -> Self
pub fn status( record: RecordId, conversation: ConversationId, source: AgentId, operation: impl Into<String>, ) -> Self
A status signal discriminated by operation (task, card,
progress). Task updates additionally require correlation and
task_state (use the with-setters).
Sourcepub fn error(
record: RecordId,
conversation: ConversationId,
source: AgentId,
correlation: CorrelationId,
body: Vec<u8>,
) -> Self
pub fn error( record: RecordId, conversation: ConversationId, source: AgentId, correlation: CorrelationId, body: Vec<u8>, ) -> Self
An error terminal for correlation. body is the encoded
AgentErrorBody.
Sourcepub fn with_target(self, target: AgentId) -> Self
pub fn with_target(self, target: AgentId) -> Self
Narrow delivery to one agent within a shared topic.
Sourcepub fn with_cause(self, cause: RecordId, cause_at: Option<LogPosition>) -> Self
pub fn with_cause(self, cause: RecordId, cause_at: Option<LogPosition>) -> Self
Stamp the causal parent: its record id (identity) and, when known, its log position (locator). A handler has both for free from the message it is replying to.
Sourcepub fn with_correlation(self, correlation: CorrelationId) -> Self
pub fn with_correlation(self, correlation: CorrelationId) -> Self
Pair this message with a correlation id. Required on command,
response, error, and chunk. Optional on event and non-task
status.
Sourcepub fn with_idempotency_key(self, key: IdempotencyKey) -> Self
pub fn with_idempotency_key(self, key: IdempotencyKey) -> Self
Attach a business idempotency key (commands, responses, events only).
Sourcepub fn with_deadline_micros(self, deadline_micros: u64) -> Self
pub fn with_deadline_micros(self, deadline_micros: u64) -> Self
Declare the drop-dead time (and, on a stream-opening message, the abandonment bound).
Sourcepub fn terminal(self, finish_reason: impl Into<String>) -> Self
pub fn terminal(self, finish_reason: impl Into<String>) -> Self
Mark this message terminal (last = true), with the reason the stream
or response ended.
Sourcepub fn with_task_state(self, state: TaskState) -> Self
pub fn with_task_state(self, state: TaskState) -> Self
Attach a task state. Status task updates require it. Responses and errors may carry it as the one-message terminal convenience.
Sourcepub fn with_operation(self, operation: impl Into<String>) -> Self
pub fn with_operation(self, operation: impl Into<String>) -> Self
Set the OTel operation name.
Sourcepub fn with_usage(self, usage: TokenUsage) -> Self
pub fn with_usage(self, usage: TokenUsage) -> Self
Attach token accounting (advisory).
Sourcepub fn with_metadata(
self,
key: impl Into<String>,
value: impl Into<Value>,
) -> Self
pub fn with_metadata( self, key: impl Into<String>, value: impl Into<Value>, ) -> Self
Add one AGDX-native metadata entry.
Sourcepub fn with_signature(self, signature: Signature) -> Self
pub fn with_signature(self, signature: Signature) -> Self
Attach a detached Signature over this envelope. The SDK signs the
canonical encoding with the signature absent and domain separator
SIGNATURE_DOMAIN, so the field is set last. A signature may ride any
kind.
Trait Implementations§
Source§impl Clone for AgentEnvelope
impl Clone for AgentEnvelope
Source§fn clone(&self) -> AgentEnvelope
fn clone(&self) -> AgentEnvelope
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 AgentEnvelope
impl Debug for AgentEnvelope
Source§impl<'de> Deserialize<'de> for AgentEnvelope
impl<'de> Deserialize<'de> for AgentEnvelope
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 AgentEnvelope
impl PartialEq for AgentEnvelope
Source§impl Serialize for AgentEnvelope
impl Serialize for AgentEnvelope
impl StructuralPartialEq for AgentEnvelope
Auto Trait Implementations§
impl Freeze for AgentEnvelope
impl RefUnwindSafe for AgentEnvelope
impl Send for AgentEnvelope
impl Sync for AgentEnvelope
impl Unpin for AgentEnvelope
impl UnsafeUnpin for AgentEnvelope
impl UnwindSafe for AgentEnvelope
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.