Commit Graph
66 Commits
Author SHA1 Message Date
Raven ScottandCursor 41a0adf295 feat(automations): export/import manifest and GUILD_SYNC hooks slice
Wire pearcord-automation-export: list/upsert/delete hooks, exportAutomationManifest,
importAutomationManifest, mesh gossip ingest, and automationHooks in view().

Co-authored-by: Cursor <[email protected]>
2026-05-22 03:20:15 -04:00
Raven ScottandCursor 23a1c999d6 feat(automations): APP_EVENT fanout and createAppListener
Wire pearcord-app-events on guild open: bridge bot payloads, fanout channel
permission and custom-role changes, gossip APP_EVENT to mesh, and expose
view.appEvents snapshot for debugging.

Co-authored-by: Cursor <[email protected]>
2026-05-22 03:15:08 -04:00
Raven ScottandCursor 11401afe9e feat(permissions): filter guild channels by VIEW_CHANNEL in view()
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]>
2026-05-22 03:11:22 -04:00
Raven Scott 489d5c6a90 feat(platform): enforce voice/stage permissions per channel (Phase 85)
joinVoiceChannel requires CONNECT_VOICE; missing SPEAK_IN_VOICE forces
listen-only. joinStageChannel uses channel-effective MANAGE_CHANNELS for
mods. view().voicePermsByChannel maps connect/speak/listenOnly per channel.
2026-05-22 03:07:32 -04:00
Raven Scott 5c4b6c1ed4 feat(platform): GUILD_SYNC channel meta + SEND_MESSAGES enforcement
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.
2026-05-22 03:02:43 -04:00
Raven Scott 30f27c515a feat(platform): per-channel permission overwrites (Phase 82)
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.
2026-05-22 02:56:26 -04:00
Raven Scott 0513f4df88 feat(platform): upload activity images via Hyperdrive staging
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.
2026-05-22 02:51:19 -04:00
Raven Scott ceddeb42fd feat(platform): enrich presence gossip with activity asset attachments
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.
2026-05-22 02:48:31 -04:00
Raven Scott ad99fa78f9 feat(platform): channel topic/description with description sidecar
Wire pearcord-channel-meta: setChannelTopic updates channels + gossip;
setChannelDescription uses ChannelDescriptionStore (always initialized in
ready()) while slowmode stays in HyperDB. Ingest remote CHANNEL_SETTINGS
into the sidecar. view().activeChannelSummary uses buildChannelSummary.
2026-05-22 02:45:09 -04:00
Raven ScottandCursor 05bfce0955 feat(platform): activityFeed view, setActivity, and presence gossip
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]>
2026-05-22 02:37:23 -04:00
Raven ScottandCursor 893f518045 feat(platform): server folders in view and user-prefs CRUD
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]>
2026-05-22 02:27:28 -04:00
Raven ScottandCursor 15f162cd73 feat(platform): threadsPanel view + setThreadsPanelIncludeArchived (Phase 75)
Compute threadLastActivity, root message snippets, and threadsPanel payload
for UI sidebar. Exposes threadsPanelIncludeArchived toggle via channel emit.

Co-authored-by: Cursor <[email protected]>
2026-05-22 02:22:41 -04:00
Raven ScottandCursor ab20375f9d feat(platform): navigateDeepLink for invite join and guild routes (Phase 74)
navigateDeepLink handles invite (joinInvite), guild-channel (load +
selectChannel), guild-only, and message kinds. Exposes formatInviteDeepLink
and formatGuildDeepLink for UI copy/share flows.

Co-authored-by: Cursor <[email protected]>
2026-05-22 02:18:37 -04:00
Raven ScottandCursor 44e36ee6ac feat(platform): voice lurker listen-only join and guards (Phase 72)
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]>
2026-05-22 02:10:41 -04:00
Raven ScottandCursor fd70fa4df6 feat(navigation): navigateDeepLink and formatMessageDeepLink APIs
Parse pearcord:// URLs, load guild or openGroupDM context, then
jumpToMessage for notification and share-link flows.

Co-authored-by: Cursor <[email protected]>
2026-05-22 02:05:02 -04:00
Raven ScottandCursor 414132f717 feat(guild): enforce lurker read-only across send, react, and voice
- setMemberRole accepts lurker; _assertCanParticipate guards writes
- canPostInActiveChannel false for lurkers without custom role perms
- Blocks joinVoiceChannel, toggleReaction, and message edits for lurkers

Co-authored-by: Cursor <[email protected]>
2026-05-22 02:00:12 -04:00
Raven ScottandCursor ea21235813 feat(messages): cross-channel jump-to-reply resolution
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]>
2026-05-22 01:55:16 -04:00
Raven ScottandCursor 593cb1ec6c feat(guild): P2P guild icon upload, preview, and sync extensions
- setGuildIconImage stages on __guild-icon__ channel (256 KB image cap)
- readGuildIconPreview with attach-mesh prefetch reuse
- GUILD_UPDATE gossip enriched via enrichGuildUpdateGossip
- GUILD_SYNC bundle includes guild snapshot + icon attachment row
- ingest guild iconHash on sync; push sync when icon present

Co-authored-by: Cursor <[email protected]>
2026-05-22 01:52:42 -04:00
Raven ScottandCursor 22de3514ca feat(platform): custom guild roles and permission editor integration (v0.8.31)
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]>
2026-05-22 01:48:30 -04:00
Raven ScottandCursor bd3548986e feat(platform): GUILD_SYNC member roster ingest and push (v0.8.30)
- _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]>
2026-05-22 01:42:30 -04:00
Raven ScottandCursor 7a23b528db feat(emoji): setGuildEmojiAllowedRoles and usable emoji view filtering
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]>
2026-05-22 00:46:22 -04:00
Raven ScottandCursor 86ef33115f feat(guild): ingest GUILD_SYNC history on mesh join
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]>
2026-05-22 00:37:59 -04:00
Raven ScottandCursor 5f7d8b460c feat(attachments): expose fetchSource on preview and mesh retry
Add readAttachmentBytesWithSource so callers know whether bytes came from
local staging, drive-local, protomux attach-mesh, or hyperdrive replication.

readAttachmentPreview now returns fetchSource for UI and smokes.
_fetchAttachMeshWithRetry mirrors banner prefetch (14s timeout + 600ms retry
when attach sessions exist). Banner prefetch uses the same retry helper.

Phase 60 / v0.8.25 — Pear attach preview mesh path.

Co-authored-by: Cursor <[email protected]>
2026-05-22 00:36:15 -04:00
Raven ScottandCursor 018291aaa5 feat(platform): guildEmojiSlots view and boost-aware emoji upsert
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]>
2026-05-22 00:30:53 -04:00
Raven ScottandCursor b8badff7b1 feat(platform): guild voice soundboard upsert, play, and view state (v0.8.21)
Integrate pearcord-soundboard: stage WAV attachments, upsert/remove registry rows,
gossip SOUND_UPSERT/SOUND_PLAY, playSoundboardSound with voice-plane injection,
remote play ingest on guild-sound-play, and expose guildSounds/recentSoundPlays
on platform.view(). Depends on pearcord-soundboard file dep.

Co-authored-by: Cursor <[email protected]>
2026-05-22 00:19:46 -04:00
Raven ScottandCursor 7635295cfb feat(platform): forum archive search and show-archived toggle (v0.8.20)
Add searchForumPosts, setForumIncludeArchived, forum search scope in
_resolveSearchResults (fix channel db.get with guildId), guild search thread
titles, and pearcord-forum-search dependency.

Co-authored-by: Cursor <[email protected]>
2026-05-22 00:13:51 -04:00
Raven ScottandCursor 24ba5b1f45 fix(profile): prefetch banner bytes over mesh before drive read (v0.8.19)
_ensureBannerAttachmentReady calls _prefetchBannerFromPeers when guild
mesh is active. _gossipProfileCosmetics awaits guild gossip broadcast.

Supports Phase 54 live peer banner fetch in PearcordPlatform.

Co-authored-by: Cursor <[email protected]>
2026-05-22 00:07:20 -04:00
Raven ScottandCursor d14fc164f5 feat(stickers): stage Lottie JSON and pass format to sticker registry (v0.8.18)
stageGuildStickerImage detects Lottie via pearcord-lottie, stores
application/lottie+json attachments, and upsertGuildSticker forwards
image bytes for validateSticker. Supports Phase 52 vector stickers.

Co-authored-by: Cursor <[email protected]>
2026-05-21 23:48:30 -04:00
Raven ScottandCursor 0ff4d29ed1 feat(profile): remote peer banner preview over P2P attachment meta (v0.8.17)
Phase 51 — remote profile banners:
- pearcord-profile-assets: embed bannerAttachment on PROFILE_COSMETIC gossip
- _gossipProfileCosmetics enriches payload; _ingestPeerCosmetics ingests meta
- readPeerProfileBannerPreview(userId) + _ensureBannerAttachmentReady
- _prefetchBannerFromPeers for guild mesh byte fallback

Peers can render banner images after cosmetics sync without a central CDN.

Co-authored-by: Cursor <[email protected]>
2026-05-21 23:43:37 -04:00
Raven ScottandCursor 8e56c82945 chore: remove accidental self-referential symlink from repo root
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]>
2026-05-21 23:38:09 -04:00
Raven ScottandCursor b9393ea45c feat(view): expose messageLayout for sticker+text combo bodies (v0.8.16)
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]>
2026-05-21 23:37:59 -04:00
Raven ScottandCursor 7edc64dc6a feat(platform): profile banner image upload with boost perk gate
Add setProfileBannerImage (512 KB max, upload_cosmetic perk) staging
to Hyperdrive attachments, gossip ATTACHMENT_META, and
readProfileBannerPreview for UI and hub author thumbnails.

Co-authored-by: Cursor <[email protected]>
2026-05-21 23:34:09 -04:00
Raven ScottandCursor 3899ff9a7f feat(platform): profile cosmetics save, gossip, and cosmeticsByUserId view
Integrate pearcord-profile-cosmetics with boost perk gates, guild and
contacts fanout, peer cache, profile modal IPC, and mesh join on settings swarm.

Co-authored-by: Cursor <[email protected]>
2026-05-21 23:30:28 -04:00
Raven ScottandCursor a8027178c6 feat(platform): rich hub mirror cards on ingest and in view/search
Integrate pearcord-hub-cards: build card on ANNOUNCEMENT_HUB_POST ingest,
hubMirrorJson on insert, enrichMessageRow for UI, hub-only displayContent,
authorAvatarHash in discovery payload, search haystack includes card text.

Co-authored-by: Cursor <[email protected]>
2026-05-21 23:25:40 -04:00
Raven ScottandCursor 195fec9026 feat(platform): sticker-only send, validation, view enrich, search
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]>
2026-05-21 23:20:14 -04:00
Raven ScottandCursor 8cec894657 feat(platform): emoji pack APIs and emojisByPack view fields
Expose upsertEmojiPack, removeEmojiPack, guild emoji pack gossip ingest,
and view enrichment (guildEmojiPacks, emojisByPack) for desktop UI.

Co-authored-by: Cursor <[email protected]>
2026-05-21 23:14:28 -04:00
Raven ScottandCursor 45571368a3 feat(platform): contributeGuildBoost for members + myBoostSlots view
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]>
2026-05-21 23:08:50 -04:00
Raven ScottandCursor c5f971a756 fix(platform): skip duplicate announcement hub mirrors on re-gossip
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]>
2026-05-21 23:04:43 -04:00
Raven ScottandCursor 9adffdd408 feat(platform): sticker pack APIs, gossip ingest, and view fields
Add upsertStickerPack, removeStickerPack, and listStickerPacks for mods with
Manage Guild. Upsert stickers accepts optional packName. View exposes
guildStickerPacks and stickersByPack for UI grouping. Pack changes re-gossip
member stickers so peers stay consistent.

Co-authored-by: Cursor <[email protected]>
2026-05-21 22:57:26 -04:00
Raven ScottandCursor 57bed4951b fix(platform): unblock UI by deferring P2P mesh startup after session restore
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]>
2026-05-21 22:53:12 -04:00
Raven ScottandCursor fd4f8a1932 fix(platform): use ~/.config/pearcord default storage + onboarded marker
Default storagePath via pearcord-identity resolveStoragePath(). Mark storage
on ready/register so identity persists across pear run restarts.

Co-authored-by: Cursor <[email protected]>
2026-05-21 22:44:15 -04:00
Raven ScottandCursor ffd405727e feat(platform): record booster on addGuildBoost and sync ledger gossip
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]>
2026-05-21 22:33:59 -04:00
Raven ScottandCursor 7577984266 feat(platform): remote announcement hub publish and ingest (v0.8.5)
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]>
2026-05-21 22:30:52 -04:00
Raven Scott e75ed08dfc feat(platform): wire pearcord-stickers APIs and view.guildStickers
Initialize sticker registry per guild, upsertGuildSticker with Hyperdrive
staging, readStickerImage previews, gossip ingest, and expose
guildStickers in platform.view() for the composer picker.
2026-05-21 22:26:41 -04:00
Raven Scott 881fbfae4b feat(platform): wire DisplayCaptureFeed and ingestDisplayCapture
Attach display capture feed to ScreenShareHub, reset on voice leave/stop
share, and accept base64 JPEG frames from the Pear UI for P2P screen share.
2026-05-21 22:22:17 -04:00
Raven Scott 0ec5bbfe56 feat(platform): wire VoiceCaptureFeed and ingestVoiceCapture API
Attach capture feed to VoiceMediaHub on guild load, reset on voice leave,
and accept base64 PCM chunks from the Pear UI for live microphone send.
2026-05-21 22:17:17 -04:00
Raven Scott 35ee850d17 feat(platform): wire pearcord-boosts APIs and view.guildBoost
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.
2026-05-21 22:14:34 -04:00
Raven ScottandCursor 3f614a5c9c feat(platform): v0.8.0 announcement follow and cross-post
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]>
2026-05-21 22:07:25 -04:00
Raven ScottandCursor d000ac43d6 feat(platform): v0.7.9 screen share start/stop in voice channels
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]>
2026-05-21 22:03:16 -04:00
Raven ScottandCursor dabdaaa7e2 feat(platform): wire voice audio-frame broadcast on guild voice mesh
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]>
2026-05-21 21:59:48 -04:00
Raven ScottandCursor 3eff053cf8 feat(platform): v0.7.7 automod enforcement and guild module bootstrap
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]>
2026-05-21 21:54:57 -04:00
Raven ScottandCursor 52be3813ab feat(platform): v0.7.6 stage channels — join, request speak, mod approve
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]>
2026-05-21 21:50:05 -04:00
Raven ScottandCursor d39a1e6962 feat(platform): v0.7.5 announcement channels — mod-only post and typing gates
Wire CHANNEL_TYPES.ANNOUNCEMENT through channel settings, search, unread,
and view.canPostInActiveChannel. _assertAnnouncementPost() requires
MANAGE_MESSAGES for sendMessage/createForumPost paths; block TYPING_START
for non-moderators. Integrates pearcord-threads isAnnouncementChannel().

Co-authored-by: Cursor <[email protected]>
2026-05-21 21:42:59 -04:00
Raven ScottandCursor 0716dfc692 feat(platform): apply channel slowmode to forum new-post creation (v0.7.4)
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]>
2026-05-21 21:37:37 -04:00
Raven ScottandCursor 165f42e51b feat(platform): forum tags module, palette, filter, and createForumPost tags
Co-authored-by: Cursor <[email protected]>
2026-05-21 21:34:42 -04:00
Raven ScottandCursor 6eca466781 feat(platform): createForumPost API and forumPosts view snapshot
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]>
2026-05-21 21:30:12 -04:00
Raven ScottandCursor 6dadc18c51 feat(platform): gate kick, ban, and bot install tokens behind step-up PIN
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]>
2026-05-21 21:24:24 -04:00
Raven ScottandCursor ab31c97441 feat(platform): gossip DM read receipts on markChannelRead
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]>
2026-05-21 21:16:54 -04:00
Raven ScottandCursor 031b5ffa71 feat(platform): pruneDiscoveryListings wrapper
Expose discovery.pruneStaleListings for future IPC; listing reads
already auto-prune via listPublicListings in view().

Co-authored-by: Cursor <[email protected]>
2026-05-21 21:14:23 -04:00
Raven ScottandCursor 200f2e54b5 feat(platform): setGuildDiscoveryTags and discovery tag filter
Wire discovery tags through platform view and IPC.

- setGuildDiscoveryTags re-announces public listing when listed
- setDiscoveryFilter accepts tag; view.discoveryAllTags
- _refreshDiscoveryAnnouncements includes guild tags

Co-authored-by: Cursor <[email protected]>
2026-05-21 21:12:53 -04:00
Raven ScottandCursor 9d089e2dda feat(platform): thread channel typing hints and archived guards
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]>
2026-05-21 21:10:26 -04:00
Raven ScottandCursor 11b0346e17 feat(platform): discovery filter state in view
Add setDiscoveryFilter() and expose filteredPublicListings,
discoveryFilter on view() for Explore UI and autonomous smokes.

Co-authored-by: Cursor <[email protected]>
2026-05-21 21:07:54 -04:00
Raven ScottandCursor ee460f6ee2 feat(platform): setPresence accepts optional customStatus
Pass customStatus through to PearcordPresence.setStatus so IPC and
contacts.broadcastPresence can sync status text to friends.

Co-authored-by: Cursor <[email protected]>
2026-05-21 21:05:23 -04:00
Raven ScottandCursor 913149cc2a feat(platform): friend presence and guild channel typing in view
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]>
2026-05-21 21:03:46 -04:00
Raven ScottandCursor 7dcb5875ca feat(platform): v0.6.2 createGroupDM and openGroupDM APIs
_initDmSession with Hyperswarm keypair, gossip group channel on create,
view fields dmIsGroup and dmParticipantIds.

Co-authored-by: Cursor <[email protected]>
2026-05-21 20:59:54 -04:00
Raven ScottandCursor 4e9afd18d6 feat(platform): v0.6.1 image guild emoji staging and preview API
stageGuildEmojiImage on __emoji__ channel, upsertGuildEmoji with image blob,
gossip ATTACHMENT_META with EMOJI_UPSERT, readEmojiImage for UI IPC.

Co-authored-by: Cursor <[email protected]>
2026-05-21 20:56:45 -04:00