joinVoiceChannel auto-upgrades lurkers to listen-only; joinVoiceListenOnly
is explicit. Blocks unmute, soundboard, screen share, and mic capture when
listen-only. View exposes canJoinVoiceListenOnly, voiceMedia.listenOnly,
and listenOnly on voiceStatesByChannel. Audit VOICE_JOIN_LISTEN.
Co-authored-by: Cursor <[email protected]>
Parse pearcord:// URLs, load guild or openGroupDM context, then
jumpToMessage for notification and share-link flows.
Co-authored-by: Cursor <[email protected]>
Add resolveMessageJump and jumpToMessage so the UI can navigate to
reply parents in other text/DM channels before scrolling and highlighting.
Co-authored-by: Cursor <[email protected]>
Wire pearcord-guild-roles for create/update/delete roles, member assignments,
_hasPerm enforcement, GUILD_SYNC role bundles, and view.guildCustomRoles for UI.
Co-authored-by: Cursor <[email protected]>
- _buildGuildSyncBundle includes full members[] from listMembers()
- _ingestGuildSync upserts member rows and emits member for UI refresh
- _pushGuildSyncToMesh runs when messages or members exist (not messages-only)
Late joiners and reconnecting peers receive roster + roles over live mesh.
Co-authored-by: Cursor <[email protected]>
Expose setGuildEmojiAllowedRoles for mods, _usableGuildEmojis/_usableEmojiMap
for picker rendering, and view fields usableGuildEmojis + guildEmojiRoleOptions.
emojisByPack and emojiMap respect member role restrictions. Phase 63 / v0.8.28.
Co-authored-by: Cursor <[email protected]>
Add _buildGuildSyncBundle (50 msgs/channel, attachment meta),
_pushGuildSyncToMesh on peer join and remote MEMBER_JOIN, and
_ingestGuildSync with channel/attachment/message dedupe.
Joining members receive prior channel history without per-message
replay. Phase 61 / v0.8.26.
Co-authored-by: Cursor <[email protected]>
Pass guild boost level into emojiRegistry.upsert for slot enforcement.
Expose getGuildEmojiSlots() and view.guildEmojiSlots for server settings UI.
Co-authored-by: Cursor <[email protected]>
The pearcord-platform symlink was created by a mistaken git add and would
break clones; keep only index.js and package.json at module root.
Co-authored-by: Cursor <[email protected]>
Add pearcord-message-layout dependency and messageLayoutKind() so each
message in view() carries messageLayout: text | sticker-only | combo | hub.
Combo rows keep displayContent for caption text while sticker-only and hub
mirrors still clear displayContent for legacy render paths.
Depends on [email protected] for classifyMessageLayout().
Co-authored-by: Cursor <[email protected]>
Normalize stickerNames against guild registry, skip automod on empty text,
enrich messages from stickerNamesJson after DB read, sticker-only
displayContent, previewPlaintext for notifications, guild search haystack.
Co-authored-by: Cursor <[email protected]>
Any guild member may contribute boosts via personal slots (not Manage Guild).
Extract _gossipGuildBoostState for shared gossip after add/contribute. Expose
myBoostSlots on view for server settings UI (used, remaining, canContribute).
Co-authored-by: Cursor <[email protected]>
Before inserting a remote hub mirror, check announcementHub.isDuplicateMirror
for the source messageId and record markMirrored after a successful insert.
Prevents duplicate 📡 mirror lines when ANNOUNCEMENT_HUB_POST is received twice.
Co-authored-by: Cursor <[email protected]>
platform.ready() no longer awaits Hyperswarm discovery/contacts or guild
mesh join before returning. Local identity and guild list restore in ~ms;
_finishSessionStartup() runs meshes in the background and emits session-ready.
Co-authored-by: Cursor <[email protected]>
Default storagePath via pearcord-identity resolveStoragePath(). Mark storage
on ready/register so identity persists across pear run restarts.
Co-authored-by: Cursor <[email protected]>
Attribute boosts to the acting user, gossip GUILD_BOOST_LEDGER_APPEND, and
ingest ledger rows from peers. guildBoost view includes ledger array.
Co-authored-by: Cursor <[email protected]>
Wire pearcord-announcement-hub: setAnnouncementHubPublish,
subscribeRemoteAnnouncementHub, _publishAnnouncementHub on send,
_ingestAnnouncementHubPost from discovery gossip, and view fields for UI.
Depends on pearcord-announcement-hub via file: for local dev.
Co-authored-by: Cursor <[email protected]>
Initialize sticker registry per guild, upsertGuildSticker with Hyperdrive
staging, readStickerImage previews, gossip ingest, and expose
guildStickers in platform.view() for the composer picker.
Integrate PearcordBoosts with lazy module init, gossip ingest on
guild-boost, addGuildBoost/setGuildBoostBannerColor/getGuildBoost with
Manage Guild permission checks, audit guild.boost entries, and expose
guildBoost in platform.view() for UI accents and server settings.
Mirror announcement posts to configured text channels via P2P gossip,
per-user follow with announcement notifications, server settings APIs,
and view fields for UI.
Co-authored-by: Cursor <[email protected]>
Integrate ScreenShareHub on guild voice init, broadcast frames over mesh,
auto-stop on voice leave, startScreenShare/stopScreenShare APIs, and
screenShare snapshot in view().
Co-authored-by: Cursor <[email protected]>
Forward VoiceMediaHub audio-frame events to guild.sendVoiceMedia so live
Opus/pcm frames fan out to all peers in the voice channel. Emit voice-media
on audio activity for UI refresh.
Co-authored-by: Cursor <[email protected]>
Integrate pearcord-automod: pre-send check in _sendPlainMessage,
setAutomodConfig/getAutomodConfig with MANAGE_GUILD gate, P2P gossip
handler, automodConfig in view(), and _ensureGuildModules() so forum,
stage, and automod initialize on loadGuild/join/create paths.
Co-authored-by: Cursor <[email protected]>
Integrate pearcord-stage with voice occupancy: joinStageChannel sets
audience/speaker roles and auto-mutes audience; requestStageSpeak,
approveStageSpeaker, demoteStageSpeaker with STAGE_SPEAKER_UPDATE gossip.
Clear stage role on voice leave. View exposes stageRolesByChannel,
myStageRole, and stagePendingRequests. Include stage in voice occupancy
snapshots.
Co-authored-by: Cursor <[email protected]>
Add _assertSlowmodeFor and _recordSlowmodeFor so createForumPost rate-limits on
the forum channel id before switching into the post thread. Include forum
channels in channelSettings snapshot for header slowmode badge.
Co-authored-by: Cursor <[email protected]>
Create forum posts as threads with starter messages, gossip channel create/
update, audit forum.post.create, and expose sorted forumPosts when a forum
channel is active. Block typing on forum channels.
Co-authored-by: Cursor <[email protected]>
Wire pearcord-step-up into bootstrap and view snapshot (stepUpPinSet,
stepUpUnlocked). Add setStepUpPin, verifyStepUpPin, clearStepUpPin, and
_assertStepUp before moderation and bot-admin APIs. Depends on pearcord-step-up.
Co-authored-by: Cursor <[email protected]>
When marking a DM channel read, fan out CHANNEL_READ on the DM mesh.
Expose dmPeerReadAt and dmReadByUser on view() for Seen UI.
Co-authored-by: Cursor <[email protected]>
Extend guild typing for thread channels (v0.6.6 Phase 20).
- _buildThreadTypingByParent for sidebar typing pills on thread rows
- view.threadTypingByParent with displayNames per active thread
- Block sendMessage in archived threads (_assertChannelWritable)
- signalTyping no-op when active thread is archived
- Reuse memberNameById for voice + thread typing maps
Co-authored-by: Cursor <[email protected]>
Add setDiscoveryFilter() and expose filteredPublicListings,
discoveryFilter on view() for Explore UI and autonomous smokes.
Co-authored-by: Cursor <[email protected]>
Pass customStatus through to PearcordPresence.setStatus so IPC and
contacts.broadcastPresence can sync status text to friends.
Co-authored-by: Cursor <[email protected]>