Commit Graph
516 Commits
Author SHA1 Message Date
Raven ScottandCursor 60fe33356b Add compose.draft.save telemetry span for draft persistence.
Surfaces draft save duration and payload size in platform logs to support
Phase 660 composer draft flush debounce verification.

Co-authored-by: Cursor <[email protected]>
2026-06-02 16:58:55 -04:00
Raven ScottandCursor 93bd5d7cfb Add composerPostBlockReason and updateDmScheduledMessage APIs.
Expose announcement vs lurker block reason in view; allow editing queued
DM scheduled messages before send.

Co-authored-by: Cursor <[email protected]>
2026-06-02 16:48:13 -04:00
Raven ScottandCursor 96f5893aad Complete Phase 409 platform perf, integrity, and mesh hardening.
Add adaptive poll helpers, discovery frame dedupe, poll DB read budget,
view integrity (draft prune, pin fallback, cross-ref audit, prefs checksum),
mesh quiet mode, topic merge counters, and discovery local-only guard.

Co-authored-by: Cursor <[email protected]>
2026-06-02 16:41:37 -04:00
Raven ScottandCursor ca50f20639 feat(platform): screen share refresh and presence stale reaper
Add refreshScreenSharePreview for frozen stream recovery and invoke
presence.reapStalePeers during view() so ghost peers are cleared.

Co-authored-by: Cursor <[email protected]>
2026-06-02 16:32:16 -04:00
Raven ScottandCursor fc344fac87 Phase 408: GUILD_SYNC replay and mark-read fanout hardening
Add guild-sync-replay tracker with syncBundleId on export bundles to skip
duplicate message applies after partial ingest. Coalesce rapid channel/thread
mark-read through MarkReadFanoutQueue with stall watchdog. Reject oversized
automation hook payloads via sanitizeAutomationEventPayload.

Co-authored-by: Cursor <[email protected]>
2026-06-02 16:24:13 -04:00
Raven ScottandCursor 0fdf35e7d8 Phase 408: mesh peer quality scores and platform capability APIs
Add mesh-peer-quality helpers (RTT, drop rate, stale cursor) for selective
sync prioritization and rejoin jitter on mesh peer retries. Expose
meshStatusSummary, platformCapabilities, and ipcContractVersion on view;
exportActiveChannelTopicPreview now passes guildId to getChannelSettings so
descriptions resolve correctly for automation smokes.

Co-authored-by: Cursor <[email protected]>
2026-06-02 16:17:35 -04:00
Raven ScottandCursor 28cd09b38c feat(platform): gossip lane alerts and mesh bounded hints (Phase 408)
Expose gossipLaneAlerts thresholds in meshStabilityStats and add
boundedStage/boundedStatusHint on guildSyncHealthRail for clearer UI.

Co-authored-by: Cursor <[email protected]>
2026-06-02 16:09:48 -04:00
Raven ScottandCursor 7f754eb295 perf(platform): skip pin/reaction list spans on cache hits (Phase 408)
Stop emitting pin.list and reaction.list timing spans when serving
cached rows; expose viewBuildStats counters in the view payload.

Co-authored-by: Cursor <[email protected]>
2026-06-02 16:05:31 -04:00
Raven ScottandCursor 6ff4def1ed feat(platform): invite preview and guild create templates (Phase 663)
Add previewJoinInvite for join preview metadata and templateId channel
presets on createGuild for friends/club onboarding branches.

Co-authored-by: Cursor <[email protected]>
2026-06-02 16:01:17 -04:00
Raven ScottandCursor c3caa74566 feat(attachments): staged list, meta sync, and send-time UI fields
Expose stagedAttachments in view, reorder/updateMeta APIs, and apply
attachmentUiById caption/spoiler on send (Phase 662).

Co-authored-by: Cursor <[email protected]>
2026-06-02 15:49:49 -04:00
Raven ScottandCursor dad7d3badb feat(voice-notes): sendVoiceNote and voiceNotesByMessage in view
Complete voice note send path, gossip enrichment, and per-message
voice note metadata for timeline rendering (Phase 662).

Co-authored-by: Cursor <[email protected]>
2026-06-02 15:40:14 -04:00
Raven ScottandCursor 2271419f8d Wire voice note staging, view draft field, and mesh gossip.
Integrate pearcord-voice-notes with stage/discard/commit APIs, permission
gates, and voiceNoteDraft in view payloads for composer UI parity.

Co-authored-by: Cursor <[email protected]>
2026-06-02 15:31:24 -04:00
Raven ScottandCursor cafcf95979 Phase 410: orphan pin repair, unread audit, webhook burst guard.
Repair orphan pin rows during channel consistency audit, run periodic
unread map sanity checks, and enforce webhook execute burst limits via
pearcord-bot-limits before relay execution.

Co-authored-by: Cursor <[email protected]>
2026-06-02 15:02:58 -04:00
Raven ScottandCursor 51c4a8daa1 Gate joinInvite and navigateDeepLink with shared paste validation (P410-30).
Reject malformed invites and deep links at the platform layer using
validatePastedNavigationInput before mesh join or navigation side effects.

Co-authored-by: Cursor <[email protected]>
2026-06-02 14:47:05 -04:00
Raven ScottandCursor 5c387d416d Wire user prefs startup recovery into session boot and view (P410-19).
Call ensurePrefsRecoveredOnStartup after settings ready, log
userPrefs.startup-recovery spans, and expose userPrefsRecovery in view().

Co-authored-by: Cursor <[email protected]>
2026-06-02 11:43:51 -04:00
Raven ScottandCursor 7a86efac40 fix(view): recover active channel when it disappears mid-build
Resolve stale activeChannelId against the visible channel list during
view finalize and channel-delete gossip, clear mismatched message slices,
and expose activeChannel plus activeChannelRecovery in the view payload.

Co-authored-by: Cursor <[email protected]>
2026-06-02 11:37:50 -04:00
Raven ScottandCursor 985dcdef06 fix(view): audit channel pin/reaction/message consistency
Run _auditChannelViewConsistency during view() to detect orphan rows
and pin/reaction cache mismatches, auto-invalidate stale list caches,
and expose channelConsistencyAudit in the view payload.

Co-authored-by: Cursor <[email protected]>
2026-06-02 11:31:31 -04:00
Raven ScottandCursor 47732f25db fix(mesh): evict stale guild peers with health metrics
Track per-peer lastSeenAt, sweep idle hyperswarm sockets on an interval
and before peer-retry, and expose peerRetryAttempt, lastPeerSeenAt, and
eviction totals on guildSyncHealthRail.

Co-authored-by: Cursor <[email protected]>
2026-06-02 11:23:54 -04:00
Raven ScottandCursor eb9122b7ad fix(mesh): coalesce guild mesh joins across open/retry paths
Route guild.open, mesh-bounded bootstrap, create, and peer-retry joins
through _requestGuildMeshJoin so startup/switch races skip stale loadGen
attempts and share one in-flight join per guild instance.

Co-authored-by: Cursor <[email protected]>
2026-06-02 11:19:28 -04:00
Raven ScottandCursor 95ba2a2272 Space guild mesh peer retries by last peer contact staleness.
Add _computeGuildMeshPeerRetryDelayMs keyed off lastPeerSeenAt with RTT and env min/max bounds, record peer contact on join, and emit spacingSource diagnostics for bounded retry scheduling.

Co-authored-by: Cursor <[email protected]>
2026-06-02 11:10:33 -04:00
Raven ScottandCursor 0e69175eb5 Expose mesh bounded retry timing in guild sync health rail.
Track per-guild mesh retry attempt metadata and publish countdown fields in view.guildSyncHealthRail so UI can present bounded-mode retry guidance without parsing logs.

Co-authored-by: Cursor <[email protected]>
2026-06-02 11:06:28 -04:00
Raven ScottandCursor 5440d8ff25 Add explicit platform view detail-level selection.
Introduce `opts.detail` support for minimal/light/full/diagnostic polling with legacy light-mode compatibility and expose the resolved detail level in view diagnostics metadata.

Co-authored-by: Cursor <[email protected]>
2026-06-02 10:45:55 -04:00
Raven ScottandCursor fe5c3d087a Harden view-list caching diagnostics and coalescing.
Add cache-hit/source metadata for pin, reaction, and discovery list spans, coalesce in-flight discovery list fetches, and batch view lookups to reduce redundant reads during render bursts.

Co-authored-by: Cursor <[email protected]>
2026-06-02 10:41:09 -04:00
Raven Scott 73075b6bd6 sync 2026-06-02 10:29:06 -04:00
Raven ScottandCursor efca048c2f Add strict pearcord module dependency guards for platform imports.
This introduces CI-enforced checks that compare index.js pearcord-* requires against declared dependencies and smoke-resolve imported modules, preventing undeclared module regressions in local file-link and attached runtime environments.

Co-authored-by: Cursor <[email protected]>
2026-06-02 09:27:52 -04:00
Raven ScottandCursor 0c73d63c78 Sync all pending local changes.
This commit captures the current working tree state as requested, including code, docs, dependency, and lockfile updates present in this repository.

Co-authored-by: Cursor <[email protected]>
2026-06-02 09:24:06 -04:00
Raven ScottandCursor 48e8b70d98 Declare DM voice runtime dependency for platform module graph integrity.
Add the missing `pearcord-dm-voice` local dependency so Bare-based attached/headless agentctl sessions can resolve platform imports reliably, and document the stabilization in the platform README for future module-graph maintenance.

Co-authored-by: Cursor <[email protected]>
2026-06-02 07:58:53 -04:00
Raven ScottandCursor da576d3f95 feat(platform): add DM scheduled message queue and due runner
Introduce DM scheduled-message APIs with shared payload validation,
command parsing integration (`/schedule`, `/sendlater`), send-now/cancel
operations, and a periodic due-message executor using existing DM send paths.

Co-authored-by: Cursor <[email protected]>
2026-06-02 04:11:22 -04:00
Raven ScottandCursor 658fd05973 feat(platform): make DM poll vote apply idempotent
Extend `voteDmPoll` with desired-state semantics so duplicate gossip or
retries no-op safely, and include explicit non-impact metadata for unread
and mention behavior during poll reaction updates.

Co-authored-by: Cursor <[email protected]>
2026-06-02 03:58:05 -04:00
Raven ScottandCursor 8340c62ae2 feat(platform): add DM poll deletion permission path
Introduce `deleteDmPoll` in DM mode with poll-shape validation and existing
message-delete permission checks, covering 1:1 and group DM contexts while
keeping message deletion semantics peer-local and P2P.

Co-authored-by: Cursor <[email protected]>
2026-06-02 03:43:20 -04:00
Raven ScottandCursor 77164a4595 feat(platform): add DM poll expiry and explicit close-state enforcement
Add poll expiry defaults/command pass-through, close-state metadata handling,
and `closeDmPoll` so vote/edit paths reject closed or expired polls consistently
in DM mode while preserving existing P2P reaction transport.

Co-authored-by: Cursor <[email protected]>
2026-06-02 03:36:41 -04:00
Raven ScottandCursor 5501defe33 feat(platform): support anonymous DM polls and edit-before-vote
Expand DM poll command parsing support to include anonymous commands and
add `editDmPoll` with a strict first-vote guard so question/options can
only be changed before any vote rows exist.

Co-authored-by: Cursor <[email protected]>
2026-06-02 03:27:17 -04:00
Raven ScottandCursor fe2ffafb37 feat(platform): support DM poll create and vote flows
Add DM poll command handling (`/poll`, `/pollm`) in `sendMessage`, plus
`createDmPoll` and `voteDmPoll` APIs that enforce single-choice behavior
while preserving multi-select poll semantics over existing DM reaction gossip.

Co-authored-by: Cursor <[email protected]>
2026-06-02 03:20:57 -04:00
Raven ScottandCursor f3d4504c56 feat(platform): add DM thread topic P2P audit export
Add `exportDmThreadP2PAudit()` so DM thread channels can be audited
for strict P2P topic conformance (`pearcord:dm-thread:*` and no central URL references).
Also document the new phase658 closure behavior in module docs.

Co-authored-by: Cursor <[email protected]>
2026-06-02 03:07:52 -04:00
Raven ScottandCursor 90ee832555 feat(platform): support DM thread archive/unarchive path v0.8.638
Extend `archiveThread` so DM threads can be archived/unarchived without a guild context:
- update `@pearcord/channels` + `THREAD_META` in `guildId: dm`,
- keep active DM thread state in sync,
- gossip updated DM channel metadata to peers,
- preserve existing guild-thread archive behavior.

Co-authored-by: Cursor <[email protected]>
2026-06-02 02:58:04 -04:00
Raven ScottandCursor 4eababf959 feat(platform): DM threads batch 2 + dm-call-history v0.8.638
This completes the Phase 658 batch 2 platform layer for Discord-like DM threads and call history.

- Enrich DM conversations with `dmThreads` + `threadUnread` rollups for inbox badges.
- Load persisted DM call history (`dm-call-history`) and expose `dmCallHistory` + `dmCallHistoryEngine` in view.
- Implement blocked-participant guard when forking a `dm_thread` from the parent DM.
- Wire DM call history entries into DM message search stubs.

Tests:
- npm run test:phase658-batch2
- npm run test:agentctl-forum-dm-bridge-phase658

Co-authored-by: Cursor <[email protected]>
2026-06-02 02:45:28 -04:00
Raven ScottandCursor 0b8ee0ecfc feat(platform): DM threads, forum bridge, parent E2E seal v0.8.637
createDmThread/openDmThread, threads panel in DM mode, bridgeForumToDm, and seal using parent channel id.

Co-authored-by: Cursor <[email protected]>
2026-06-02 01:48:14 -04:00
Raven ScottandCursor e6a32094f7 feat(platform): DM call history, pins store wiring v0.8.636
Track in-memory call history for search stubs; route DM pin/unpin through dm pins store.

Co-authored-by: Cursor <[email protected]>
2026-06-02 01:32:58 -04:00
Raven ScottandCursor 63c1cef962 feat(platform): avatar mesh, DM video/screen-share, rekey prefs v0.8.635
Peer avatar image IPC, live screen-share on video calls, toggleDmVideoCall,
readPeerAvatarPreview, and dismissed rekey channel id persistence.

Co-authored-by: Cursor <[email protected]>
2026-06-02 01:23:41 -04:00
Raven Scott 8671f1e250 feat(platform): live DM video, voice mute, accept span v0.8.634
setDmVoiceMute, startDmVideoCall non-stub, dm.voice.accept span,
setVoiceMute routes to DM call when in dm voice session.
2026-06-02 01:13:31 -04:00
Raven Scott 8765fe8160 feat(platform): DM session rekey notice and contact avatarHash
Set dmSessionRekey on group participant change, expose in view,
clearDmSessionRekeyNotice API, enrich listContacts with mesh avatarHash.
2026-06-02 01:06:38 -04:00
Raven Scott cb22d66a87 feat(platform): live DM voice calls and group member management
Phase 656 — PearcordDmVoice integration, dmCall view snapshot, start/end/accept
voice APIs, addGroupDmMember/removeGroupDmMember platform facades.
2026-06-02 01:01:38 -04:00
Raven ScottandCursor 795076498e Wire dm meta store, global presence snapshot, and prefs mesh toggle.
Platform view exposes globalPresence and dmMetaEngine; contacts mesh
respects globalPresenceMeshEnabled from synced user prefs.

Co-authored-by: Cursor <[email protected]>
2026-06-02 00:49:55 -04:00
Raven ScottandCursor b6fa2c3c58 feat(platform): DM pins, reaction gossip, and heal-open metadata (v0.8.629)
Add _pinDmMessage/_unpinDmMessage, DM reaction gossip via pearcord-dm,
load pins in DM view, and dm.open span fields for guild heal context.

Co-authored-by: Cursor <[email protected]>
2026-06-02 00:36:14 -04:00
Raven ScottandCursor c3f07793dc feat(platform): DM voice/video call stubs and group rename API (Phase 655)
Add renameGroupDM, startDmVoiceCall, startDmVideoCall spans and dm.open
sidebarFilterActive metadata for inbox telemetry and P2P call groundwork.

Co-authored-by: Cursor <[email protected]>
2026-06-02 00:25:16 -04:00
Raven ScottandCursor 5c941bf38e fix(platform): RTT-scaled adaptiveBurstDelays for guild mesh peer retry (P654-1)
Use swarm-manager backoff arrays indexed by retry attempt instead of passing
attempt count as RTT, keeping discovery refresh on non-owner retries.

Co-authored-by: Cursor <[email protected]>
2026-06-02 00:06:10 -04:00
Raven Scott ea62743d2d feat(platform): Phase 654 mesh resilience — adaptive guild peer retry + discovery aid (P654-1)
- Use adaptiveBurstDelays from swarm-manager for progressive backoff in _scheduleGuildMeshPeerRetry (fallback to prior fixed delays).
- Non-owners now trigger this.discovery.refreshMesh on retry attempts to improve peer discovery for replication/sync under churn/0-peer (addresses observed 'guild mesh peer retry' logs).
- Added defensive isOwner2 guard and comments tying to P654-1 / production mesh.
- Minor: preserves existing max 8 attempts, _clear, host wiring, logging.

This is a targeted swarm connection / replication improvement per core rules (focus on swarm, replicating data, syncing). Part of 50-item Phase 654 (global mesh resilience soak) generated after assessing vs Discord centralized instant sync (our eventual + heal must be rock-solid).

Verified:
- Manual non-automated pearcord-agentctl headless + mesh-live runs (AGENTCTL_*_OK).
- pear run boot gate (BOOT_OK) pre/post.
- No new errors in pearcord.log (retries still surface as expected; improvement exercised on next live).

Platform change only; renderer/UI + docs in sibling commits.

Refs: PLATFORM_ROADMAP.md Phase 654 P654-1, P654-11 (wire retry), swarm-manager adaptive, platform:12322, log 'guild mesh peer retry'.
2026-06-01 23:53:46 -04:00
Raven ScottandCursor 30480c2af6 fix(platform): wait for discovery mesh ingest when opening Explore
Remote peers only see public servers after DIRECTORY_LISTING gossip; block up to PEARCORD_DISCOVERY_MESH_WAIT_MS on explore open and scoped refresh.

Co-authored-by: Cursor <[email protected]>
2026-06-01 22:47:48 -04:00
Raven ScottandCursor 405786b8d8 fix(platform): await session startup before register IPC returns
Register was racing pushState ahead of sessionReady, leaving the UI on the session-restore shell instead of onboarding.

Co-authored-by: Cursor <[email protected]>
2026-06-01 22:35:43 -04:00
Raven ScottandCursor 9561e68ac3 fix(platform): cap session startup so UI does not hang on mesh joins
Time-box discovery/contacts/settings mesh, DM topic sync, and device sync; run mesh joins in background; add PEARCORD_SESSION_STARTUP_MS watchdog; parallelize register bootstrap module ready().

Co-authored-by: Cursor <[email protected]>
2026-06-01 22:33:47 -04:00