Let Paseo agents on different daemons list, message, start and archive each other.
npmjs · Paseo 0.9+
paseo plugin add npm:paseo-cross-daemon@0.7.1GitHub · Paseo 0.8 fallback
paseo plugin add maxwell-01/maxs-paseo-plugins --ref b84a8426cef5b0c04c511927d8d5c29e413c9570 --path cross-daemonGit security status and fallback installation are pinned to commit b84a8426cef5.
From the plugin's README
Install it on every daemon that takes part, then switch each one on in the app:
paseo plugin install paseo-cross-daemon
That installs the npm package. To install from Git instead:
paseo plugin install https://github.com/maxwell-01/maxs-paseo-plugins.git:cross-daemon.
Update with paseo plugin update cross-daemon.
README
A Paseo plugin that lets agents on different Paseo daemons list, message, start and archive each other. Requires Paseo 0.9.2 or newer, installed on every daemon that takes part.
Open Settings → Plugins → cross-daemon ⋯ → Settings. This daemon has the switch for that host and the daemons it can reach. All daemons lists every daemon the app is connected to, each with a switch and the daemons it can reach. Switches are off by default. Daemons that are switched on can reach each other; a switched-off daemon shares no link and keeps no peers. A daemon without the plugin, or offline, is shown but cannot be switched.
While the app is open it syncs every host that has the plugin, one sync at a time: at connect, after a switch change, and every minute. Each daemon gets the names and links of the other switched-on daemons. The app is the only party that can reach every daemon, so a peer list changes only while it is open; daemons keep their last list when it closes.
Switching off clears that daemon's peer list at once. The other daemons drop it at their next sync.
A daemon that does not answer a sync, for example a sleeping Mac, keeps its place on its peers' lists until it answers switched off.
Each daemon gives its own relay pairing link, the same as paseo pair, only while it is switched
on. A pairing link grants full control of that daemon. Peers are stored owner-only in
$PASEO_HOME/plugin-data/cross-daemon/, which keeps other users out but not the daemon's own
agents: they run as the same user. The cross-daemon tools never print a link.
Every new Claude, Codex or OpenCode agent on a daemon with the plugin gets a cross-daemon MCP
server. Other providers are left unchanged: Paseo refuses to create them with MCP servers or tool
approvals. Claude and Codex agents get the tools pre-approved; OpenCode does not, because a tool
policy turns off its auto-accept.
An agent keeps the tools it was created with. Agents created before the plugin, or before an update that adds a tool, do not see the new tools.
Codex does not pass PASEO_AGENT_ID to MCP servers, so a message from a Codex agent cannot say
which agent sent it, and the receiver cannot reply to it.
| Tool | What it does |
|---|---|
list_daemons |
The daemons this one can reach, by name and server ID. |
list_workspaces(daemon) |
That daemon's workspaces. |
list_agents(daemon) |
That daemon's agents, with status and folder. |
get_agent_activity(daemon, agentId, tail) |
An agent's recent activity. |
send_agent_prompt(daemon, agentId, prompt, notifyOnFinish) |
Sends a message; see below. |
create_agent(daemon, cwd, prompt, mode, provider?, title?, notifyOnFinish) |
Starts a new agent; see below. |
archive_agent(daemon, agentId) |
Archives an agent that create_agent started, and the workspace it made for it. |
daemon is a name or a server ID; use the server ID when two daemons share a name.
To hand new work to another daemon, start a fresh agent with create_agent. Do not message an
unrelated idle agent and ask it to relay the job. To give work to a particular agent, message it
with send_agent_prompt.
cwd, an absolute path on that daemon. It joins that daemon's
workspace for the folder, if there is one, or else a new local workspace. It never joins the
caller's workspace.auto permission mode unless mode names another, such as acceptEdits or
default (always ask). Claude and Codex both have auto.provider (such as claude) unless you know the daemon has a default: a daemon without one
refuses the call.send_agent_prompt, so it can reply.get_agent_activity, send_agent_prompt and
archive_agent.notifyOnFinish (on by default), the caller is told when the agent finishes, as for
send_agent_prompt.paseo run takes the prompt on its command line, so a first prompt is at most 30,000 characters,
and other users of the calling machine can see it in ps.archive_agent closes only agents that create_agent on this daemon started, so it cannot close
someone's own session by mistake. The record of those agents survives a restart. It refuses an agent
that is still working, and does not force one to stop.
After the agent, archive_agent archives the workspace that create_agent made for it. Archiving a
workspace archives every agent in it and closes its terminals, so the workspace is kept while any
other agent on that daemon is in the same folder. When a daemon has 200 agents or more, the plugin
cannot see them all, so it keeps the workspace. A workspace that create_agent did not make is never
archived.
The CLI shows each agent's folder but not its workspace, so the check goes by folder. An agent put in that workspace with a different folder is archived with it. Paseo's own tools do not do this: they give an agent its workspace's folder.
send_agent_prompt never interrupts a working agent:
paseo send.send_agent_prompt, create_agent and archive_agent show as
compact rows too; a send or create expands to its prompt.notifyOnFinish (on by default), the sender is told when the agent finishes, with its last
message. Paseo's own tool steers that notice into the sender's running turn; this one waits until
the sender is idle, so it never interrupts the sender either.The plugin checks and sends to one agent at a time, so two messages cannot both find an agent idle.
A target that starts a turn of its own between the plugin's check and its send is still interrupted,
as it would be by Paseo's own send_agent_prompt.
Limits, each reported to the sender:
Every line the plugin adds to a message or notice carries a random marker, so text inside a message cannot pose as the sender or as a reply target.
Install it on every daemon that takes part, then switch each one on in the app:
paseo plugin install paseo-cross-daemon
That installs the npm package. To install from Git instead:
paseo plugin install https://github.com/maxwell-01/maxs-paseo-plugins.git:cross-daemon.
Update with paseo plugin update cross-daemon.
MIT.
Scanned 23 Oct 2026, 11:29 UTC from maxwell-01/maxs-paseo-plugins/cross-daemon.