Skip to content

Agent Mesh

The mesh is how one agent originates a task on another. The single fact to hold onto before anything else: delivery is asynchronous and mailbox-based. There is no synchronous reply. A caller that assumes agent_trigger behaves like a function call — send a request, block, get an answer back — will hang. This is worth repeating because it is the one assumption most likely to be carried over from other tool-calling patterns: nothing about the call shape stops you from writing code that waits for a response that is not coming.

Why asynchronous, mailbox-based delivery

Each agent lives in its own terminal session, taking its own turns. A synchronous call would require one agent's turn to block on another agent's turn completing — which doesn't fit a model where each agent is an independent process with its own pace, its own queue of work, and no obligation to be listening at the moment it's addressed. Originating a message into a mailbox and letting the recipient pick it up on its own next turn removes that dependency entirely: the caller's turn ends when the message is placed, not when the recipient has acted on it.

Why the transport holds no state of its own

The component that moves a message from one agent to another is a pure proxy: no peer list, no message history, no agent registry. Restarting it loses nothing and duplicates nothing, because it never held anything authoritative to lose or duplicate in the first place. That statelessness is what makes the mesh's failure behavior simple to reason about — there is no reconciliation step after a restart, because there was never a second copy of the truth sitting in the transport to reconcile against the real one.

Why agents are addressed by a stable identifier, not a display name

Renaming an agent is an ordinary action, not a rare one, and a message addressed by display name would either silently fail or silently go to the wrong place the moment a rename happened in between. Addressing by a stable identifier that survives renaming means a message queued before a rename and one queued after both still reach the same agent — the address never goes stale just because the label on top of it changed.

What's gated, and what's still to come

Every mesh call is gated on the calling agent already holding mesh capability, and every call is scoped to a single workspace — a workspace boundary that mirrors the one the canvas enforces, for the same reason: nothing here is meant to reach across into a workspace the caller isn't part of.

Roadmap: only originate semantics exist today. There is no thread-scoped reply tool — a recipient can originate its own new message back, but nothing ties that reply to the original as a thread. If you need conversation-like structure, you are building correlation on your own side; the mesh gives you delivery, not a conversation primitive, until that ships.

Mesh “mail” is a local agent mailbox, not internet email. See Agent Mesh Messaging and Email for the current boundary and the requirements a future remote transport must preserve.

Built with purpose.