docs: Phase 75 threads panel (v0.8.39)

THREADS_PANEL.md, PLATFORM_ROADMAP Phase 75, PEARCORD_PARITY Phase 76 tranche,
IPC, AUTOMATED_TESTING updates.

Co-authored-by: Cursor <[email protected]>
This commit is contained in:
Raven Scott
2026-05-22 02:22:44 -04:00
co-authored by Cursor
parent f04789213f
commit 407b6c7322
6 changed files with 71 additions and 8 deletions
+1
View File
@@ -32,6 +32,7 @@ Pearcord validates itself without manual QA.
| `npm run test:embed` | OpenGraph parse + cache (`EMBED_SMOKE_OK`) | | `npm run test:embed` | OpenGraph parse + cache (`EMBED_SMOKE_OK`) |
| `npm run test:dm-encrypt` | DM seal roundtrip (`DM_ENCRYPT_SMOKE_OK`) | | `npm run test:dm-encrypt` | DM seal roundtrip (`DM_ENCRYPT_SMOKE_OK`) |
| `npm run test:threads` | Thread channels (`THREADS_SMOKE_OK`) | | `npm run test:threads` | Thread channels (`THREADS_SMOKE_OK`) |
| `npm run test:threads-panel` | Threads panel unread + archived (`THREADS_PANEL_SMOKE_OK`) |
| `npm run test:slash` | Slash commands + gossip (`SLASH_SMOKE_OK`) | | `npm run test:slash` | Slash commands + gossip (`SLASH_SMOKE_OK`) |
| `npm run test:bot-events` | Bot event fanout (`BOT_EVENTS_SMOKE_OK`) | | `npm run test:bot-events` | Bot event fanout (`BOT_EVENTS_SMOKE_OK`) |
| `npm run test:contacts` | Friend request gossip + accept (`CONTACTS_SMOKE_OK`) | | `npm run test:contacts` | Friend request gossip + accept (`CONTACTS_SMOKE_OK`) |
+1
View File
@@ -38,6 +38,7 @@ JSON lines over `pear-pipe` between `ui/app.js` and `apps/pearcord/index.js`.
| `create-channel` | `name`, `channelType?`, `parentId?` | Add text/voice channel + gossip | | `create-channel` | `name`, `channelType?`, `parentId?` | Add text/voice channel + gossip |
| `create-thread` | `messageId`, `name?` | Thread channel under active text channel | | `create-thread` | `messageId`, `name?` | Thread channel under active text channel |
| `archive-thread` | `threadId`, `archived?` | Archive / unarchive thread | | `archive-thread` | `threadId`, `archived?` | Archive / unarchive thread |
| `set-threads-panel-archived` | `includeArchived` | Show archived threads in panel |
| `toggle-reaction` | `messageId`, `emoji` | Toggle 👍/❤️/😂 reaction + gossip | | `toggle-reaction` | `messageId`, `emoji` | Toggle 👍/❤️/😂 reaction + gossip |
| `select-home` | — | Leave mesh, show DM home | | `select-home` | — | Leave mesh, show DM home |
| `send-friend-request` | `peerUserId`, `peerDisplayName?` | Send P2P friend request | | `send-friend-request` | `peerUserId`, `peerDisplayName?` | Send P2P friend request |
+1 -1
View File
@@ -28,7 +28,7 @@
| `pearcord-discovery` | `modules/pearcord-discovery` | Local directory + P2P public listings mesh | | `pearcord-discovery` | `modules/pearcord-discovery` | Local directory + P2P public listings mesh |
| `pearcord-embed` | `modules/pearcord-embed` | OpenGraph fetch + cache | | `pearcord-embed` | `modules/pearcord-embed` | OpenGraph fetch + cache |
| `pearcord-crypto` | `modules/pearcord-crypto` | DM payload sealing | | `pearcord-crypto` | `modules/pearcord-crypto` | DM payload sealing |
| `pearcord-threads` | `modules/pearcord-threads` | Thread channel helpers | | `pearcord-threads` | `modules/pearcord-threads` | Thread helpers + `buildThreadsPanel` |
| `pearcord-attachments` | `modules/pearcord-attachments` | File staging + metadata | | `pearcord-attachments` | `modules/pearcord-attachments` | File staging + metadata |
| `pearcord-drive` | `modules/pearcord-drive` | Per-guild Hyperdrive keys | | `pearcord-drive` | `modules/pearcord-drive` | Per-guild Hyperdrive keys |
| `pearcord-moderation` | `modules/pearcord-moderation` | Timeouts / communication disabled | | `pearcord-moderation` | `modules/pearcord-moderation` | Timeouts / communication disabled |
+7 -6
View File
@@ -145,7 +145,7 @@ Phases **02** and **4** are largely complete; **3** (live audio) and **5** (n
| P63-1 | Role-restricted emoji manage UI (v0.8.28) | [x] | | P63-1 | Role-restricted emoji manage UI (v0.8.28) | [x] |
| P64-1 | Discovery mesh live sync (v0.8.29) | [x] | | P64-1 | Discovery mesh live sync (v0.8.29) | [x] |
**Next tranches (Phase 74+):** Electron live `open-url` · threads panel · server folders · activity feed. **Next tranches (Phase 75+):** Server folders · Electron live `open-url` · activity feed.
When Phase 5 checklist is `[x]`, copy open items here into tracked rows in `PLATFORM_ROADMAP.md`. When Phase 5 checklist is `[x]`, copy open items here into tracked rows in `PLATFORM_ROADMAP.md`.
@@ -162,15 +162,16 @@ When Phase 5 checklist is `[x]`, copy open items here into tracked rows in `PLAT
| P73-1 | OS `pearcord://` protocol handler (argv + register-protocol) | [x] v0.8.37 | | P73-1 | OS `pearcord://` protocol handler (argv + register-protocol) | [x] v0.8.37 |
| P74-1 | Invite deep links `pearcord://invite/...` | [x] v0.8.38 | | P74-1 | Invite deep links `pearcord://invite/...` | [x] v0.8.38 |
| P74-2 | Guild/channel deep links `pearcord://g/...` | [x] v0.8.38 | | P74-2 | Guild/channel deep links `pearcord://g/...` | [x] v0.8.38 |
| P75-1 | Threads panel (sidebar + unread + archived) | [x] v0.8.39 |
### Phase 75 — Planned parity tranche ### Phase 76 — Planned parity tranche
| ID | Item | Status | | ID | Item | Status |
|----|------|--------| |----|------|--------|
| P75-1 | Electron `open-url` when Pear appling ships custom bundle | [ ] | | P76-1 | Server folders (client-side guild grouping) | [ ] |
| P75-2 | Threads panel (sidebar + unread) | [ ] | | P76-2 | Electron `open-url` when Pear appling ships custom bundle | [ ] |
| P75-3 | Server folders (client-side grouping) | [ ] | | P76-3 | Activity / Now Playing feed (P2P presence extension) | [ ] |
| P75-4 | Activity / Now Playing feed (P2P presence extension) | [ ] | | P76-4 | Channel topic + description UI | [ ] |
## Holepunch stack references ## Holepunch stack references
+15 -1
View File
@@ -249,6 +249,19 @@ When completing work, change `[ ]` → `[x]` and add a one-line note under **Cha
--- ---
### Phase 75 — Threads panel (v0.8.39)
| ID | Item | Status |
|----|------|--------|
| P75-1 | `buildThreadsPanel` + thread unread/activity in view | [x] |
| P75-2 | Sidebar threads panel + header 🧵 button | [x] |
| P75-3 | Archived toggle + `set-threads-panel-archived` IPC | [x] |
| P75-4 | smoke-threads-panel + THREADS_PANEL.md | [x] |
**Next:** Server folders · Electron `open-url` · activity feed.
---
### Phase 74 — Invite & guild deep links (v0.8.38) ### Phase 74 — Invite & guild deep links (v0.8.38)
| ID | Item | Status | | ID | Item | Status |
@@ -258,7 +271,7 @@ When completing work, change `[ ]` → `[x]` and add a one-line note under **Cha
| P74-3 | Invite modal copy link + `format-invite-deep-link` IPC | [x] | | P74-3 | Invite modal copy link + `format-invite-deep-link` IPC | [x] |
| P74-4 | smoke-invite-deep-link + smoke-guild-deep-link + INVITE_DEEP_LINKS.md | [x] | | P74-4 | smoke-invite-deep-link + smoke-guild-deep-link + INVITE_DEEP_LINKS.md | [x] |
**Next:** Electron live `open-url` · parity tranche (threads panel, server folders). **Next:** ~~Threads panel~~ (Phase 75) · server folders · Electron `open-url`.
--- ---
@@ -923,6 +936,7 @@ When completing work, change `[ ]` → `[x]` and add a one-line note under **Cha
### Changelog ### Changelog
- **2026-05-22** — v0.8.39: threads panel (`threadsPanel` view, unread badges, archived toggle, `test:threads-panel`, THREADS_PANEL.md).
- **2026-05-22** — v0.8.38: invite + guild `pearcord://` links (`formatInviteDeepLink`, `navigateDeepLink` kinds, invite modal link, `test:invite-deep-link`, `test:guild-deep-link`). - **2026-05-22** — v0.8.38: invite + guild `pearcord://` links (`formatInviteDeepLink`, `navigateDeepLink` kinds, invite modal link, `test:invite-deep-link`, `test:guild-deep-link`).
- **2026-05-22** — v0.8.37: OS `pearcord://` handler (`pearcord-protocol`, argv launch, `register-protocol`, `test:os-deep-link`, PEARCORD_PROTOCOL.md). - **2026-05-22** — v0.8.37: OS `pearcord://` handler (`pearcord-protocol`, argv launch, `register-protocol`, `test:os-deep-link`, PEARCORD_PROTOCOL.md).
- **2026-05-22** — v0.8.36: voice lurker listen-only (`listenOnly` media plane, `joinVoiceListenOnly`, `test:voice-listen`, VOICE_LISTEN_ONLY.md). - **2026-05-22** — v0.8.36: voice lurker listen-only (`listenOnly` media plane, `joinVoiceListenOnly`, `test:voice-listen`, VOICE_LISTEN_ONLY.md).
+46
View File
@@ -0,0 +1,46 @@
# Threads panel (v0.8.39+)
Discord-style **Active Threads** sidebar for text channels: unread badges, reply counts, root snippets, and archived toggle.
## View fields
| Field | Description |
|-------|-------------|
| `threadsPanel` | Panel payload from `buildThreadsPanel()` |
| `threadsPanel.scope` | `channel` (active text parent) or `guild` (all text channels) |
| `threadsPanel.threads` | Active thread rows with `unread`, `replyCount`, `rootSnippet`, `lastActivityAt` |
| `threadsPanel.archivedThreads` | Archived rows when `threadsPanelIncludeArchived` |
| `threadsPanel.totalUnread` | Sum of thread unreads in panel scope |
| `threadsPanelIncludeArchived` | User toggle for archived list |
## Platform
| Method | Description |
|--------|-------------|
| `setThreadsPanelIncludeArchived(include)` | Show/hide archived threads in panel |
Unread uses existing `READ_STATE` per thread channel (same as text channels).
## UI
- **Channel pane** — collapsible **Threads · #channel** section under channel list
- **Chat header** — 🧵 button with unread count when threads exist
- Row click → `select-channel` (thread id)
- **Show archived** checkbox → `set-threads-panel-archived` IPC
## Module
`pearcord-threads`: `buildThreadsPanel`, `enrichThreadRow`, `sortThreadsByActivity`
## Tests
| Script | Marker |
|--------|--------|
| `npm run test:threads-panel` | `THREADS_PANEL_SMOKE_OK` |
| `npm run test:threads` | Create/archive threads |
| `npm run test:boot` | `BOOT_OK` |
## Related
- [FORUM_CHANNELS.md](./FORUM_CHANNELS.md) — forum posts use thread channels too
- Sidebar nesting via `threadsByParent`