Commit Graph
100 Commits
Author SHA1 Message Date
Raven ScottandCursor c36c5799e4 feat(platform): updateGuildSettings nsfwGateEnabled (v0.8.174)
Expose server-wide age-restricted gate toggle through updateGuildSettings and
include nsfwGateEnabled in guild view snapshots for UI gate logic.

Co-authored-by: Cursor <[email protected]>
2026-05-22 22:48:40 -04:00
Raven ScottandCursor 25a4a48a1e Add setChannelNsfw for age-restricted channel marking
Manage Channels permission updates nsfw flag with audit log and channel gossip.

Co-authored-by: Cursor <[email protected]>
2026-05-22 22:35:53 -04:00
Raven ScottandCursor df0060623c Expose slowmode remaining and voice user limit APIs
Compute slowmodeRemainingSec for composer UI, setChannelUserLimit, and capacity checks on voice/stage join.

Co-authored-by: Cursor <[email protected]>
2026-05-22 22:25:38 -04:00
Raven ScottandCursor aa91e1a0ff Expose emoji-only layout and renameChannel for GUI
messageLayoutKind returns emoji-only; renameChannel gossips category/channel name updates for inline sidebar rename.

Co-authored-by: Cursor <[email protected]>
2026-05-22 22:17:44 -04:00
Raven ScottandCursor 21a5f7984b feat(platform): include custom role names in mentionNames (v0.8.170)
Role @mentions in composer autocomplete highlight in message rendering.

Co-authored-by: Cursor <[email protected]>
2026-05-22 22:05:57 -04:00
Raven ScottandCursor 45cf74ec42 feat(platform): moveChannelToParent with gossip and audit (v0.8.168)
Expose channel parent moves for Manage Channels permission holders.

Co-authored-by: Cursor <[email protected]>
2026-05-22 21:55:29 -04:00
Raven ScottandCursor dff4064efe feat(platform): setChannelMuteDuration and notification level cleanup
Wire timed mute IPC and clear channelMuteUntil when setting permanent
notification levels.

Co-authored-by: Cursor <[email protected]>
2026-05-22 21:45:06 -04:00
Raven ScottandCursor 91d7e3abc9 feat(platform): channel open read snapshot and role reorder API
Expose activeChannelLastReadAt from pre-mark read cursor for unread
divider UI and add reorderGuildCustomRoles with ROLE_UPSERT gossip.

Co-authored-by: Cursor <[email protected]>
2026-05-22 21:37:58 -04:00
Raven ScottandCursor c768d9fe3b feat(platform): setChannelNotificationLevel for guild channel prefs
Wire per-channel notification overrides with mutedChannelIds sync and
mesh gossip via notification prefs.

Co-authored-by: Cursor <[email protected]>
2026-05-22 21:20:30 -04:00
Raven ScottandCursor 7d899fb655 feat(platform): reorderCategories with permissions and gossip
Expose category reorder for MANAGE_CHANNELS holders with audit logging
and mesh gossip for each moved category row.

Co-authored-by: Cursor <[email protected]>
2026-05-22 21:08:23 -04:00
Raven ScottandCursor 8bfae6e3c2 feat(platform): reorderChannelsInParent with permission and gossip
Wire guild channel reorder for MANAGE_CHANNELS holders, gossip
CHANNEL_UPDATE per moved channel, and audit channel.reorder events.

Co-authored-by: Cursor <[email protected]>
2026-05-22 21:03:25 -04:00
Raven ScottandCursor 3438c3d252 docs: v0.8.158 dual combo buckets highest on guild open
Document guild channel pick when two mention+plain parent buckets compete;
smoke test:guild-dual-combo-buckets-highest.

Co-authored-by: Cursor <[email protected]>
2026-05-22 20:42:16 -04:00
Raven ScottandCursor d4a5b1afc3 docs: v0.8.157 plain bucket beats triple combo on guild open
Document guild channel pick when one heavy plain-only category outscores
three mention+plain combo categories; smoke test:guild-plain-beats-triple-combo.

Co-authored-by: Cursor <[email protected]>
2026-05-22 20:39:22 -04:00
Raven ScottandCursor 1c2f03d031 docs: v0.8.156 triple combo buckets highest on guild open
Document guild channel pick when three mention+plain parent buckets compete;
smoke test:guild-triple-combo-buckets-highest.

Co-authored-by: Cursor <[email protected]>
2026-05-22 20:37:05 -04:00
Raven ScottandCursor fb3df3d835 docs: v0.8.155 triple plain bucket wins on guild open
Document guild channel pick when three plain-only parent buckets compete;
smoke test:guild-triple-plain-bucket-pick.

Co-authored-by: Cursor <[email protected]>
2026-05-22 20:33:11 -04:00
Raven ScottandCursor 9dcc4a751a docs: v0.8.154 combo bucket beats heavy plain on guild open
Document guild channel pick when mention+plain parent score exceeds
a higher plain-only bucket; smoke test:guild-combo-beats-plain-bucket.

Co-authored-by: Cursor <[email protected]>
2026-05-22 20:30:19 -04:00
Raven ScottandCursor 846aae78cd docs: v0.8.153 plain bucket wins equal combo on minPos tie
Document guild-open bucket selection when mention+plain and plain-only
totals match and lower channel position breaks the tie.

Co-authored-by: Cursor <[email protected]>
2026-05-22 20:26:35 -04:00
Raven ScottandCursor 3e09637234 docs: v0.8.152 dual plain-only parent bucket pick
Document guild-open selection when two plain-only categories compete by
unread total.

Co-authored-by: Cursor <[email protected]>
2026-05-22 20:22:06 -04:00
Raven ScottandCursor 98a7a92733 docs: v0.8.151 plain-only bucket beats lighter combo on guild open
Document parent-bucket selection when plain unread total exceeds a
mention+plain combo bucket score.

Co-authored-by: Cursor <[email protected]>
2026-05-22 20:20:01 -04:00
Raven ScottandCursor 1aeeb97887 docs: v0.8.150 triple combo bucket highest total wins
Document guild-open selection among three mention+plain parent buckets.

Co-authored-by: Cursor <[email protected]>
2026-05-22 20:17:35 -04:00
Raven ScottandCursor 28b4ae4c81 docs: v0.8.149 equal combo bucket minPos tie-break
Document guild-open selection when two mention+plain buckets share the same
total score and lower minimum channel position wins.

Co-authored-by: Cursor <[email protected]>
2026-05-22 20:15:24 -04:00
Raven ScottandCursor 557d4d6a35 docs: v0.8.148 combo beats plain-only at equal plain unread
Document guild-open bucket selection when mention weight breaks a tie
between equal plain-unread totals across categories.

Co-authored-by: Cursor <[email protected]>
2026-05-22 20:13:03 -04:00
Raven ScottandCursor a644eb1e49 docs: v0.8.147 dual combo bucket pick smoke
Document that the higher mention+plain parent-bucket total wins when two
categories both have combined unread.

Co-authored-by: Cursor <[email protected]>
2026-05-22 20:10:16 -04:00
Raven ScottandCursor 6c17e43a6c docs: v0.8.146 mention+plain bucket pick smoke
Document that a category with one mention plus plain unread beats a higher
plain-only bucket in another category on guild open.

Co-authored-by: Cursor <[email protected]>
2026-05-22 20:07:05 -04:00
Raven ScottandCursor 143d63f345 docs: note root plain bucket beats dual mention categories (v0.8.145)
Co-authored-by: Cursor <[email protected]>
2026-05-22 19:57:18 -04:00
Raven ScottandCursor 67b935e7fe docs: note mention triple-bucket beats plain totals (v0.8.144)
Co-authored-by: Cursor <[email protected]>
2026-05-22 19:54:52 -04:00
Raven ScottandCursor 63166b1e5f docs: note three-way equal bucket minPos pick (v0.8.143)
Co-authored-by: Cursor <[email protected]>
2026-05-22 19:52:49 -04:00
Raven ScottandCursor 936f835c97 docs: note equal minPos bucket order tie-break (v0.8.142)
Co-authored-by: Cursor <[email protected]>
2026-05-22 19:50:15 -04:00
Raven ScottandCursor 33fc374096 docs: note equal bucket minPos tie includes root (v0.8.141)
Co-authored-by: Cursor <[email protected]>
2026-05-22 19:47:03 -04:00
Raven ScottandCursor f7ff17718f feat(platform): removeSearchRecent and root mention bucket pick (v0.8.140)
Expose removeSearchRecent to drop guild-scoped recent queries from prefs.
Document root mention bucket beating higher plain category unread.

Co-authored-by: Cursor <[email protected]>
2026-05-22 19:41:52 -04:00
Raven ScottandCursor 924e9fdb61 docs: note mention bucket beats plain root unread (v0.8.139)
Co-authored-by: Cursor <[email protected]>
2026-05-22 19:37:16 -04:00
Raven ScottandCursor 6f84d0a095 docs: note mixed parent-bucket guild channel pick (v0.8.138)
Co-authored-by: Cursor <[email protected]>
2026-05-22 19:34:00 -04:00
Raven ScottandCursor 2b1d810ca2 docs: note dual-category guild channel isolation pick (v0.8.137)
Co-authored-by: Cursor <[email protected]>
2026-05-22 19:30:08 -04:00
Raven ScottandCursor 3ac71d4a01 docs: note mention wins in single-category guild channel pool (v0.8.136)
Co-authored-by: Cursor <[email protected]>
2026-05-22 19:26:44 -04:00
Raven ScottandCursor 5376970c4b docs: document single-category guild channel pool pick (v0.8.135)
Co-authored-by: Cursor <[email protected]>
2026-05-22 19:23:33 -04:00
Raven ScottandCursor 3e5407bd73 docs: note uncategorized bucket guild channel pick (v0.8.134)
Co-authored-by: Cursor <[email protected]>
2026-05-22 19:20:07 -04:00
Raven ScottandCursor 255b2bd542 docs: note bucket total wins over minPos for guild channel pick (v0.8.133)
Co-authored-by: Cursor <[email protected]>
2026-05-22 19:15:50 -04:00
Raven ScottandCursor 76e9f3991e docs: note mention-in-bucket guild channel pick behavior (v0.8.132)
Co-authored-by: Cursor <[email protected]>
2026-05-22 19:12:44 -04:00
Raven ScottandCursor cfee2f8713 docs: note in-bucket position tie-break for guild channel pick (v0.8.131)
Co-authored-by: Cursor <[email protected]>
2026-05-22 19:08:36 -04:00
Raven ScottandCursor f9e50cab77 docs: document bucket minPos tie-break for guild channel pick (v0.8.130)
Co-authored-by: Cursor <[email protected]>
2026-05-22 19:05:32 -04:00
Raven ScottandCursor aea5485baf docs: mention-weighted parent bucket pick (v0.8.126)
Document that bucket totals use mention × 1000 + unread scores.
Smoke: test:guild-mention-bucket-pick.

Co-authored-by: Cursor <[email protected]>
2026-05-22 18:37:38 -04:00
Raven ScottandCursor eea4ce0187 feat(platform): pick guild channel by parent unread bucket total
When unread spans categories or uncategorized channels, select the
parentId bucket with the highest summed unread score before position
tie-break within the bucket.

Co-authored-by: Cursor <[email protected]>
2026-05-22 18:34:52 -04:00
Raven ScottandCursor f7c795259f fix(platform): category-scoped unread pick and channel unread counts
Filter message rows by channelId in _unreadForChannel after HyperDB find.
When every unread channel shares one category parentId, limit
_selectGuildChannelWithUnread to that category before position tie-break.

Co-authored-by: Cursor <[email protected]>
2026-05-22 18:32:14 -04:00
Raven ScottandCursor 19188c725c docs: note equal-unread position tie-break (v0.8.123)
Document that _selectGuildChannelWithUnread prefers lower channel.position
when mention/unread scores tie; smoke test:guild-unread-position-tie.

Co-authored-by: Cursor <[email protected]>
2026-05-22 18:25:09 -04:00
Raven ScottandCursor 43ac01b305 docs(platform): mention×1000 channel pick on loadGuild (v0.8.120)
Document mention-weighted scoring in _selectGuildChannelWithUnread and reference
test:guild-mention-channel-pick smoke.

Co-authored-by: Cursor <[email protected]>
2026-05-22 18:08:00 -04:00
Raven ScottandCursor 9629d1769b docs(platform): document loadGuild channel pick priority (v0.8.119)
Clarify _selectGuildChannelWithUnread order in README: unread/mention score,
then lastChannelByGuild, then first text. Reference smokes
test:guild-unread-over-last-channel and test:guild-unread-channel-jump.

Co-authored-by: Cursor <[email protected]>
2026-05-22 18:05:54 -04:00
Raven ScottandCursor 723627aa9a feat(platform): persist and restore last guild channel (v0.8.116)
selectChannel calls _persistLastGuildChannel for savable channel types.
_selectGuildChannelWithUnread falls back to lastChannelByGuild when no
unread channels qualify, after permission check via _canViewChannel.

Unread-weighted channel pick from v0.8.115 remains unchanged when unread > 0.

Co-authored-by: Cursor <[email protected]>
2026-05-22 17:21:25 -04:00
Raven ScottandCursor 995469292a feat(platform): guild unread channel pick and search history (v0.8.115)
_openGuild clears stale activeChannelId and calls _selectGuildChannelWithUnread
to open the text/thread/announcement channel with the highest mention-weighted
unread count before falling back to the first text channel.

setSearch records queries of at least two characters into user prefs via
_recordSearchRecent. view() exposes searchRecentQueries for the active guild.

Co-authored-by: Cursor <[email protected]>
2026-05-22 17:17:22 -04:00
Raven ScottandCursor 356f6fd9e3 feat(platform): persist discoveryExploreFilter in USER_PREFS
Phase 146 (v0.8.111): setDiscoveryFilter is async and saves query,
sort, minMembers, and tag to discoveryExploreFilter prefs. Restore
on boot via _ingestDiscoveryExploreBaselineFromPrefs. Emits discovery
after filter updates.

Co-authored-by: Cursor <[email protected]>
2026-05-22 15:54:51 -04:00
Raven ScottandCursor 9bf4d3c64f feat(platform): persist voice roster expanded channel ids in USER_PREFS
Phase 145 (v0.8.110): setVoiceRosterChannelExpanded stores
voiceRosterExpandedChannelIds across sessions. Ingest on boot from
user prefs alongside thread filter and voice roster filter prefs.

Co-authored-by: Cursor <[email protected]>
2026-05-22 15:23:47 -04:00
Raven ScottandCursor 911ade8aec feat(platform): createGuild publicListing toggle for discovery opt-out
Phase 144 (v0.8.109): createGuild accepts publicListing (default true).
recordGuild stores listing preference; announceGuild runs only when listed.
Unlisted servers stay invite-only until enabled in server settings.

Co-authored-by: Cursor <[email protected]>
2026-05-22 15:06:02 -04:00
Raven ScottandCursor 7d28f57d7f feat(platform): Phases 142–143 discovery, onboarding Explore, thread/voice prefs
Phase 142 (v0.8.107):
- navigateDeepLink explore kind with preserveBaseline and USER_PREFS ingest
- formatDiscoveryExploreBaselineDeepLink for shareable listing snapshots

Phase 143 (v0.8.108):
- onboardingExplorePending after first guild create; markOnboardingExploreShown
- joinInvite accepts pearcord://explore URLs (Join modal baseline paste)
- setThreadsPanelFilter persists threadsPanelFilter in USER_PREFS
- view exposes onboardingExplorePending for renderer auto-open Explore

Co-authored-by: Cursor <[email protected]>
2026-05-22 14:48:38 -04:00
Raven ScottandCursor 627f7fe492 feat(platform): setVoiceRosterCombinedFilter for voice roster preset
Single API toggles voiceRosterMutedOnly and voiceRosterDeafenedOnly
together for Phase 141 combined sidebar filter chip.

Co-authored-by: Cursor <[email protected]>
2026-05-22 14:17:32 -04:00
Raven ScottandCursor f5b4efa1ba feat(platform): setVoiceRosterDeafenedOnly API and view field
Add voiceRosterDeafenedOnly pref ingest, setter with USER_PREFS gossip,
and view export for Phase 140 deafened-only sidebar roster filter.

Co-authored-by: Cursor <[email protected]>
2026-05-22 14:08:46 -04:00
Raven ScottandCursor 6956e47db4 feat(platform): voice roster muted filter and explore baseline timestamp
Expose setVoiceRosterMutedOnly with USER_PREFS persistence, ingest
voiceRosterMutedOnly and discoveryExploreBaselineAt from prefs, and
record baselineAt when markDiscoveryExploreOpened runs. View adds
discoveryExploreBaseline, discoveryExploreBaselineAt, and
voiceRosterMutedOnly for Phase 139 UX (v0.8.104).

Co-authored-by: Cursor <[email protected]>
2026-05-22 14:04:58 -04:00
Raven Scott 3693248166 docs: full module READMEs (v0.8.103 platform audit) 2026-05-22 13:39:50 -04:00
Raven ScottandCursor 910866b8fd feat(platform): self voice roster mute, prefs explore baseline (v0.8.103)
Phase 138 platform changes:
- Apply local voiceMedia mute/deafen to self roster row via myVoiceChannelId
  (no protomux roundtrip required for sidebar indicators).
- Persist discoveryExploreBaseline through updateUserPrefs on Explore open.
- Ingest discoveryExploreBaseline from USER_PREFS on boot and prefs events.

Co-authored-by: Cursor <[email protected]>
2026-05-22 13:11:12 -04:00
Raven ScottandCursor eebede9eb9 feat(platform): voice mute mesh roster, explore baseline, pinned-muted filter (v0.8.102)
Phase 137 platform depth:
- Ingest VOICE_MEDIA_MUTE into _voiceMuteMesh and expose muted/deafened on
  voiceStatesByChannel rows (local media peers + mesh gossip).
- markDiscoveryExploreOpened() snapshots discovery listing count; view adds
  discoveryNewSinceExplore for Explore +N badge while modal is closed.
- Allow threads panel filter pinned-muted; gossip self mute into mesh cache.

Co-authored-by: Cursor <[email protected]>
2026-05-22 12:53:10 -04:00
Raven ScottandCursor 8d88fdfe9a feat(platform): Phase 135 speaking roster, folder color, pinned filter (v0.8.100)
- voiceStatesByChannel.speaking from voiceMedia snapshot
- setServerFolderColor and threads panel pinned filter
- setThreadsPanelFilter accepts pinned

Co-authored-by: Cursor <[email protected]>
2026-05-22 12:07:36 -04:00
Raven ScottandCursor db54620007 feat(platform): Phase 134 thread pin/mute and discovery diff banner (v0.8.99)
- toggleThreadPinned and setThreadNotificationMuted APIs
- _wireDiscoveryEvents at init; discoveryDiffHint on listing ingest
- Pass pinned/muted maps into buildThreadsPanel

Co-authored-by: Cursor <[email protected]>
2026-05-22 11:53:33 -04:00
Raven ScottandCursor f0884ebdbb feat(platform): Phase 133 threads sort, discovery refresh, view fields (v0.8.98)
- setThreadsPanelSort and threadsPanelSort in view
- refreshDiscoveryListingsFromMesh on setDiscoveryFilter
- discoveryMeshRefreshAt for Explore freshness

Co-authored-by: Cursor <[email protected]>
2026-05-22 11:38:59 -04:00
Raven ScottandCursor 43d440e170 feat(platform): Phase 132 threads, voice presence, forum search refresh (v0.8.97)
- setThreadsPanelParentFilter and view.threadsPanelParentFilter
- voiceStatesByChannel rows include presenceStatus from guild mesh
- maybeRefreshStaleSearch on selectChannel for forum channel switches

Co-authored-by: Cursor <[email protected]>
2026-05-22 11:22:41 -04:00
Raven ScottandCursor 87cc613e38 feat(platform): auto-refresh stale mesh search on guild focus (v0.8.96)
Add maybeRefreshStaleSearch() to re-run guild/forum mesh queries when
searchMeshMeta.fetchedAt is older than 90s and mesh is enabled.

Invoke after loadGuild so switching servers refreshes stale P2P search
hits without requiring a manual ↻ click.

Co-authored-by: Cursor <[email protected]>
2026-05-22 11:08:17 -04:00
Raven ScottandCursor 12360f4288 feat(platform): Phase 130 search refresh and presence prefs sync (v0.8.95)
Add refreshSearch() to re-run guild/forum mesh queries and stamp
searchMeshMeta.fetchedAt for stale UI indicators.

Persist guild online counts to USER_PREFS.guildPresenceCache (debounced
gossip) and merge remote cache on prefs ingest so companion rail presence
stays consistent across linked devices.

Expose presence row timestamps on guildPresenceSummary in view().

Co-authored-by: Cursor <[email protected]>
2026-05-22 10:57:00 -04:00
Raven ScottandCursor be400a043a feat(platform): Phase 129 companion guild persist and presence summary
Persist USER_PREFS.companionLastGuildId on every loadGuild so the
companion restores the last server the user opened on any device.

Restore companionLastGuildId on companion session startup instead of
always picking the first guild in the list.

Track per-guild online counts in _guildPresenceSummary (updated on
presence gossip) and expose guildPresenceSummary on platform.view()
for the companion guild rail presence dots.

Co-authored-by: Cursor <[email protected]>
2026-05-22 10:44:38 -04:00
Raven ScottandCursor af74d9af07 feat(platform): forum search mesh merge API for Phase 128 (v0.8.93)
Add searchForumPostsWithMesh and _forumPostsFromMeshMessages to merge
local forum haystack hits with guild MESSAGE_SEARCH mesh responses via
pearcord-search.mergeForumSearchHits.

_resolveSearchResults uses mesh for forum scope and records
_lastSearchMeshMeta with scope forum for the desktop search UI.

Co-authored-by: Cursor <[email protected]>
2026-05-22 10:30:21 -04:00
Raven ScottandCursor 8ac673b2aa feat(platform): forum search enrich, pair deep links, notification jump (v0.8.92)
Wire rankAndEnrichForumSearchHits in searchForumPosts; navigateDeepLink
handles pair kind; formatDevicePairDeepLink and openNotificationTarget
for companion notification navigation.

Co-authored-by: Cursor <[email protected]>
2026-05-22 10:15:17 -04:00
Raven ScottandCursor 89df90b933 feat(platform): search ranking merge and device link pairSwarm hook (v0.8.91)
mergeSearchHits accepts query for ranked enrichment; DB fallback uses
rankAndEnrichSearchHits. linkDevicePairCode accepts an external Hyperswarm
for smoke/live pairing without destroying the guest swarm early.

Co-authored-by: Cursor <[email protected]>
2026-05-22 09:59:18 -04:00
Raven ScottandCursor 01c1bdb5bd feat(platform): Phase 125 settings mesh, search, drafts, and folders
- Join settings mesh with per-device swarm keys and unified connection wiring
- clearGuildSearchIndex, searchGuildMessages indexOnly / localIndexOnly mesh leg
- setComposeDraft, reorderServerFolders, view composeDrafts + activeComposeDraft

Co-authored-by: Cursor <[email protected]>
2026-05-22 09:11:38 -04:00
Raven ScottandCursor 798fc44462 feat(platform): sync guild search index on GUILD_SYNC ingest and export
Builds guildSearchIndex into GUILD_SYNC payloads from memory or the
persisted GuildSearchIndexStore, and merges inbound slices into local
indexes on join so multi-device search stays warm after mesh connect.

Co-authored-by: Cursor <[email protected]>
2026-05-22 08:36:42 -04:00
Raven ScottandCursor 159e8c63e9 feat(search): load/save persisted guild search index + searchIndexMeta (v0.8.87)
Integrate GuildSearchIndexStore on platform startup and debounced persist
after message ingest. Expose getGuildSearchIndexMeta and view.searchIndexMeta
for smokes and UI diagnostics.

Co-authored-by: Cursor <[email protected]>
2026-05-22 08:09:48 -04:00
Raven ScottandCursor 1d8e700bd1 feat(search): guild index, mesh fanout, thread filter, companion readOnly (v0.8.86)
Integrate pearcord-search GuildSearchIndex with incremental message indexing.
Add searchGuildMessagesWithMesh via MESSAGE_SEARCH_REQUEST/RESPONSE gossip.
Expose searchMeshMeta, threadsPanelFilter, readOnly, and companionMode in view.
setThreadsPanelFilter, setSearch includeMesh, and block sends in read-only mode.

Co-authored-by: Cursor <[email protected]>
2026-05-22 08:02:52 -04:00
Raven ScottandCursor db4ef3ceda feat(audit): schedule filter sync, member-join CSV push, GUILD_SYNC ingest (v0.8.84)
Add _resolveAuditExportFilter to merge guild schedule filter with user prefs.
setAuditLogExportFilter now writes filter into auditExportSchedule for mods.
Push signed audit CSV on member join via debounced _pushAuditCsvOnMemberJoinIfDue
when pushCsvOnMemberJoin is enabled.

Fix GUILD_SYNC member ingest to only emit member events for new roster rows and
trigger the same debounced CSV push when a peer was offline during MEMBER_JOIN
gossip. Expose auditExportScheduleFilter in view for UI schedule hints.

Co-authored-by: Cursor <[email protected]>
2026-05-22 07:48:54 -04:00
Raven ScottandCursor 63cdb8ae03 feat(platform): Phase 119 audit filter, CSV mesh timestamps, GUILD_SYNC (v0.8.83)
- setAuditLogExportFilter + view.auditLogExportFilter
- pushAuditExportCsvToMesh updates lastCsvMeshPushAt on schedule
- getAutomationHealthDashboard passes auditExportCsvMeta for dashboard

Co-authored-by: Cursor <[email protected]>
2026-05-22 07:39:11 -04:00
Raven ScottandCursor aae290258d feat(platform): Phase 118 scheduled CSV mesh + auditExportCsvMeta view (v0.8.82)
_runScheduledAuditExportIfDue now calls pushAuditExportCsvToMesh when
pushSignedCsvToMesh is enabled. View exposes auditExportCsvMeta for the
audit modal HMAC signature badge.

Co-authored-by: Cursor <[email protected]>
2026-05-22 07:32:19 -04:00
Raven ScottandCursor 3cd74e9989 feat(platform): Phase 117 audit CSV mesh push and gossip handlers (v0.8.81)
- pushAuditExportCsvToMesh + _onAuditExportCsvGossip
- Guild listener for audit-export-csv-sync
- exportAuditLog sign path unchanged; mesh uses dedicated RPC 76

Co-authored-by: Cursor <[email protected]>
2026-05-22 07:26:13 -04:00
Raven ScottandCursor 874472732c feat(platform): Phase 116 — audit CSV sign, CSV mesh push, SMTP prefs (v0.8.80)
- exportAuditLog signs CSV; getAuditExportCsvExport; GUILD_SYNC slice
- pushHookFailureDigestCsvToMesh + _onHookFailureDigestCsvGossip
- SMTP relay prefs in UI API; _syncDigestRelaySmtpConfigToPlugin
- relay handoff opts include smtp manifest fields

Co-authored-by: Cursor <[email protected]>
2026-05-22 07:19:12 -04:00
Raven ScottandCursor 9e5390de96 feat(platform): Phase 115 bridges — CSV mesh, archive health, webhook URL (v0.8.79)
- exportHookFailureDigest / getHookFailureDigestCsvExport with signatureValid
- GUILD_SYNC slices: hookFailureDigestCsvExport, archiveHealthPrefs, modDigestGroupDmMeta
- refreshArchivePeerHealth + archive health prefs on guild focus/join/open
- dryRunDigestWebhookRelay + digest relay webhook URL plugin sync
- syncModDigestGroupDmFromMesh for mod digest group DM participant sync

Co-authored-by: Cursor <[email protected]>
2026-05-22 07:11:30 -04:00
Raven ScottandCursor c844d4f200 feat(platform): Phase 114 webhook dry-run, health refresh, GDM mesh meta
- dryRunDigestWebhookRelay and webhook preview on digest-relay hook dry-run
- refreshArchivePeerHealth with persist + GUILD_SYNC mesh push
- syncModDigestGroupDmFromMesh and modDigestGroupDmMeta on GUILD_SYNC bundle
- Signed CSV hook failure digest export with signatureValid
- Ingest mod digest meta for all members; open group DM for mods only

Co-authored-by: Cursor <[email protected]>
2026-05-22 06:58:59 -04:00
Raven ScottandCursor a21685522a feat(platform): mod digest group DM and signed relay handoff posts (v0.8.77)
Add ensureModDigestGroupDmChannel and _postModDigestGroupDmSummary so hook
failure digest mesh sync can post to an auto-created mod group DM without
leaving guild mode. Requires two other moderators (manage guild/channels).

Restore guild session after DM posts. Extend hook failure notify prefs API
for mod digest group DM toggles.

Co-authored-by: Cursor <[email protected]>
2026-05-22 06:37:47 -04:00
Raven ScottandCursor 77936807b4 feat(platform): Phase 112 relay signing and health decay
- Sign relay handoffs with guild-derived secret for webhook/smtp plugins
- Verify signature on getLastDigestRelayHandoff (signatureValid)
- Apply health decay in archive peer picker
- Show signature status in server settings UI

Co-authored-by: Cursor <[email protected]>
2026-05-22 06:27:46 -04:00
Raven ScottandCursor aae2a51cd1 feat(platform): Phase 111 relay plugins, digest summary, prerelease tag
- digestRelayPlugins on GUILD_SYNC; apply active plugin to relay handoff
- Hook failure digest summary channel post on mesh push
- Worker announce channelTag; dry-run relay preview for digest-relay hooks

Co-authored-by: Cursor <[email protected]>
2026-05-22 06:19:31 -04:00
Raven ScottandCursor 4e55fbcdfe feat(platform): Phase 110 digest-relay dispatch and mesh notify prefs
- Record digest relay handoff before AUTOMATION_DIGEST_EXPORT fanout
- Dispatch automation hooks on digest export (digest-relay action + audit)
- hookFailureDigestNotifyPrefs on GUILD_SYNC and push notifications
- Archive peer picker prefers synced health from archivePeerSeen rows

Co-authored-by: Cursor <[email protected]>
2026-05-22 06:10:58 -04:00
Raven ScottandCursor 4085513530 feat(platform): digest relay, inbox channel post, worker semver gate
Record digest relay handoffs, post digest summaries to configured inbox channels,
validate worker versions on announce, sync digestRelayHandoff on GUILD_SYNC,
and expose getLastDigestRelayHandoff (Phase 109 v0.8.73).

Co-authored-by: Cursor <[email protected]>
2026-05-22 06:01:03 -04:00
Raven ScottandCursor 81a00cfeac feat(platform): digest notify, peer health, worker release audit, health dash
Notify mods on digest export with prefs and AUTOMATION_DIGEST_EXPORT fanout.
Archive peer picker healthScore/healthLabel. automation.worker.release audit on
announce and mesh gossip. getAutomationHealthDashboard and GUILD_SYNC notify prefs.
Phase 108 v0.8.72.

Co-authored-by: Cursor <[email protected]>
2026-05-22 05:46:16 -04:00
Raven ScottandCursor 35b34b0bb7 feat(platform): digest fetch retry and archivePeerSeen guild sync
Refactor fetchAutomationDigestSnapshotFromMesh with exponential backoff
retries mirroring audit archives. Bundle archivePeerSeen on GUILD_SYNC
push and ingest on join. Phase 107 v0.8.71.

Co-authored-by: Cursor <[email protected]>
2026-05-22 05:37:32 -04:00
Raven ScottandCursor 702377b36c feat(platform): digest snapshot mesh fetch and archive peer last seen
Implement fetchAutomationDigestSnapshotFromMesh with waiters, gossip handlers,
scheduled export body gossip, GUILD_SYNC snapshot ingest, listAuditArchiveFetchPeers
lastSeenAt, and _touchArchivePeerSeen on presence/mesh join. Phase 106 v0.8.70.

Co-authored-by: Cursor <[email protected]>
2026-05-22 05:31:54 -04:00
Raven ScottandCursor 7adf714b8a feat(platform): Phase 105 mesh peer indicator and digest export schedule
- listAuditArchiveFetchPeers returns meshConnected per member
- automationDigestExportSchedule timer and snapshot persistence
- GUILD_SYNC slices for schedule and snapshot metadata
- runOverdueAutomationSchedules includes digest export task

Co-authored-by: Cursor <[email protected]>
2026-05-22 05:23:36 -04:00
Raven ScottandCursor 2eb9ece6f0 feat(platform): Phase 104 peer picker, trial matrix, digest export
- listAuditArchiveFetchPeers and targetMemberId on archive mesh requests
- exportAutomationScheduleDigest for schedule + hook failure bundle
- runIntegrationWorkerTrialMatrix across all worker templates
- Template-specific trial event fanout via buildSampleAppEvent

Co-authored-by: Cursor <[email protected]>
2026-05-22 05:09:14 -04:00
Raven ScottandCursor a7be60b702 feat(platform): Phase 103 retry fetch, receipts trial, overdue runs
- fetchAuditExportArchiveFromMesh retries with exponential backoff
- runIntegrationWorkerTrial receipt mode for delivery-tracer template
- runOverdueAutomationSchedules runs due audit export and digest sync

Co-authored-by: Cursor <[email protected]>
2026-05-22 05:03:31 -04:00
Raven ScottandCursor 09b98b0efb feat(platform): Phase 102 archive fetch, dashboard, trial asserts
- fetchAuditExportArchiveFromMesh via RPC 72 request/response waiters
- Respond to audit-export-archive-request when local archive has entries
- getAutomationScheduleDashboard on view state
- runIntegrationWorkerTrial fans out MESSAGE_CREATE and requires sawMessageCreate
- Merge archive ingest resolves pending mesh fetch waiters

Co-authored-by: Cursor <[email protected]>
2026-05-22 04:57:16 -04:00
Raven ScottandCursor a5008a3621 feat(platform): audit archive download and worker install trial (Phase 101)
- exportAuditExportArchive formats stored archive entries for UI modal
- runIntegrationWorkerTrial starts PearcordIntegrationWorker in-process
  briefly to validate template wiring before Pear publish

Co-authored-by: Cursor <[email protected]>
2026-05-22 04:49:10 -04:00
Raven ScottandCursor 3b72fd69e8 feat(platform): Phase 100 audit archives, digest schedule, install plan
- AUDIT_EXPORT_ARCHIVE retention + gossip on exportAuditLog
- digestExportSchedule timer parity with audit export schedule
- fetchWorkerInstallPlan / listAuditExportArchives in guild view
- GUILD_SYNC slices for archives, digest schedule

Co-authored-by: Cursor <[email protected]>
2026-05-22 04:44:44 -04:00
Raven ScottandCursor 563792464d feat(platform): Phase 99 scheduled audit export, digest sync, version diff
- Scheduled audit export timer with GUILD_SYNC auditExportSchedule prefs
- runScheduledAuditExportNow forces export + gossip (+ digest push)
- HOOK_FAILURE_DIGEST_SYNC ingest and pushHookFailureDigestToMesh
- getHookFailureDigest merges mesh snapshot via mergeHookFailureDigests

Co-authored-by: Cursor <[email protected]>
2026-05-22 04:38:48 -04:00
Raven ScottandCursor 91c7da8847 feat(platform): Phase 98 audit export gossip, digest export, worker changelog
- exportAuditLog gossips AUDIT_EXPORT_SNAPSHOT entries to guild mesh
- _onAuditExportSnapshotGossip merges snapshot rows into local audit log
- exportHookFailureDigest with MANAGE_GUILD gate
- announceWorkerRelease accepts releaseNotes; GUILD_SYNC includes releaseNotes

Co-authored-by: Cursor <[email protected]>
2026-05-22 04:32:24 -04:00
Raven ScottandCursor 9fa0db2d3e feat(platform): audit export, hook failure fanout, publish announce fixes (Phase 97)
- exportAuditLog with MANAGE_GUILD gate and formatAuditExport integration
- _fanoutHookFailureEvent dispatches HOOK_FAILURE to other automation hooks;
  skipFanout prevents recursive fanout on nested failures
- Reorder _recordHookFailure so fanout runs before audit/notify and audit errors
  cannot block webhook fanout
- Import categoryAllows for failure hook filtering

Co-authored-by: Cursor <[email protected]>
2026-05-22 04:27:18 -04:00
Raven ScottandCursor 5a77582dbb feat(v0.8.60): audit filters, hook failure digest, worker release hints
- listAuditLog(filter), getHookFailureDigest, announceWorkerRelease
- WORKER_RELEASE_ANNOUNCE gossip ingest + GUILD_SYNC.workerReleaseHint
- appVersion constructor option for update-available comparison
- view: hookFailureDigest, workerReleaseHint, auditLogFilterOptions

Co-authored-by: Cursor <[email protected]>
2026-05-22 04:17:52 -04:00
Raven ScottandCursor c407bc5d55 feat(v0.8.59): per-user hook mute and scoped setHookFailurePrefs
- getHookFailurePrefs returns guildMute, userMute, muteNotifications
- setHookFailurePrefs scope user|guild (guild requires MANAGE_GUILD)
- _notifyHookFailure uses shouldMuteForUser
- view.hookFailurePrefs exposes split mute state for server settings UI

Co-authored-by: Cursor <[email protected]>
2026-05-22 04:11:55 -04:00
Raven ScottandCursor 4c8d177c4b feat(v0.8.58): GUILD_SYNC auditRecent and hook failure mute prefs
- _exportAuditSyncSlice: up to 32 automod/automation/moderation audits
- Ingest auditRecent on GUILD_SYNC; sync hookFailurePrefs
- getHookFailurePrefs / setHookFailurePrefs (MANAGE_GUILD)
- _notifyHookFailure respects muteNotifications
- view.hookFailurePrefs; push GUILD_SYNC after prefs/retention save

Co-authored-by: Cursor <[email protected]>
2026-05-22 04:05:11 -04:00
Raven ScottandCursor 6bf4576439 feat(v0.8.57): automod audit, hook failure alerts, audit gossip ingest
- automod.block audit on _assertAutomod (reason in action label)
- automation.hook.failed audit + HOOK_FAILURE_ALERT gossip on failed hooks
- HookFailureAlertStore wiring, mod MANAGE_GUILD notifications
- Remote AUDIT_APPEND inserts into local audit-log collection
- view.hookFailureAlerts for server settings UI

Co-authored-by: Cursor <[email protected]>
2026-05-22 03:58:49 -04:00