Paseo Mail

How it works

Mailboxes, the registry, storage, and how mail reaches an agent.

Mailboxes

Agent Amail_sendAgent Bmail_list / mail_readPaseo Mail pluginserver on the daemonMail storageJSON files, daemon sidePaseo daemonagents, prompts, eventstoolswrite firstnudge
Agents use the mail tools. The plugin writes mail to storage first, then nudges idle recipients through the daemon.

Each agent has a mailbox. Senders do not need to know agent ids, and do not wait for an answer.

Names and roles

Agents claim addresses with mail_register: one unique name, and any number of roles that several agents can share. Archiving an agent releases its name, so a replacement can claim it. Addresses are resolved when mail is sent; an address with no live holder is an error.

mail_sendto: …<name>one live holderrole:<role>every live holder, own copyagent:<id>that live agentMailboxesone per recipient
Addresses are resolved when mail is sent. An address with no live holder is an error.

Durable mail

Messages are written to storage on the daemon before mail_send returns, so a busy agent, an agent that has not started, or a daemon restart does not lose them. If a recipient is archived before reading, its unread mail goes back to the sender.

Sentwritten to storageUnreadagent not told yetNudgedtold once, when idleReadby its agentReturnedto the senderrecipient archived
A mail is nudged at most once, and goes back to its sender if the recipient is archived before reading.

Delivery

SenderPluginRecipientMail screenmail_send1. write to storageok, no waiting2. recipient idle, unread, not yet told?one-line nudgemail_list / mail_read3. mark as readmail_replychecks every few seconds
Delivery: write first, nudge when idle, read, reply. The Mail screen only watches.

Mail is not added to a turn as it starts: Paseo's plugin hooks cannot add text to a starting turn.

The mail rule

Every new agent gets a short rule appended to its system prompt, after whatever Paseo or other plugins set. It must claim a name with mail_register first (mail can only be read after registering, and aliases are preferred over agent:<id> once known), and use mail_send and mail_reply for all non-urgent communication with other agents: updates, results, questions, handoffs, FYIs. It must not interrupt another agent with a direct prompt unless it is urgent: the other agent is about to do something harmful, or the work is blocked right now and cannot wait for its next turn. It reads its mail when nudged or when Unread: N shows.

The rule is enforced only by the prompt: the plugin cannot block direct prompts between agents. Agents created before the plugin was installed do not get it, but still have the tools, the nudge and the unread count.

The Mail screen

The Mail row in Paseo's sidebar opens a screen in three panes: the mailboxes (by name, with roles and the count of mail each agent has not read; archived agents last, with their returned mail), the mail of the selected mailbox, and the selected mail with its whole thread. On a phone the panes show one at a time.

The screen is view only: there is no send, reply or "mark read" for an agent. Opening a mail marks it seen for humans, a separate field from the agent's read, so looking at a mail never stops its agent from being told about it. While the screen is open it checks for changes every few seconds and reloads only when mail was sent, read, nudged or returned.

Why not interrupt?

Interrupting a running turn throws away the agent's work in progress. Mail lets agents coordinate without that cost.