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:
@@ -32,6 +32,7 @@ Pearcord validates itself without manual QA.
|
||||
| `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: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:bot-events` | Bot event fanout (`BOT_EVENTS_SMOKE_OK`) |
|
||||
| `npm run test:contacts` | Friend request gossip + accept (`CONTACTS_SMOKE_OK`) |
|
||||
|
||||
@@ -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-thread` | `messageId`, `name?` | Thread channel under active text channel |
|
||||
| `archive-thread` | `threadId`, `archived?` | Archive / unarchive thread |
|
||||
| `set-threads-panel-archived` | `includeArchived` | Show archived threads in panel |
|
||||
| `toggle-reaction` | `messageId`, `emoji` | Toggle 👍/❤️/😂 reaction + gossip |
|
||||
| `select-home` | — | Leave mesh, show DM home |
|
||||
| `send-friend-request` | `peerUserId`, `peerDisplayName?` | Send P2P friend request |
|
||||
|
||||
+1
-1
@@ -28,7 +28,7 @@
|
||||
| `pearcord-discovery` | `modules/pearcord-discovery` | Local directory + P2P public listings mesh |
|
||||
| `pearcord-embed` | `modules/pearcord-embed` | OpenGraph fetch + cache |
|
||||
| `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-drive` | `modules/pearcord-drive` | Per-guild Hyperdrive keys |
|
||||
| `pearcord-moderation` | `modules/pearcord-moderation` | Timeouts / communication disabled |
|
||||
|
||||
+7
-6
@@ -145,7 +145,7 @@ Phases **0–2** and **4** are largely complete; **3** (live audio) and **5** (n
|
||||
| P63-1 | Role-restricted emoji manage UI (v0.8.28) | [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`.
|
||||
|
||||
@@ -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 |
|
||||
| P74-1 | Invite deep links `pearcord://invite/...` | [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 |
|
||||
|----|------|--------|
|
||||
| P75-1 | Electron `open-url` when Pear appling ships custom bundle | [ ] |
|
||||
| P75-2 | Threads panel (sidebar + unread) | [ ] |
|
||||
| P75-3 | Server folders (client-side grouping) | [ ] |
|
||||
| P75-4 | Activity / Now Playing feed (P2P presence extension) | [ ] |
|
||||
| P76-1 | Server folders (client-side guild grouping) | [ ] |
|
||||
| P76-2 | Electron `open-url` when Pear appling ships custom bundle | [ ] |
|
||||
| P76-3 | Activity / Now Playing feed (P2P presence extension) | [ ] |
|
||||
| P76-4 | Channel topic + description UI | [ ] |
|
||||
|
||||
## Holepunch stack references
|
||||
|
||||
|
||||
+15
-1
@@ -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)
|
||||
|
||||
| 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-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
|
||||
|
||||
- **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.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).
|
||||
|
||||
@@ -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`
|
||||
Reference in New Issue
Block a user