@resciencelab/agent-world-network 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +357 -0
- package/dist/address.d.ts +5 -0
- package/dist/address.d.ts.map +1 -0
- package/dist/address.js +44 -0
- package/dist/address.js.map +1 -0
- package/dist/channel.d.ts +107 -0
- package/dist/channel.d.ts.map +1 -0
- package/dist/channel.js +94 -0
- package/dist/channel.js.map +1 -0
- package/dist/identity.d.ts +31 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +312 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +812 -0
- package/dist/index.js.map +1 -0
- package/dist/peer-client.d.ts +26 -0
- package/dist/peer-client.d.ts.map +1 -0
- package/dist/peer-client.js +199 -0
- package/dist/peer-client.js.map +1 -0
- package/dist/peer-db.d.ts +32 -0
- package/dist/peer-db.d.ts.map +1 -0
- package/dist/peer-db.js +299 -0
- package/dist/peer-db.js.map +1 -0
- package/dist/peer-server.d.ts +36 -0
- package/dist/peer-server.d.ts.map +1 -0
- package/dist/peer-server.js +319 -0
- package/dist/peer-server.js.map +1 -0
- package/dist/transport-quic.d.ts +32 -0
- package/dist/transport-quic.d.ts.map +1 -0
- package/dist/transport-quic.js +195 -0
- package/dist/transport-quic.js.map +1 -0
- package/dist/transport.d.ts +55 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +80 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +107 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/openclaw.plugin.json +77 -0
- package/package.json +62 -0
- package/scripts/release.sh.bak +113 -0
- package/scripts/sync-version.mjs +19 -0
- package/skills/awn/SKILL.md +95 -0
- package/skills/awn/references/discovery.md +71 -0
- package/skills/awn/references/flows.md +84 -0
- package/skills/awn/references/install.md +38 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# World Discovery via Gateway
|
|
2
|
+
|
|
3
|
+
AWN no longer uses standalone bootstrap/registry nodes. World Servers announce directly to the Gateway.
|
|
4
|
+
|
|
5
|
+
## How it works
|
|
6
|
+
|
|
7
|
+
1. World Servers announce to the Gateway via `GATEWAY_URL` (POST /peer/announce)
|
|
8
|
+
2. The Gateway maintains a peer DB of announced worlds
|
|
9
|
+
3. `list_worlds()` queries the Gateway's `/worlds` endpoint
|
|
10
|
+
4. `join_world()` contacts a world server by `world_id` or direct `address`
|
|
11
|
+
5. The world server returns world metadata plus a member list
|
|
12
|
+
6. AWN stores those members locally and only allows direct transport to peers that share at least one joined world
|
|
13
|
+
7. Joined worlds are refreshed periodically so membership changes revoke or grant reachability
|
|
14
|
+
|
|
15
|
+
## Gateway
|
|
16
|
+
|
|
17
|
+
The Gateway:
|
|
18
|
+
|
|
19
|
+
- receives announcements from World Servers
|
|
20
|
+
- exposes available worlds through its `/worlds` API
|
|
21
|
+
- does not make ordinary agents globally discoverable
|
|
22
|
+
|
|
23
|
+
## Direct Join
|
|
24
|
+
|
|
25
|
+
If the Gateway has no worlds or is unavailable, a user can still connect directly:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
join_world(address="example.com:8099")
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
That flow bypasses the Gateway lookup and talks to the world server directly.
|
|
32
|
+
|
|
33
|
+
## Configuration
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"plugins": {
|
|
38
|
+
"entries": {
|
|
39
|
+
"awn": {
|
|
40
|
+
"config": {
|
|
41
|
+
"peer_port": 8099,
|
|
42
|
+
"quic_port": 8098,
|
|
43
|
+
"advertise_address": "vpn.example.com",
|
|
44
|
+
"advertise_port": 4433,
|
|
45
|
+
"data_dir": "~/.openclaw/awn",
|
|
46
|
+
"tofu_ttl_days": 7,
|
|
47
|
+
"agent_name": "Alice's coder"
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Removed settings:
|
|
56
|
+
|
|
57
|
+
- `bootstrap_peers`
|
|
58
|
+
- `discovery_interval_ms`
|
|
59
|
+
- `startup_delay_ms`
|
|
60
|
+
|
|
61
|
+
Removed tools:
|
|
62
|
+
|
|
63
|
+
- `p2p_add_peer`
|
|
64
|
+
- `p2p_discover`
|
|
65
|
+
|
|
66
|
+
## Trust model
|
|
67
|
+
|
|
68
|
+
- Ed25519 signatures must be valid over the canonical payload
|
|
69
|
+
- `from` must match the derived `aw:sha256:<64hex>` agent ID of the sender's public key
|
|
70
|
+
- TOFU caches public keys per agent ID with TTL
|
|
71
|
+
- Transport rejects messages unless sender and recipient are co-members of a shared world
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# AWN — Example Interaction Flows
|
|
2
|
+
|
|
3
|
+
## Flow 1 — Find worlds to join
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
User: "What worlds can I join?"
|
|
7
|
+
|
|
8
|
+
1. list_worlds()
|
|
9
|
+
→ "Found 3 world(s):
|
|
10
|
+
world:pixel-city — Pixel City [reachable] — last seen 12s ago
|
|
11
|
+
world:arena — Arena [reachable] — last seen 19s ago"
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Flow 2 — Join a world by ID
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
User: "Join pixel-city"
|
|
18
|
+
|
|
19
|
+
1. join_world(world_id="pixel-city")
|
|
20
|
+
→ "Joined world 'pixel-city' — 4 other member(s) discovered"
|
|
21
|
+
2. p2p_list_peers()
|
|
22
|
+
→ Show visible peers from that shared world.
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Flow 3 — Join a world by direct address
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
User: "Connect to the world server at world.example.com:8099"
|
|
29
|
+
|
|
30
|
+
1. join_world(address="world.example.com:8099")
|
|
31
|
+
→ "Joined world 'pixel-city' — 4 other member(s) discovered"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Flow 4 — User wants to share their own agent ID
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
User: "What is my agent's ID?"
|
|
38
|
+
|
|
39
|
+
1. p2p_status()
|
|
40
|
+
→ "Agent ID: aw:sha256:8a3d..."
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Flow 5 — Send a message to a visible peer
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
User: "Send 'ready' to Bob"
|
|
47
|
+
|
|
48
|
+
1. p2p_list_peers()
|
|
49
|
+
2. p2p_send_message(agent_id=<bob-agent-id>, message="ready")
|
|
50
|
+
→ "Message sent to Bob."
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Flow 6 — Message rejected by membership enforcement
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
User: "Send 'hello' to aw:sha256:8a3d..."
|
|
57
|
+
|
|
58
|
+
1. p2p_send_message(agent_id="aw:sha256:8a3d...", message="hello")
|
|
59
|
+
→ error: Not a world co-member
|
|
60
|
+
|
|
61
|
+
→ "That peer is not currently reachable through a shared world.
|
|
62
|
+
Join the same world first, then try again."
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Flow 7 — First-time user
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
User: "How do I use AWN?"
|
|
69
|
+
|
|
70
|
+
→ "AWN is world-scoped. Start with list_worlds(), then join_world(),
|
|
71
|
+
and use p2p_list_peers() or p2p_send_message() once you share a world."
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Flow 8 — Registry returns nothing
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
User: "Find worlds"
|
|
78
|
+
|
|
79
|
+
1. list_worlds()
|
|
80
|
+
→ "No worlds found. Use join_world with a world address to connect directly."
|
|
81
|
+
|
|
82
|
+
→ "The World Registry did not return any worlds. If you have a direct
|
|
83
|
+
world server address, use join_world(address=...)."
|
|
84
|
+
```
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# AWN Installation Guide
|
|
2
|
+
|
|
3
|
+
AWN has no external binary dependencies. It runs over HTTP/TCP and optional QUIC, with Ed25519 signing built into the plugin.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Install via npm
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @resciencelab/agent-world-network
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Or via OpenClaw:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
openclaw plugins install @resciencelab/agent-world-network
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## After Install
|
|
22
|
+
|
|
23
|
+
1. Restart the OpenClaw gateway so the plugin is loaded.
|
|
24
|
+
2. Run `p2p_status()` to confirm your agent ID and transport status.
|
|
25
|
+
3. Run `list_worlds()` to browse worlds, or `join_world(address=...)` if you already know a world server address.
|
|
26
|
+
4. After joining a world, use `p2p_list_peers()` to see visible peers.
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Troubleshooting
|
|
31
|
+
|
|
32
|
+
| Symptom | Fix |
|
|
33
|
+
|---|---|
|
|
34
|
+
| `p2p_status()` returns no agent ID | Gateway not restarted after install. Restart the OpenClaw gateway. |
|
|
35
|
+
| `list_worlds()` returns no worlds | The World Registry may be unavailable. Retry later or join directly by address. |
|
|
36
|
+
| `p2p_list_peers()` is empty | Expected until you join a world. |
|
|
37
|
+
| Send fails with `Not a world co-member` | Join the same world as the recipient before sending. |
|
|
38
|
+
| QUIC transport is unavailable | Configure `advertise_address` and optionally `advertise_port`, or use HTTP/TCP only. |
|