@ai-matrx/meet 0.7.72 → 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.cjs CHANGED
@@ -523,6 +523,12 @@ var MEET_ROUTES = {
523
523
  record: "/api/v1/meet/record",
524
524
  /** A host chooses what guests may read of ONE meeting (MRF-1). */
525
525
  recordAccess: "/api/v1/meet/record/access",
526
+ /**
527
+ * KEEP YOUR NOTES (2026-10-01): a guest who just created an account presents
528
+ * their kept pass in `x-meet-room-token` with their new session, and the
529
+ * meeting they attended becomes theirs to read. Idempotent; never a grant.
530
+ */
531
+ claim: "/api/v1/meet/claim",
526
532
  /**
527
533
  * Meet wave 1 (0.8): bring every invitee up to date after a write — sends the
528
534
  * invitation / update / cancellation emails with their `.ics` and re-queues
@@ -5829,7 +5835,7 @@ var import_format = require("@ai-matrx/kit/format");
5829
5835
  function activeWrapUpSummary(notes) {
5830
5836
  return notes.find((note) => note.role === "summary" && note.supersededBy === null) ?? null;
5831
5837
  }
5832
- 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.";
5838
+ var RESTRICTION_REMEDY = "Open it from the meeting link in the browser you attended with, or ask the host to share it.";
5833
5839
  var PART_LABEL = {
5834
5840
  transcript: "The transcript of this meeting is not readable from this account.",
5835
5841
  notes: "The notes, decisions and action items are not readable from this account.",
@@ -6088,7 +6094,8 @@ function summarizeMeetingRecordRestrictions(restrictions) {
6088
6094
  }
6089
6095
  async function loadGuestMeetingRecord(args) {
6090
6096
  const { api, repository, meetingId, meeting, roomToken } = args;
6091
- if (roomToken === null) {
6097
+ const session = args.session === true;
6098
+ if (roomToken === null && !session) {
6092
6099
  return refusedBundle(
6093
6100
  meeting,
6094
6101
  "This meeting's record is only readable by the people who were in it.",
@@ -6101,9 +6108,9 @@ async function loadGuestMeetingRecord(args) {
6101
6108
  path: `${MEET_ROUTES.record}?meeting_id=${encodeURIComponent(meetingId)}`,
6102
6109
  method: "GET",
6103
6110
  // A GUEST HAS NO SESSION AND IS STILL A FIRST-CLASS READER (D6).
6104
- requireAuth: false,
6111
+ requireAuth: session,
6105
6112
  operation: "meet.record",
6106
- headers: { [ROOM_TOKEN_HEADER]: roomToken.token }
6113
+ headers: roomToken === null ? {} : { [ROOM_TOKEN_HEADER]: roomToken.token }
6107
6114
  });
6108
6115
  } catch (error) {
6109
6116
  return refusedBundle(
@@ -6832,7 +6839,24 @@ function useMeetingRecord(meeting) {
6832
6839
  meetingId,
6833
6840
  meeting,
6834
6841
  roomToken: tokens.remembered(roomName)
6835
- }) : loadMeetingRecord(repository, meetingId, meeting, { userId: readerId });
6842
+ }) : loadMeetingRecord(repository, meetingId, meeting, { userId: readerId }).then(
6843
+ (direct) => (
6844
+ // A SIGNED-IN OUTSIDER IS NOT A STRANGER (2026-10-01). The database
6845
+ // answers members and invitees; a person from another organization
6846
+ // the host admitted — or a guest who later made an account — reads
6847
+ // the guest share through the server, with their session as the pass.
6848
+ api !== null && direct.restrictions.some((part) => part.part === "notes") ? loadGuestMeetingRecord({
6849
+ api,
6850
+ repository,
6851
+ meetingId,
6852
+ meeting,
6853
+ roomToken: null,
6854
+ session: true
6855
+ }).then(
6856
+ (viaServer) => viaServer.restrictions.length < direct.restrictions.length ? viaServer : direct
6857
+ ) : direct
6858
+ )
6859
+ );
6836
6860
  void load.then((bundle) => {
6837
6861
  if (!live) return;
6838
6862
  setRecordReaderId(readerId);
@@ -8252,6 +8276,7 @@ function WhiteboardPanel({ onClose }) {
8252
8276
  function clock(ms2) {
8253
8277
  return (0, import_format3.formatDurationMs)(Math.ceil(ms2 / 1e3) * 1e3, { style: "clock" });
8254
8278
  }
8279
+ var BREAKOUT_EXPIRE_RETRY_MS = 5e3;
8255
8280
  function useNow(active) {
8256
8281
  const [now, setNow] = (0, import_react4.useState)(() => Date.now());
8257
8282
  (0, import_react4.useEffect)(() => {
@@ -8512,10 +8537,11 @@ function BreakoutBanner() {
8512
8537
  }, [moveAt, host, moveTo]);
8513
8538
  (0, import_react4.useEffect)(() => {
8514
8539
  if (open === null || remaining === null || remaining > 0) return;
8515
- if (expireAsked.current === open.id) return;
8516
- expireAsked.current = open.id;
8540
+ const asked = expireAsked.current;
8541
+ if (asked !== null && asked.id === open.id && now - asked.at < BREAKOUT_EXPIRE_RETRY_MS) return;
8542
+ expireAsked.current = { id: open.id, at: now };
8517
8543
  void act({ action: "breakout_expire" });
8518
- }, [open, remaining, act]);
8544
+ }, [open, remaining, act, now]);
8519
8545
  const broadcast = collab?.broadcast ?? null;
8520
8546
  const showBroadcast = broadcast !== null && broadcast.at !== dismissedBroadcast && open !== null;
8521
8547
  const room = open?.rooms.find((r) => r.id === breakoutRoomId) ?? null;