Inter-agent message bus for coding-agent runtimes such as Claude Code and Codex. Enables multiple agent sessions running in tmux panes to discover each other, exchange messages, and coordinate work through a shared filesystem-based transport.
Each runtime instance spawns helioy-bus as an MCP server over stdio. Shared state lives in ~/.helioy/bus/: a SQLite registry for agent presence and file-based mailboxes for message delivery. Any agents sharing the same filesystem share the same bus.
Messages are delivered as atomic JSON files (temp + rename) to prevent partial reads. Recipients may be woken via tmux send-keys nudges when their runtime supports that path. Nudges are currently Claude-only and are throttled to one per 30 seconds per recipient.
Requires Python 3.12+ and uv.
uv syncThe MCP server and hooks are managed by helioy-plugins. Once the plugin is activated, Claude sessions register on SessionStart and deregister on SessionEnd automatically. Codex sessions register through the launch wrapper used by the Codex runtime adapter.
To register manually as an MCP server:
{
"mcpServers": {
"helioy-bus": {
"command": "uv",
"args": ["run", "--directory", "/path/to/helioy-bus", "python", "server/proxy.py"]
}
}
}The proxy provides hot-reload during development. For production, point directly at server/bus_server.py.
| Tool | Purpose |
|---|---|
whoami |
Return the caller's identity record from the registry |
register_agent |
Register a runtime instance on the bus |
unregister_agent |
Remove an agent from the registry |
list_agents |
List registered agents with optional tmux session/window filtering |
heartbeat |
Update liveness timestamp for an agent |
send_message |
Send a message to an agent, a role, or broadcast to all |
get_messages |
Read and archive unread messages from an agent's inbox |
The repo also ships helioy-warroom, a companion MCP server for multi-agent orchestration:
| Tool | Purpose |
|---|---|
warroom_discover |
Discover launchable agent catalogues across registered runtimes |
warroom_spawn_repos |
Spawn one general-purpose pane per Helioy repo |
warroom_spawn |
Spawn a named warroom with runtime-scoped agent validation |
warroom_status |
Return live warroom rows plus member registration and liveness state |
warroom_add |
Add a member pane to an active warroom |
warroom_remove |
Remove a member by stable member id or unique role |
warroom_kill |
Kill one warroom or all active warrooms |
warroom_presets / warroom_save_preset |
Read and persist reusable team compositions |
- Direct:
send_message(to="agent-id")targets a specific agent - Role-based:
send_message(to="role:backend-engineer")targets all agents of that type - Broadcast:
send_message(to="*")delivers to every registered agent except the sender
plugin/scripts/warroom.sh remains as a legacy convenience wrapper around tmux workflows. Symlink it if you still want the shell entrypoint:
ln -sf "$(pwd)/plugin/scripts/warroom.sh" ~/.helioy/warroom.sh# Repo-mode: one agent per helioy repo
warroom.sh
# Role-mode: named window of specialists in current directory
warroom.sh design "brand-guardian ui-designer visual-storyteller"
# Management
warroom.sh status
warroom.sh kill design
warroom.sh kill allPane title format: {repo}:{agent_type}:{session}:{window}.{pane}
Examples:
fmm:general:main:2.1(repo-mode)helioy-bus:backend-engineer:main:3.1(role-mode)
This title is the source of truth for agent identity. The Claude hooks read it at SessionStart, and the Codex wrapper uses the same identity convention.
just build # install dependencies
just check # ruff, mypy across server/, shellcheck when installed
just test # run pytest