nc://iroh

v0.1.0Pinned
ThomSharktools/nodecode-iroh: Pairs agents over Iroh QUIC and sends one bounded task to a paired peer, with a reply. - a rewrite of rahlquist/hermes-iroh-interconnect (MIT), credited to rahlquist57d2e23· 9 Nov1 commit
test1 filecell.lisp14.2 KBiroh.lisp14.5 KB

nodecode-iroh

Iroh Interconnect: pairs agents over Iroh QUIC so they can send each other tasks. A Nodecode rewrite of rahlquist/hermes-iroh-interconnect by rahlquist.

Two machines, two agents, one task at a time, no server in the middle: Iroh dials by endpoint key, punches through NAT, and falls back to a relay when a direct path fails. Pair once with a ticket, then call.

Get it

Tell the agent "add the iroh cell", or run nodecode add nc://iroh.

Set it up

The endpoint is the original plugin's Rust sidecar, which you build once:

git clone https://github.com/rahlquist/hermes-iroh-interconnect
cd ~/hermes-iroh-interconnect/sidecar && cargo build --release

and name the binary in your config (~/.nodecode/config.jsonc):

"iroh": {
  "sidecar": "~/hermes-iroh-interconnect/sidecar/target/release/hermes-iroh-sidecar",
  "relay": "default",
  "timeout_seconds": 120
}

relay is default (the public Iroh relays, which see connection metadata and not the task's text), off (LAN only: peers then need a direct address each time), or a relay URL of your own. Everything but calling works without the sidecar: pairing, tickets, the peer list.

Use it

Pair once, out of band (a chat, a QR, one paste):

(iroh:ticket)                       ; this agent's hermes-iroh://pair? ticket, 15 minutes, one use
(iroh:pair "hermes-iroh://pair?...")            ; refuses, naming the peer it would trust
(iroh:pair "hermes-iroh://pair?..." :confirm t) ; trusts it

Then:

(iroh:call "peer-id" "run the tests in src/ and tell me what broke")
(iroh:peers)   (iroh:status)

/iroh is the panel: pair with a ticket, issue this agent's ticket, call a peer. The model has the same five things as the tools iroh_peer_status, iroh_peer_list, iroh_peer_make_ticket, iroh_peer_pair and iroh_peer_call.

What a call carries is scrubbed of credential-shaped tokens (token=..., Bearer ..., a private key block) before it leaves, and the answer is another agent's words: data, not the operator's instruction. A ticket is a bearer capability for fifteen minutes: send it only to the peer you mean to pair with. Every refusal is ERROR: IROH-ERROR with the reason.

Pairing state lives under ~/.nodecode/iroh/, files 0600: peers.json, nonces.json, pairing.secret, and endpoint.key (the identity the sidecar keeps).

Test it

.github/test-cell.sh tools/nodecode-iroh

Add nc://iroh

  1. 1

    Install Nodecode

    Once per machine.

    $ curl -fsSL https://nodecode.ai/install.sh | sh
  2. 2

    Add the cell

    Pinned at 57d2e23.

    $ nodecode add nc://iroh

    Or tell the agent add the iroh cell.