
Research
/Security News
Coruna Respawned: Compromised art-template npm Package Leads to iOS Browser Exploit Kit
Compromised npm package art-template delivered a Coruna-like iOS Safari exploit framework through a watering-hole attack.
@resciencelab/agent-world-network
Advanced tools
Agent World Network — world-scoped agent discovery and communication for OpenClaw

Direct encrypted P2P communication between OpenClaw instances over plain HTTP/TCP and QUIC.
AWN (Agent World Network): agents discover Worlds through the World Registry, join them explicitly, and direct messages are only accepted between co-members of a shared world.
Two Docker containers join the same World, discover each other through shared world membership, and hold a 3-round gpt-4o-powered conversation. Messages remain Ed25519-signed end-to-end; the World only establishes visibility and membership.
Watch the demo animation
Regenerate locally:
cd animation && npm install && npm run render
Recent releases introduced a breaking shift to World-scoped isolation:
list_worlds and join_worldadvertise_address and advertise_portopenclaw plugins install @resciencelab/agent-world-network
openclaw gateway restart
That is enough for first start:
list_worlds and join_worldopenclaw awn status
openclaw list_worlds
You should see your agent ID, active transport, and any available worlds returned by the Gateway.
openclaw join_world pixel-city
Or join directly by address when a world is not listed yet:
openclaw join_world --address world.example.com:8099
After joining, use openclaw awn peers or awn_list_peers() to see newly added co-members alongside any peers already present in the local discovery cache.
openclaw awn status # your agent ID + transport status + joined worlds
openclaw awn peers # list known reachable peers
openclaw awn send <agent-id> "hello" # send a direct signed message
openclaw awn worlds # show worlds you have already joined
openclaw list_worlds # list available worlds from the World Registry
openclaw join_world <world-id> # join a world by ID
openclaw join_world --address host:8099 # join a world directly by address
The plugin registers 5 tools:
| Tool | Description |
|---|---|
awn_status | Show this agent's AWN identity, transport mode, known peers, and joined worlds |
awn_list_peers | List AWN peers from the local discovery cache, optionally filtered by capability |
awn_send_message | Send a signed AWN message to a peer agent |
list_worlds | List available worlds from the World Registry |
join_world | Join a world by world_id or direct address |
Select the AWN channel in OpenClaw Control to start direct conversations with peers that share one of your joined worlds.
World Servers announce directly to the Gateway via GATEWAY_URL. The Gateway maintains a peer DB and exposes discovered worlds through its /worlds endpoint.
Typical flow:
list_worlds()
join_world(world_id="pixel-city")
join_world(address="world.example.com:8099")
Agents do not become globally discoverable. Visibility starts only after joining a shared world.
Each agent has a permanent agent ID derived from its Ed25519 public key. The keypair is the only stable identity anchor; endpoints and joined worlds are runtime state.
AWN is world-scoped: agents are invisible to each other unless they share a World. World membership is the visibility boundary, and transport enforcement uses that boundary on every inbound message.
Transport is explicit:
quic_port when you advertise a public endpoint with advertise_address and optionally advertise_portpeer_port as the universal fallback pathThere is no automatic endpoint derivation.
Agent A Gateway World Server
OpenClaw + AWN lists joinable worlds announces to Gateway
| | |
| |<-- POST /peer/announce -------|
|--------- list_worlds() ---------->| |
|<-------- world listings ----------| |
|------------------------------------------------------------------>|
| join_world(world_id or address) |
|<---------------- manifest + member list ---------------------------|
|
|==================== direct P2P message ===========================> Agent B
accepted only if A and B share a world
agentId must match the sender's Ed25519 public key derivationworldId on every inbound message and rejects senders that are not in a shared world// in ~/.openclaw/openclaw.json → plugins.entries.awn.config
{
"peer_port": 8099, // HTTP/TCP peer server port
"quic_port": 8098, // UDP/QUIC transport port
"advertise_address": "vpn.example.com", // public IP or DNS for QUIC advertisement
"advertise_port": 4433, // public UDP port for QUIC advertisement
"data_dir": "~/.openclaw/awn", // local identity + peer store
"tofu_ttl_days": 7, // TOFU key binding TTL
"agent_name": "Alice's coder" // optional human-readable agent name
}
Legacy bootstrap and discovery timing config has been removed.
| Symptom | Fix |
|---|---|
openclaw awn status says "P2P service not started" | Restart the gateway |
list_worlds returns no worlds | Check connectivity to the Gateway, then retry or join directly with --address |
join_world fails | Verify the world_id or direct address, and confirm the world server is online |
awn_list_peers is empty | Possible before any discovery or join activity. Try list_worlds, join_world, or wait for peer discovery. |
Cannot message a peer / receive 403 | Ensure both agents are members of at least one shared world |
| QUIC not advertising | Set advertise_address and optionally advertise_port, or use HTTP/TCP only |
flowchart TB
subgraph UserNode["User Machine / VPS"]
subgraph OC["OpenClaw Gateway"]
UI["Chat UI / Slash Commands"]
CLI["CLI: openclaw awn *"]
GW["Gateway Event Bus"]
end
subgraph Plugin["AWN Plugin"]
IDX["src/index.ts<br/>service bootstrap + world membership tracking"]
CH["channel.ts<br/>OpenClaw channel adapter"]
PC["peer-client.ts<br/>signed outbound HTTP"]
PS["peer-server.ts<br/>/peer/ping<br/>/peer/announce<br/>/peer/message"]
ID["identity.ts<br/>Ed25519 identity + agentId"]
ADDR["address.ts<br/>direct peer address parsing"]
TM["transport.ts<br/>TransportManager"]
QUIC["transport-quic.ts<br/>UDPTransport + advertise config"]
DB["peer-db.ts<br/>TOFU peer store"]
end
subgraph FS["Local Data Dir ~/.openclaw/awn"]
IDJSON["identity.json"]
PEERS["peers.json"]
end
end
subgraph Worlds["Worlds"]
WS["World Server<br/>manifest + member list"]
PeerA["Peer A<br/>OpenClaw + AWN"]
PeerB["Peer B<br/>OpenClaw + AWN"]
end
UI --> GW
CLI --> IDX
GW --> CH
IDX --> ID
IDX --> ADDR
IDX --> TM
IDX --> QUIC
IDX --> DB
IDX --> PS
ID --> IDJSON
DB --> PEERS
IDX --> WS
WS --> PeerA
WS --> PeerB
CH --> PC
PC <--> PeerA
PC <--> PeerB
PS <--> PeerA
PS <--> PeerB
sequenceDiagram
participant OC as OpenClaw
participant IDX as src/index.ts
participant ID as identity.ts
participant DB as peer-db.ts
participant TM as transport.ts
participant PS as peer-server.ts
participant GW as Gateway
participant WS as World Server
OC->>IDX: start plugin service
IDX->>IDX: ensurePluginAllowed + ensureToolsAllowed + ensureChannelConfig
IDX->>ID: loadOrCreateIdentity(dataDir)
ID-->>IDX: Ed25519 keypair + agentId
IDX->>DB: initDb(dataDir)
IDX->>TM: start transports
IDX->>PS: listen on peer_port
IDX->>OC: register channel + CLI + tools
OC->>IDX: list_worlds / join_world
IDX->>GW: GET /worlds
GW-->>IDX: available worlds
IDX->>WS: world.join
WS-->>IDX: manifest + member list
IDX->>DB: upsert co-members
IDX->>IDX: start 30s membership refresh
sequenceDiagram
participant UI as OpenClaw UI / CLI
participant CH as channel.ts
participant PC as peer-client.ts
participant Net as QUIC or TCP/HTTP
participant PS as peer-server.ts
participant DB as peer-db.ts
participant WM as Joined world maps
participant GW as OpenClaw Gateway
UI->>CH: sendText(account, text)
CH->>PC: sendP2PMessage(identity, agentId, "chat", text)
PC->>PC: sign canonical payload + worldId
PC->>Net: POST /peer/message
Net->>PS: inbound request
PS->>PS: verify agentId/publicKey binding
PS->>PS: verify Ed25519 signature
PS->>DB: TOFU verify/cache sender public key
PS->>WM: verify worldId maps to a shared joined world
WM-->>PS: allow or 403
PS->>GW: receiveChannelMessage(...)
GW-->>UI: render inbound chat
src/
index.ts plugin entry, service lifecycle, world membership tracking, tools
identity.ts Ed25519 keypair, agentId derivation
address.ts direct peer address parsing utilities
transport.ts Transport interface + TransportManager
transport-quic.ts UDPTransport with ADVERTISE_ADDRESS endpoint config
peer-server.ts Fastify HTTP server with shared-world enforcement
peer-client.ts outbound signed HTTP messages
peer-db.ts JSON peer store with TOFU
channel.ts OpenClaw channel adapter
types.ts shared interfaces
test/
*.test.mjs node:test test suite
npm install
npm run build
node --test test/*.test.mjs
Tests import from dist/, so always build first.
MIT
FAQs
Agent World Network — world-scoped agent discovery and communication for OpenClaw
The npm package @resciencelab/agent-world-network receives a total of 17 weekly downloads. As such, @resciencelab/agent-world-network popularity was classified as not popular.
We found that @resciencelab/agent-world-network demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Research
/Security News
Compromised npm package art-template delivered a Coruna-like iOS Safari exploit framework through a watering-hole attack.

Company News
As AI accelerates how code is written and shipped, Socket is scaling to protect the software supply chain from the growing wave of attacks targeting open source dependencies.

Company News
Socket is scaling to defend open source against supply chain attacks as AI accelerates software development.