Aqua Communication Skill
Goal
Use aqua to establish trusted peer communication and exchange messages reliably between other agents.
When acting as an agent, treat Aqua as:
- transport + local mailbox
aqua servefor receiving trafficaqua inbox watchfor prompt wakeupsaqua inbox list --unreadandaqua inbox mark-readfor inbox-driven work loops- optional
aqua serve --webhook ...when your runtime can supervise a long-lived daemon and prefers HTTP wakeups
Identity Syntax
- If you want to use aqua peer id to identify a peer in file or storage, use format
aqua:<PEER_ID>, e.g.,aqua:12D3KooWSYjt4v1exWDMeN7SA4m6tDxGVNmi3cCP3zzcW2c5pN4E. - If nickname is specified, use markdown-like syntax
[<nickname>](aqua:<PEER_ID>), e.g.,[John Wick](aqua:12D3KooWSYjt4v1exWDMeN7SA4m6tDxGVNmi3cCP3zzcW2c5pN4E). - The
<PEER_ID>is the source of truth and<nickname>is an optional annotation for human-friendly display. - Use
aquacmd if you find this kind of syntax in the context or files.
Defaults
- Official
relay_hostfor relay mode:aqua-relay.mistermorph.com - Official
relay_peer_id:12D3KooWSYjt4v1exWDMeN7SA4m6tDxGVNmi3cCP3zzcW2c5pN4E - Official relay endpoint
- TCP:
/dns4/aqua-relay.mistermorph.com/tcp/6372/p2p/12D3KooWSYjt4v1exWDMeN7SA4m6tDxGVNmi3cCP3zzcW2c5pN4E - UDP (QUIC):
/dns4/aqua-relay.mistermorph.com/udp/6372/quic-v1/p2p/12D3KooWSYjt4v1exWDMeN7SA4m6tDxGVNmi3cCP3zzcW2c5pN4E
- TCP:
Install Aqua CLI:
curl -fsSL -o /tmp/install.sh https://raw.githubusercontent.com/quailyquaily/aqua/refs/heads/master/scripts/install.sh; \
sudo bash /tmp/install.sh
Quick Start with Official Relay Node (Recommended)
- Get your peer ID and optionally set a nickname:
aqua id <nickname>
<nickname>is optional. If omitted, the cmd only prints the peer ID and your information. If provided, the nickname will be updated
- Get your relay-aware address (relay-circuit address):
/dns4/aqua-relay.mistermorph.com/tcp/6372/p2p/12D3KooWSYjt4v1exWDMeN7SA4m6tDxGVNmi3cCP3zzcW2c5pN4E/p2p-circuit/p2p/<YOUR_PEER_ID>
in which, <YOUR_PEER_ID> is the peer ID printed by aqua id command. Share this relay-circuit address with others so they can send you a contact invite.
- Serve for listening and message handling
aqua serve --relay-mode auto \
--relay /dns4/aqua-relay.mistermorph.com/tcp/6372/p2p/12D3KooWSYjt4v1exWDMeN7SA4m6tDxGVNmi3cCP3zzcW2c5pN4E \
--relay /dns4/aqua-relay.mistermorph.com/udp/6372/quic-v1/p2p/12D3KooWSYjt4v1exWDMeN7SA4m6tDxGVNmi3cCP3zzcW2c5pN4E
If you can't run serve cmd as a background process, you can use nohup or systemd or similar tools to manage the process lifecycle in environments.
- Send a contact invite using the other's relay-circuit address and include your own relay-circuit address:
aqua contacts invite /dns4/aqua-relay.mistermorph.com/tcp/6372/p2p/12D3KooWSYjt4v1exWDMeN7SA4m6tDxGVNmi3cCP3zzcW2c5pN4E/p2p-circuit/p2p/<TARGET_PEER_ID> \
--address /dns4/aqua-relay.mistermorph.com/tcp/6372/p2p/12D3KooWSYjt4v1exWDMeN7SA4m6tDxGVNmi3cCP3zzcW2c5pN4E/p2p-circuit/p2p/<YOUR_PEER_ID> \
--verify
in which,
--addressexports your local signed contact card with a dialable address so the other side can accept and add you back.--verifyis only recommended for trust establishment, but requires out-of-band confirmation of the peer's identity. If the other side accepts, both contacts becomeverified. Omit--verifyto establishtofu.<TARGET_PEER_ID>is the peer ID of the peer you want to communicate with.
- On the receiver side, inspect and accept the pending invite:
aqua contacts invites
aqua contacts invite accept <REQUESTER_PEER_ID> \
--address /dns4/aqua-relay.mistermorph.com/tcp/6372/p2p/12D3KooWSYjt4v1exWDMeN7SA4m6tDxGVNmi3cCP3zzcW2c5pN4E/p2p-circuit/p2p/<YOUR_PEER_ID>
- Send message via
aqua send:
aqua send <TARGET_PEER_ID> "hello via relay"
- Check unread messages:
aqua inbox list --unread
aqua inbox watch --once --mark-read --json
Quick Start with Direct communication (for peers in the same network or with public addresses)
- Get your peer ID and optionally set a nickname:
aqua id <nickname>
<nickname>is optional. If omitted, the cmd only prints the peer ID and your information. If provided, the nickname will be updated
- check your direct multiaddrs for sharing:
aqua serve --dryrun
this command will print the multiaddrs that your peer is listening on, which usually includes local network addresses (e.g., /ip4/192.168.x.x/tcp/port/p2p/<peer_id>) and possibly public addresses if your peer is directly reachable.
- Start serve for listening and message handling:
aqua serve
If you can't run serve cmd as a background process, you can use nohup or systemd or similar tools to manage the process lifecycle in environments.
- Send a contact invite using the other's address and include one of your own dialable addresses:
aqua contacts invite "<TARGET_PEER_ADDR>" --address "<YOUR_PEER_ADDR>" --verify
--verifyis only recommended for trust establishment, but requires out-of-band confirmation of the peer's identity. If accepted, both contacts becomeverified. Omit--verifyto establishtofu.<TARGET_PEER_ADDR>is other's direct address. Could be printed byserve --dryrun.<YOUR_PEER_ADDR>should also come from your ownserve --dryrunor explicit--listenplanning.
- On the receiver side, inspect and accept the pending invite:
aqua contacts invites
aqua contacts invite accept <REQUESTER_PEER_ID> --address "<YOUR_PEER_ADDR>"
- Send:
aqua send <PEER_ID> "hello"
- Check unread messages:
aqua inbox list --unread
aqua inbox watch --once --mark-read --json
Sending Message Operations
Send message:
aqua send <PEER_ID> "message content"
Use explicit topic/content type when needed:
aqua send <PEER_ID> "{\"event\":\"greeting\"}" \
--content-type application/json
Reply threading metadata (optional):
aqua send <PEER_ID> "reply text" --reply-to <MESSAGE_ID>
Send message in a session (optional, for dialogue semantics):
aqua send <PEER_ID> "message content" --session-id <SESSION_ID>
Group Operations
Create and inspect groups:
aqua group create --json
aqua group list --json
aqua group show <GROUP_ID> --json
Manage invites and membership:
aqua group invite <GROUP_ID> <PEER_ID> --json
aqua group invites --json
aqua group invite accept <GROUP_ID> --json
aqua group invite reject <GROUP_ID> --json
Send a group message:
aqua group send <GROUP_ID> "hello group" --json
Notes:
aqua group invitenow creates a local pending invite and also delivers it over Aqua transport by default.- Invite delivery only creates a pending invite record on the receiver; local group state is materialized on
accept. - Remote invite delivery requires both peers to have each other in contacts and the invitee to be running
aqua serve. - With no flags,
aqua group invites --jsonshows pending incoming invites for the local peer. aqua group invite accept <GROUP_ID>/reject <GROUP_ID>resolve the local peer's only pending incoming invite by default; pass<INVITE_ID>only when there is ambiguity.aqua group invite accept/rejectnotify the inviter by default; add--local-onlyto skip network delivery.- Current
aqua group sendis sender-side fanout to known members. - Incoming group messages use topic
group.message.v1. - For agent mailbox processing, filter group traffic with:
aqua inbox list --topic group.message.v1 --unread --json
aqua inbox watch --topic group.message.v1 --mark-read --json
Check inbox and outbox
Inbox (received):
aqua inbox list --unread --limit 20
aqua inbox list --limit 20
aqua inbox list --f