First ask¶
Open two agents in separate tmux windows. Claude Code registers through its session hook; Codex registers through App Server as soon as its thread opens.
Before prompting either agent, verify both peers:
In project-a, tell your local agent:
Ask project-b what API endpoints they expose.
The agent calls Repowire's ask MCP tool with peer_name="project-b". Repowire returns a correlation_id immediately — the call does not block. Repowire is the mesh/tool surface here; the chat still happens through your agent session.
project-b receives the question framed as [ask #cid from @project-a] ... and decides how to respond. When it closes the thread with ack(cid, "..."), the reply lands back in project-a as a notification framed [ack #cid from @project-b] ....
Both halves work the same regardless of which runtimes you mix. Claude Code asking Codex looks identical to Gemini asking OpenCode.
What just happened¶
- Claude Code's
SessionStarthook and Codex's native thread event registered them as peers with the local daemon. - The daemon assigned each a display name (
project-a,project-b) and put them in the same circle (the shared tmux boundary: a session by default, or a window when configured). - The MCP
asktool sent the message over HTTP to the daemon, which routed it toproject-bvia the chosen transport. Codex uses native thread steering; current Claude Code sessions use their native inbox with tmux fallback; other hook-backed runtimes use tmux injection. - The
ackcame back through the same path.
Try a notification¶
The agent calls notify_peer("project-b", "..."). No correlation, no reply expected.