Include receiptRetention in guild sync bundles and ingest on join. Expose
dryRunAutomationHook and dryRunAllAutomationHooks for server settings
preview without writing delivery receipts.
Co-authored-by: Cursor <[email protected]>
Wire pearcord-delivery-receipts to run enabled hooks on every APP_EVENT and
bot-bridged messageCreate. Successful deliveries gossip APP_EVENT_RECEIPT;
view exposes automationDelivery stats for server settings UI.
Co-authored-by: Cursor <[email protected]>
Hide channels denied via role or channel overwrite from view().channels,
guard selectChannel with memberCanViewChannel, and reassign activeChannelId
to the first visible text channel when the current selection becomes hidden
after loadGuild or permission gossip.
Co-authored-by: Cursor <[email protected]>
Bundle channelSettings (description + slowmode) and all topic-bearing channel
types in GUILD_SYNC; ingest into ChannelDescriptionStore on peer join. Push
mesh sync after topic/description edits. _participationMask applies channel
overwrites for send, voice join, and view.canPostInActiveChannel.
Integrate pearcord-channel-permissions: list/upsert/delete overwrites,
channel-effective _hasPerm/_myPermissions, GUILD_SYNC bundle, and mesh
ingest handlers. Requires MANAGE_CHANNELS on the active channel to edit.
Add setActivityImageFromBytes (256 KB image cap, __presence__ channel) and
readActivityImagePreview for UI thumbnails. Merges large/small image keys
into the current activity and reuses presence enrichment for P2P gossip.
Async _enrichPresenceActivity resolves large/small image keys via the
local attachments store before PRESENCE_UPDATE broadcast on guild and
contacts meshes. Updates self presence activity after enrichment.
Wire pearcord-activity buildActivityFeed into view(), extend setPresence and
add setActivity for Now Playing. Friend list rows include activity field.
Co-authored-by: Cursor <[email protected]>
Wire pearcord-server-folders into PearcordPlatform: createServerFolder,
assignGuildToFolder, collapse/rename/delete, and buildServerRailLayout on
view() as serverRail with folderColors. Persist via updateUserPrefs
serverFolders and emit user-prefs after saves.
Co-authored-by: Cursor <[email protected]>
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]>
Extend PearcordPlatform for v0.6.3 social realtime polish.
- setPresence also contacts.broadcastPresence()
- listContacts enriches accepted friends with presence/customStatus
- _guildTyping map (5s TTL) + _onGuildTyping from guild typing event
- signalTyping fans out to DM and guild.gossipTyping in guild mode
- view() typingUsers: member names in guild, peer id in DM
- friend-presence IPC event for UI status dots
Co-authored-by: Cursor <[email protected]>
_initDmSession with Hyperswarm keypair, gossip group channel on create,
view fields dmIsGroup and dmParticipantIds.
Co-authored-by: Cursor <[email protected]>
stageGuildEmojiImage on __emoji__ channel, upsertGuildEmoji with image blob,
gossip ATTACHMENT_META with EMOJI_UPSERT, readEmojiImage for UI IPC.
Co-authored-by: Cursor <[email protected]>