@ai-matrx/meet 0.7.73 → 0.7.75

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.js CHANGED
@@ -219,6 +219,12 @@ var MEET_ROUTES = {
219
219
  record: "/api/v1/meet/record",
220
220
  /** A host chooses what guests may read of ONE meeting (MRF-1). */
221
221
  recordAccess: "/api/v1/meet/record/access",
222
+ /**
223
+ * KEEP YOUR NOTES (2026-10-01): a guest who just created an account presents
224
+ * their kept pass in `x-meet-room-token` with their new session, and the
225
+ * meeting they attended becomes theirs to read. Idempotent; never a grant.
226
+ */
227
+ claim: "/api/v1/meet/claim",
222
228
  /**
223
229
  * Meet wave 1 (0.8): bring every invitee up to date after a write — sends the
224
230
  * invitation / update / cancellation emails with their `.ics` and re-queues
@@ -5525,7 +5531,7 @@ import { formatDurationMs } from "@ai-matrx/kit/format";
5525
5531
  function activeWrapUpSummary(notes) {
5526
5532
  return notes.find((note) => note.role === "summary" && note.supersededBy === null) ?? null;
5527
5533
  }
5528
- var RESTRICTION_REMEDY = "The people in this meeting's organization can read it. Sign in with an account in that organization \u2014 following the link is enough to join a meeting, but not to read its record.";
5534
+ var RESTRICTION_REMEDY = "Open it from the meeting link in the browser you attended with, or ask the host to share it.";
5529
5535
  var PART_LABEL = {
5530
5536
  transcript: "The transcript of this meeting is not readable from this account.",
5531
5537
  notes: "The notes, decisions and action items are not readable from this account.",
@@ -5784,7 +5790,8 @@ function summarizeMeetingRecordRestrictions(restrictions) {
5784
5790
  }
5785
5791
  async function loadGuestMeetingRecord(args) {
5786
5792
  const { api, repository, meetingId, meeting, roomToken } = args;
5787
- if (roomToken === null) {
5793
+ const session = args.session === true;
5794
+ if (roomToken === null && !session) {
5788
5795
  return refusedBundle(
5789
5796
  meeting,
5790
5797
  "This meeting's record is only readable by the people who were in it.",
@@ -5797,9 +5804,9 @@ async function loadGuestMeetingRecord(args) {
5797
5804
  path: `${MEET_ROUTES.record}?meeting_id=${encodeURIComponent(meetingId)}`,
5798
5805
  method: "GET",
5799
5806
  // A GUEST HAS NO SESSION AND IS STILL A FIRST-CLASS READER (D6).
5800
- requireAuth: false,
5807
+ requireAuth: session,
5801
5808
  operation: "meet.record",
5802
- headers: { [ROOM_TOKEN_HEADER]: roomToken.token }
5809
+ headers: roomToken === null ? {} : { [ROOM_TOKEN_HEADER]: roomToken.token }
5803
5810
  });
5804
5811
  } catch (error) {
5805
5812
  return refusedBundle(
@@ -6528,7 +6535,24 @@ function useMeetingRecord(meeting) {
6528
6535
  meetingId,
6529
6536
  meeting,
6530
6537
  roomToken: tokens.remembered(roomName)
6531
- }) : loadMeetingRecord(repository, meetingId, meeting, { userId: readerId });
6538
+ }) : loadMeetingRecord(repository, meetingId, meeting, { userId: readerId }).then(
6539
+ (direct) => (
6540
+ // A SIGNED-IN OUTSIDER IS NOT A STRANGER (2026-10-01). The database
6541
+ // answers members and invitees; a person from another organization
6542
+ // the host admitted — or a guest who later made an account — reads
6543
+ // the guest share through the server, with their session as the pass.
6544
+ api !== null && direct.restrictions.some((part) => part.part === "notes") ? loadGuestMeetingRecord({
6545
+ api,
6546
+ repository,
6547
+ meetingId,
6548
+ meeting,
6549
+ roomToken: null,
6550
+ session: true
6551
+ }).then(
6552
+ (viaServer) => viaServer.restrictions.length < direct.restrictions.length ? viaServer : direct
6553
+ ) : direct
6554
+ )
6555
+ );
6532
6556
  void load.then((bundle) => {
6533
6557
  if (!live) return;
6534
6558
  setRecordReaderId(readerId);
@@ -7948,6 +7972,7 @@ function WhiteboardPanel({ onClose }) {
7948
7972
  function clock(ms2) {
7949
7973
  return formatDurationMs3(Math.ceil(ms2 / 1e3) * 1e3, { style: "clock" });
7950
7974
  }
7975
+ var BREAKOUT_EXPIRE_RETRY_MS = 5e3;
7951
7976
  function useNow(active) {
7952
7977
  const [now, setNow] = useState3(() => Date.now());
7953
7978
  useEffect3(() => {
@@ -8208,10 +8233,11 @@ function BreakoutBanner() {
8208
8233
  }, [moveAt, host, moveTo]);
8209
8234
  useEffect3(() => {
8210
8235
  if (open === null || remaining === null || remaining > 0) return;
8211
- if (expireAsked.current === open.id) return;
8212
- expireAsked.current = open.id;
8236
+ const asked = expireAsked.current;
8237
+ if (asked !== null && asked.id === open.id && now - asked.at < BREAKOUT_EXPIRE_RETRY_MS) return;
8238
+ expireAsked.current = { id: open.id, at: now };
8213
8239
  void act({ action: "breakout_expire" });
8214
- }, [open, remaining, act]);
8240
+ }, [open, remaining, act, now]);
8215
8241
  const broadcast = collab?.broadcast ?? null;
8216
8242
  const showBroadcast = broadcast !== null && broadcast.at !== dismissedBroadcast && open !== null;
8217
8243
  const room = open?.rooms.find((r) => r.id === breakoutRoomId) ?? null;