Skip to content

feat(swarm): another machine's conversation works like one of yours - #117

Merged
meszmate merged 2 commits into
mainfrom
feature/remote-machine-settings-panel
Sep 25, 2026
Merged

meszmate merged 2 commits into
mainfrom
feature/remote-machine-settings-panel

Conversation

@meszmate

Copy link
Copy Markdown
Contributor

What

Opening a conversation that lives on another paired computer now opens it as a conversation: the full transcript, cards and working line in the pane, and a composer that sends to that machine. Before this, you got a read-only float.

Mirrors

  • swarm.mirror creates a hidden local Session with mirror: Some(MirrorOf { node, session, machine }). That machine's stream is translated into AgentEvents and handled by the same on_agent_event path, so the transcript is drawn by one piece of code whichever machine the agent is on.
  • ↵ on a remote row leaves the project panel, so the keyboard is in the composer.
  • Rich stream events (ToolStarted, ToolFinished, Asked) go only to peers with NodeCapabilities::rich_stream.

Everything works like it does locally

  • ^P / ^E / footer: answered from that machine's own ModelCatalogue (AscpMessage::Catalogue, gated by NodeCapabilities::catalogue). No plugin needed to learn what a mirror is. Options travel on SetModel.
  • AgentSummary carries instance, mode, options and context, so the footer's model, mode and meter describe the owner's conversation.
  • ⇧⇥ (needs accepts_approvals), ^N on that machine, <C-w>T as a shell over there, rename and archive all act on the owner. Deleting is refused.
  • Questions and permission prompts are relayed (crate::relay, StreamEvent::Question / Permission / Settled, AgentCommand::Answer / SetMode, and Approve naming the prompt it answers). The first answer from any machine wins, and the other panels withdraw via neosh.prompt.withdrawn.

Sidebar

One section per machine, a short code and a colour per machine (Swarm.Host1–6), version drift shown as a machine block (≠ 4f3a1c2), no rail, and a fix for folded rows turning into bogus local projects.

Also

  • A settings panel plugin (, in the project panel, /settings) that saves into config.toml via toml_edit (opt.save).
  • agent.append_prompt, git.pull.auto, and paste routed to the focused float (neosh.paste).
  • scripts/bump.sh bumps only the npm packages that changed; tag.yml verifies this.

Wire compatibility

Every new message, event and command is behind a capability flag that decodes to false from an older node, so an older peer degrades rather than dropping the link. New fields are #[serde(default)]. Public enums and structs gained variants and fields, so this is a minor release (0.5.0).

Tests

cargo test -p neosh --test builtin_plugins (241), plus the neosh-proto, neosh-swarm, neosh-agent and neosh unit suites and check.sh web, all pass locally. New tests cover: focus on open, answering a remote question and withdrawal, the remote shell, a refused stray answer, the remote model catalogue in the footer and ^P, folding, per-machine sections and the settings panel.

Opening a conversation on another computer now makes a mirror: a local,
hidden conversation drawn by the same code as yours, whose turns run on
the machine they belong to.

- Mirrors: the transcript, cards and working line come from that
  machine's stream; sending, steering and Esc go back to it. Opening one
  from the project panel puts the keyboard in its composer.
- Parity: ^P and ^E read that machine's own model catalogue
  (AscpMessage::Catalogue), the footer shows its model, options, mode and
  context, and ^N, <C-w>T, rename and archive all act over there.
  Deleting is refused.
- Questions and permission prompts are offered to whoever is watching;
  the first answer wins and the other panels withdraw
  (StreamEvent::Question/Permission/Settled, crate::relay).
- Sidebar: one section per machine, short codes and a colour per machine,
  version drift shown as a block, no rail, and a fold fix.
- Settings panel (`,`, /settings) that saves into config.toml as a
  document; agent.append_prompt; git.pull.auto; paste goes to the
  focused float.
- scripts/bump.sh bumps only the npm packages that changed, and tag.yml
  verifies it.
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

Deploying neosh with  Cloudflare Pages  Cloudflare Pages

Latest commit: b4ed5d0
Status: ✅  Deploy successful!
Preview URL: https://af6d8bb3.neosh.pages.dev
Branch Preview URL: https://feature-remote-machine-setti.neosh.pages.dev

View logs

@meszmate
meszmate merged commit f501f4b into main Sep 25, 2026
8 checks passed
@meszmate
meszmate deleted the feature/remote-machine-settings-panel branch September 25, 2026 03:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant