Document Phase 656 global presence mesh and dm-meta materialization.
Add GLOBAL_PRESENCE.md playbook and update roadmap with batch 1 completions. Co-authored-by: Cursor <[email protected]>
This commit is contained in:
+4
-2
@@ -1,6 +1,8 @@
|
||||
# DM inbox & sidebar (Phase 655)
|
||||
# DM inbox & sidebar (Phase 655–656)
|
||||
|
||||
Discord-style home/DM experience in Pearcord — sidebar search, avatars, friends tabs, pinned DMs, previews, and composer parity. All P2P via `pearcord-dm`, contacts mesh, and local `dm-meta` JsonStore.
|
||||
Discord-style home/DM experience in Pearcord — sidebar search, avatars, friends tabs, pinned DMs, previews, and composer parity. All P2P via `pearcord-dm`, contacts mesh, and `DmChannelMetaStore` (HyperDB when schema available, JsonStore fallback).
|
||||
|
||||
**v0.8.630 (Phase 656 batch 1):** `DmChannelMetaStore` HyperDB adapter + JsonStore migration; global presence mesh (`globalPresenceTopic`); quick switcher **Recent DMs** section + ↑↓/Enter keyboard nav; group **Seen** avatar stack tooltip; settings `globalPresenceMeshEnabled`; dev-log `global-presence-errors` + clipboard `globalPresencePeerCount`. Bundle: `npm run test:phase656-dm-presence`.
|
||||
|
||||
**v0.8.629 (Phase 655 closure + Phase 656 start):** DM density (cozy/compact), DM pins panel + gossip, DM reactions gossip, companion DM sidebar search + avatars, agentctl pins/reaction/guild-heal journeys. Bundle: `npm run test:phase655-dm-inbox`.
|
||||
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
# Global presence mesh
|
||||
|
||||
**Phase 656 (v0.8.630)** — Pearcord exposes friend online status on a dedicated P2P topic so home/DM views stay accurate without an active guild mesh.
|
||||
|
||||
## Topic plane
|
||||
|
||||
| Topic | Pattern | Role |
|
||||
|-------|---------|------|
|
||||
| Global presence | `pearcord:presence:global:{userId}` | Lightweight status + activity gossip |
|
||||
|
||||
Defined in `pearcord-shared` as `globalPresenceTopic(userId)`.
|
||||
|
||||
## Behavior
|
||||
|
||||
1. On contacts mesh join, each user hosts their own global topic (`server: true`) and subscribes to accepted friends' global topics (`client: true`).
|
||||
2. `broadcastPresence` fans out `RPC.PRESENCE_UPDATE` on the contacts plane **and** the global presence plane when enabled.
|
||||
3. `ingestFriendPresence` merges payloads into `_friendPresence` (LWW by `at`).
|
||||
4. Blocked users never appear in presence maps; blocking clears cached presence for that peer.
|
||||
5. User pref `globalPresenceMeshEnabled` (default `true`) toggles global topic subscription via settings → platform → `contacts.setGlobalPresenceMeshEnabled`.
|
||||
|
||||
## View surface
|
||||
|
||||
Platform view includes:
|
||||
|
||||
```javascript
|
||||
globalPresence: {
|
||||
meshLive: boolean,
|
||||
peerCount: number,
|
||||
topicCount: number,
|
||||
enabled: boolean,
|
||||
peers: [{ userId, status, at, activity }]
|
||||
}
|
||||
```
|
||||
|
||||
`contacts.stats` also reports `globalPresenceTopics` and `globalPresenceEnabled`.
|
||||
|
||||
## Dev tooling
|
||||
|
||||
- Dev log filter: **Global presence errors** (`global-presence-errors`)
|
||||
- Clipboard fields: `globalPresencePeerCount`, `globalPresenceTopicCount`, `globalPresenceMeshEnabled`, `dmMetaEngine`
|
||||
|
||||
## Testing
|
||||
|
||||
```bash
|
||||
npm run test:quick-switcher-phase656
|
||||
PEARCORD_SKIP_MESH_ROUNDTRIP=1 npm run test:agentctl-global-presence-phase656
|
||||
npm run test:phase656-dm-presence
|
||||
```
|
||||
|
||||
## Related
|
||||
|
||||
- [DM_INBOX.md](./DM_INBOX.md) — DM sidebar uses friend presence dots
|
||||
- [CONTACTS.md](./CONTACTS.md) — contacts mesh + friend links
|
||||
- [PRESENCE.md](./PRESENCE.md) — guild-scoped presence vectors
|
||||
+23
-23
@@ -20204,12 +20204,12 @@ P2P-first phase: Hyperswarm guild mesh, `GUILD_SYNC` bundles, join/recovery pipe
|
||||
|
||||
| ID | Item | Status |
|
||||
|----|------|--------|
|
||||
| P656-1 | HyperDB: migrate `dm-meta` JsonStore to HyperDB collection | [ ] |
|
||||
| P656-2 | HyperDB: DM read receipt rows materialized + gossip | [ ] |
|
||||
| P656-1 | HyperDB: migrate `dm-meta` JsonStore to HyperDB collection | [x] |
|
||||
| P656-2 | HyperDB: DM read receipt rows materialized + gossip | [x] |
|
||||
| P656-3 | HyperDB: pinned DM ids in user prefs HyperDB mirror | [ ] |
|
||||
| P656-4 | Global presence mesh topic on contacts plane | [ ] |
|
||||
| P656-5 | Presence: friend online status from global mesh (not guild-only) | [ ] |
|
||||
| P656-6 | Presence: activity cards pull global mesh payload | [ ] |
|
||||
| P656-4 | Global presence mesh topic on contacts plane | [x] |
|
||||
| P656-5 | Presence: friend online status from global mesh (not guild-only) | [x] |
|
||||
| P656-6 | Presence: activity cards pull global mesh payload | [x] |
|
||||
| P656-7 | DM voice call: contacts mesh voice topic (live, not stub) | [ ] |
|
||||
| P656-8 | DM video call: screen-share plane for 1:1 | [ ] |
|
||||
| P656-9 | DM reactions: full guild picker parity in DM mode | [x] |
|
||||
@@ -20219,43 +20219,43 @@ P2P-first phase: Hyperswarm guild mesh, `GUILD_SYNC` bundles, join/recovery pipe
|
||||
| P656-13 | Cross-guild DM open during guild mesh heal verify | [x] |
|
||||
| P656-14 | Group DM: live add-member (new topic id) flow | [ ] |
|
||||
| P656-15 | Group DM: remove member gossip + UI | [ ] |
|
||||
| P656-16 | Quick switcher: recent DMs section at top | [ ] |
|
||||
| P656-17 | Quick switcher: keyboard ↑↓ + Enter | [ ] |
|
||||
| P656-16 | Quick switcher: recent DMs section at top | [x] |
|
||||
| P656-17 | Quick switcher: keyboard ↑↓ + Enter | [x] |
|
||||
| P656-18 | DM header: ringing state UI for outbound call | [ ] |
|
||||
| P656-19 | DM header: in-call bar mini (mute/hang up) | [ ] |
|
||||
| P656-20 | Friend list: mutual servers count from mesh | [ ] |
|
||||
| P656-21 | Blocked users: global presence hidden | [ ] |
|
||||
| P656-21 | Blocked users: global presence hidden | [x] |
|
||||
| P656-22 | DM typing: global mesh fan-in when guild loading | [ ] |
|
||||
| P656-23 | Seen receipt: group per-user avatar stack tooltip | [ ] |
|
||||
| P656-23 | Seen receipt: group per-user avatar stack tooltip | [x] |
|
||||
| P656-24 | Agentctl: DM voice stub → live join journey | [ ] |
|
||||
| P656-25 | Agentctl: global presence two-peer mesh | [ ] |
|
||||
| P656-26 | Agentctl: HyperDB dm-meta migration smoke | [ ] |
|
||||
| P656-25 | Agentctl: global presence two-peer mesh | [x] |
|
||||
| P656-26 | Agentctl: HyperDB dm-meta migration smoke | [x] |
|
||||
| P656-27 | Agentctl: DM pins panel journey | [x] |
|
||||
| P656-28 | Agentctl: DM reactions toggle journey | [x] |
|
||||
| P656-29 | Smoke: DM search scoped query | [x] |
|
||||
| P656-30 | Smoke: quick switcher static asserts | [ ] |
|
||||
| P656-30 | Smoke: quick switcher static asserts | [x] |
|
||||
| P656-31 | Companion: DM header call buttons | [ ] |
|
||||
| P656-32 | Companion: quick switcher subset | [ ] |
|
||||
| P656-33 | Mobile companion: group rename parity | [ ] |
|
||||
| P656-34 | Platform: `dm.voice.call` span live metrics | [ ] |
|
||||
| P656-35 | Platform: global presence snapshot in view | [ ] |
|
||||
| P656-36 | Platform: HyperDB engine default for dm-meta | [ ] |
|
||||
| P656-37 | pearcord-dm: HyperDB channel meta adapter | [ ] |
|
||||
| P656-38 | pearcord-settings: presence prefs global mesh toggle | [ ] |
|
||||
| P656-39 | Dev-log: global-presence-errors filter | [ ] |
|
||||
| P656-40 | Dev-log clipboard: globalPresencePeerCount | [ ] |
|
||||
| P656-41 | `docs/GLOBAL_PRESENCE.md` playbook | [ ] |
|
||||
| P656-42 | `docs/DM_INBOX.md` Phase 656 delta | [ ] |
|
||||
| P656-35 | Platform: global presence snapshot in view | [x] |
|
||||
| P656-36 | Platform: HyperDB engine default for dm-meta | [x] |
|
||||
| P656-37 | pearcord-dm: HyperDB channel meta adapter | [x] |
|
||||
| P656-38 | pearcord-settings: presence prefs global mesh toggle | [x] |
|
||||
| P656-39 | Dev-log: global-presence-errors filter | [x] |
|
||||
| P656-40 | Dev-log clipboard: globalPresencePeerCount | [x] |
|
||||
| P656-41 | `docs/GLOBAL_PRESENCE.md` playbook | [x] |
|
||||
| P656-42 | `docs/DM_INBOX.md` Phase 656 delta | [x] |
|
||||
| P656-43 | Module README audit (dm, platform, agentctl, settings) | [ ] |
|
||||
| P656-44 | `test:phase656-dm-presence` bundle | [ ] |
|
||||
| P656-45 | pear run boot gate + agentctl soak | [ ] |
|
||||
| P656-44 | `test:phase656-dm-presence` bundle | [x] |
|
||||
| P656-45 | pear run boot gate + agentctl soak | [x] |
|
||||
| P656-46 | CI: phase656 regression chain | [ ] |
|
||||
| P656-47 | DM call notification toast + OS permission stub | [ ] |
|
||||
| P656-48 | E2E rekey banner when dm session rotates | [ ] |
|
||||
| P656-49 | DM sidebar: lazy avatar image queue from mesh | [ ] |
|
||||
| P656-50 | Phase 657 — Voice mesh federation + stage DM bridge planned | [ ] |
|
||||
|
||||
**Next:** Phase 656 — HyperDB DM meta + global presence mesh; live DM voice; close P655 tail items.
|
||||
**Next:** Phase 656 — DM voice live mesh, group add/remove member, companion parity; then Phase 657 planning.
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user