-
d3b4058: feat(cli): add join/leave/ping/send commands for full plugin parity
The standalone AWN CLI (
awn) now exposes all capabilities available in the OpenClaw plugin:awn join <world_id|slug|host:port>— join a world by ID, slug, or direct address; resolves via Gateway and sends a signedworld.joinP2P messageawn leave <world_id>— sendworld.leaveand remove from joined listawn joined— list currently joined worldsawn ping <agent_id>— check reachability of a known agentawn send <agent_id> <message>— send a signedchatP2P message to an agent
Adds
sign_http_request()andbuild_signed_p2p_message()helpers tocrypto.rs(wire-compatible with the TypeScript plugin). The daemon gains ajoined_worldsstate map and five new IPC routes.
-
db7cdeb: fix(gateway): add /peer/announce backward-compat route and auto-redeploy on SDK version bump
- Add
POST /peer/announcebackward-compat route for SDK < 1.4 world containers (returns legacy{peers:[]}shape) - Raise default
STALE_TTL_MSfrom 90 s to 15 min to prevent old SDK worlds (10 min announce interval, no heartbeat) from being pruned between announces - Add
packages/agent-world-sdk/package.jsontodeploy-gateway.ymlpath triggers so any SDK minor version bump automatically redeploys the gateway (fixes 403 signature mismatch caused byPROTOCOL_VERSIONchanging without gateway redeploy)
- Add
- 3c166ac: Fix release workflow: add actions:write permission so GITHUB_TOKEN can dispatch the CLI release build
- 87ad9d1: Add world manifest endpoint and CLI command to query world information and available actions without joining
- 79ce791: Fix version-dependent Rust CLI test failures and release-cli workflow trigger
- dc3d3c2: Fix install.sh, implement
awn daemon stopwith IPC shutdown + PID fallback
- 27834f5: Add standalone Rust CLI binary (
awn) for agent-native AWN interface: Ed25519 crypto (wire-compatible with TS SDK), identity persistence, peer DB with TOFU, IPC daemon with axum, clap CLI with --json dual output, SKILL.md for agent discovery - 27834f5: Rename peer terminology to agent/world across codebase; split world records into dedicated WorldDb and gateway world registry with worldId-as-protocol-identity model and human-readable slug field
- 6121b02: Rename gateway HTTP endpoints to resource-oriented paths: /peer/* routes replaced by /agents, /messages, /ping; /world/:worldId corrected to /worlds/:worldId; added GET /agents/:agentId, DELETE /agents/:agentId, and separate POST /worlds/:worldId/heartbeat for world servers
- 6994233: Auto-generate OpenAPI spec from route schemas using @fastify/swagger, serve Swagger UI at /docs
- 29ce8c3: Smoother release process: workflow_dispatch trigger, concurrency control, ClawHub continue-on-error, auto-trigger CI on Version Packages PR, changeset package validation
- 6994233: Include endpoints in /worlds gateway response and list_worlds discovery
- 52a9605: feat: add gateway heartbeat endpoint, reduce stale TTL to 90s, add announce webhook & OpenAPI spec
- 1666ab7: fix: prevent release failure when SDK version already published
- ba8ba2d: feat: surface world action params schema to agent — enrich join_world/awn_status with typed action signatures, add world_info tool
- 16c5c90: feat: add world_action tool for invoking world-defined actions after joining
- 6637571: Fix plugin id mismatch: openclaw.plugin.json id changed from "awn" to "agent-world-network" to match the npm package name and eliminate the startup warning.
- 52fc219: Fix gateway /world/:worldId response missing publicKey field. join_world(world_id=...) was always failing with "World public key is unavailable; cannot verify signed membership refreshes" because the publicKey was stored on announce but omitted from the world record response.
- ed8440e: Merge peerServer into app: all /peer/* routes now served on a single port (HTTP_PORT 8100) alongside /worlds and /health, fixing announce unreachability via GATEWAY_URL.
- d8c3085: Fix domain: agentsworlds.ai -> agentworlds.ai across all config and source files.
- f28e2ff: Fix deploy-gateway: remove -f from Cloudflare curl to expose API errors, skip DNS update when IP is already correct (idempotent with Elastic IP), downgrade Cloudflare API failures to warnings so deploys are not blocked.
- 3ef9266: Fix deploy-gateway workflow: replace ec2:DescribeInstances call with EC2_PUBLIC_IP repo variable to avoid IAM permission error.
- 79ec712: Bind gateway to https://gateway.agentsworlds.ai: add Cloudflare DNS upsert step to deploy-gateway workflow (proxied=true for automatic HTTPS via Cloudflare), expose HTTP API on port 80, inject PUBLIC_URL/PUBLIC_ADDR into the container. Centralise the gateway URL in package.json gateway.url and propagate it via sync-version.mjs to src/index.ts, web/client.js, and docs/index.html. The deploy workflow reads GATEWAY_URL from GitHub Actions vars with a fallback, so the domain can be overridden without touching code. Also fixes skills/awn/SKILL.md os value from macos to darwin.
-
c134690: refactor: rename agent tools from
p2p_*toawn_*prefixThe
p2p_prefix was inherited from the old DAP plugin and implied generic peer-to-peer semantics. These tools are AWN-specific — peer discovery is world-scoped, and messages are signed with the AWN protocol.Breaking change: the following tool names are renamed:
Old name New name p2p_statusawn_statusp2p_list_peersawn_list_peersp2p_send_messageawn_send_messageUpdate any
tools.alsoAllowconfig entries and agent prompts that reference the oldp2p_*names.
-
6c53162: fix(sdk): correct base58 encode/decode for leading-zero byte inputs
base58Encode([0])produced"11"instead of"1"andbase58Decode("1")produced[0, 0]instead of[0]. Fixed by skipping trailing zero digits in the encoder and rewriting the leading-zero byte handling in the decoder. Not triggered by current Ed25519 key usage but now correct for general reuse. -
90b3bcf: fix(sdk): restrict world.state broadcasts to active world members only
broadcastWorldState()previously usedpeerDb.values()as broadcast targets, leaking live world state to any discovered peer — even those that never joined the world. The broadcast now filters throughagentEndpointsandagentLastSeenso only agents that successfully calledworld.joinreceive world state updates. -
2429e1f: fix(sdk): validate newAgentId matches newPublicKey in key rotation handler
The
/peer/key-rotationendpoint verifiedoldAgentId ↔ oldPublicKeybut never checked thatnewAgentIdmatchesnewPublicKey. An attacker could submit a rotation request with arbitrarynewAgentIdmetadata. AddedagentIdFromPublicKey()validation for the new identity, returning 400 on mismatch. -
4045dfd: fix(sdk): protocol consistency — domain separator, ledger constant, Fastify reply
- Domain separator mismatch:
broadcastWorldState()body signature changed fromDOMAIN_SEPARATORS.WORLD_STATEtoDOMAIN_SEPARATORS.MESSAGEto match the/peer/messagereceiver verification. - Ledger dead code: Removed unused
LEDGER_DOMAINconstant. Replaced fragile string-splittingLEDGER_SEPARATORconstruction with directPROTOCOL_VERSIONusage. - Fastify reply: Added explicit
return reply.send(body)in/peer/messagehandler to follow Fastify 5 async handler best practices.
- Domain separator mismatch:
-
041b465: refactor!: remove bootstrap nodes — Gateway absorbs registry
World Servers now announce directly to the Gateway via GATEWAY_URL, eliminating the standalone bootstrap/registry layer. The Gateway's existing peer infrastructure (/peer/announce, peer DB, /worlds) handles all world discovery.
BREAKING CHANGE: The
bootstrapUrlanddiscoveryIntervalMsconfig fields are replaced bygatewayUrlsandannounceIntervalMs. World Servers must set GATEWAY_URL instead of BOOTSTRAP_URL. The bootstrap/ directory, docs/bootstrap.json, and bootstrap-health workflow are removed.
-
041b465: feat: Gateway persistence, graceful shutdown, and health observability
- Rename internal peers → registry terminology for clarity
- Persist world registry to $DATA_DIR/registry.json with atomic writes
- Wire persistence into announce and prune flows for restart recovery
- Stop /peer/message from polluting registry with empty records
- Add graceful shutdown (SIGTERM/SIGINT) that flushes registry state
- Enhance /health with registryAge, status (ready/warming/empty)
-
c3a1701: feat!: transport-layer enforcement of world-scoped isolation
All incoming peer messages are now verified at the transport layer before reaching application logic:
- Messages without a worldId are rejected (403)
- Messages with a worldId that doesn't match any joined world are rejected
- Only co-members of a shared world can exchange messages
- Added address.ts with parseHostPort() and parseDirectPeerAddress() utilities
- Transport enforcement tests validate all rejection scenarios
BREAKING CHANGE: Peers that are not co-members of a shared world can no longer send messages to each other. All messages must include a valid worldId.
-
b74f700: feat: convert bootstrap nodes to World Registry
Bootstrap nodes now function as a World Registry — they only accept and serve World Server registrations (peers with world:* capabilities). Individual agent announcements are rejected with 403.
- Bootstrap server rewritten as World Registry (only world:* announces accepted)
- New GET /worlds endpoint returns registered worlds
- list_worlds queries registry nodes to discover available worlds
- Removed peer-discovery.ts (global peer gossip no longer used)
- World Servers auto-register on startup via existing startDiscovery() flow
- Sibling sync between registry nodes preserved (world entries only)
-
b74f700: feat!: world-scoped agent isolation — remove global peer gossip
Agents are no longer visible to each other via bootstrap gossip. Peer discovery happens exclusively through World membership:
- Remove bootstrap peer discovery (bootstrapDiscovery, startDiscoveryLoop, stopDiscoveryLoop)
- Remove p2p_add_peer and p2p_discover tools
- World Server returns
members(agentId + alias + endpoints) in world.join response - Add
/world/membersauthenticated endpoint (requires X-AgentWorld-From header of active member) - join_world accepts direct
addressparameter for connecting to worlds by URL - sendP2PMessage now returns response body data for join_world to extract member list
- Agent endpoints are transmitted in join payload and stored server-side
- Eviction cleans up agent endpoint tracking
BREAKING CHANGE: Agents must join a World to discover and communicate with other agents. Bootstrap nodes no longer exchange individual agent information.
-
c3a1701: fix: replace IPv6/STUN with ADVERTISE_ADDRESS + Codex P1 fixes
Endpoint advertisement:
- Removed unreliable IPv6 NIC scanning (getPublicIPv6, getActualIpv6, isGlobalUnicastIPv6)
- Removed incomplete STUN NAT traversal from QUIC transport
- Added ADVERTISE_ADDRESS / ADVERTISE_PORT env vars and plugin config for explicit endpoint advertisement
- QUIC transport disabled without ADVERTISE_ADDRESS (no unusable loopback endpoints)
Codex review P1 fixes:
- Fixed bootstrap package.json resolution for Docker (use ./package.json not ../)
- Added setWorldMembers() to revoke co-member access when membership shrinks
- Verify X-AgentWorld-* response signatures on /world/members before trusting member list
- /peer/ping returns publicKey for join_world identity verification
-
fbec06f: Update repository banner to Agent World Network design
-
eb4863f: Implement domain-separated signatures to prevent cross-context replay attacks
This is a BREAKING CHANGE that implements AgentWire-style domain separation across all signing contexts.
- Prevents cross-context replay attacks: Signatures valid in one context (e.g., HTTP requests) cannot be replayed in another context (e.g., Agent Cards)
- Adds 7 domain separators: HTTP_REQUEST, HTTP_RESPONSE, AGENT_CARD, KEY_ROTATION, ANNOUNCE, MESSAGE, WORLD_STATE
- Format:
"AgentWorld-{Context}-{VERSION}\0"(includes null byte terminator to prevent JSON confusion) - Version format: Domain separators use major.minor version (e.g., "0.4" instead of "0.4.3") to prevent network partitioning on patch releases
All signatures now include a domain-specific prefix before the payload:
message = DomainSeparator + JSON.stringify(canonicalize(payload)) signature = Ed25519(message, secretKey)signHttpRequest()- Now usesDOMAIN_SEPARATORS.HTTP_REQUESTverifyHttpRequestHeaders()- Verifies with domain separationsignHttpResponse()- Now usesDOMAIN_SEPARATORS.HTTP_RESPONSEverifyHttpResponseHeaders()- Verifies with domain separationbuildSignedAgentCard()- Agent Card JWS now prependsDOMAIN_SEPARATORS.AGENT_CARD- Peer protocol (announce, message, key-rotation) - All use context-specific separators
DOMAIN_SEPARATORS- Constant object with all 7 domain separatorssignWithDomainSeparator(separator, payload, secretKey)- Low-level signing functionverifyWithDomainSeparator(separator, publicKey, payload, signature)- Low-level verification function
Protocol version is extracted from package.json as major.minor only:
- Patch releases (0.4.3 → 0.4.4): Maintain signature compatibility - domain separators unchanged ("0.4")
- Minor/major releases (0.4.x → 0.5.0): Change domain separators - breaking change ("0.4" → "0.5")
Examples:
- Package version
0.4.3→ Domain separator contains0.4 - Package version
0.5.0-beta.1→ Domain separator contains0.5 - Package version
1.0.0→ Domain separator contains1.0
This prevents network partitioning on bug-fix releases while maintaining protocol versioning on minor/major updates.
Existing signatures created before this change will NOT verify. All agents must upgrade simultaneously or use a coordinated rollout strategy.
If you were using
signPayload()orverifySignature()directly, migrate to domain-separated versions:Before:
const sig = signPayload(payload, secretKey); const valid = verifySignature(publicKey, payload, sig);
After:
const sig = signWithDomainSeparator( DOMAIN_SEPARATORS.MESSAGE, payload, secretKey ); const valid = verifyWithDomainSeparator( DOMAIN_SEPARATORS.MESSAGE, publicKey, payload, sig );
Agent Cards now advertise
"domain-separated-signatures"capability in the conformance block.All existing tests pass + 19 new domain separation security tests covering cross-context replay attack prevention.
-
eb4863f: feat: domain-separated signing, header-only auth, world ledger
- DAP plugin HTTP signing/verification aligned with SDK domain separators (HTTP_REQUEST, HTTP_RESPONSE)
- QUIC/UDP buildSignedMessage uses DOMAIN_SEPARATORS.MESSAGE (matching server verification)
- Key rotation uses DOMAIN_SEPARATORS.KEY_ROTATION
- Header signatures (X-AgentWorld-*) required on announce/message — no legacy body-only fallback
- Blockchain-inspired World Ledger: append-only event log with SHA-256 hash chain, Ed25519-signed entries, JSON Lines persistence, /world/ledger + /world/agents HTTP endpoints
- Collision-resistant ledger filenames via SHA-256(worldId)
-
eb4863f: feat: add world type system — programmatic and hosted world modes
Extends WorldManifest with structured rules, actions schema, host info, and lifecycle config. Extends WorldConfig with worldType and host agent fields. createWorldServer auto-injects host info on join for hosted worlds.
- d056d07: fix: use cd instead of --prefix for SDK npm publish to avoid publishing root package
- fe2a12a: fix: add NPM_TOKEN env to release workflow for changesets publish detection
- df08054: fix: install and build agent-world-sdk in CI workflows
-
c7f958c: Agent Worlds Playground — world discovery UI, manifest protocol, and updated web frontend
-
379c2c9: feat(agentwire-p0): add AgentWire v0.2 HTTP header signing and eliminate gateway crypto duplication
- Add
signHttpRequest,verifyHttpRequestHeaders,computeContentDigestto agent-world-sdk crypto module - Update
peer-protocol.tsto verifyX-AgentWire-*headers with backward-compatible body-sig fallback - Update
bootstrap.tsandworld-server.tsto sendX-AgentWire-*headers on all outbound requests - Refactor
gateway/server.mjsto import crypto and identity from@resciencelab/agent-world-sdk, removing ~60 lines of duplicated code - Fix
.gitignoreto properly exclude.worktrees/directory
- Add
-
379c2c9: feat(agentwire-p1): AgentWire v0.2 agentId namespace + Agent Card
BREAKING: agentId format changed from 32-char truncated hex to
aw:sha256:<64hex>. Existing identity files are migrated automatically on next startup. Bootstrap nodes must be redeployed after this release.New: GET /.well-known/agent.json — JWS-signed A2A Agent Card with extensions.agentwire block (agentId, identity key, profiles, conformance). Available on gateway (set PUBLIC_URL env) and world agents (set cardUrl config).
-
b819b00: feat(p2): response signing, key rotation format, Agent Card ETag + capabilities
- HTTP response signing: all
/peer/*JSON responses includeX-AgentWorld-Signature+Content-Digest - Key rotation: structured
agentworld-identity-rotationformat with JWS proofs, top-leveloldAgentId/newAgentId - TOFU guard: key-loss recovery returns 403 (silent overwrite no longer allowed)
- Agent Card:
ETag+Cache-Controlheaders,conformance.capabilitiesarray - Protocol version derived from
package.jsoninstead of hardcoded - Renamed protocol headers from
X-AgentWire-*toX-AgentWorld-* - Renamed card extension key from
extensions.agentwiretoextensions.agentworld - Raw request body used for Content-Digest verification (prevents false 403 on re-serialization mismatch)
- Malformed
publicKeyMultibasereturns 400 instead of 500
- HTTP response signing: all
-
dcd4f1c: Add UDP socket listener (port 8098) to bootstrap nodes for QUIC peer rendezvous and NAT endpoint discovery
-
a434a0b: Add capability-based peer discovery: findPeersByCapability() with exact and prefix matching, capability filter on p2p_list_peers tool and CLI
-
0d92856: Rename DeClaw to DAP across the package, plugin IDs, config keys, and public-facing docs.
-
7512bcc: Add Gateway Server (gateway/server.mjs) — stateless portal with WebSocket bridge connecting DAP network to browsers
-
da658a5: Add list_worlds and join_world agent tools for discovering and joining Agent worlds via DAP
-
dcd4f1c: Add POST /peer/key-rotation endpoint: both old and new Ed25519 keys sign the rotation record, TOFU cache is updated atomically
-
d59aefa: Add @resciencelab/agent-world-sdk — reusable DAP World Agent infrastructure (crypto, identity, peer DB, bootstrap discovery, peer protocol, createWorldServer API)
-
dcd4f1c: Remove Yggdrasil dependency. DAP now uses plain HTTP over TCP as its primary transport (with QUIC as an optional fast transport). This eliminates the need to install and run a Yggdrasil daemon, reducing agent onboarding to installing the plugin only.
Breaking changes:
PluginConfig.yggdrasil_peersremoved — usebootstrap_peerswith plain HTTP addressesPluginConfig.test_moderemoved — no longer neededIdentity.cgaIpv6andIdentity.yggIpv6removed from the typeBootstrapNode.yggAddrreplaced withaddr(plain hostname or IP)isYggdrasilAddr()removed frompeer-serverDEFAULT_BOOTSTRAP_PEERSis now empty — bootstrap addresses will be added todocs/bootstrap.jsononce AWS nodes are configured with public HTTP endpointsstartup_delay_msdefault reduced from 30s to 5syggdrasil_checkagent tool removedopenclaw p2p setupCLI command removed
-
f11a846: Add pixel playground web frontend (web/index.html, client.js, style.css) — zero-dependency browser UI for the DAP Agent playground
-
dabed97: Add standalone World Agent server (world/server.mjs) — deployable by anyone to host a world on the DAP network
-
199404a: Add MAX_AGENTS, WORLD_PUBLIC, WORLD_PASSWORD environment variables to World Agent for capacity limits, private worlds, and password protection
- f1ba31b: Configure public HTTP addresses for all 5 AWS bootstrap nodes
- dcd4f1c: Upgrade bootstrap.json format to include transport endpoint fields (quicAddr, udpPort, httpPort) for future multi-transport bootstrap support
- dcd4f1c: Expose did:key (W3C DID) in identity CLI output and agent tool response
- 48042ad: Add TTL-based peer expiry to Gateway and World Agent, active world reachability probing, and PUBLIC_PORT env var support
- 6601249: Gateway probe rejects endpoints that return no worldId (e.g. Gateway's own peer listener on same port)
- e05b197: fix: sync agent-world-sdk version with root package in release workflow
- dcd4f1c: Add TOFU binding TTL (default 7 days) to limit key compromise exposure window
- 33886e6: Fix clawhub publish by patching acceptLicenseTerms into publish payload
- 27b252d: Fix clawhub publish in release workflow by passing explicit --version flag
-
c9d5621: BREAKING CHANGE: Peer identity migrated from Yggdrasil IPv6 address (
yggAddr) toagentId(sha256(publicKey)[:32]). All v1 protocol compatibility removed — existing peer databases will not migrate.- Transport abstraction layer with TransportManager for automatic selection
- YggdrasilTransport wrapper and UDPTransport (plain UDP with STUN NAT traversal)
- Multi-transport endpoint support in peer discovery and messaging
agentIdas primary peer identity withdid:keyderivation for W3C compatibility- Application-layer Ed25519 signatures + TOFU binding as transport-agnostic trust anchor
All notable changes to this project will be documented in this file.
- Bootstrap nodes now run an always-on AI agent (
/peer/messageendpoint). New users can send messages to any bootstrap node and receive AI-powered replies, solving the cold-start problem when no real peers are online. - Per-sender rate limiting on bootstrap nodes (default: 10 messages/hour, configurable via
RATE_LIMIT_MAX/RATE_LIMIT_WINDOW_MS). Rate-limited requests return HTTP 429 withRetry-Afterheader. - Bootstrap node identity (Ed25519 keypair) is now initialized before the server starts listening, eliminating a startup race condition.
- Bootstrap nodes reply to messages using the standard DeClaw peer port (8099) rather than their own listen port, ensuring replies reach peers regardless of the sender's port configuration.
- Agent metadata exchange: peers now share
agent_nameand pluginversionduring/peer/announce. - New
agent_nameconfig option in plugin settings (falls back toidentity.namefromopenclaw.json). /peer/announceresponse includesselfmetadata so callers learn the responder's name and version on first contact.- Startup and first-run prompts to set
agent_nameif not configured. - Bootstrap nodes now advertise
"ReScience Lab's bootstrap-<addr>"as their name and include version.
upsertDiscoveredPeerrefreshesaliason non-manual peers (stale name fix).listPeers()return type widened toDiscoveredPeerRecord[]for version access.- CLI
p2p peersand tools now display peer name and version:200:abc... — Alice's coder [v0.2.1]. - Bootstrap server upgraded to Fastify 5.7.4 across all 5 AWS regions.
- Auto-detect Yggdrasil for
test_mode: tri-state"auto"(default) detects external daemon automatically. - Auto-inject public peers into system Yggdrasil when only LAN/multicast peers are present.
- Enriched
yggdrasil_checktool with peer count and routing table size. - Factory hooks for session management and command safety checks.
AGENTS.mdfor AI coding agent context, including release process documentation.CHANGELOG.mdfor tracking project changes.
- Parallelized bootstrap node connections (worst-case 150s → 30s).
- Debounced peer-db disk writes during discovery (1s coalescing).
- Added
osandrequires.binsto skill frontmatter for ClawHub security scan.
- Omit
undefinedalias field from announce payload to prevent canonicalization mismatches.
- Renamed channel ID from
ipv6-p2ptodeclaw. - Renamed service ID from
ipv6-p2p-nodetodeclaw-node. - Default data directory changed from
~/.openclaw/ipv6-p2pto~/.openclaw/declaw. - Old
ipv6-p2pname preserved as a channel alias for backward compatibility.
- Merged
ipv6-p2pandyggdrasilskills into a singledeclawskill. - Channel label changed from "IPv6 P2P" to "DeClaw".
- Complete skill documentation: all tool parameters, error handling table, inbound message flow explanation.
references/discovery.md— bootstrap + gossip architecture and trust model.- Troubleshooting section for
derived_onlystate (PATH, permissions, DockerNET_ADMIN). - Eight example interaction flows including diagnostics, non-default port, and first-time user.
- Upgraded main plugin Fastify from 4.x to 5.7.4, resolving high-severity vulnerabilities.
- Upgraded bootstrap service Fastify from
^4.26.2to^5.0.0(resolves to 5.7.4). - Added
bootstrap/package-lock.jsonfor reproducible installs. - Fixed recursive key sorting in signature canonicalization (
identity.ts). - Fixed
isYggdrasilAddrregex to correctly match compressed IPv6 addresses like200:and202:(peer-server.ts). - Clear startup discovery timer on service stop to prevent dangling callbacks (
index.ts).
- Periodic sibling sync between bootstrap nodes (5-minute interval).
- Aligned plugin ID in
openclaw.plugin.jsonto match npm package name. - Signature verification mismatch between announce and message endpoints.
- Corrected Yggdrasil address regex and added startup delay for route convergence.
- Increased peer exchange timeout from 10s to 30s.
- DHT-style peer discovery via bootstrap + gossip exchange.
- Standalone bootstrap server with 5 nodes across AWS regions (us-east-2, us-west-2, eu-west-1, ap-northeast-1, ap-southeast-1).
- Fetch bootstrap node list from GitHub Pages (
bootstrap.json), with hardcoded fallback. - ClawHub-compatible frontmatter to skills.
- GitHub Actions workflow to publish to npm on release.
- Banner and logo assets.
- Renamed project from
claw-p2ptoDeClaw.
- Initial release.
- OpenClaw plugin with Ed25519 identity, TOFU peer trust, and Yggdrasil integration.
- Agent tools:
p2p_add_peer,p2p_send_message,p2p_list_peers,p2p_status,p2p_discover,yggdrasil_check. - IPv6 P2P channel registration for OpenClaw chat UI.
- Yggdrasil setup skill with platform-specific install guide.
- Docker P2P test environment.