docs: v0.6.2 Phase 16 group DMs
GROUP_DM.md, roadmap Phase 16, parity, IPC, automated testing. Co-authored-by: Cursor <[email protected]>
This commit is contained in:
@@ -54,6 +54,7 @@ Pearcord validates itself without manual QA.
|
||||
| `npm run test:discovery` | Local guild directory (`DISCOVERY_SMOKE_OK`) |
|
||||
| `npm run test:discovery-gossip` | Public listing gossip + join (`DISCOVERY_GOSSIP_SMOKE_OK`) |
|
||||
| `npm run test:dm` | DM channel id + message sync (`DM_SMOKE_OK`) |
|
||||
| `npm run test:group-dm` | Group DM 3-party topic (`GROUP_DM_SMOKE_OK`) |
|
||||
| `npm run test:reply` | Message replyToId chain (`REPLY_SMOKE_OK`) |
|
||||
| `npm run test:hyperdb` | Rocks engine when spec built (`HYPERDB_SMOKE_OK` or skip) |
|
||||
| `npm run test:invite` | Two temp dirs: host invite → guest join (`INVITE_SMOKE_OK`) |
|
||||
|
||||
+6
-1
@@ -2,7 +2,7 @@
|
||||
|
||||
Pearcord DMs use a **deterministic 1:1 Hyperswarm topic** derived from both user ids (sorted). No central relay.
|
||||
|
||||
## Topic formula
|
||||
## 1:1 topic formula
|
||||
|
||||
```
|
||||
pearcord:dm:<userIdA>:<userIdB> // ids sorted lexicographically
|
||||
@@ -10,6 +10,10 @@ pearcord:dm:<userIdA>:<userIdB> // ids sorted lexicographically
|
||||
|
||||
Channel id is `hash(topic)` (32 hex chars). Stored under `guildId: "dm"` in `@pearcord/channels`.
|
||||
|
||||
## Group DMs (3–10 people)
|
||||
|
||||
See [GROUP_DM.md](./GROUP_DM.md) — topic `pearcord:dm-group:…`, `GROUP_DM_UPSERT` gossip, **◎** UI.
|
||||
|
||||
## Flow
|
||||
|
||||
1. Click **P** (home) in the server rail → `select-home` → DM list.
|
||||
@@ -27,6 +31,7 @@ Channel id is `hash(topic)` (32 hex chars). Stored under `guildId: "dm"` in `@pe
|
||||
```bash
|
||||
npm run test:dm # DM_SMOKE_OK
|
||||
npm run test:dm-preview # DM_PREVIEW_SMOKE_OK
|
||||
npm run test:group-dm # GROUP_DM_SMOKE_OK
|
||||
```
|
||||
|
||||
## Future (P2-3)
|
||||
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
# Group direct messages (P2P)
|
||||
|
||||
Multi-party DMs (3–10 participants) use a **deterministic Hyperswarm topic** from sorted user ids. No central relay.
|
||||
|
||||
## Topic
|
||||
|
||||
```
|
||||
pearcord:dm-group:<id1>:<id2>:<id3> // all participant ids sorted lexicographically
|
||||
```
|
||||
|
||||
Channel id is `hash(topic)` (32 hex). Stored under `guildId: "dm"` with `type: "group_dm"`.
|
||||
|
||||
Participant lists live in `dm-meta` JsonStore (`@pearcord/dm-channel-meta`) because HyperDB channel rows omit extra fields.
|
||||
|
||||
## Flow
|
||||
|
||||
1. Home → **◎** next to **+** → enter group name + comma-separated peer user ids (minimum 2 others).
|
||||
2. `create-group-dm` → join mesh + `GROUP_DM_UPSERT` gossip so peers learn the channel row.
|
||||
3. Open existing groups from the sidebar (**◎** prefix, member count).
|
||||
4. Messages use the same gossip codec as 1:1 DMs (`MESSAGE_CREATE`, typing, etc.).
|
||||
|
||||
## Limits
|
||||
|
||||
| Rule | Value |
|
||||
|------|-------|
|
||||
| Min participants | 3 (you + 2 others) |
|
||||
| Max participants | 10 |
|
||||
|
||||
## RPC
|
||||
|
||||
| Method | Value | Payload |
|
||||
|--------|-------|---------|
|
||||
| `GROUP_DM_UPSERT` | 40 | Channel row + `participantIds[]` |
|
||||
|
||||
## Platform API
|
||||
|
||||
- `createGroupDM({ peerUserIds, name })`
|
||||
- `openGroupDM({ channelId })`
|
||||
|
||||
## IPC
|
||||
|
||||
| type | fields |
|
||||
|------|--------|
|
||||
| `create-group-dm` | `peerUserIds[]`, `name?` |
|
||||
| `open-group-dm` | `channelId` |
|
||||
|
||||
## View fields
|
||||
|
||||
- `dmIsGroup`, `dmParticipantIds`
|
||||
- `dmConversations[].isGroup`, `memberCount`
|
||||
|
||||
## Test
|
||||
|
||||
```bash
|
||||
npm run test:group-dm # GROUP_DM_SMOKE_OK
|
||||
```
|
||||
@@ -40,6 +40,8 @@ JSON lines over `pear-pipe` between `ui/app.js` and `apps/pearcord/index.js`.
|
||||
| `request-emoji-image` | `name` or `attachmentId` | Sidecar → `emoji-image` with base64 bytes |
|
||||
| `update-search` | `query`, `scope?` | `channel` \| `guild` search state |
|
||||
| `open-dm` | `peerUserId`, `peerDisplayName?` | Open 1:1 DM channel + mesh |
|
||||
| `create-group-dm` | `peerUserIds[]`, `name?` | Open 3–10 participant group DM + gossip |
|
||||
| `open-group-dm` | `channelId` | Re-open existing group DM |
|
||||
| `typing-start` | — | Gossip typing indicator (DM) |
|
||||
| `update-profile` | `displayName` | Update local user profile |
|
||||
| `pin-message` | `messageId` | Pin message (requires `manageMessages`) |
|
||||
|
||||
+3
-2
@@ -4,14 +4,14 @@ Gap analysis between **Pearcord** (P2P Pear app) and a typical **centralized cha
|
||||
|
||||
> This is the only doc that compares against an external reference product. All other docs use Pearcord naming only.
|
||||
|
||||
## Summary (v0.6.1)
|
||||
## Summary (v0.6.2)
|
||||
|
||||
| Area | Reference product | Pearcord | Gap |
|
||||
|------|-------------------|----------|-----|
|
||||
| Account | Email/OAuth, cloud profile | Local username + HyperDB + **`pcdv_` device link** | No cloud identity recovery |
|
||||
| Servers | Hosted guilds | P2P guild topic + local DB + **public discovery mesh** | No curated global index (fully P2P topic) |
|
||||
| Text chat | Full | … rich link embeds, categories, **thread channels**, **guild emoji** (unicode + **image/Hyperdrive**) | Forum channels, automod, animated stickers |
|
||||
| DMs | E2E optional | … **sidebar previews**, read-on-open | Group DMs |
|
||||
| DMs | E2E optional | … **sidebar previews**, **group DM (3–10)**, read-on-open | Full E2E group vault |
|
||||
| Voice/video | WebRTC SFU | Voice join/leave + **P2P protomux media plane** (ping/RTT, mute) | Opus/udx live audio (P3-3 follow-up) |
|
||||
| Moderation | Roles, bans, automod | Kick, ban, timeout, roles UI, slowmode, audit+gossip | automod |
|
||||
| Friends | Friend list + requests | **P2P contacts** + block/unblock gossip | Online friends |
|
||||
@@ -85,6 +85,7 @@ Phases **0–2** and **4** are largely complete; **3** (live audio) and **5** (n
|
||||
| P14-1 | Appearance prefs — P5-5 | [~] v0.6.0 userprefs topic |
|
||||
| P14-3 | DM sidebar polish — P1-8 | [~] v0.6.0 previews + read |
|
||||
| P15-1 | Image emoji — P5-4 | [~] v0.6.1 Hyperdrive image emoji |
|
||||
| P16-1 | Group DMs — P1-8 | [~] v0.6.2 3–10 participant topics |
|
||||
| P10-3 | Multi-device identity (autopass) — P8-3 | [x] v0.5.6 `pcdv_` session pairing |
|
||||
| P10-4 | HyperDB schema v2 — P8-4 | [x] v0.5.7 schema v9 |
|
||||
| P11-1 | Guild-wide search — P5-3 | [x] v0.5.7 |
|
||||
|
||||
+12
-1
@@ -34,7 +34,7 @@ Track implementation status here. Update checkboxes as phases land.
|
||||
| P1-5 | `pearcord-presence` — online/idle/dnd | [~] |
|
||||
| P1-6 | Hyperswarm mesh per guild topic | [x] |
|
||||
| P1-7 | Message sync P2P (gossip + HyperDB flush) | [x] |
|
||||
| P1-8 | DM channels (1:1 topic) | [~] previews + read-on-open |
|
||||
| P1-8 | DM channels (1:1 + group topic) | [~] group 3–10 + 1:1 previews |
|
||||
| P1-9 | Reactions + threads | [x] thread channels + archive |
|
||||
| P1-10 | File attachments (hyperdrive) | [~] local staging + metadata gossip |
|
||||
|
||||
@@ -221,8 +221,19 @@ When completing work, change `[ ]` → `[x]` and add a one-line note under **Cha
|
||||
|
||||
---
|
||||
|
||||
### Phase 16 — Group DMs (v0.6.2)
|
||||
|
||||
| ID | Item | Status |
|
||||
|----|------|--------|
|
||||
| P16-1 | `pearcord:dm-group:` topic + `GROUP_DM_UPSERT` gossip | [x] |
|
||||
| P16-2 | Create/open group UI (3–10 participants) | [x] |
|
||||
| P16-3 | smoke-group-dm + GROUP_DM.md | [x] |
|
||||
|
||||
---
|
||||
|
||||
### Changelog
|
||||
|
||||
- **2026-05-21** — v0.6.2: P2P group DMs (3–10 users), `GROUP_DM_UPSERT`, create/open UI, smoke-group-dm, GROUP_DM.md.
|
||||
- **2026-05-21** — v0.6.1: image guild emoji (Hyperdrive staging, `kind: image` EMOJI_UPSERT, inline render, upload UI, smoke-emoji-image).
|
||||
- **2026-05-21** — v0.6.0: `pearcord-settings` appearance prefs P2P sync, theme/density UI, DM previews + mark-read-on-open, smoke-user-prefs/dm-preview, USER_SETTINGS.md.
|
||||
- **2026-05-21** — v0.5.9: `pearcord-emoji` module, guild unicode emoji + `EMOJI_UPSERT` gossip, composer picker, `:name:` message rendering, extended reactions, smoke-emoji, EMOJI.md.
|
||||
|
||||
Reference in New Issue
Block a user