{"id":"cross-daemon","repo":"maxwell-01/maxs-paseo-plugins","url":"https://github.com/maxwell-01/maxs-paseo-plugins/tree/main/cross-daemon","package":"paseo-cross-daemon","npm":{"package":"paseo-cross-daemon","version":"0.2.0","integrity":"sha512-GpUr6i+6KdWHteav01E7HzeK0wDud53bn5rQpvh7D7X1D+94iGJOcE1d8W16ro5F2NRPG4wr/ImhiAAEFErpuw==","publishedAt":"2026-09-25T20:36:52.276Z","downloadsLast30Days":119},"name":"cross-daemon","description":"Let Paseo agents on different daemons list and message each other.","categories":["orchestration","productivity"],"platforms":[],"caveats":["Requires Paseo 0.9.2 or newer on every daemon and on the app","Install it on every daemon that takes part, then switch each one on from the Cross-daemon sidebar page","The Paseo app must be open for daemons to exchange links","Switched-on daemons hold each other's pairing links, which grant full control of that daemon","Messages from Codex agents cannot be replied to"],"images":[],"themes":[],"health":{"manifestValid":true,"hasReadme":true,"hasLicense":true,"hasTests":true,"hasTypecheckScript":true,"updatedRecently":true},"scannedAt":"2026-09-27T08:57:36.840Z","addedAt":"2026-09-27T11:54:31+03:00","npmSecurity":{"status":"passed","blockingFindings":0,"advisoryFindings":0,"scannedAt":"2026-09-27T08:57:26.759Z","version":"0.2.0","integrity":"sha512-GpUr6i+6KdWHteav01E7HzeK0wDud53bn5rQpvh7D7X1D+94iGJOcE1d8W16ro5F2NRPG4wr/ImhiAAEFErpuw=="},"path":"cross-daemon","version":"0.2.0","security":{"status":"passed","blockingFindings":0,"advisoryFindings":0,"scannedAt":"2026-09-27T08:57:26.759Z","commit":"975f8c4c062cb78ca82b203c8952e6c31621a9e6"},"license":"MIT","paseoVersionRequirement":">=0.9.2","descriptionNodes":[{"type":"text","text":"Let Paseo agents on different daemons list and message each other."}],"caveatNodes":[[{"type":"text","text":"Requires Paseo 0.9.2 or newer on every daemon and on the app"}],[{"type":"text","text":"Install it on every daemon that takes part, then switch each one on from the Cross-daemon sidebar page"}],[{"type":"text","text":"The Paseo app must be open for daemons to exchange links"}],[{"type":"text","text":"Switched-on daemons hold each other's pairing links, which grant full control of that daemon"}],[{"type":"text","text":"Messages from Codex agents cannot be replied to"}]],"manifest":{"id":"cross-daemon","requirements":{"paseo":">=0.9.2"}},"repoMeta":{"stars":1,"defaultBranch":"main","pushedAt":"2026-09-25T17:19:31Z"},"owner":{"login":"maxwell-01","avatarUrl":"https://avatars.githubusercontent.com/u/45392468?v=4"},"installNotesHtml":"<p>Install it on every daemon that takes part, then switch each one on in the app:</p>\n<pre><code class=\"language-bash\">paseo plugin install paseo-cross-daemon\n</code></pre>\n<p>That installs the npm package. To install from Git instead:\n<code>paseo plugin install https://github.com/maxwell-01/maxs-paseo-plugins.git:cross-daemon</code>.\nUpdate with <code>paseo plugin update cross-daemon</code>.</p>","readmeText":"# Cross-daemon\n\nA [Paseo](https://paseo.sh) plugin that lets agents on different Paseo daemons list and message each\nother. Requires **Paseo 0.9.2 or newer**, installed on every daemon that takes part.\n\n## Switching a daemon on\n\nOpen **Cross-daemon** in the app's sidebar. It lists every daemon the app is connected to, each\nwith a switch and the daemons it can reach. Switches are off by default. Daemons that are switched\non can reach each other; a switched-off daemon shares no link and keeps no peers. A daemon without\nthe plugin, or offline, is shown but cannot be switched.\n\nThe same switch is in each host's settings: **Settings → Plugins → cross-daemon ⋯ → Cross-daemon**.\n\nWhile the app is open it syncs every host that has the plugin, one sync at a time: at connect, after\na switch change, and every minute. Each daemon gets the names and links of the other switched-on\ndaemons. The app is the only party that can reach every daemon, so a peer list changes only while\nit is open; daemons keep their last list when it closes.\n\nSwitching off clears that daemon's peer list at once. The other daemons drop it at their next sync.\n\nA daemon that does not answer a sync, for example a sleeping Mac, keeps its place on its peers'\nlists until it answers switched off.\n\n## Links\n\nEach daemon gives its own relay pairing link, the same as `paseo pair`, only while it is switched\non. A pairing link grants full control of that daemon. Peers are stored owner-only in\n`$PASEO_HOME/plugin-data/cross-daemon/`, which keeps other users out but not the daemon's own\nagents: they run as the same user. The cross-daemon tools never print a link.\n\n## Agent tools\n\nEvery new Claude, Codex or OpenCode agent on a daemon with the plugin gets a `cross-daemon` MCP\nserver. Other providers are left unchanged: Paseo refuses to create them with MCP servers or tool\napprovals. Claude and Codex agents get the tools pre-approved; OpenCode does not, because a tool\npolicy turns off its auto-accept.\n\nAn agent keeps the tools it was created with. Agents created before the plugin, or before an\nupdate that adds a tool, do not see the new tools.\n\nCodex does not pass `PASEO_AGENT_ID` to MCP servers, so a message from a Codex agent cannot say\nwhich agent sent it, and the receiver cannot reply to it.\n\n## Tools\n\n| Tool | What it does |\n| --- | --- |\n| `list_daemons` | The daemons this one can reach, by name and server ID. |\n| `list_workspaces(daemon)` | That daemon's workspaces. |\n| `list_agents(daemon)` | That daemon's agents, with status and folder. |\n| `get_agent_activity(daemon, agentId, tail)` | An agent's recent activity. |\n| `send_agent_prompt(daemon, agentId, prompt, notifyOnFinish)` | Sends a message; see below. |\n\n`daemon` is a name or a server ID; use the server ID when two daemons share a name.\n\n## Sending without interrupting\n\n`send_agent_prompt` never interrupts a working agent:\n\n- If the agent is idle, the message goes at once with `paseo send`.\n- If it is working, the message is queued and the sender is told so. Every 15 seconds the plugin\n  delivers the oldest queued message for each agent that has become idle. The queue survives a\n  restart.\n- Each message says which agent and daemon sent it and how to reply.\n- With `notifyOnFinish` (on by default), the sender is told when the agent finishes, with its last\n  message. Paseo's own tool steers that notice into the sender's running turn; this one waits until\n  the sender is idle, so it never interrupts the sender either.\n\nThe plugin checks and sends to one agent at a time, so two messages cannot both find an agent idle.\nA target that starts a turn of its own between the plugin's check and its send is still interrupted,\nas it would be by Paseo's own `send_agent_prompt`.\n\nLimits, each reported to the sender:\n\n- A message that waits more than 24 hours is dropped, as is a message to an agent that is archived,\n  missing or ambiguous.\n- A send cut off by a restart or a timeout is not repeated: it may have been delivered.\n- At most 20 messages wait per agent, and a prompt is at most 50,000 characters.\n- A finish notice is given up after 24 hours.\n\nEvery line the plugin adds to a message or notice carries a random marker, so text inside a message\ncannot pose as the sender or as a reply target.\n\n## Install\n\nInstall it on every daemon that takes part, then switch each one on in the app:\n\n```bash\npaseo plugin install paseo-cross-daemon\n```\n\nThat installs the npm package. To install from Git instead:\n`paseo plugin install https://github.com/maxwell-01/maxs-paseo-plugins.git:cross-daemon`.\nUpdate with `paseo plugin update cross-daemon`.\n\n## License\n\nMIT.\n"}