Skip to main content

AgentEnvelope

Struct AgentEnvelope 

Source
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: ConversationId

Also the partition key.

§source: AgentId

Agent-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: bool

Terminal 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: u64

Must-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

Source

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.

Source

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.

Source

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.

Source

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).

Source

pub fn event( record: RecordId, conversation: ConversationId, source: AgentId, body: Vec<u8>, ) -> Self

An event: expects nothing.

Source

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.

Source

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).

Source

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.

Source

pub fn with_target(self, target: AgentId) -> Self

Narrow delivery to one agent within a shared topic.

Source

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.

Source

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.

Source

pub fn with_idempotency_key(self, key: IdempotencyKey) -> Self

Attach a business idempotency key (commands, responses, events only).

Source

pub fn with_deadline_micros(self, deadline_micros: u64) -> Self

Declare the drop-dead time (and, on a stream-opening message, the abandonment bound).

Source

pub fn terminal(self, finish_reason: impl Into<String>) -> Self

Mark this message terminal (last = true), with the reason the stream or response ended.

Source

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.

Source

pub fn with_operation(self, operation: impl Into<String>) -> Self

Set the OTel operation name.

Source

pub fn with_tool(self, tool: impl Into<String>) -> Self

Set the OTel tool name.

Source

pub fn with_usage(self, usage: TokenUsage) -> Self

Attach token accounting (advisory).

Source

pub fn with_metadata( self, key: impl Into<String>, value: impl Into<Value>, ) -> Self

Add one AGDX-native metadata entry.

Source

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

Source§

fn clone(&self) -> AgentEnvelope

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AgentEnvelope

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'de> Deserialize<'de> for AgentEnvelope

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl PartialEq for AgentEnvelope

Source§

fn eq(&self, other: &AgentEnvelope) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl Serialize for AgentEnvelope

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for AgentEnvelope

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .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
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V