SkateSpots/src/lib/cordn
SkateSpots 383fb07127 Cordn native UI: crew MLS chat tab, IndexedDB store, membership flow
Milestone 2 for the native Cordn client.

- Session now runs on the viewer's own signer (NIP-07/Amber/nsec) instead of a
  raw key, so the Cordn identity is the user's pubkey. Added idbStore.ts
  (Dexie 'SkateSpotsCordnDB', one snapshot per account) so MLS state survives a
  reload, plus membership delivery: requestJoin / fetchJoinRequests /
  fetchWelcomes / acceptWelcome / addMemberByIdentifier, and addMember now also
  stores the Welcome on the coordinator for the target.
- useCordnNative owns the session lifecycle and lazy-imports the native module,
  keeping @contextvm/sdk + ts-mls in a separate ~678 kB async chunk (entry
  bundle unchanged at 1.9 MB).
- CordnNativePanel: a third 'Private chat' tab on the crew page — founder/admin
  create the group and approve join requests; members ask to join and check for
  an invite; live message list + composer (polling only for silent signers).
- Strings in i18n/legacy/cordnUi.ts (en/es).

Verified live against our coordinator with a new scenario
(join-request -> approve -> welcome) plus the existing two; npm test + smoke
pass. Not yet exercised in a real browser (browser tooling was offline this
session) — the dynamic-import failure path degrades to an inline error.
2026-10-12 22:30:15 +07:00
..
native Cordn native UI: crew MLS chat tab, IndexedDB store, membership flow 2026-10-12 22:30:15 +07:00
client.ts Cordn crew chat: ephemeral envelopes (coordinator can't see the sender) 2026-09-03 18:14:58 +07:00
crypto.ts Cordn crew chat: ephemeral envelopes (coordinator can't see the sender) 2026-09-03 18:14:58 +07:00
endpoint.ts Wire live Cordn encrypted crew chat over the coordinator (ContextVM) 2026-09-03 00:15:22 +07:00
types.ts Wire live Cordn encrypted crew chat over the coordinator (ContextVM) 2026-09-03 00:15:22 +07:00