Commit Graph
507 Commits
Author SHA1 Message Date
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
Raven ScottandCursor 96562199c4 feat(platform): mesh federation live diagnostics span (v0.8.625)
Log federation live metadata when exporting mesh replication diagnostics.

Co-authored-by: Cursor <[email protected]>
2026-06-01 22:25:40 -04:00
Raven ScottandCursor ed149f02cf Phase 652: mesh churn scale spans and federation heal aggregate refresh.
Add guild.mesh.churn.scale logging on partition heal and topic pool cap,
hub-ingest composer focus in view, and federation aggregate timestamps for Explore.

Co-authored-by: Cursor <[email protected]>
2026-06-01 22:07:55 -04:00
Raven ScottandCursor 12ca37eb2d feat(platform): swarm topic pool and scoped mesh discovery refresh (v0.8.623)
Track guild mesh peers in GuildTopicPool, export mesh replication diagnostics,
and use per-guild listing refresh after partition heal and offline recovery.

Co-authored-by: Cursor <[email protected]>
2026-06-01 21:59:46 -04:00
Raven ScottandCursor c0d7097112 feat(platform): scoped Explore refresh and federation hub ingest (v0.8.622)
Add listing LWW ingest path, refreshDiscoveryExploreScoped, hub-ingest spans,
async federation diagnostics with hub subscriptions, and listing TTL view.

Co-authored-by: Cursor <[email protected]>
2026-06-01 21:53:10 -04:00
Raven ScottandCursor 7f163b7764 feat(platform): federation sync diagnostics and listing TTL refresh (v0.8.621)
Add discovery.mesh.federation spans, per-guild public listing refresh on guild
focus without stalling other meshes, and exportFederationSyncDiagnostics for
multi-guild plus discovery observability.

Co-authored-by: Cursor <[email protected]>
2026-06-01 21:47:19 -04:00
Raven ScottandCursor 73307e11ef feat(platform): per-guild mesh heal isolation and multi-guild diagnostics (v0.8.620)
Phase 648 adds per-guild mesh bounded flags, partition heal cooldown/in-progress maps,
exportMultiGuildSyncDiagnostics, guildSyncHealthRail for the UI, and guild.mesh.multi-scale spans.

Co-authored-by: Cursor <[email protected]>
2026-06-01 21:41:30 -04:00
Raven ScottandCursor a374078e38 Phase 647: partition heal cooldown and diagnostics export.
Add PEARCORD_PARTITION_HEAL_COOLDOWN_MS throttling, exportPartitionHealDiagnostics, and durationMs on heal spans so production soak runs can be rate-limited and inspected without a full guild sync dump.

Co-authored-by: Cursor <[email protected]>
2026-06-01 21:34:18 -04:00
Raven ScottandCursor d14fbb6ad0 feat(platform): CRDT partition heal orchestration (v0.8.618)
Add runPartitionHealSync with presence vector at-tie-break on equal
vectorSeq, read receipt/sparse/sidecar/member-page reconcile, gossip
flush, push halt clear, discovery refresh, and guild.mesh.partition-heal
span for mesh split recovery.

Co-authored-by: Cursor <[email protected]>
2026-06-01 21:17:33 -04:00
Raven ScottandCursor f646e8f7ca feat(platform): large guild member roster sync scale (v0.8.617)
Add member page burst limiter, roster-scaled bandwidth cap, roster sync
progress helpers, ingest health patches, and diagnostics memberSync for
partial GUILD_SYNC member pages on large guilds.

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