feat(core): merge gossip-discovered rooms into listRooms - #138
Merged
Merged
Conversation
listRooms now also surfaces every public/private room this store has heard gossiped by another device (via room/hosted, #131/#132) but never joined or otherwise locally recorded, mixed into its existing Room[] result as a display-only placeholder -- id/name/type/owner/ description real, everything membership-shaped (members, memberJoins, etc.) genuinely empty, since a gossip hint is not the same as admission and this store has nothing else real to report for it. A room already known locally always wins; a gossip advert for it is silently ignored rather than shadowing the real record. MeshTransport gains an optional listKnownDevices method (matching WireMeshTransport's own already-shipped implementation) so RoomLifecycle can read it through the existing abstract requireTransport() port rather than depending on the concrete WireMeshTransport type -- absent for any transport implementation that doesn't offer it, in which case the merge step is simply a no-op, matching every construction site that predates this feature. A gossiped candidate is narrowed through a real type guard (isHostedRoomAdvert) before use, matching the codebase's own "an advert not participating in this convention is not an error" gossip-consumption pattern already established for presence/status.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
🎉 This PR is included in version 2.27.0 🎉 The release is available on: Your semantic-release bot 📦🚀 |
Mearman
added a commit
that referenced
this pull request
Sep 16, 2026
…es into listAgents WireMeshTransport's gossip tick gains a third optional source (getSelfAgentAdvert), gossiping this side's own name/harness/cwd/pid/ startedAt/tags/subscribedRooms under agent/self -- the write half of P3.8's eventual agent register/update/offline retirement. Deliberately excludes status (already carried separately under presence/status) and visibility (only ever populated for a "visible" agent in the first place, so a discovered entry's visibility is always exactly "visible" by construction). MeshStore.selfAgentAdvert reads this store's own agent record and withholds the advert entirely for anything other than "visible" -- gossip reaches every connected peer regardless of mesh-approval status, so advertising a hidden or ghost agent's identity this way would leak exactly what those visibility levels exist to withhold. AgentRegistry.listAgents merges in a gossip-discovered agent not otherwise locally known, mirroring listRooms' own room-discovery merge (#138): a display-only placeholder AgentIdentity, real facts from the gossiped advert, status read from the existing presence/ status key, never merged into the local agents map, and always shadowed by a real local record when one exists.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
listRooms now also surfaces every public/private room this store has heard gossiped by another device (via room/hosted, #131/#132) but never joined or otherwise locally recorded, mixed into its existing Room[] result as a display-only placeholder -- id/name/type/owner/description real, everything membership-shaped (members, memberJoins, etc.) genuinely empty, since a gossip hint is not the same as admission. A room already known locally always wins; a gossip advert for it is silently ignored rather than shadowing the real record.
MeshTransport gains an optional listKnownDevices method (matching WireMeshTransport's own already-shipped implementation, #130) so RoomLifecycle can read it through the existing abstract requireTransport() port rather than depending on the concrete WireMeshTransport type -- absent for any transport implementation that doesn't offer it, in which case the merge step is a no-op.
A gossiped candidate is narrowed through a real type guard (isHostedRoomAdvert) before use, matching the codebase's own "an advert not participating in this convention is not an error" gossip-consumption pattern already established for presence/status.
Caught a real bug before this ever reached CI: my first implementation extracted transport.listKnownDevices into a bare variable before calling it, which drops the method's own
thisbinding to the WireMeshTransport instance and crashes with "Cannot read properties of undefined" the moment a real transport is exercised anywhere in the suite -- found by running the full test suite, not just the new test file, then fixed by calling it as a normal property-access method call instead.This closes out the last piece #48's own P3.8 tracking called genuinely open on the room-discovery side: createRoom's own room_upsert broadcast can now be retired once this is verified equivalent in production, though that retirement itself stays its own follow-up rather than bundled in here.
Refs #48.