Skip to main content
Gensyn AXL is a peer-to-peer transport for agents. ed25519 peer ids, HTTP API on localhost:9002, endpoints POST /send, GET /recv, GET /topology. Zuno treats AXL as the coordination layer for a multi-agent debate, not a one-shot pipeline. Without it, “multi-agent” is just function calls wearing a costume.

What ships in the box

  • packages/strategy/src/axl/transport/client.ts: AxlClient with send, request, recv, topology, listen.
  • packages/strategy/src/axl/transport/discovery.ts: reads configured peer ids for cli, scout, strategist, critic, arbiter.

Why it matters in Zuno

  • The CLI is a peer, not a special case.
  • Scout, Strategist, Critic, and Arbiter exchange envelopes directly - no central queue, no orchestrator process.
  • Strategist ↔ Critic loops over multiple rounds; Arbiter only joins on deadlock. AXL routing makes that pattern natural; HTTP request/response would force a heavier coordinator.
  • Roles are open: anyone with a peer id can plug in a competing Strategist or Critic, and the position owner picks which they trust.

Configuration

Zuno expects real AXL nodes and real peer ids:
Generate keys and config with bash tooling/axl-bootstrap.sh, then run each agent in its own terminal:

Envelope kinds

Why long-poll instead of websockets

Long-poll matches what the real Gensyn AXL node does. Switching the transport to websockets later would be a client.ts change only - the agent code never sees the wire.

Inspecting the mesh

The CLI uses this on startup to confirm all four agent peers are reachable before sending flow_start. If any are missing, the CLI falls back to the in-process debate orchestrator (same handlers, same prompts) so the demo still works.