62f376279b
Builds on the salvaged #88598 multi-source roster work: - New Agent "Create on" picker (multi-connection registries only): the profiles.create/configure/describe/mcp.catalog calls route to the picked connection's backend via host.requestProfile route descriptors — the window's active gateway never switches. Remote-target drafts discard via the remote CLI; appearance/title write into the remote profile's ui_meta and asset store; the taken-name check is scoped to the target machine's roster; the live SkillsView Capabilities tab (active-gateway-bound) falls back to the staged checklists for remote targets. - Group chats can seat bots from other registered connections: member turns (session.create/resume, prompt.submit, reply polling) route to each member's own source through the new requestForBot helper. Remote member descriptors persist on the room record (bot-meta is active-gateway-scoped by design); watermarks/sessions key by source-qualified member keys so same-named agents on two machines never share state; @name-device handles resolve in room mentions; room lines and turn prompts badge cross-machine speakers with their device. - pidIsOurDashboard: a dead remote PID (ps exits non-zero) now reads as FOREIGN instead of throwing "Could not verify SSH backend process ownership" — the misleading error from #88625's secondary report. Tests: cross-connection-bots.test.mjs (route descriptors, requestForBot routing, member keys, disambiguated mentions, device badges, source contracts); plugin suite 180/180; electron vitest 220/220.