feat(collab): presence P1 — awareness transport + who's-here roster (collab-presence 0001)

- provider.ts: expose awareness on YjsProvider (partykit/hocuspocus surface
  their own; BroadcastChannel gets a sibling-channel relay via awareness-bc.ts)
- presence.ts: createPresence — publish local PresenceState, subscribable
  deduped peers() roster, setCursor/setSelection for P2, pagehide fast removal
- PresenceRoster.tsx + WasmTool wiring: facepile chip next to SourceChip;
  eeschema rebinds per active sheet (sheet-manager ActiveSheet now carries the
  room's provider); config presenceUser() = slug + colorForUser
- new dep y-protocols; unit tests (presence.test.ts) + e2e
  tests/web/presence-roster.spec.ts (two tabs, verified vs real partykit)
- bump pcbjam-shared: presence-wire schema (MIT)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CvqUd4QsJSGHN28aunJRTq
This commit is contained in:
Gergő Törcsvári 2026-07-06 14:28:10 +02:00
commit 22528f450b
No known key found for this signature in database
GPG key ID: 8E75F2CDE64E5322
12 changed files with 538 additions and 15 deletions

3
web/pnpm-lock.yaml generated
View file

@ -125,6 +125,9 @@ importers:
y-partyserver:
specifier: ^2.2.0
version: 2.2.0(@cloudflare/workers-types@4.20260610.1)(partyserver@0.5.6(@cloudflare/workers-types@4.20260610.1))(yjs@13.6.31)
y-protocols:
specifier: ^1.0.6
version: 1.0.7(yjs@13.6.31)
yjs:
specifier: ^13.6.18
version: 13.6.31