From 7bb2962f94944bbf5e0296ec815acc271c96717b Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Tue, 17 Jun 2025 12:18:41 -0400 Subject: [PATCH 01/30] consent preparation --- .gitignore | 3 + GUIDE.md | 425 ++++++++++++++++++ NOTES.md | 9 + PLAN.md | 392 ++++++++++++++++ README.md | 6 + REQUIREMENTS.md | 49 ++ server/README.md | 22 + server/reflector/db/transcripts.py | 2 +- ...erebyEmbed.tsx => WherebyWebinarEmbed.tsx} | 4 +- www/app/webinars/[title]/page.tsx | 2 +- 10 files changed, 911 insertions(+), 3 deletions(-) create mode 100644 GUIDE.md create mode 100644 NOTES.md create mode 100644 PLAN.md create mode 100644 REQUIREMENTS.md rename www/app/lib/{WherebyEmbed.tsx => WherebyWebinarEmbed.tsx} (90%) diff --git a/.gitignore b/.gitignore index e705c6b7..722ac817 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,6 @@ server/exportdanswer .vercel .env*.local dump.rdb +.yarn +ngrok.log +.claude/settings.local.json \ No newline at end of file diff --git a/GUIDE.md b/GUIDE.md new file mode 100644 index 00000000..c500c3e1 --- /dev/null +++ b/GUIDE.md @@ -0,0 +1,425 @@ +# Codebase Review Guide: Audio Storage Consent Implementation + +This guide walks through the relevant parts of the codebase for implementing the audio storage consent flow. **Important**: This implementation works with post-processing deletion, not real-time recording control, due to Whereby integration constraints. + +## System Reality: Recording Detection Constraints + +**Critical Understanding**: +- **No real-time recording detection** - System only discovers recordings after they complete via SQS polling (60+ second delay) +- **Cannot stop recordings in progress** - Whereby controls recording entirely based on room configuration +- **Limited webhooks** - Only `room.client.joined/left` events available, no recording events +- **Post-processing intervention only** - Can only mark recordings for deletion during SQS processing + +## 1. Current Consent Implementation (TO BE REMOVED) + +### File: `www/app/[roomName]/page.tsx` +**Purpose:** Room entry page with blocking consent dialog + +**Key Areas:** +- **Line 24:** `const [consentGiven, setConsentGiven] = useState(null);` +- **Lines 34-36:** `handleConsent` function that sets consent state +- **Lines 80-124:** Consent UI blocking room entry +- **Line 80:** `if (!isAuthenticated && !consentGiven)` - blocking condition + +**Current Logic:** +```typescript +// Lines 99-111: Consent request UI +{consentGiven === null ? ( + <> + + This meeting may be recorded. Do you consent to being recorded? + + + + + + +) : ( + // Lines 114-120: Rejection message + You cannot join the meeting without consenting... +)} +``` + +**What to Change:** Remove entire consent blocking logic, allow direct room entry. + +--- + +## 2. Whereby Integration Reality + +### File: `www/app/[roomName]/page.tsx` +**Purpose:** Main room page where video call happens via whereby-embed + +**Key Whereby Integration:** +- **Line 129:** `` element - this IS the video call +- **Lines 26-28:** Room URL from meeting API +- **Lines 48-57:** Event listeners for whereby events + +**What Happens:** +1. `useRoomMeeting()` calls backend to create/get Whereby meeting +2. Whereby automatically records based on room `recording_trigger` configuration +3. **NO real-time recording status** - system doesn't know when recording starts/stops + +### File: `www/app/[roomName]/useRoomMeeting.tsx` +**Purpose:** Creates or retrieves Whereby meeting for room + +**Key Flow:** +- **Line 48:** Calls `v1RoomsCreateMeeting({ roomName })` +- **Lines 49-52:** Returns meeting with `room_url` and `host_room_url` +- Meeting includes recording configuration from room settings + +**What to Add:** Consent dialog overlay on the whereby-embed - always ask for consent regardless of meeting configuration (simplified approach). + +--- + +## 3. Recording Discovery System (POST-PROCESSING ONLY) + +### File: `server/reflector/worker/process.py` +**Purpose:** Discovers recordings after they complete via SQS polling + +**Key Areas:** +- **Lines 24-62:** `process_messages()` - polls SQS every 60 seconds +- **Lines 66-133:** `process_recording()` - processes discovered recording files +- **Lines 69-71:** Extracts meeting info from S3 object key format + +**Current Discovery Flow:** +```python +# Lines 69-71: Parse S3 object key +room_name = f"/{object_key[:36]}" # First 36 chars = room GUID +recorded_at = datetime.fromisoformat(object_key[37:57]) # Timestamp + +# Lines 73-74: Link to meeting +meeting = await meetings_controller.get_by_room_name(room_name) +room = await rooms_controller.get_by_id(meeting.room_id) +``` + +**What to Add:** Consent checking after transcript processing - always create transcript first, then delete only audio files if consent denied. + +### File: `server/reflector/worker/app.py` +**Purpose:** Celery task scheduling + +**Key Schedule:** +- **Lines 26-29:** `process_messages` runs every 60 seconds +- **Lines 30-33:** `process_meetings` runs every 60 seconds to check meeting status + +**Reality:** consent must be requested during the meeting, not based on recording detection. + +--- + +## 4. Meeting-Based Consent Timing + +### File: `server/reflector/views/whereby.py` +**Purpose:** Whereby webhook handler - receives participant join/leave events + +**Key Areas:** +- **Lines 69-72:** Handles `room.client.joined` and `room.client.left` events +- **Line 71:** Updates `num_clients` count in meeting record + +**Current Logic:** +```python +# Lines 69-72: Participant tracking +if event.type in ["room.client.joined", "room.client.left"]: + await meetings_controller.update_meeting( + meeting.id, num_clients=event.data["numClients"] + ) +``` + +**What to Add:** ALWAYS ask for consent - no triggers, no conditions. Simple list field to track who denied consent. + +### File: `server/reflector/db/meetings.py` +**Purpose:** Meeting database model and recording configuration + +**Key Recording Config:** +- **Lines 56-59:** Recording trigger options: + - `"automatic"` - Recording starts immediately + - `"automatic-2nd-participant"` (default) - Recording starts when 2nd person joins + - `"prompt"` - Manual recording start + - `"none"` - No recording + +**Current Meeting Model:** +```python +# Lines 56-59: Recording configuration +recording_type: Literal["none", "local", "cloud"] = "cloud" +recording_trigger: Literal[ + "none", "prompt", "automatic", "automatic-2nd-participant" +] = "automatic-2nd-participant" +``` + +**What to Add:** Dictionary field `participant_consent_responses: dict[str, bool]` in Meeting model to store {user_id: true/false}. ALWAYS ask for consent - no complex logic. + +--- + +## 5. Consent Implementation (NO WebSockets Needed) + +**Consent is meeting-level, not transcript-level** - WebSocket events are for transcript processing, not consent. + +### Simple Consent Flow: +1. **Frontend**: Show consent dialog when meeting loads +2. **User Response**: Direct API call to `/meetings/{meeting_id}/consent` +3. **Backend**: Store response in meeting record +4. **SQS Processing**: Check consent during recording processing + +**No WebSocket events needed** - consent is a simple API interaction, not real-time transcript data. + +--- + +## 4. Backend WebSocket System + +### File: `server/reflector/views/transcripts_websocket.py` +**Purpose:** Server-side WebSocket endpoint for real-time events + +**Key Areas:** +- **Lines 19-55:** `transcript_events_websocket` function +- **Line 32:** Room ID format: `room_id = f"ts:{transcript_id}"` +- **Lines 37-44:** Initial event sending to new connections +- **Lines 42-43:** Filtering events: `if name in ("TRANSCRIPT", "STATUS"): continue` + +**Current Flow:** +1. WebSocket connects to `/transcripts/{transcript_id}/events` +2. Server adds user to Redis room `ts:{transcript_id}` +3. Server sends historical events (except TRANSCRIPT/STATUS) +4. Server waits for new events via Redis pub/sub + +**What to Add:** Handle new consent events in the message flow. + +### File: `server/reflector/ws_manager.py` +**Purpose:** Redis pub/sub WebSocket management + +**Key Areas:** +- **Lines 61-99:** `WebsocketManager` class +- **Lines 78-79:** `send_json` method for broadcasting +- **Lines 88-98:** `_pubsub_data_reader` for distributing messages + +**Broadcasting Pattern:** +```python +# Line 78: How to broadcast to all users in a room +async def send_json(self, room_id: str, message: dict) -> None: + await self.pubsub_client.send_json(room_id, message) +``` + +**What to Use:** This system for broadcasting consent requests and responses. + +--- + +## 5. Database Models and Migrations + +### File: `server/reflector/db/transcripts.py` +**Purpose:** Transcript database model and controller + +**Key Areas:** +- **Lines 28-73:** `transcripts` SQLAlchemy table definition +- **Lines 149-172:** `Transcript` Pydantic model +- **Lines 304-614:** `TranscriptController` class with database operations + +**Current Schema Fields:** +```python +# Lines 31-72: Key existing columns +sqlalchemy.Column("id", sqlalchemy.String, primary_key=True), +sqlalchemy.Column("status", sqlalchemy.String), +sqlalchemy.Column("duration", sqlalchemy.Integer), +sqlalchemy.Column("locked", sqlalchemy.Boolean), +sqlalchemy.Column("audio_location", sqlalchemy.String, server_default="local"), +# ... more columns +``` + +**Audio File Management:** +- **Lines 225-230:** Audio file path properties +- **Lines 252-284:** `get_audio_url` method for accessing audio +- **Lines 554-571:** `move_mp3_to_storage` for cloud storage + +**What to Add:** New columns for consent tracking and deletion marking. + +### File: `server/migrations/versions/b9348748bbbc_reviewed.py` +**Purpose:** Example migration pattern for adding boolean columns + +**Pattern:** +```python +# Lines 20-23: Adding boolean column with default +def upgrade() -> None: + op.add_column('transcript', sa.Column('reviewed', sa.Boolean(), + server_default=sa.text('0'), nullable=False)) + +def downgrade() -> None: + op.drop_column('transcript', 'reviewed') +``` + +**What to Follow:** This pattern for adding consent columns. + +--- + +## 6. API Endpoint Patterns + +### File: `server/reflector/views/transcripts.py` +**Purpose:** REST API endpoints for transcript operations + +**Key Areas:** +- **Lines 29-30:** Router setup: `router = APIRouter()` +- **Lines 70-85:** `CreateTranscript` and `UpdateTranscript` models +- **Lines 122-135:** Example POST endpoint: `transcripts_create` + +**Endpoint Pattern:** +```python +# Lines 122-135: Standard endpoint structure +@router.post("/transcripts", response_model=GetTranscript) +async def transcripts_create( + info: CreateTranscript, + user: Annotated[Optional[auth.UserInfo], Depends(auth.current_user_optional)], +): + user_id = user["sub"] if user else None + return await transcripts_controller.add(...) +``` + +**Authentication Pattern:** +- **Line 125:** Optional user authentication dependency +- **Line 127:** Extract user ID: `user_id = user["sub"] if user else None` + +**What to Follow:** This pattern for new consent endpoint. + +--- + +## 7. Live Pipeline System + +### File: `server/reflector/pipelines/main_live_pipeline.py` +**Purpose:** Real-time processing pipeline during recording + +**Key Areas:** +- **Lines 80-96:** `@broadcast_to_sockets` decorator for WebSocket events +- **Lines 98-104:** `@get_transcript` decorator for database access +- **Line 56:** WebSocket manager import: `from reflector.ws_manager import get_ws_manager` + +**Event Broadcasting Pattern:** +```python +# Lines 80-95: Decorator for broadcasting events +def broadcast_to_sockets(func): + async def wrapper(self, *args, **kwargs): + resp = await func(self, *args, **kwargs) + if resp is None: + return + await self.ws_manager.send_json( + room_id=self.ws_room_id, + message=resp.model_dump(mode="json"), + ) + return wrapper +``` + +--- + +## 8. Modal/Dialog Patterns + +### File: `www/app/(app)/transcripts/[transcriptId]/shareModal.tsx` +**Purpose:** Example modal implementation using fixed overlay + +**Key Areas:** +- **Lines 105-176:** Modal implementation using `fixed inset-0` overlay +- **Lines 107-108:** Overlay styling: `fixed inset-0 bg-gray-600 bg-opacity-50` +- **Lines 152-170:** Button patterns for actions + +**Modal Structure:** +```typescript +// Lines 105-109: Modal overlay and container +
+ {props.show && ( +
+
+ // Modal content... +
+
+ )} +
+``` + +### File: `www/app/(app)/transcripts/shareAndPrivacy.tsx` +**Purpose:** Example using Chakra UI Modal components + +**Key Areas:** +- **Lines 10-16:** Chakra UI Modal imports +- **Lines 86-100:** Chakra Modal structure + +**Chakra Modal Pattern:** +```typescript +// Lines 86-94: Chakra UI Modal structure + setShowModal(false)} size={"xl"}> + + + Share + + // Modal content... + + + +``` + +**What to Choose:** Either pattern works - fixed overlay for simple cases, Chakra UI for consistent styling. + +--- + +## 9. Audio File Management + +### File: `server/reflector/db/transcripts.py` +**Purpose:** Audio file storage and access + +**Key Methods:** +- **Lines 225-230:** File path properties + - `audio_wav_filename`: Local WAV file path + - `audio_mp3_filename`: Local MP3 file path + - `storage_audio_path`: Cloud storage path +- **Lines 252-284:** `get_audio_url()` - Generate access URL +- **Lines 554-571:** `move_mp3_to_storage()` - Move to cloud +- **Lines 572-580:** `download_mp3_from_storage()` - Download from cloud + +**File Path Properties:** +```python +# Lines 225-230: Audio file locations +@property +def audio_wav_filename(self): + return self.data_path / "audio.wav" + +@property +def audio_mp3_filename(self): + return self.data_path / "audio.mp3" +``` + +**Storage Logic:** +- **Line 253:** Local files: `if self.audio_location == "local"` +- **Line 255:** Cloud storage: `elif self.audio_location == "storage"` + +**What to Modify:** Add deletion logic and update `get_audio_url` to handle deleted files. + +--- + +## 10. Review Checklist + +Before implementing, manually review these areas with the **meeting-based consent** approach: + +### Frontend Changes +- [ ] **Room Entry**: Remove consent blocking in `www/app/[roomName]/page.tsx:80-124` +- [ ] **Meeting UI**: Add consent dialog overlay on `whereby-embed` in `www/app/[roomName]/page.tsx:126+` +- [ ] **Meeting Hook**: Update `www/app/[roomName]/useRoomMeeting.tsx` to provide meeting data for consent +- [ ] **WebSocket Events**: Add consent event handlers (meeting-based, not transcript-based) +- [ ] **User Identification**: Add browser fingerprinting for anonymous users + +### Backend Changes - Meeting Scope +- [ ] **Database**: Create `meeting_consent` table migration following `server/migrations/versions/b9348748bbbc_reviewed.py` pattern +- [ ] **Meeting Model**: Add consent tracking in `server/reflector/db/meetings.py` +- [ ] **Recording Model**: Add deletion flags in `server/reflector/db/recordings.py` +- [ ] **API**: Add meeting consent endpoint in `server/reflector/views/meetings.py` +- [ ] **Whereby Webhook**: Update `server/reflector/views/whereby.py` to trigger consent based on participant count +- [ ] **SQS Processing**: Update `server/reflector/worker/process.py` to check consent before processing recordings + +### Critical Integration Points +- [ ] **Consent Timing**: ALWAYS ask for consent - no conditions, no triggers, no participant count checks +- [ ] **SQS Processing**: Always create transcript first, then delete only audio files if consent denied +- [ ] **Meeting Scoping**: All consent tracking uses `meeting_id`, not `room_id` (rooms are reused) +- [ ] **Post-Processing Only**: No real-time recording control - all intervention happens during SQS processing + +### Testing Strategy +- [ ] **Multiple Participants**: Test consent collection from multiple users in same meeting +- [ ] **Room Reuse**: Verify consent doesn't affect other meetings in same room +- [ ] **Recording Triggers**: Test different `recording_trigger` configurations +- [ ] **SQS Deletion**: Verify recordings are deleted from S3 when consent denied +- [ ] **Timing Edge Cases**: Test consent given after recording already started + +**Reality Check**: This implementation works with **post-processing deletion only**. We cannot stop recordings in progress or detect exactly when they start. Consent timing is estimated based on meeting configuration and participant events. \ No newline at end of file diff --git a/NOTES.md b/NOTES.md new file mode 100644 index 00000000..c6878869 --- /dev/null +++ b/NOTES.md @@ -0,0 +1,9 @@ +frontend explicitly calls backend to create meeting. upsert semantic (meeting gets "stale" somehow - how?) +frontend only listens for users own "leave" event to redirect away +how do we know it starts recording? meeting has different meeting configurations. to simplify, probably show the consent ALWAYS +Q: how S3 and SQS gets filled? by what system? + + +we have meeting entity, we have users. let's always ask users for consent in an overlay and send this to server to attach to the meeting entity, if we have it + +- consent endpoint \ No newline at end of file diff --git a/PLAN.md b/PLAN.md new file mode 100644 index 00000000..ddf5bf04 --- /dev/null +++ b/PLAN.md @@ -0,0 +1,392 @@ +# Audio Storage Consent Implementation Plan + +## Overview +Move consent from room entry to during recording, asking specifically about audio storage while allowing transcription to continue regardless of response. + +## Implementation Phases + +### Phase 1: Database Schema Changes + +**Meeting Consent Table:** `server/migrations/versions/[timestamp]_add_meeting_consent_table.py` + +Create new table for meeting-scoped consent (rooms are reused, consent is per-meeting): + +```python +def upgrade() -> None: + op.create_table('meeting_consent', + sa.Column('id', sa.String(), nullable=False), + sa.Column('meeting_id', sa.String(), nullable=False), + sa.Column('user_identifier', sa.String(), nullable=False), # IP, session, or user ID + sa.Column('consent_given', sa.Boolean(), nullable=False), + sa.Column('consent_timestamp', sa.DateTime(), nullable=False), + sa.PrimaryKeyConstraint('id'), + sa.ForeignKeyConstraint(['meeting_id'], ['meeting.id']), + ) +``` + +**Update Models:** `server/reflector/db/meetings.py` and `server/reflector/db/recordings.py` + +```python +# New model for meeting consent +class MeetingConsent(BaseModel): + id: str = Field(default_factory=generate_uuid4) + meeting_id: str + user_identifier: str + consent_given: bool + consent_timestamp: datetime + user_agent: str | None = None +``` + +### Phase 2: Backend API Changes + +**New Consent Endpoint:** `server/reflector/views/meetings.py` + +Meeting-based consent endpoint (since consent is per meeting session): + +```python +class MeetingConsentRequest(BaseModel): + consent_given: bool + user_identifier: str # IP, session ID, or user ID + +@router.post("/meetings/{meeting_id}/consent") +async def meeting_audio_consent( + meeting_id: str, + request: MeetingConsentRequest, + user_request: Request, +): + meeting = await meetings_controller.get_by_id(meeting_id) + if not meeting: + raise HTTPException(status_code=404, detail="Meeting not found") + + # Store consent in meeting_consent table + consent = MeetingConsent( + meeting_id=meeting_id, + user_identifier=request.user_identifier, + consent_given=request.consent_given, + consent_timestamp=datetime.utcnow(), + user_agent=user_request.headers.get("user-agent") + ) + + await meeting_consent_controller.create(consent) + + # Broadcast consent event via WebSocket to room participants + ws_manager = get_ws_manager() + await ws_manager.send_json( + room_id=f"meeting:{meeting_id}", + message={ + "event": "CONSENT_RESPONSE", + "data": { + "meeting_id": meeting_id, + "consent_given": request.consent_given, + "user_identifier": request.user_identifier + } + } + ) + + return {"status": "success", "consent_id": consent.id} +``` + +### Phase 3: WebSocket Event System + +**Consent Communication:** Use direct API calls instead of WebSocket events + +Since consent is meeting-level (not transcript-level), use direct API calls: +- Frontend shows consent dialog immediately when meeting loads +- User response sent directly to `/meetings/{meeting_id}/consent` endpoint +- No need for new WebSocket events - keep it simple + +**Consent Request:** ALWAYS ask - no conditions + +```ts +# Frontend: Show consent dialog immediately when meeting loads +useEffect(() => { + if (meeting?.id) { + // ALWAYS show consent dialog - no conditions + showConsentDialog(meeting.id); + } +}, [meeting?.id]); + +# Backend: Consent storage in meeting record +# Add to Meeting model: +participant_consent_responses: dict[str, bool] = Field(default_factory=dict) # {user_id: true/false} +``` + +**Simple Consent Storage:** Track participant responses + +```python +# Update Meeting model to include: +participant_consent_responses: dict[str, bool] = Field(default_factory=dict) + +# Note that it must not be possible to call /consent on already finished meeting. +# Consent endpoint stores the response: +@router.post("/meetings/{meeting_id}/consent") +async def meeting_audio_consent(meeting_id: str, request: MeetingConsentRequest): + meeting = await meetings_controller.get_by_id(meeting_id) + + # Store the consent response (true/false) + # Only store if they actually clicked something + consent_responses = meeting.participant_consent_responses or {} + consent_responses[request.user_identifier] = request.consent_given + + await meetings_controller.update_meeting( + meeting_id, participant_consent_responses=consent_responses + ) + + return {"status": "success"} +``` + +### Phase 4: Frontend Changes + +**Remove Room Entry Consent:** `www/app/[roomName]/page.tsx` + +Remove lines 24, 34-36, 80-124: +```typescript +// Remove these lines: +const [consentGiven, setConsentGiven] = useState(null); +const handleConsent = (consent: boolean) => { setConsentGiven(consent); }; +// Remove entire consent UI block (lines 80-124) + +// Simplify render condition: +if (!isAuthenticated) { + // Show loading or direct room entry, no consent check +} +``` + +**Add Consent Dialog Component:** `www/app/(app)/transcripts/components/AudioConsentDialog.tsx` + +Based on `shareModal.tsx` patterns: + +```typescript +interface AudioConsentDialogProps { + isOpen: boolean; + onClose: () => void; + onConsent: (given: boolean) => void; +} + +const AudioConsentDialog = ({ isOpen, onClose, onConsent }: AudioConsentDialogProps) => { + return ( + + + + Audio Storage Consent + + + Do you consent to storing this audio recording? + The transcript will be generated regardless of your choice. + + + + + + + + + ); +}; +``` + +**Update Recording Interface:** `www/app/(app)/transcripts/[transcriptId]/record/page.tsx` + +Add consent dialog state and handling: + +```typescript +const [showConsentDialog, setShowConsentDialog] = useState(false); +const [consentStatus, setConsentStatus] = useState(''); + +// Add to existing WebSocket event handlers +const handleConsentRequest = () => { + setShowConsentDialog(true); +}; + +const handleConsentResponse = async (consentGiven: boolean) => { + // Call API endpoint + await api.v1TranscriptAudioConsent({ + transcriptId: details.params.transcriptId, + requestBody: { consent_given: consentGiven } + }); + setShowConsentDialog(false); + setConsentStatus(consentGiven ? 'given' : 'denied'); +}; +``` + + +### Phase 5: SQS Processing Integration + +**Consent Check During Recording Processing:** `server/reflector/worker/process.py` + +Update `process_recording()` to check consent before processing: + +```python +@shared_task +@asynctask +async def process_recording(bucket_name: str, object_key: str): + logger.info("Processing recording: %s/%s", bucket_name, object_key) + + # Extract meeting info from S3 object key + room_name = f"/{object_key[:36]}" + recorded_at = datetime.fromisoformat(object_key[37:57]) + + meeting = await meetings_controller.get_by_room_name(room_name) + + + recording = await recordings_controller.get_by_object_key(bucket_name, object_key) + if not recording: + recording = await recordings_controller.create( + Recording( + bucket_name=bucket_name, + object_key=object_key, + recorded_at=recorded_at, + meeting_id=meeting.id + ) + ) + + # ALWAYS create transcript first (regardless of consent) + transcript = await transcripts_controller.get_by_recording_id(recording.id) + if transcript: + await transcripts_controller.update(transcript, {"topics": []}) + else: + transcript = await transcripts_controller.add( + "", source_kind=SourceKind.ROOM, source_language="en", + target_language="en", user_id=room.user_id, + recording_id=recording.id, share_mode="public" + ) + + # Process transcript normally (transcription, topics, summaries) + _, extension = os.path.splitext(object_key) + upload_filename = transcript.data_path / f"upload{extension}" + # ... continue with full transcript processing ... + # Check if any participant denied consent (check dict values) + consent_responses = meeting.participant_consent_responses or {} + should_delete = any(consent is False for consent in consent_responses.values()) + # AFTER transcript processing is complete, delete audio if consent denied + if should_delete: + logger.info(f"Deleting audio files for {object_key} due to consent denial") + await delete_audio_files_only(transcript, bucket_name, object_key) + +``` + +**Audio Deletion Function (AFTER transcript processing):** + +```python +async def delete_audio_files_only(transcript: Transcript, bucket_name: str, object_key: str): + """Delete ONLY audio files from all locations, keep transcript data""" + + try: + # 1. Delete original Whereby recording from S3 + s3_whereby = boto3.client( + "s3", + aws_access_key_id=settings.AWS_WHEREBY_ACCESS_KEY_ID, + aws_secret_access_key=settings.AWS_WHEREBY_ACCESS_KEY_SECRET, + ) + s3_whereby.delete_object(Bucket=bucket_name, Key=object_key) + logger.info(f"Deleted original Whereby recording: {bucket_name}/{object_key}") + + # 2. Delete processed audio from transcript storage S3 bucket + if transcript.audio_location == "storage": + storage = get_storage() + await storage.delete_file(transcript.storage_audio_path) + logger.info(f"Deleted processed audio from storage: {transcript.storage_audio_path}") + + # 3. Delete local audio files (if any remain) + transcript.audio_mp3_filename.unlink(missing_ok=True) + transcript.audio_wav_filename.unlink(missing_ok=True) + (transcript.data_path / "upload.mp4").unlink(missing_ok=True) + + # 4. Update transcript to reflect audio deletion (keep all other data) + await transcripts_controller.update(transcript, { + 'audio_location_deleted': True + }) + + logger.info(f"Deleted all audio files for transcript {transcript.id}, kept transcript data") + + except Exception as e: + logger.error(f"Failed to delete audio files for {object_key}: {str(e)}") +``` + +**Meeting Consent Controller:** `server/reflector/db/meeting_consent.py` + + +```python +class MeetingConsentController: + async def create(self, consent: MeetingConsent): + query = meeting_consent.insert().values(**consent.model_dump()) + await database.execute(query) + return consent + + async def get_by_meeting_id(self, meeting_id: str) -> list[MeetingConsent]: + query = meeting_consent.select().where(meeting_consent.c.meeting_id == meeting_id) + results = await database.fetch_all(query) + return [MeetingConsent(**result) for result in results] + + async def has_any_denial(self, meeting_id: str) -> bool: + """Check if any participant denied consent for this meeting""" + query = meeting_consent.select().where( + meeting_consent.c.meeting_id == meeting_id, + meeting_consent.c.consent_given == False + ) + result = await database.fetch_one(query) + return result is not None +``` + +### Phase 6: Testing Strategy + +**Unit Tests:** +- Test consent API endpoint +- Test WebSocket event broadcasting +- Test audio deletion logic +- Test consent status tracking + +**Integration Tests:** +- Test full consent flow during recording +- Test multiple participants consent handling +- Test recording continuation regardless of consent +- Test audio file cleanup + +**Manual Testing:** +- Join room without consent (should work) +- Receive consent request during recording +- Verify transcription continues regardless of consent choice +- Verify audio deletion when consent denied +- Verify audio preservation when consent given + +### Phase 7: Deployment Considerations + +**Database Migration:** +```bash +# Run migration +alembic upgrade head +``` + +**Rollback Plan:** +- Keep old consent logic in feature flag +- Database migration includes downgrade function +- Frontend can toggle between old/new consent flows + +**Monitoring:** +- Track consent request rates +- Monitor audio deletion operations +- Alert on consent-related errors + +## Implementation Order + +1. **Database migration** - Foundation for all changes +2. **Backend API endpoints** - Core consent handling logic +3. **WebSocket event system** - Real-time consent communication +4. **Remove room entry consent** - Unblock room joining +5. **Add recording consent dialog** - New consent UI +6. **Audio deletion logic** - Cleanup mechanism +7. **Testing and deployment** - Validation and rollout + +## Risk Mitigation + +- **Feature flags** for gradual rollout +- **Comprehensive logging** for consent operations +- **Rollback plan** if consent flow breaks +- **Audio file backup** before deletion (configurable) +- **Legal review** of consent language and timing + +This plan maintains backward compatibility while implementing the new consent flow without interrupting core recording functionality. \ No newline at end of file diff --git a/README.md b/README.md index 2a5600ce..2a395026 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,12 @@ Start with `cd www`. ### Installation +**Note**: This project requires Node.js v20.18.1 to maintain yarn.lock compatibility. If using `n` for Node version management: + +```bash +n 20.18.1 +``` + To install the application, run: ```bash diff --git a/REQUIREMENTS.md b/REQUIREMENTS.md new file mode 100644 index 00000000..5f9e4f93 --- /dev/null +++ b/REQUIREMENTS.md @@ -0,0 +1,49 @@ +# Audio Storage Consent Flow Requirements + +## Current Problem +- Users must consent to recording **before** joining room +- Consent blocks room entry at `/app/[roomName]/page.tsx:80-124` +- Users cannot participate without prior consent + +## System Reality: Recording Detection Constraints +- **No real-time recording detection**: System only discovers recordings after they complete (60+ second SQS delay) +- **Cannot stop recordings**: Whereby controls recording entirely based on room configuration +- **Limited webhook events**: Only `room.client.joined/left` available, no recording webhooks +- **Post-processing only**: Can only mark recordings for deletion during transcript processing + +## Required Changes + +### 1. Remove Pre-Entry Consent Blocking +- **Remove** consent dialog from room entry page +- Allow immediate room joining without consent check + +### 2. Request Audio Storage Consent During Meeting Session +- Ask during meeting: **"Do you consent to storing this audio recording?"** +- **Timing**: ALWAYS ask - no conditions, no participant count checks, no configuration checks +- **Scope**: Per meeting session (`meeting_id`), not per room (rooms are reused) +- **Storage**: Dictionary of participants with their consent responses {user_id: true/false} in meeting record + +### 3. Handle Consent Responses +- **If ANY participant denies consent:** Mark recording for deletion during post-processing +- **If ALL participants consent:** Keep audio file as normal +- **Always:** Continue meeting, recording, and transcription (cannot be interrupted) + +### 4. Audio Deletion Logic +- **Always**: Create transcript, topics, summaries, waveforms first +- **Then**: If consent denied, delete only audio files (`upload.mp4`, `audio.mp3`, `audio.wav`) +- **Keep**: All transcript data, topics, summaries, waveforms (audio content is transcribed) +- **Scope**: Only affects specific meeting's audio files, not other sessions in same room + +## Recording Trigger Context +Whereby recording starts based on room configuration: +- `"automatic-2nd-participant"` (default): Recording starts when 2nd person joins +- `"automatic"`: Recording starts immediately when meeting begins +- `"prompt"`: Manual recording start (host control) +- `"none"`: No recording + +## Success Criteria +- Users join rooms without barriers +- Audio storage consent requested during meeting (estimated timing) +- Post-processing checks consent and deletes audio if denied +- Transcription and analysis unaffected by consent choice +- Multiple meeting sessions in same room handled independently \ No newline at end of file diff --git a/server/README.md b/server/README.md index e69de29b..74675085 100644 --- a/server/README.md +++ b/server/README.md @@ -0,0 +1,22 @@ +## AWS S3/SQS usage clarification + +Whereby.com uploads recordings directly to our S3 bucket when meetings end. + +SQS Queue (AWS_PROCESS_RECORDING_QUEUE_URL) + +Filled by: AWS S3 Event Notifications + +The S3 bucket is configured to send notifications to our SQS queue when new objects are created. This is standard AWS infrastructure - not in our codebase. + +AWS S3 → SQS Event Configuration: +- Event Type: s3:ObjectCreated:* +- Filter: *.mp4 files +- Destination: Our SQS queue + +Our System's Role + +Polls SQS every 60 seconds via /server/reflector/worker/process.py:24-62: + +# Every 60 seconds, check for new recordings +sqs = boto3.client("sqs", ...) +response = sqs.receive_message(QueueUrl=queue_url, ...) diff --git a/server/reflector/db/transcripts.py b/server/reflector/db/transcripts.py index b9ffe0d2..5953fe0b 100644 --- a/server/reflector/db/transcripts.py +++ b/server/reflector/db/transcripts.py @@ -542,7 +542,7 @@ class TranscriptController: topic: TranscriptTopic, ) -> TranscriptEvent: """ - Append an event to a transcript + Upsert topics to a transcript """ transcript.upsert_topic(topic) await self.update( diff --git a/www/app/lib/WherebyEmbed.tsx b/www/app/lib/WherebyWebinarEmbed.tsx similarity index 90% rename from www/app/lib/WherebyEmbed.tsx rename to www/app/lib/WherebyWebinarEmbed.tsx index 6a7df0c7..94ce5d53 100644 --- a/www/app/lib/WherebyEmbed.tsx +++ b/www/app/lib/WherebyWebinarEmbed.tsx @@ -8,9 +8,11 @@ interface WherebyEmbedProps { onLeave?: () => void; } -export default function WherebyEmbed({ roomUrl, onLeave }: WherebyEmbedProps) { +// currently used for webinars only +export default function WherebyWebinarEmbed({ roomUrl, onLeave }: WherebyEmbedProps) { const wherebyRef = useRef(null); + // TODO extract common toast logic / styles to be used by consent toast on normal rooms const toast = useToast(); useEffect(() => { if (roomUrl && !localStorage.getItem("recording-notice-dismissed")) { diff --git a/www/app/webinars/[title]/page.tsx b/www/app/webinars/[title]/page.tsx index 914bd4c4..cc798e15 100644 --- a/www/app/webinars/[title]/page.tsx +++ b/www/app/webinars/[title]/page.tsx @@ -5,7 +5,7 @@ import Image from "next/image"; import { notFound } from "next/navigation"; import useRoomMeeting from "../../[roomName]/useRoomMeeting"; import dynamic from "next/dynamic"; -const WherebyEmbed = dynamic(() => import("../../lib/WherebyEmbed"), { +const WherebyEmbed = dynamic(() => import("../../lib/./WherebyWebinarEmbed"), { ssr: false, }); import { FormEvent } from "react"; From b85338754e179f00f5a8f209bd20607b375e6a6c Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Tue, 17 Jun 2025 12:53:19 -0400 Subject: [PATCH 02/30] hydration mismatch warning --- .gitignore | 4 +- PLAN.md | 6 +- compose.yml | 4 +- www/app/(app)/transcripts/new/page.tsx | 50 +- www/app/(app)/transcripts/useAudioDevice.ts | 9 + www/yarn.lock | 18911 +++++++++++------- 6 files changed, 11270 insertions(+), 7714 deletions(-) diff --git a/.gitignore b/.gitignore index 722ac817..18c9ce2b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,6 @@ server/exportdanswer dump.rdb .yarn ngrok.log -.claude/settings.local.json \ No newline at end of file +.claude/settings.local.json +restart-dev.sh +backend-output.log \ No newline at end of file diff --git a/PLAN.md b/PLAN.md index ddf5bf04..d33a3e5b 100644 --- a/PLAN.md +++ b/PLAN.md @@ -389,4 +389,8 @@ alembic upgrade head - **Audio file backup** before deletion (configurable) - **Legal review** of consent language and timing -This plan maintains backward compatibility while implementing the new consent flow without interrupting core recording functionality. \ No newline at end of file +This plan maintains backward compatibility while implementing the new consent flow without interrupting core recording functionality. + +## Extra notes + +Room creator must not be asked for consent \ No newline at end of file diff --git a/compose.yml b/compose.yml index 0f1526a0..c9c59927 100644 --- a/compose.yml +++ b/compose.yml @@ -38,11 +38,11 @@ services: web: image: node:18 ports: - - "3000:3000" + - "3001:3000" command: sh -c "yarn install && yarn dev" restart: unless-stopped working_dir: /app volumes: - ./www:/app/ env_file: - - ./www/.env.local + - ./www/.env.development.local diff --git a/www/app/(app)/transcripts/new/page.tsx b/www/app/(app)/transcripts/new/page.tsx index 9d12ddda..acc98c6c 100644 --- a/www/app/(app)/transcripts/new/page.tsx +++ b/www/app/(app)/transcripts/new/page.tsx @@ -68,13 +68,13 @@ const TranscriptCreate = () => { }; const send = () => { - if (loadingRecord || createTranscript.loading || permissionDenied) return; + if (!isClient || loadingRecord || createTranscript.loading || permissionDenied) return; setLoadingRecord(true); createTranscript.create({ name, target_language: getTargetLanguage() }); }; const uploadFile = () => { - if (loadingUpload || createTranscript.loading || permissionDenied) return; + if (!isClient || loadingUpload || createTranscript.loading || permissionDenied) return; setLoadingUpload(true); createTranscript.create({ name, target_language: getTargetLanguage() }); }; @@ -91,7 +91,7 @@ const TranscriptCreate = () => { if (createTranscript.error) setLoadingRecord(false); }, [createTranscript.error]); - const { loading, permissionOk, permissionDenied, requestPermission } = + const { loading, permissionOk, permissionDenied, requestPermission, isClient } = useAudioDevice(); return ( @@ -123,12 +123,12 @@ const TranscriptCreate = () => { Reflector is a transcription and summarization pipeline that transforms audio into knowledge. - - The output is meeting minutes and topic summaries enabling + + {" "}The output is meeting minutes and topic summaries enabling topic-specific analyses stored in your systems of record. This is accomplished on your infrastructure – without 3rd parties – keeping your data private, secure, and organized. - + @@ -179,29 +179,31 @@ const TranscriptCreate = () => { placeholder="Choose your language" /> - {loading ? ( - Checking permissions... - ) : permissionOk ? ( - - ) : permissionDenied ? ( - - Permission to use your microphone was denied, please change - the permission setting in your browser and refresh this - page. - + {isClient && !loading ? ( + permissionOk ? ( + + ) : permissionDenied ? ( + + Permission to use your microphone was denied, please change + the permission setting in your browser and refresh this + page. + + ) : ( + + ) ) : ( - + Checking permissions... )} - - - -) : ( - // Lines 114-120: Rejection message - You cannot join the meeting without consenting... -)} -``` - -**What to Change:** Remove entire consent blocking logic, allow direct room entry. - ---- - -## 2. Whereby Integration Reality - -### File: `www/app/[roomName]/page.tsx` -**Purpose:** Main room page where video call happens via whereby-embed - -**Key Whereby Integration:** -- **Line 129:** `` element - this IS the video call -- **Lines 26-28:** Room URL from meeting API -- **Lines 48-57:** Event listeners for whereby events - -**What Happens:** -1. `useRoomMeeting()` calls backend to create/get Whereby meeting -2. Whereby automatically records based on room `recording_trigger` configuration -3. **NO real-time recording status** - system doesn't know when recording starts/stops - -### File: `www/app/[roomName]/useRoomMeeting.tsx` -**Purpose:** Creates or retrieves Whereby meeting for room - -**Key Flow:** -- **Line 48:** Calls `v1RoomsCreateMeeting({ roomName })` -- **Lines 49-52:** Returns meeting with `room_url` and `host_room_url` -- Meeting includes recording configuration from room settings - -**What to Add:** Consent dialog overlay on the whereby-embed - always ask for consent regardless of meeting configuration (simplified approach). - ---- - -## 3. Recording Discovery System (POST-PROCESSING ONLY) - -### File: `server/reflector/worker/process.py` -**Purpose:** Discovers recordings after they complete via SQS polling - -**Key Areas:** -- **Lines 24-62:** `process_messages()` - polls SQS every 60 seconds -- **Lines 66-133:** `process_recording()` - processes discovered recording files -- **Lines 69-71:** Extracts meeting info from S3 object key format - -**Current Discovery Flow:** -```python -# Lines 69-71: Parse S3 object key -room_name = f"/{object_key[:36]}" # First 36 chars = room GUID -recorded_at = datetime.fromisoformat(object_key[37:57]) # Timestamp - -# Lines 73-74: Link to meeting -meeting = await meetings_controller.get_by_room_name(room_name) -room = await rooms_controller.get_by_id(meeting.room_id) -``` - -**What to Add:** Consent checking after transcript processing - always create transcript first, then delete only audio files if consent denied. - -### File: `server/reflector/worker/app.py` -**Purpose:** Celery task scheduling - -**Key Schedule:** -- **Lines 26-29:** `process_messages` runs every 60 seconds -- **Lines 30-33:** `process_meetings` runs every 60 seconds to check meeting status - -**Reality:** consent must be requested during the meeting, not based on recording detection. - ---- - -## 4. Meeting-Based Consent Timing - -### File: `server/reflector/views/whereby.py` -**Purpose:** Whereby webhook handler - receives participant join/leave events - -**Key Areas:** -- **Lines 69-72:** Handles `room.client.joined` and `room.client.left` events -- **Line 71:** Updates `num_clients` count in meeting record - -**Current Logic:** -```python -# Lines 69-72: Participant tracking -if event.type in ["room.client.joined", "room.client.left"]: - await meetings_controller.update_meeting( - meeting.id, num_clients=event.data["numClients"] - ) -``` - -**What to Add:** ALWAYS ask for consent - no triggers, no conditions. Simple list field to track who denied consent. - -### File: `server/reflector/db/meetings.py` -**Purpose:** Meeting database model and recording configuration - -**Key Recording Config:** -- **Lines 56-59:** Recording trigger options: - - `"automatic"` - Recording starts immediately - - `"automatic-2nd-participant"` (default) - Recording starts when 2nd person joins - - `"prompt"` - Manual recording start - - `"none"` - No recording - -**Current Meeting Model:** -```python -# Lines 56-59: Recording configuration -recording_type: Literal["none", "local", "cloud"] = "cloud" -recording_trigger: Literal[ - "none", "prompt", "automatic", "automatic-2nd-participant" -] = "automatic-2nd-participant" -``` - -**What to Add:** Dictionary field `participant_consent_responses: dict[str, bool]` in Meeting model to store {user_id: true/false}. ALWAYS ask for consent - no complex logic. - ---- - -## 5. Consent Implementation (NO WebSockets Needed) - -**Consent is meeting-level, not transcript-level** - WebSocket events are for transcript processing, not consent. - -### Simple Consent Flow: -1. **Frontend**: Show consent dialog when meeting loads -2. **User Response**: Direct API call to `/meetings/{meeting_id}/consent` -3. **Backend**: Store response in meeting record -4. **SQS Processing**: Check consent during recording processing - -**No WebSocket events needed** - consent is a simple API interaction, not real-time transcript data. - ---- - -## 4. Backend WebSocket System - -### File: `server/reflector/views/transcripts_websocket.py` -**Purpose:** Server-side WebSocket endpoint for real-time events - -**Key Areas:** -- **Lines 19-55:** `transcript_events_websocket` function -- **Line 32:** Room ID format: `room_id = f"ts:{transcript_id}"` -- **Lines 37-44:** Initial event sending to new connections -- **Lines 42-43:** Filtering events: `if name in ("TRANSCRIPT", "STATUS"): continue` - -**Current Flow:** -1. WebSocket connects to `/transcripts/{transcript_id}/events` -2. Server adds user to Redis room `ts:{transcript_id}` -3. Server sends historical events (except TRANSCRIPT/STATUS) -4. Server waits for new events via Redis pub/sub - -**What to Add:** Handle new consent events in the message flow. - -### File: `server/reflector/ws_manager.py` -**Purpose:** Redis pub/sub WebSocket management - -**Key Areas:** -- **Lines 61-99:** `WebsocketManager` class -- **Lines 78-79:** `send_json` method for broadcasting -- **Lines 88-98:** `_pubsub_data_reader` for distributing messages - -**Broadcasting Pattern:** -```python -# Line 78: How to broadcast to all users in a room -async def send_json(self, room_id: str, message: dict) -> None: - await self.pubsub_client.send_json(room_id, message) -``` - -**What to Use:** This system for broadcasting consent requests and responses. - ---- - -## 5. Database Models and Migrations - -### File: `server/reflector/db/transcripts.py` -**Purpose:** Transcript database model and controller - -**Key Areas:** -- **Lines 28-73:** `transcripts` SQLAlchemy table definition -- **Lines 149-172:** `Transcript` Pydantic model -- **Lines 304-614:** `TranscriptController` class with database operations - -**Current Schema Fields:** -```python -# Lines 31-72: Key existing columns -sqlalchemy.Column("id", sqlalchemy.String, primary_key=True), -sqlalchemy.Column("status", sqlalchemy.String), -sqlalchemy.Column("duration", sqlalchemy.Integer), -sqlalchemy.Column("locked", sqlalchemy.Boolean), -sqlalchemy.Column("audio_location", sqlalchemy.String, server_default="local"), -# ... more columns -``` - -**Audio File Management:** -- **Lines 225-230:** Audio file path properties -- **Lines 252-284:** `get_audio_url` method for accessing audio -- **Lines 554-571:** `move_mp3_to_storage` for cloud storage - -**What to Add:** New columns for consent tracking and deletion marking. - -### File: `server/migrations/versions/b9348748bbbc_reviewed.py` -**Purpose:** Example migration pattern for adding boolean columns - -**Pattern:** -```python -# Lines 20-23: Adding boolean column with default -def upgrade() -> None: - op.add_column('transcript', sa.Column('reviewed', sa.Boolean(), - server_default=sa.text('0'), nullable=False)) - -def downgrade() -> None: - op.drop_column('transcript', 'reviewed') -``` - -**What to Follow:** This pattern for adding consent columns. - ---- - -## 6. API Endpoint Patterns - -### File: `server/reflector/views/transcripts.py` -**Purpose:** REST API endpoints for transcript operations - -**Key Areas:** -- **Lines 29-30:** Router setup: `router = APIRouter()` -- **Lines 70-85:** `CreateTranscript` and `UpdateTranscript` models -- **Lines 122-135:** Example POST endpoint: `transcripts_create` - -**Endpoint Pattern:** -```python -# Lines 122-135: Standard endpoint structure -@router.post("/transcripts", response_model=GetTranscript) -async def transcripts_create( - info: CreateTranscript, - user: Annotated[Optional[auth.UserInfo], Depends(auth.current_user_optional)], -): - user_id = user["sub"] if user else None - return await transcripts_controller.add(...) -``` - -**Authentication Pattern:** -- **Line 125:** Optional user authentication dependency -- **Line 127:** Extract user ID: `user_id = user["sub"] if user else None` - -**What to Follow:** This pattern for new consent endpoint. - ---- - -## 7. Live Pipeline System - -### File: `server/reflector/pipelines/main_live_pipeline.py` -**Purpose:** Real-time processing pipeline during recording - -**Key Areas:** -- **Lines 80-96:** `@broadcast_to_sockets` decorator for WebSocket events -- **Lines 98-104:** `@get_transcript` decorator for database access -- **Line 56:** WebSocket manager import: `from reflector.ws_manager import get_ws_manager` - -**Event Broadcasting Pattern:** -```python -# Lines 80-95: Decorator for broadcasting events -def broadcast_to_sockets(func): - async def wrapper(self, *args, **kwargs): - resp = await func(self, *args, **kwargs) - if resp is None: - return - await self.ws_manager.send_json( - room_id=self.ws_room_id, - message=resp.model_dump(mode="json"), - ) - return wrapper -``` - ---- - -## 8. Modal/Dialog Patterns - -### File: `www/app/(app)/transcripts/[transcriptId]/shareModal.tsx` -**Purpose:** Example modal implementation using fixed overlay - -**Key Areas:** -- **Lines 105-176:** Modal implementation using `fixed inset-0` overlay -- **Lines 107-108:** Overlay styling: `fixed inset-0 bg-gray-600 bg-opacity-50` -- **Lines 152-170:** Button patterns for actions - -**Modal Structure:** -```typescript -// Lines 105-109: Modal overlay and container -
- {props.show && ( -
-
- // Modal content... -
-
- )} -
-``` - -### File: `www/app/(app)/transcripts/shareAndPrivacy.tsx` -**Purpose:** Example using Chakra UI Modal components - -**Key Areas:** -- **Lines 10-16:** Chakra UI Modal imports -- **Lines 86-100:** Chakra Modal structure - -**Chakra Modal Pattern:** -```typescript -// Lines 86-94: Chakra UI Modal structure - setShowModal(false)} size={"xl"}> - - - Share - - // Modal content... - - - -``` - -**What to Choose:** Either pattern works - fixed overlay for simple cases, Chakra UI for consistent styling. - ---- - -## 9. Audio File Management - -### File: `server/reflector/db/transcripts.py` -**Purpose:** Audio file storage and access - -**Key Methods:** -- **Lines 225-230:** File path properties - - `audio_wav_filename`: Local WAV file path - - `audio_mp3_filename`: Local MP3 file path - - `storage_audio_path`: Cloud storage path -- **Lines 252-284:** `get_audio_url()` - Generate access URL -- **Lines 554-571:** `move_mp3_to_storage()` - Move to cloud -- **Lines 572-580:** `download_mp3_from_storage()` - Download from cloud - -**File Path Properties:** -```python -# Lines 225-230: Audio file locations -@property -def audio_wav_filename(self): - return self.data_path / "audio.wav" - -@property -def audio_mp3_filename(self): - return self.data_path / "audio.mp3" -``` - -**Storage Logic:** -- **Line 253:** Local files: `if self.audio_location == "local"` -- **Line 255:** Cloud storage: `elif self.audio_location == "storage"` - -**What to Modify:** Add deletion logic and update `get_audio_url` to handle deleted files. - ---- - -## 10. Review Checklist - -Before implementing, manually review these areas with the **meeting-based consent** approach: - -### Frontend Changes -- [ ] **Room Entry**: Remove consent blocking in `www/app/[roomName]/page.tsx:80-124` -- [ ] **Meeting UI**: Add consent dialog overlay on `whereby-embed` in `www/app/[roomName]/page.tsx:126+` -- [ ] **Meeting Hook**: Update `www/app/[roomName]/useRoomMeeting.tsx` to provide meeting data for consent -- [ ] **WebSocket Events**: Add consent event handlers (meeting-based, not transcript-based) -- [ ] **User Identification**: Add browser fingerprinting for anonymous users - -### Backend Changes - Meeting Scope -- [ ] **Database**: Create `meeting_consent` table migration following `server/migrations/versions/b9348748bbbc_reviewed.py` pattern -- [ ] **Meeting Model**: Add consent tracking in `server/reflector/db/meetings.py` -- [ ] **Recording Model**: Add deletion flags in `server/reflector/db/recordings.py` -- [ ] **API**: Add meeting consent endpoint in `server/reflector/views/meetings.py` -- [ ] **Whereby Webhook**: Update `server/reflector/views/whereby.py` to trigger consent based on participant count -- [ ] **SQS Processing**: Update `server/reflector/worker/process.py` to check consent before processing recordings - -### Critical Integration Points -- [ ] **Consent Timing**: ALWAYS ask for consent - no conditions, no triggers, no participant count checks -- [ ] **SQS Processing**: Always create transcript first, then delete only audio files if consent denied -- [ ] **Meeting Scoping**: All consent tracking uses `meeting_id`, not `room_id` (rooms are reused) -- [ ] **Post-Processing Only**: No real-time recording control - all intervention happens during SQS processing - -### Testing Strategy -- [ ] **Multiple Participants**: Test consent collection from multiple users in same meeting -- [ ] **Room Reuse**: Verify consent doesn't affect other meetings in same room -- [ ] **Recording Triggers**: Test different `recording_trigger` configurations -- [ ] **SQS Deletion**: Verify recordings are deleted from S3 when consent denied -- [ ] **Timing Edge Cases**: Test consent given after recording already started - -**Reality Check**: This implementation works with **post-processing deletion only**. We cannot stop recordings in progress or detect exactly when they start. Consent timing is estimated based on meeting configuration and participant events. \ No newline at end of file diff --git a/PLAN.md b/PLAN.md index d33a3e5b..93dca3bd 100644 --- a/PLAN.md +++ b/PLAN.md @@ -106,33 +106,8 @@ useEffect(() => { } }, [meeting?.id]); -# Backend: Consent storage in meeting record -# Add to Meeting model: -participant_consent_responses: dict[str, bool] = Field(default_factory=dict) # {user_id: true/false} -``` - -**Simple Consent Storage:** Track participant responses - -```python -# Update Meeting model to include: -participant_consent_responses: dict[str, bool] = Field(default_factory=dict) - -# Note that it must not be possible to call /consent on already finished meeting. -# Consent endpoint stores the response: -@router.post("/meetings/{meeting_id}/consent") -async def meeting_audio_consent(meeting_id: str, request: MeetingConsentRequest): - meeting = await meetings_controller.get_by_id(meeting_id) - - # Store the consent response (true/false) - # Only store if they actually clicked something - consent_responses = meeting.participant_consent_responses or {} - consent_responses[request.user_identifier] = request.consent_given - - await meetings_controller.update_meeting( - meeting_id, participant_consent_responses=consent_responses - ) - - return {"status": "success"} +# Backend: Consent storage using meeting_consent table +# Use meeting_consent table for proper normalization ``` ### Phase 4: Frontend Changes @@ -152,7 +127,7 @@ if (!isAuthenticated) { } ``` -**Add Consent Dialog Component:** `www/app/(app)/transcripts/components/AudioConsentDialog.tsx` +**Add Consent Dialog Component:** `www/app/(app)/rooms/audioConsentDialog.tsx` Based on `shareModal.tsx` patterns: @@ -259,9 +234,8 @@ async def process_recording(bucket_name: str, object_key: str): _, extension = os.path.splitext(object_key) upload_filename = transcript.data_path / f"upload{extension}" # ... continue with full transcript processing ... - # Check if any participant denied consent (check dict values) - consent_responses = meeting.participant_consent_responses or {} - should_delete = any(consent is False for consent in consent_responses.values()) + # Check if any participant denied consent using meeting_consent_controller + should_delete = await meeting_consent_controller.has_any_denial(meeting.id) # AFTER transcript processing is complete, delete audio if consent denied if should_delete: logger.info(f"Deleting audio files for {object_key} due to consent denial") diff --git a/TODO.md b/TODO.md new file mode 100644 index 00000000..e57a251f --- /dev/null +++ b/TODO.md @@ -0,0 +1,2 @@ +- non-auth user consent - store on frontend per session? per meeting? (get meeting from the iframe) +- consent field userIdentity itself - optional \ No newline at end of file diff --git a/server/.env_template b/server/.env_template index 8252dfdd..2c79d80d 100644 --- a/server/.env_template +++ b/server/.env_template @@ -18,3 +18,4 @@ DIARIZATION_URL=https://monadical-sas--reflector-diarizer-web.modal.run BASE_URL=https://xxxxx.ngrok.app DIARIZATION_ENABLED=false +SQS_POLLING_TIMEOUT_SECONDS=60 diff --git a/server/migrations/versions/20250617140003_add_meeting_consent_table.py b/server/migrations/versions/20250617140003_add_meeting_consent_table.py new file mode 100644 index 00000000..3f42fafc --- /dev/null +++ b/server/migrations/versions/20250617140003_add_meeting_consent_table.py @@ -0,0 +1,37 @@ +"""add meeting consent table + +Revision ID: 20250617140003 +Revises: f819277e5169 +Create Date: 2025-06-17 14:00:03.000000 + +""" +from typing import Sequence, Union + +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "20250617140003" +down_revision: Union[str, None] = "f819277e5169" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # Create meeting_consent table + op.create_table( + 'meeting_consent', + sa.Column('id', sa.String(), nullable=False), + sa.Column('meeting_id', sa.String(), nullable=False), + sa.Column('user_identifier', sa.String(), nullable=False), + sa.Column('consent_given', sa.Boolean(), nullable=False), + sa.Column('consent_timestamp', sa.DateTime(), nullable=False), + sa.Column('user_agent', sa.String(), nullable=True), + sa.PrimaryKeyConstraint('id'), + sa.ForeignKeyConstraint(['meeting_id'], ['meeting.id']), + ) + + +def downgrade() -> None: + # Drop meeting_consent table + op.drop_table('meeting_consent') \ No newline at end of file diff --git a/server/migrations/versions/38e116c82385_make_user_identifier_optional_in_.py b/server/migrations/versions/38e116c82385_make_user_identifier_optional_in_.py new file mode 100644 index 00000000..b97cf6e5 --- /dev/null +++ b/server/migrations/versions/38e116c82385_make_user_identifier_optional_in_.py @@ -0,0 +1,32 @@ +"""make user_identifier optional in meeting_consent + +Revision ID: 38e116c82385 +Revises: 20250617140003 +Create Date: 2025-06-17 15:23:41.346980 + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision: str = '38e116c82385' +down_revision: Union[str, None] = '20250617140003' +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # Make user_identifier column nullable + op.alter_column('meeting_consent', 'user_identifier', + existing_type=sa.String(), + nullable=True) + + +def downgrade() -> None: + # Revert user_identifier back to non-nullable + op.alter_column('meeting_consent', 'user_identifier', + existing_type=sa.String(), + nullable=False) diff --git a/server/reflector/app.py b/server/reflector/app.py index 079a5efe..d10fc744 100644 --- a/server/reflector/app.py +++ b/server/reflector/app.py @@ -11,6 +11,7 @@ from reflector.events import subscribers_shutdown, subscribers_startup from reflector.logger import logger from reflector.metrics import metrics_init from reflector.settings import settings +from reflector.views.meetings import router as meetings_router from reflector.views.rooms import router as rooms_router from reflector.views.rtc_offer import router as rtc_offer_router from reflector.views.transcripts import router as transcripts_router @@ -71,6 +72,7 @@ metrics_init(app, instrumentator) # register views app.include_router(rtc_offer_router) +app.include_router(meetings_router, prefix="/v1") app.include_router(rooms_router, prefix="/v1") app.include_router(transcripts_router, prefix="/v1") app.include_router(transcripts_audio_router, prefix="/v1") diff --git a/server/reflector/db/meetings.py b/server/reflector/db/meetings.py index 6852d5b0..e064fb7a 100644 --- a/server/reflector/db/meetings.py +++ b/server/reflector/db/meetings.py @@ -3,9 +3,10 @@ from typing import Literal import sqlalchemy as sa from fastapi import HTTPException -from pydantic import BaseModel +from pydantic import BaseModel, Field from reflector.db import database, metadata from reflector.db.rooms import Room +from reflector.utils import generate_uuid4 meetings = sa.Table( "meeting", @@ -41,6 +42,26 @@ meetings = sa.Table( ), ) +meeting_consent = sa.Table( + "meeting_consent", + metadata, + sa.Column("id", sa.String, primary_key=True), + sa.Column("meeting_id", sa.String, sa.ForeignKey("meeting.id")), + sa.Column("user_identifier", sa.String, nullable=True), + sa.Column("consent_given", sa.Boolean), + sa.Column("consent_timestamp", sa.DateTime), + sa.Column("user_agent", sa.String, nullable=True), +) + + +class MeetingConsent(BaseModel): + id: str = Field(default_factory=generate_uuid4) + meeting_id: str + user_identifier: str | None = None + consent_given: bool + consent_timestamp: datetime + user_agent: str | None = None + class Meeting(BaseModel): id: str @@ -116,7 +137,7 @@ class MeetingController: async def get_active(self, room: Room, current_time: datetime) -> Meeting: """ - Get latest meeting for a room. + Get latest active meeting for a room. """ end_date = getattr(meetings.c, "end_date") query = ( @@ -125,6 +146,7 @@ class MeetingController: sa.and_( meetings.c.room_id == room.id, meetings.c.end_date > current_time, + meetings.c.is_active == True, ) ) .order_by(end_date.desc()) @@ -167,4 +189,57 @@ class MeetingController: await database.execute(query) +class MeetingConsentController: + async def get_by_meeting_id(self, meeting_id: str) -> list[MeetingConsent]: + query = meeting_consent.select().where(meeting_consent.c.meeting_id == meeting_id) + results = await database.fetch_all(query) + return [MeetingConsent(**result) for result in results] + + async def get_by_meeting_and_user(self, meeting_id: str, user_identifier: str) -> MeetingConsent | None: + """Get existing consent for a specific user and meeting""" + query = meeting_consent.select().where( + meeting_consent.c.meeting_id == meeting_id, + meeting_consent.c.user_identifier == user_identifier + ) + result = await database.fetch_one(query) + return MeetingConsent(**result) if result else None + + async def create_or_update(self, consent: MeetingConsent) -> MeetingConsent: + """Create new consent or update existing one for authenticated users""" + if consent.user_identifier: + # For authenticated users, check if consent already exists + existing = await self.get_by_meeting_and_user(consent.meeting_id, consent.user_identifier) + if existing: + # Update existing consent + query = meeting_consent.update().where( + meeting_consent.c.id == existing.id + ).values( + consent_given=consent.consent_given, + consent_timestamp=consent.consent_timestamp, + user_agent=consent.user_agent + ) + await database.execute(query) + + # Return updated consent object + existing.consent_given = consent.consent_given + existing.consent_timestamp = consent.consent_timestamp + existing.user_agent = consent.user_agent + return existing + + # For anonymous users or first-time authenticated users, create new record + query = meeting_consent.insert().values(**consent.model_dump()) + await database.execute(query) + return consent + + async def has_any_denial(self, meeting_id: str) -> bool: + """Check if any participant denied consent for this meeting""" + query = meeting_consent.select().where( + meeting_consent.c.meeting_id == meeting_id, + meeting_consent.c.consent_given == False + ) + result = await database.fetch_one(query) + return result is not None + + meetings_controller = MeetingController() +meeting_consent_controller = MeetingConsentController() diff --git a/server/reflector/settings.py b/server/reflector/settings.py index 9fd8748e..54a8f87e 100644 --- a/server/reflector/settings.py +++ b/server/reflector/settings.py @@ -138,6 +138,7 @@ class Settings(BaseSettings): HEALTHCHECK_URL: str | None = None AWS_PROCESS_RECORDING_QUEUE_URL: str | None = None + SQS_POLLING_TIMEOUT_SECONDS: int = 60 WHEREBY_API_URL: str = "https://api.whereby.dev/v1" diff --git a/server/reflector/storage/__init__.py b/server/reflector/storage/__init__.py index fd4c72f0..edfb8079 100644 --- a/server/reflector/storage/__init__.py +++ b/server/reflector/storage/__init__.py @@ -1 +1,7 @@ from .base import Storage # noqa + +def get_storage() -> Storage: + from reflector.settings import settings + return Storage.get_instance( + name=settings.TRANSCRIPT_STORAGE_BACKEND, + ) diff --git a/server/reflector/utils/__init__.py b/server/reflector/utils/__init__.py index e69de29b..254ce4b6 100644 --- a/server/reflector/utils/__init__.py +++ b/server/reflector/utils/__init__.py @@ -0,0 +1,5 @@ +from uuid import uuid4 + + +def generate_uuid4() -> str: + return str(uuid4()) \ No newline at end of file diff --git a/server/reflector/views/meetings.py b/server/reflector/views/meetings.py new file mode 100644 index 00000000..01ea03d1 --- /dev/null +++ b/server/reflector/views/meetings.py @@ -0,0 +1,42 @@ +from datetime import datetime + +from fastapi import APIRouter, HTTPException, Request +from pydantic import BaseModel + +from reflector.db.meetings import ( + MeetingConsent, + meeting_consent_controller, + meetings_controller, +) + +router = APIRouter() + + +class MeetingConsentRequest(BaseModel): + consent_given: bool + user_identifier: str | None = None + + +@router.post("/meetings/{meeting_id}/consent") +async def meeting_audio_consent( + meeting_id: str, + request: MeetingConsentRequest, + user_request: Request, +): + meeting = await meetings_controller.get_by_id(meeting_id) + if not meeting: + raise HTTPException(status_code=404, detail="Meeting not found") + + # Store consent in meeting_consent table (create or update for authenticated users) + consent = MeetingConsent( + meeting_id=meeting_id, + user_identifier=request.user_identifier, + consent_given=request.consent_given, + consent_timestamp=datetime.utcnow(), + user_agent=user_request.headers.get("user-agent") + ) + + # Use create_or_update to handle consent overrides for authenticated users + updated_consent = await meeting_consent_controller.create_or_update(consent) + + return {"status": "success", "consent_id": updated_consent.id} \ No newline at end of file diff --git a/server/reflector/worker/app.py b/server/reflector/worker/app.py index e8bad4ab..bf32ee95 100644 --- a/server/reflector/worker/app.py +++ b/server/reflector/worker/app.py @@ -25,11 +25,11 @@ else: app.conf.beat_schedule = { "process_messages": { "task": "reflector.worker.process.process_messages", - "schedule": 60.0, + "schedule": float(settings.SQS_POLLING_TIMEOUT_SECONDS), }, "process_meetings": { "task": "reflector.worker.process.process_meetings", - "schedule": 60.0, + "schedule": float(settings.SQS_POLLING_TIMEOUT_SECONDS), }, "reprocess_failed_recordings": { "task": "reflector.worker.process.reprocess_failed_recordings", diff --git a/server/reflector/worker/process.py b/server/reflector/worker/process.py index 85e249e5..d8c45808 100644 --- a/server/reflector/worker/process.py +++ b/server/reflector/worker/process.py @@ -9,10 +9,11 @@ import structlog from celery import shared_task from celery.utils.log import get_task_logger from pydantic import ValidationError -from reflector.db.meetings import meetings_controller +from reflector.db.meetings import meeting_consent_controller, meetings_controller from reflector.db.recordings import Recording, recordings_controller from reflector.db.rooms import rooms_controller from reflector.db.transcripts import SourceKind, transcripts_controller +from reflector.storage import get_storage from reflector.pipelines.main_live_pipeline import asynctask, task_pipeline_process from reflector.settings import settings from reflector.whereby import get_room_sessions @@ -130,6 +131,51 @@ async def process_recording(bucket_name: str, object_key: str): await transcripts_controller.update(transcript, {"status": "uploaded"}) task_pipeline_process.delay(transcript_id=transcript.id) + + # Check if any participant denied consent after transcript processing is complete + should_delete = await meeting_consent_controller.has_any_denial(meeting.id) + if should_delete: + logger.info(f"Deleting audio files for {object_key} due to consent denial") + await delete_audio_files_only(transcript, bucket_name, object_key) + + +async def delete_audio_files_only(transcript, bucket_name: str, object_key: str): + """Delete ONLY audio files from all locations, keep transcript data""" + + try: + # 1. Delete original Whereby recording from S3 + s3_whereby = boto3.client( + "s3", + aws_access_key_id=settings.AWS_WHEREBY_ACCESS_KEY_ID, + aws_secret_access_key=settings.AWS_WHEREBY_ACCESS_KEY_SECRET, + ) + s3_whereby.delete_object(Bucket=bucket_name, Key=object_key) + logger.info(f"Deleted original Whereby recording: {bucket_name}/{object_key}") + + # 2. Delete processed audio from transcript storage S3 bucket + if transcript.audio_location == "storage": + storage = get_storage() + await storage.delete_file(transcript.storage_audio_path) + logger.info(f"Deleted processed audio from storage: {transcript.storage_audio_path}") + + # 3. Delete local audio files (if any remain) + if hasattr(transcript, 'audio_mp3_filename') and transcript.audio_mp3_filename: + transcript.audio_mp3_filename.unlink(missing_ok=True) + if hasattr(transcript, 'audio_wav_filename') and transcript.audio_wav_filename: + transcript.audio_wav_filename.unlink(missing_ok=True) + + upload_path = transcript.data_path / f"upload{os.path.splitext(object_key)[1]}" + upload_path.unlink(missing_ok=True) + + # 4. Update transcript to reflect audio deletion (keep all other data) + await transcripts_controller.update(transcript, { + 'audio_location_deleted': True + }) + + logger.info(f"Deleted all audio files for transcript {transcript.id}, kept transcript data") + + except Exception as e: + logger.error(f"Failed to delete audio files for {object_key}: {str(e)}") @shared_task diff --git a/www/app/(app)/rooms/audioConsentDialog.tsx b/www/app/(app)/rooms/audioConsentDialog.tsx new file mode 100644 index 00000000..e3d568f3 --- /dev/null +++ b/www/app/(app)/rooms/audioConsentDialog.tsx @@ -0,0 +1,48 @@ +import React from "react"; +import { + Modal, + ModalOverlay, + ModalContent, + ModalHeader, + ModalBody, + Button, + Text, + HStack, +} from "@chakra-ui/react"; + +interface AudioConsentDialogProps { + isOpen: boolean; + onClose: () => void; + onConsent: (given: boolean) => void; +} + +const AudioConsentDialog = ({ isOpen, onClose, onConsent }: AudioConsentDialogProps) => { + const handleConsent = (given: boolean) => { + onConsent(given); + onClose(); + }; + + return ( + + + + Audio Storage Consent + + + Can we have your permission to store this meeting's audio recording on our servers? + + + + + + + + + ); +}; + +export default AudioConsentDialog; \ No newline at end of file diff --git a/www/app/(app)/transcripts/[transcriptId]/record/page.tsx b/www/app/(app)/transcripts/[transcriptId]/record/page.tsx index 2d227f57..8f46f76c 100644 --- a/www/app/(app)/transcripts/[transcriptId]/record/page.tsx +++ b/www/app/(app)/transcripts/[transcriptId]/record/page.tsx @@ -13,6 +13,8 @@ import useMp3 from "../../useMp3"; import WaveformLoading from "../../waveformLoading"; import { Box, Text, Grid, Heading, VStack, Flex } from "@chakra-ui/react"; import LiveTrancription from "../../liveTranscription"; +import AudioConsentDialog from "../../components/AudioConsentDialog"; +import useApi from "../../../../lib/useApi"; type TranscriptDetails = { params: { @@ -24,6 +26,9 @@ const TranscriptRecord = (details: TranscriptDetails) => { const transcript = useTranscript(details.params.transcriptId); const [transcriptStarted, setTranscriptStarted] = useState(false); const useActiveTopic = useState(null); + const [showConsentDialog, setShowConsentDialog] = useState(false); + const [consentStatus, setConsentStatus] = useState(''); + const api = useApi(); const webSockets = useWebSockets(details.params.transcriptId); @@ -64,14 +69,60 @@ const TranscriptRecord = (details: TranscriptDetails) => { }; }, []); + // Show consent dialog when recording starts and meeting_id is available + useEffect(() => { + if (status === "recording" && transcript.response?.meeting_id && !consentStatus) { + setShowConsentDialog(true); + } + }, [status, transcript.response?.meeting_id, consentStatus]); + + const handleConsentResponse = async (consentGiven: boolean) => { + const meetingId = transcript.response?.meeting_id; + if (!meetingId || !api) { + console.error('No meeting_id available or API not initialized'); + return; + } + + try { + // Use a simple user identifier - could be improved with actual user ID + const userIdentifier = `user_${Date.now()}`; + + const response = await fetch(`/v1/meetings/${meetingId}/consent`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + consent_given: consentGiven, + user_identifier: userIdentifier + }) + }); + + if (response.ok) { + setConsentStatus(consentGiven ? 'given' : 'denied'); + console.log('Consent recorded successfully'); + } else { + console.error('Failed to record consent'); + } + } catch (error) { + console.error('Error recording consent:', error); + } + }; + return ( - + <> + setShowConsentDialog(false)} + onConsent={handleConsentResponse} + /> + {status == "processing" ? ( ) : ( @@ -124,6 +175,7 @@ const TranscriptRecord = (details: TranscriptDetails) => { + ); }; diff --git a/www/app/[roomName]/page.tsx b/www/app/[roomName]/page.tsx index 6f5b3e69..a2e28ff5 100644 --- a/www/app/[roomName]/page.tsx +++ b/www/app/[roomName]/page.tsx @@ -1,12 +1,16 @@ "use client"; import "@whereby.com/browser-sdk/embed"; -import { useCallback, useEffect, useRef, useState } from "react"; +import { useCallback, useEffect, useRef, useState, useContext } from "react"; import { Box, Button, Text, VStack, HStack, Spinner } from "@chakra-ui/react"; import useRoomMeeting from "./useRoomMeeting"; import { useRouter } from "next/navigation"; import { notFound } from "next/navigation"; import useSessionStatus from "../lib/useSessionStatus"; +import AudioConsentDialog from "../(app)/rooms/audioConsentDialog"; +import { DomainContext } from "../domainContext"; +import useSessionAccessToken from "../lib/useSessionAccessToken"; +import useSessionUser from "../lib/useSessionUser"; export type RoomDetails = { params: { @@ -20,8 +24,12 @@ export default function Room(details: RoomDetails) { const meeting = useRoomMeeting(roomName); const router = useRouter(); const { isLoading, isAuthenticated } = useSessionStatus(); - + const [showConsentDialog, setShowConsentDialog] = useState(false); const [consentGiven, setConsentGiven] = useState(null); + const { api_url } = useContext(DomainContext); + const { accessToken } = useSessionAccessToken(); + const { id: userId } = useSessionUser(); + const roomUrl = meeting?.response?.host_room_url ? meeting?.response?.host_room_url @@ -31,9 +39,49 @@ export default function Room(details: RoomDetails) { router.push("/browse"); }, [router]); - const handleConsent = (consent: boolean) => { - setConsentGiven(consent); - }; + const getUserIdentifier = useCallback(() => { + if (isAuthenticated && userId) { + return userId; // Send actual user ID for authenticated users + } + + // For anonymous users, send no identifier + return null; + }, [isAuthenticated, userId]); + + const handleConsent = useCallback(async (given: boolean) => { + setConsentGiven(given); + setShowConsentDialog(false); // Close dialog after consent is given + + if (meeting?.response?.id && api_url) { + try { + const userIdentifier = getUserIdentifier(); + const requestBody: any = { + consent_given: given + }; + + // Only include user_identifier if we have one (authenticated users) + if (userIdentifier) { + requestBody.user_identifier = userIdentifier; + } + + const response = await fetch(`${api_url}/v1/meetings/${meeting.response.id}/consent`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + ...(accessToken && { 'Authorization': `Bearer ${accessToken}` }) + }, + body: JSON.stringify(requestBody), + }); + + if (!response.ok) { + console.error('Failed to submit consent'); + } + } catch (error) { + console.error('Error submitting consent:', error); + } + } + }, [meeting?.response?.id, api_url, accessToken]); + useEffect(() => { if ( @@ -46,6 +94,13 @@ export default function Room(details: RoomDetails) { } }, [isLoading, meeting?.error]); + // Show consent dialog when meeting is loaded and consent hasn't been given yet + useEffect(() => { + if (meeting?.response?.id && consentGiven === null && !showConsentDialog) { + setShowConsentDialog(true); + } + }, [meeting?.response?.id, consentGiven, showConsentDialog]); + useEffect(() => { if (isLoading || !isAuthenticated || !roomUrl) return; @@ -77,51 +132,6 @@ export default function Room(details: RoomDetails) { ); } - if (!isAuthenticated && !consentGiven) { - return ( - - - {consentGiven === null ? ( - <> - - This meeting may be recorded. Do you consent to being recorded? - - - - - - - ) : ( - <> - - You cannot join the meeting without consenting to being - recorded. - - - )} - - - ); - } return ( <> @@ -132,6 +142,11 @@ export default function Room(details: RoomDetails) { style={{ width: "100vw", height: "100vh" }} /> )} + {}} // No-op: ESC should not close without consent + onConsent={handleConsent} + /> ); } diff --git a/www/yarn.lock b/www/yarn.lock index c60a0a1f..5c0788aa 100644 --- a/www/yarn.lock +++ b/www/yarn.lock @@ -5,13 +5,6 @@ __metadata: version: 6 cacheKey: 8 -"@aashutoshrathi/word-wrap@npm:^1.2.3": - version: 1.2.6 - resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" - checksum: ada901b9e7c680d190f1d012c84217ce0063d8f5c5a7725bb91ec3c5ed99bb7572680eb2d2938a531ccbaec39a95422fcd8a6b4a13110c7d98dd75402f66a0cd - languageName: node - linkType: hard - "@alloc/quick-lru@npm:^5.2.0": version: 5.2.0 resolution: "@alloc/quick-lru@npm:5.2.0" @@ -30,110 +23,105 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0": - version: 7.23.5 - resolution: "@babel/code-frame@npm:7.23.5" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/code-frame@npm:7.27.1" dependencies: - "@babel/highlight": ^7.23.4 - chalk: ^2.4.2 - checksum: d90981fdf56a2824a9b14d19a4c0e8db93633fd488c772624b4e83e0ceac6039a27cd298a247c3214faa952bf803ba23696172ae7e7235f3b97f43ba278c569a + "@babel/helper-validator-identifier": ^7.27.1 + js-tokens: ^4.0.0 + picocolors: ^1.1.1 + checksum: 5874edc5d37406c4a0bb14cf79c8e51ad412fb0423d176775ac14fc0259831be1bf95bdda9c2aa651126990505e09a9f0ed85deaa99893bc316d2682c5115bdc + languageName: node + linkType: hard + +"@babel/generator@npm:^7.27.3": + version: 7.27.5 + resolution: "@babel/generator@npm:7.27.5" + dependencies: + "@babel/parser": ^7.27.5 + "@babel/types": ^7.27.3 + "@jridgewell/gen-mapping": ^0.3.5 + "@jridgewell/trace-mapping": ^0.3.25 + jsesc: ^3.0.2 + checksum: f6d3bf70f6bfbc5df263a023200728c53161d7f3ee3607bd8b2222c8568b6dd604ee490e305f0492a8225dac059ad75b4cc772b5cfd7d967e70360499d4d3701 languageName: node linkType: hard "@babel/helper-module-imports@npm:^7.16.7": - version: 7.22.15 - resolution: "@babel/helper-module-imports@npm:7.22.15" + version: 7.27.1 + resolution: "@babel/helper-module-imports@npm:7.27.1" dependencies: - "@babel/types": ^7.22.15 - checksum: ecd7e457df0a46f889228f943ef9b4a47d485d82e030676767e6a2fdcbdaa63594d8124d4b55fd160b41c201025aec01fc27580352b1c87a37c9c6f33d116702 + "@babel/traverse": ^7.27.1 + "@babel/types": ^7.27.1 + checksum: 92d01c71c0e4aacdc2babce418a9a1a27a8f7d770a210ffa0f3933f321befab18b655bc1241bebc40767516731de0b85639140c42e45a8210abe1e792f115b28 languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/helper-string-parser@npm:7.23.4" - checksum: c0641144cf1a7e7dc93f3d5f16d5327465b6cf5d036b48be61ecba41e1eece161b48f46b7f960951b67f8c3533ce506b16dece576baef4d8b3b49f8c65410f90 +"@babel/helper-string-parser@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-string-parser@npm:7.27.1" + checksum: 0a8464adc4b39b138aedcb443b09f4005d86207d7126e5e079177e05c3116107d856ec08282b365e9a79a9872f40f4092a6127f8d74c8a01c1ef789dacfc25d6 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-validator-identifier@npm:7.22.20" - checksum: 136412784d9428266bcdd4d91c32bcf9ff0e8d25534a9d94b044f77fe76bc50f941a90319b05aafd1ec04f7d127cd57a179a3716009ff7f3412ef835ada95bdc +"@babel/helper-validator-identifier@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-identifier@npm:7.27.1" + checksum: 3c7e8391e59d6c85baeefe9afb86432f2ab821c6232b00ea9082a51d3e7e95a2f3fb083d74dc1f49ac82cf238e1d2295dafcb001f7b0fab479f3f56af5eaaa47 languageName: node linkType: hard -"@babel/highlight@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/highlight@npm:7.23.4" +"@babel/parser@npm:^7.27.2, @babel/parser@npm:^7.27.4, @babel/parser@npm:^7.27.5": + version: 7.27.5 + resolution: "@babel/parser@npm:7.27.5" dependencies: - "@babel/helper-validator-identifier": ^7.22.20 - chalk: ^2.4.2 - js-tokens: ^4.0.0 - checksum: 643acecdc235f87d925979a979b539a5d7d1f31ae7db8d89047269082694122d11aa85351304c9c978ceeb6d250591ccadb06c366f358ccee08bb9c122476b89 + "@babel/types": ^7.27.3 + bin: + parser: ./bin/babel-parser.js + checksum: 16f00a12895522c1682f1f047332010e129ba517add3a2db347a658e02f60434fc38f9105a9d6ec3fd6bfb5d1b0b70d88585c1f10e06e2b58fba29004a42d648 languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": - version: 7.23.6 - resolution: "@babel/runtime@npm:7.23.6" - dependencies: - regenerator-runtime: ^0.14.0 - checksum: 1a8eaf3d3a103ef5227b60ca7ab5c589118c36ca65ef2d64e65380b32a98a3f3b5b3ef96660fa0471b079a18b619a8317f3e7f03ab2b930c45282a8b69ed9a16 +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": + version: 7.27.6 + resolution: "@babel/runtime@npm:7.27.6" + checksum: 3f7b879df1823c0926bd5dbc941c62f5d60faa790c1aab9758c04799e1f04ee8d93553be9ec059d4e5882f19fe03cbe8933ee4f46212dced0f6d8205992c9c9a languageName: node linkType: hard -"@babel/runtime@npm:^7.20.13": - version: 7.25.6 - resolution: "@babel/runtime@npm:7.25.6" +"@babel/template@npm:^7.27.2": + version: 7.27.2 + resolution: "@babel/template@npm:7.27.2" dependencies: - regenerator-runtime: ^0.14.0 - checksum: ee1a69d3ac7802803f5ee6a96e652b78b8addc28c6a38c725a4ad7d61a059d9e6cb9f6550ed2f63cce67a1bd82e0b1ef66a1079d895be6bfb536a5cfbd9ccc32 + "@babel/code-frame": ^7.27.1 + "@babel/parser": ^7.27.2 + "@babel/types": ^7.27.1 + checksum: ff5628bc066060624afd970616090e5bba91c6240c2e4b458d13267a523572cbfcbf549391eec8217b94b064cf96571c6273f0c04b28a8567b96edc675c28e27 languageName: node linkType: hard -"@babel/types@npm:^7.22.15": - version: 7.23.6 - resolution: "@babel/types@npm:7.23.6" +"@babel/traverse@npm:^7.27.1": + version: 7.27.4 + resolution: "@babel/traverse@npm:7.27.4" dependencies: - "@babel/helper-string-parser": ^7.23.4 - "@babel/helper-validator-identifier": ^7.22.20 - to-fast-properties: ^2.0.0 - checksum: 68187dbec0d637f79bc96263ac95ec8b06d424396678e7e225492be866414ce28ebc918a75354d4c28659be6efe30020b4f0f6df81cc418a2d30645b690a8de0 + "@babel/code-frame": ^7.27.1 + "@babel/generator": ^7.27.3 + "@babel/parser": ^7.27.4 + "@babel/template": ^7.27.2 + "@babel/types": ^7.27.3 + debug: ^4.3.1 + globals: ^11.1.0 + checksum: ae0047fe786e200ffb048929347b074988e8b68decdb9fc0e2b36ca3e137d72462f349fa0e6193e44fb3cb99f9c639654515028995b44d7040707cef48ddb5c1 languageName: node linkType: hard -"@chakra-ui/accordion@npm:2.3.1": - version: 2.3.1 - resolution: "@chakra-ui/accordion@npm:2.3.1" +"@babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3": + version: 7.27.6 + resolution: "@babel/types@npm:7.27.6" dependencies: - "@chakra-ui/descendant": 3.1.0 - "@chakra-ui/icon": 3.2.0 - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/react-use-controllable-state": 2.1.0 - "@chakra-ui/react-use-merge-refs": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - "@chakra-ui/transition": 2.1.0 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - framer-motion: ">=4.0.0" - react: ">=18" - checksum: 3839a77ad235cc4fd322e3118457eb12433df7b5937e5145570277ee54f4d8ce0a7a4f0a02474524d3c7fa8dab9f7d083d21a097e5bed9d5a5d15e345c5d1f49 - languageName: node - linkType: hard - -"@chakra-ui/alert@npm:2.2.2": - version: 2.2.2 - resolution: "@chakra-ui/alert@npm:2.2.2" - dependencies: - "@chakra-ui/icon": 3.2.0 - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - "@chakra-ui/spinner": 2.1.0 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: f13a7b3c128447b915d8481105bb994fd382edb45273f0c59733c02cec4d891561db8462d5b4b0148f405ec3228b7e78dddb1dc03c2905dc4a0ec21e2c915822 + "@babel/helper-string-parser": ^7.27.1 + "@babel/helper-validator-identifier": ^7.27.1 + checksum: c3bd0984d892b0edec38fd12cf63f620bb52fba8187ec7cbe2d1aff5bee5e185e0fd86a3fb90b4d8f18b072113d07901476d0e39f58d5c988db14b231a6ea735 languageName: node linkType: hard @@ -144,32 +132,10 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/avatar@npm:2.3.0": - version: 2.3.0 - resolution: "@chakra-ui/avatar@npm:2.3.0" - dependencies: - "@chakra-ui/image": 2.1.0 - "@chakra-ui/react-children-utils": 2.0.6 - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: a54120d7bf2096c09c19248050e511b379e93ac4d541cb6882ebc3690552b026bd4e7a2da1fa6cf486938bc438c7e3fd1aad5c5d77c247ddc81832b02d4016d9 - languageName: node - linkType: hard - -"@chakra-ui/breadcrumb@npm:2.2.0": - version: 2.2.0 - resolution: "@chakra-ui/breadcrumb@npm:2.2.0" - dependencies: - "@chakra-ui/react-children-utils": 2.0.6 - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: 27ff90194166a34a33c7d39bc18920e3a379d476afabed80e806328ac18c6e0d3c66ab912f23fa68fc07033b1fd0cfd80564fb7fc1e5ff1986c6693a6d8b4fc2 +"@chakra-ui/anatomy@npm:2.3.6": + version: 2.3.6 + resolution: "@chakra-ui/anatomy@npm:2.3.6" + checksum: e7c08704f8a88dc685c0b638600003ff71b063804f2a56a139a4f9830e1f455d04d047f501da96041afc498eb2cc4ef4a55e58686e39e3f9a342ce842c090625 languageName: node linkType: hard @@ -182,55 +148,6 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/button@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/button@npm:2.1.0" - dependencies: - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/react-use-merge-refs": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - "@chakra-ui/spinner": 2.1.0 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: 749f11334d7d5bf7257d40fdebb0e0156ce64a53b21d56016d9fb9431a2c934db33f78b2e092872aa5f19e1de4745af1cc893aa70d75092b9f07020c07224e7f - languageName: node - linkType: hard - -"@chakra-ui/card@npm:2.2.0": - version: 2.2.0 - resolution: "@chakra-ui/card@npm:2.2.0" - dependencies: - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: e8333b521cba8be8193dfb4784697942efc820890f8c89aa1484fab3fa7b69ababffea24eaecc331b1c901407b94f4a465113bf115ab965be1f87b913f31d53d - languageName: node - linkType: hard - -"@chakra-ui/checkbox@npm:2.3.2": - version: 2.3.2 - resolution: "@chakra-ui/checkbox@npm:2.3.2" - dependencies: - "@chakra-ui/form-control": 2.2.0 - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/react-types": 2.0.7 - "@chakra-ui/react-use-callback-ref": 2.1.0 - "@chakra-ui/react-use-controllable-state": 2.1.0 - "@chakra-ui/react-use-merge-refs": 2.1.0 - "@chakra-ui/react-use-safe-layout-effect": 2.1.0 - "@chakra-ui/react-use-update-effect": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - "@chakra-ui/visually-hidden": 2.2.0 - "@zag-js/focus-visible": 0.16.0 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: b3dcf8b8e5530fd51df2b761a1721c554f01aa7d3e02fed6d8e12697715c73f6d42c9f80d116f4fc7b757f82f89bea876f1bc0c59cd4d64480c3f7536b0208ac - languageName: node - linkType: hard - "@chakra-ui/clickable@npm:2.1.0": version: 2.1.0 resolution: "@chakra-ui/clickable@npm:2.1.0" @@ -243,18 +160,6 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/close-button@npm:2.1.1": - version: 2.1.1 - resolution: "@chakra-ui/close-button@npm:2.1.1" - dependencies: - "@chakra-ui/icon": 3.2.0 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: 7b81bb592b19a81aea5f616b3d244a0e54b8a90a7beae56253bf18d29351b3b14bf934473ed940244340fef6066d3e1001d970c3692f02ce984e4a6d926cedd4 - languageName: node - linkType: hard - "@chakra-ui/color-mode@npm:2.2.0": version: 2.2.0 resolution: "@chakra-ui/color-mode@npm:2.2.0" @@ -266,39 +171,6 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/control-box@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/control-box@npm:2.1.0" - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: c52ff6ba03fae9818372a7a11ef22b2389ed5e7c046355eb3f6ae6d348db4c32058a841d502c759ee30a6efdd18c831274b31fc79a3f67ac1f1ca60bcc67e608 - languageName: node - linkType: hard - -"@chakra-ui/counter@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/counter@npm:2.1.0" - dependencies: - "@chakra-ui/number-utils": 2.0.7 - "@chakra-ui/react-use-callback-ref": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - react: ">=18" - checksum: d955281ef594a26b31116c1323ae4231b809957048d0fa414f46d759f038a8d193227486f4b2a76320c83deff0a69078e850d83a10c10797ba986e458779dbb8 - languageName: node - linkType: hard - -"@chakra-ui/css-reset@npm:2.3.0": - version: 2.3.0 - resolution: "@chakra-ui/css-reset@npm:2.3.0" - peerDependencies: - "@emotion/react": ">=10.0.35" - react: ">=18" - checksum: 1c760c7475c4b781c73a5174c265e05cd0f8cdca5420910fd53a29c565555863eeeb5967eb2deeb0c5219600a9dae4d14cbe0d4817db9c83e43f41963988df4e - languageName: node - linkType: hard - "@chakra-ui/descendant@npm:3.1.0": version: 3.1.0 resolution: "@chakra-ui/descendant@npm:3.1.0" @@ -318,45 +190,6 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/editable@npm:3.1.0": - version: 3.1.0 - resolution: "@chakra-ui/editable@npm:3.1.0" - dependencies: - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/react-types": 2.0.7 - "@chakra-ui/react-use-callback-ref": 2.1.0 - "@chakra-ui/react-use-controllable-state": 2.1.0 - "@chakra-ui/react-use-focus-on-pointer-down": 2.1.0 - "@chakra-ui/react-use-merge-refs": 2.1.0 - "@chakra-ui/react-use-safe-layout-effect": 2.1.0 - "@chakra-ui/react-use-update-effect": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: f9ee2ab959371607662b6a3c23c95aeead810f3da3a2469ec2e5ca9effe176b74e1a742d0e10584978129c4174cca24f5c096f74cb8ed1996b1e1a190ff9b18b - languageName: node - linkType: hard - -"@chakra-ui/event-utils@npm:2.0.8": - version: 2.0.8 - resolution: "@chakra-ui/event-utils@npm:2.0.8" - checksum: a38c91533b2e3e7a9ba3eb8b76fca9e9d667ac1168d6c679e88e00a6b59acf1ee06aa95b748a3f0787dda5996deab799dd9491c9a6df517126c49b6d594c8afd - languageName: node - linkType: hard - -"@chakra-ui/focus-lock@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/focus-lock@npm:2.1.0" - dependencies: - "@chakra-ui/dom-utils": 2.1.0 - react-focus-lock: ^2.9.4 - peerDependencies: - react: ">=18" - checksum: 741671f132f4a772b0a65441ec50e96e8d718875aa634d1847285b4be0aa4ed1f0dbd7fe5eae0f50742454f8aa047d536ec1398de742f1269d25545f5b7b4871 - languageName: node - linkType: hard - "@chakra-ui/form-control@npm:2.2.0": version: 2.2.0 resolution: "@chakra-ui/form-control@npm:2.2.0" @@ -373,17 +206,17 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/hooks@npm:2.2.1": - version: 2.2.1 - resolution: "@chakra-ui/hooks@npm:2.2.1" +"@chakra-ui/hooks@npm:2.4.5": + version: 2.4.5 + resolution: "@chakra-ui/hooks@npm:2.4.5" dependencies: - "@chakra-ui/react-utils": 2.0.12 - "@chakra-ui/utils": 2.0.15 - compute-scroll-into-view: 3.0.3 + "@chakra-ui/utils": 2.2.5 + "@zag-js/element-size": 0.31.1 copy-to-clipboard: 3.3.3 + framesync: 6.1.2 peerDependencies: react: ">=18" - checksum: d0700e06c316d158c98a9a70448ee2a80379346c1ba0becafe968ebd1e1c81ecf4d5e4ebe07d58d1b5c81c62d9d90ff8fc7dd4f2b610937a4901bbc4ac6296ab + checksum: 4768a8d05a4cc08e6d9d85a5b5dff002640d19dbf697946c2ef9b16ffe3762dbf4cda8baf9737a9779dc6346fac9af08406afca3990de4b19cb848129bf324c6 languageName: node linkType: hard @@ -411,36 +244,7 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/image@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/image@npm:2.1.0" - dependencies: - "@chakra-ui/react-use-safe-layout-effect": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: 83bd16de9780e64e05ada5ddcccc0048228cdb9af73ca5dc75514fdbf14aed4fecee9c976cea768755b3ea3aae2d8f90d2bf63909c16d238331c9c9b31f5a31f - languageName: node - linkType: hard - -"@chakra-ui/input@npm:2.1.2": - version: 2.1.2 - resolution: "@chakra-ui/input@npm:2.1.2" - dependencies: - "@chakra-ui/form-control": 2.2.0 - "@chakra-ui/object-utils": 2.1.0 - "@chakra-ui/react-children-utils": 2.0.6 - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: 0db226c07d0b4c726632036d08dada467c7676e3b4fe2b0881d8885f8b6903563d20d106c9052d60e1a56b67f498e30155fd47e4efe2dbd35cefdee427c740d8 - languageName: node - linkType: hard - -"@chakra-ui/layout@npm:2.3.1, @chakra-ui/layout@npm:^2.3.1": +"@chakra-ui/layout@npm:^2.3.1": version: 2.3.1 resolution: "@chakra-ui/layout@npm:2.3.1" dependencies: @@ -464,16 +268,7 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/live-region@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/live-region@npm:2.1.0" - peerDependencies: - react: ">=18" - checksum: 5a89dd76febf090f0b1f8ead616d4af6233276ab12df4b42c1dc48d329aeb4672732dd755613038f64cb92d02c32bb4a8e56922610de4e7d1f9df34e1087b01f - languageName: node - linkType: hard - -"@chakra-ui/media-query@npm:3.3.0, @chakra-ui/media-query@npm:^3.3.0": +"@chakra-ui/media-query@npm:^3.3.0": version: 3.3.0 resolution: "@chakra-ui/media-query@npm:3.3.0" dependencies: @@ -487,7 +282,7 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/menu@npm:2.2.1, @chakra-ui/menu@npm:^2.2.1": +"@chakra-ui/menu@npm:^2.2.1": version: 2.2.1 resolution: "@chakra-ui/menu@npm:2.2.1" dependencies: @@ -514,32 +309,9 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/modal@npm:2.3.1": - version: 2.3.1 - resolution: "@chakra-ui/modal@npm:2.3.1" - dependencies: - "@chakra-ui/close-button": 2.1.1 - "@chakra-ui/focus-lock": 2.1.0 - "@chakra-ui/portal": 2.1.0 - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/react-types": 2.0.7 - "@chakra-ui/react-use-merge-refs": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - "@chakra-ui/transition": 2.1.0 - aria-hidden: ^1.2.3 - react-remove-scroll: ^2.5.6 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - framer-motion: ">=4.0.0" - react: ">=18" - react-dom: ">=18" - checksum: 2f2e3965199a3fa8f867f2fcb6c125763ac5c982b15f29cf1e462e2e49b5466a675b5a41f24fcf0ba40c25bf70fc401cee600ddb7642d250469a15df3352924e - languageName: node - linkType: hard - "@chakra-ui/next-js@npm:^2.2.0": - version: 2.2.0 - resolution: "@chakra-ui/next-js@npm:2.2.0" + version: 2.4.2 + resolution: "@chakra-ui/next-js@npm:2.4.2" dependencies: "@emotion/cache": ^11.11.0 peerDependencies: @@ -547,37 +319,7 @@ __metadata: "@emotion/react": ">=11" next: ">=13" react: ">=18" - checksum: cad9e0ca7decfd301794161d95cc889ea9ada350129c7d8ad11f4015e9b88be3e831fc265e0593feae422318875685519aaca4376583b56dadedc8e1af9e0a3e - languageName: node - linkType: hard - -"@chakra-ui/number-input@npm:2.1.2": - version: 2.1.2 - resolution: "@chakra-ui/number-input@npm:2.1.2" - dependencies: - "@chakra-ui/counter": 2.1.0 - "@chakra-ui/form-control": 2.2.0 - "@chakra-ui/icon": 3.2.0 - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/react-types": 2.0.7 - "@chakra-ui/react-use-callback-ref": 2.1.0 - "@chakra-ui/react-use-event-listener": 2.1.0 - "@chakra-ui/react-use-interval": 2.1.0 - "@chakra-ui/react-use-merge-refs": 2.1.0 - "@chakra-ui/react-use-safe-layout-effect": 2.1.0 - "@chakra-ui/react-use-update-effect": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: fcce1dedfb50a0246dc2d87e96b0faa472e43c47ae9c9821bd6bf94457737d954024ecbf2dc9cf05437169cf12c84cb3af59733d8e38dc5df5295931b9573a26 - languageName: node - linkType: hard - -"@chakra-ui/number-utils@npm:2.0.7": - version: 2.0.7 - resolution: "@chakra-ui/number-utils@npm:2.0.7" - checksum: e9773385f9f1758687d9f42b88487199725ccdd8e565b73832d89f38e95d80a748c55a44752dc9966c380dc7768e88394bdd369e2415f3b05adfc0e06588c55e + checksum: a99a1a1f05a577c2392a477e34be19fc3dac9211b81aa0d64d8d9a1af48e740a03a1a3c78f7accf56dc81e24378bc0d941befa21b7ec7b0a31596cfdffb04c1c languageName: node linkType: hard @@ -588,46 +330,6 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/pin-input@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/pin-input@npm:2.1.0" - dependencies: - "@chakra-ui/descendant": 3.1.0 - "@chakra-ui/react-children-utils": 2.0.6 - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/react-use-controllable-state": 2.1.0 - "@chakra-ui/react-use-merge-refs": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: fc1cbeb1646fe6466086b578f3375f453457fab6cda59e36390dad7999689d4ccd64392bc49a92dfa5bf1a5929ee56931eab523190d43698977bd5e1cdd70334 - languageName: node - linkType: hard - -"@chakra-ui/popover@npm:2.2.1": - version: 2.2.1 - resolution: "@chakra-ui/popover@npm:2.2.1" - dependencies: - "@chakra-ui/close-button": 2.1.1 - "@chakra-ui/lazy-utils": 2.0.5 - "@chakra-ui/popper": 3.1.0 - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/react-types": 2.0.7 - "@chakra-ui/react-use-animation-state": 2.1.0 - "@chakra-ui/react-use-disclosure": 2.1.0 - "@chakra-ui/react-use-focus-effect": 2.1.0 - "@chakra-ui/react-use-focus-on-pointer-down": 2.1.0 - "@chakra-ui/react-use-merge-refs": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - framer-motion: ">=4.0.0" - react: ">=18" - checksum: 5034e2b156180da2875c75b8828bf2d83a21d814101ab27db8f057e601f1cdf109568360db229f9a73c67e029d88f9f25670e42eb80eea21a908d3f7f91274fa - languageName: node - linkType: hard - "@chakra-ui/popper@npm:3.1.0": version: 3.1.0 resolution: "@chakra-ui/popper@npm:3.1.0" @@ -641,66 +343,6 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/portal@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/portal@npm:2.1.0" - dependencies: - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/react-use-safe-layout-effect": 2.1.0 - peerDependencies: - react: ">=18" - react-dom: ">=18" - checksum: fa9799f99614943f17e32797e2daf7fe7d96da6d2ccd8bb96b817ffac8a1301b29d398d96c1c0c1ba72ab8f6c2e4e6835eeb11cb1f56968ff3934c611068900c - languageName: node - linkType: hard - -"@chakra-ui/progress@npm:2.2.0": - version: 2.2.0 - resolution: "@chakra-ui/progress@npm:2.2.0" - dependencies: - "@chakra-ui/react-context": 2.1.0 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: 4936959f3bfe645d4a715808c273eb8da74238bff35da26ae62cf03b709233852a22563a571160637cd509082208008220421ca887efee6b7f73e0d8401b50c8 - languageName: node - linkType: hard - -"@chakra-ui/provider@npm:2.4.2": - version: 2.4.2 - resolution: "@chakra-ui/provider@npm:2.4.2" - dependencies: - "@chakra-ui/css-reset": 2.3.0 - "@chakra-ui/portal": 2.1.0 - "@chakra-ui/react-env": 3.1.0 - "@chakra-ui/system": 2.6.2 - "@chakra-ui/utils": 2.0.15 - peerDependencies: - "@emotion/react": ^11.0.0 - "@emotion/styled": ^11.0.0 - react: ">=18" - react-dom: ">=18" - checksum: 8ecb657ca2c15ba975e01b1f127f774a10f7ea8eed032cec84e0c82e223eb66dce6834da8f6c8f0ab8aa3cde1867c1e10e77bb4cb6488f1e009ca97bc4d9be6f - languageName: node - linkType: hard - -"@chakra-ui/radio@npm:2.1.2": - version: 2.1.2 - resolution: "@chakra-ui/radio@npm:2.1.2" - dependencies: - "@chakra-ui/form-control": 2.2.0 - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/react-types": 2.0.7 - "@chakra-ui/react-use-merge-refs": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - "@zag-js/focus-visible": 0.16.0 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: 44b99b830bd3b5e5e0e2332c2c38908abd2740fd0dc695fcd899a06f5f76cfed318f85dce66d9eb12a982daf4797a1945eb2653d1ca1ac3bc34295dce7ab147c - languageName: node - linkType: hard - "@chakra-ui/react-children-utils@npm:2.0.6": version: 2.0.6 resolution: "@chakra-ui/react-children-utils@npm:2.0.6" @@ -816,37 +458,6 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/react-use-focus-on-pointer-down@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/react-use-focus-on-pointer-down@npm:2.1.0" - dependencies: - "@chakra-ui/react-use-event-listener": 2.1.0 - peerDependencies: - react: ">=18" - checksum: 02a3e2c49ddf8d36dacba7107bb93e26cd5fc9dbb0f1739e11f25daa3430efe4978d3cd590b1280d2ec70c8f03be90998c7f8398a8e8001f1ad1e3d00a1a1f30 - languageName: node - linkType: hard - -"@chakra-ui/react-use-interval@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/react-use-interval@npm:2.1.0" - dependencies: - "@chakra-ui/react-use-callback-ref": 2.1.0 - peerDependencies: - react: ">=18" - checksum: 1e6336eb9bfbef0884550943d3cc4538ce7f333f21b3a5ec7696e3f5ebe6d44366fc2447c554a502337a2593d2a4ee83da49970b95f769a1fefff4fae9c2d9e6 - languageName: node - linkType: hard - -"@chakra-ui/react-use-latest-ref@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/react-use-latest-ref@npm:2.1.0" - peerDependencies: - react: ">=18" - checksum: 0384389bf695407122b6eda6e4c7c54b70100605280e69f4903c0ee4e57849c80361b24948fb63062566a5021190508fc652e64a3b3de05cff1232fdcca89986 - languageName: node - linkType: hard - "@chakra-ui/react-use-merge-refs@npm:2.1.0": version: 2.1.0 resolution: "@chakra-ui/react-use-merge-refs@npm:2.1.0" @@ -867,28 +478,6 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/react-use-pan-event@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/react-use-pan-event@npm:2.1.0" - dependencies: - "@chakra-ui/event-utils": 2.0.8 - "@chakra-ui/react-use-latest-ref": 2.1.0 - framesync: 6.1.2 - peerDependencies: - react: ">=18" - checksum: a084bfd8ace81079b46cb5825a7863cc6db7f4ee329e660ada74ad4343a37bb2b5af30215323787e3e94461a5812516740a28631747584c0f3c6de6823726b76 - languageName: node - linkType: hard - -"@chakra-ui/react-use-previous@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/react-use-previous@npm:2.1.0" - peerDependencies: - react: ">=18" - checksum: d868160842c271877c8d363e7a9626c7ff5f3f64b30d224418d5752abd39df0855fc98580f9f698e6e9fbf043b3a3e4bfdc9cb4964e972bf709be329752f4443 - languageName: node - linkType: hard - "@chakra-ui/react-use-safe-layout-effect@npm:2.1.0": version: 2.1.0 resolution: "@chakra-ui/react-use-safe-layout-effect@npm:2.1.0" @@ -898,28 +487,6 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/react-use-size@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/react-use-size@npm:2.1.0" - dependencies: - "@zag-js/element-size": 0.10.5 - peerDependencies: - react: ">=18" - checksum: cf0bfbcacfbfffdb7e13532300ff2df013d98a221b31af3248324976cd115fbd3ae76a4917c3e40ab44372bea66b709cb22550ab7d53a7d500624c1fefeb19b6 - languageName: node - linkType: hard - -"@chakra-ui/react-use-timeout@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/react-use-timeout@npm:2.1.0" - dependencies: - "@chakra-ui/react-use-callback-ref": 2.1.0 - peerDependencies: - react: ">=18" - checksum: c23b6ec5a4a02465cdf01cf5a268dbe11d597e47ad922b6120dbf3ffa98e8dfddf59f7661ee41ecdb21d67aee5eb98067351a5e33b92798d7bc1c5b4fb532710 - languageName: node - linkType: hard - "@chakra-ui/react-use-update-effect@npm:2.1.0": version: 2.1.0 resolution: "@chakra-ui/react-use-update-effect@npm:2.1.0" @@ -941,82 +508,26 @@ __metadata: linkType: hard "@chakra-ui/react@npm:^2.8.2": - version: 2.8.2 - resolution: "@chakra-ui/react@npm:2.8.2" + version: 2.10.9 + resolution: "@chakra-ui/react@npm:2.10.9" dependencies: - "@chakra-ui/accordion": 2.3.1 - "@chakra-ui/alert": 2.2.2 - "@chakra-ui/avatar": 2.3.0 - "@chakra-ui/breadcrumb": 2.2.0 - "@chakra-ui/button": 2.1.0 - "@chakra-ui/card": 2.2.0 - "@chakra-ui/checkbox": 2.3.2 - "@chakra-ui/close-button": 2.1.1 - "@chakra-ui/control-box": 2.1.0 - "@chakra-ui/counter": 2.1.0 - "@chakra-ui/css-reset": 2.3.0 - "@chakra-ui/editable": 3.1.0 - "@chakra-ui/focus-lock": 2.1.0 - "@chakra-ui/form-control": 2.2.0 - "@chakra-ui/hooks": 2.2.1 - "@chakra-ui/icon": 3.2.0 - "@chakra-ui/image": 2.1.0 - "@chakra-ui/input": 2.1.2 - "@chakra-ui/layout": 2.3.1 - "@chakra-ui/live-region": 2.1.0 - "@chakra-ui/media-query": 3.3.0 - "@chakra-ui/menu": 2.2.1 - "@chakra-ui/modal": 2.3.1 - "@chakra-ui/number-input": 2.1.2 - "@chakra-ui/pin-input": 2.1.0 - "@chakra-ui/popover": 2.2.1 - "@chakra-ui/popper": 3.1.0 - "@chakra-ui/portal": 2.1.0 - "@chakra-ui/progress": 2.2.0 - "@chakra-ui/provider": 2.4.2 - "@chakra-ui/radio": 2.1.2 - "@chakra-ui/react-env": 3.1.0 - "@chakra-ui/select": 2.1.2 - "@chakra-ui/skeleton": 2.1.0 - "@chakra-ui/skip-nav": 2.1.0 - "@chakra-ui/slider": 2.1.0 - "@chakra-ui/spinner": 2.1.0 - "@chakra-ui/stat": 2.1.1 - "@chakra-ui/stepper": 2.3.1 - "@chakra-ui/styled-system": 2.9.2 - "@chakra-ui/switch": 2.1.2 - "@chakra-ui/system": 2.6.2 - "@chakra-ui/table": 2.1.0 - "@chakra-ui/tabs": 3.0.0 - "@chakra-ui/tag": 3.1.1 - "@chakra-ui/textarea": 2.1.2 - "@chakra-ui/theme": 3.3.1 - "@chakra-ui/theme-utils": 2.0.21 - "@chakra-ui/toast": 7.0.2 - "@chakra-ui/tooltip": 2.3.1 - "@chakra-ui/transition": 2.1.0 - "@chakra-ui/utils": 2.0.15 - "@chakra-ui/visually-hidden": 2.2.0 + "@chakra-ui/hooks": 2.4.5 + "@chakra-ui/styled-system": 2.12.4 + "@chakra-ui/theme": 3.4.9 + "@chakra-ui/utils": 2.2.5 + "@popperjs/core": ^2.11.8 + "@zag-js/focus-visible": ^0.31.1 + aria-hidden: ^1.2.3 + react-fast-compare: 3.2.2 + react-focus-lock: ^2.9.6 + react-remove-scroll: ^2.5.7 peerDependencies: - "@emotion/react": ^11.0.0 - "@emotion/styled": ^11.0.0 + "@emotion/react": ">=11" + "@emotion/styled": ">=11" framer-motion: ">=4.0.0" react: ">=18" react-dom: ">=18" - checksum: f7af6ec5f248e7995030a4f61c6f815bef7bb9fbebd652a4f2eff9b313db007124e8f636727a50f4d40f6f4550249c5920bb47f024cc34a3e97286a02666ea98 - languageName: node - linkType: hard - -"@chakra-ui/select@npm:2.1.2": - version: 2.1.2 - resolution: "@chakra-ui/select@npm:2.1.2" - dependencies: - "@chakra-ui/form-control": 2.2.0 - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: d98ea14cc9146bfad976c5f230970adf7012251c6895d8e0f24ad36ae478351717cc99cc12f1e3ce8b1b314b6712a5481d9e2a9364bb7cd0f05d55d06a27bf32 + checksum: fd1119a62deab6428bbe1e2a2fbc2cfc06c46f4a113b8651ff3ad7d0489036dc146fd09915aec13295b4e269e5d736e201c9f150f7162226592deb87ce7444c9 languageName: node linkType: hard @@ -1027,52 +538,7 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/skeleton@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/skeleton@npm:2.1.0" - dependencies: - "@chakra-ui/media-query": 3.3.0 - "@chakra-ui/react-use-previous": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: f153cfd46453a167fd1d93e26326f5ae11a4ce7b80e8847ce117e2c2d930e908dcdff1faa1f8768675596daa9a1aaef2304da1528975924178e97ed9e589ca24 - languageName: node - linkType: hard - -"@chakra-ui/skip-nav@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/skip-nav@npm:2.1.0" - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: 3a7ea19d7414b3ad91a01685d47ec5eed59d74d58853fef18445b6e15d94e3fbc4a8fed43951d6e5542d33549275ed13093e0df5b9b449fd7b872fd85db2d319 - languageName: node - linkType: hard - -"@chakra-ui/slider@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/slider@npm:2.1.0" - dependencies: - "@chakra-ui/number-utils": 2.0.7 - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/react-types": 2.0.7 - "@chakra-ui/react-use-callback-ref": 2.1.0 - "@chakra-ui/react-use-controllable-state": 2.1.0 - "@chakra-ui/react-use-latest-ref": 2.1.0 - "@chakra-ui/react-use-merge-refs": 2.1.0 - "@chakra-ui/react-use-pan-event": 2.1.0 - "@chakra-ui/react-use-size": 2.1.0 - "@chakra-ui/react-use-update-effect": 2.1.0 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: 8e11468e0ef7d07cf8784b8034e4d6fad867d0fe06723f02fd8cf3427524ba29fb64f3ebf56aaf91cb0f11f3bf0af96e18ea732a0dfd0d734e1a609567014bb4 - languageName: node - linkType: hard - -"@chakra-ui/spinner@npm:2.1.0, @chakra-ui/spinner@npm:^2.1.0": +"@chakra-ui/spinner@npm:^2.1.0": version: 2.1.0 resolution: "@chakra-ui/spinner@npm:2.1.0" dependencies: @@ -1084,31 +550,13 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/stat@npm:2.1.1": - version: 2.1.1 - resolution: "@chakra-ui/stat@npm:2.1.1" +"@chakra-ui/styled-system@npm:2.12.4": + version: 2.12.4 + resolution: "@chakra-ui/styled-system@npm:2.12.4" dependencies: - "@chakra-ui/icon": 3.2.0 - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: f7fa51912a313a7cf0ddd1f1a71c32cb4cd01c2da11b43f232cba2b0ef772bf401fba81dd7469c354c43b718ce1a13c01feef62fcae45bdd66c33698a6fb5fab - languageName: node - linkType: hard - -"@chakra-ui/stepper@npm:2.3.1": - version: 2.3.1 - resolution: "@chakra-ui/stepper@npm:2.3.1" - dependencies: - "@chakra-ui/icon": 3.2.0 - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: a638ffb2a5132dd79f6e0a27b2716115610f7370877b28985bb2618208c84bd76921431659a98cf6afa56f46aeb9f42f78cee9ed73692c5d1cba2412f37921c1 + "@chakra-ui/utils": 2.2.5 + csstype: ^3.1.2 + checksum: fbf903cb65a46f4cfc693802601bf8465fc4d4457084d931c0fb5cea7b66f82d7605c5c8e14f2e8e80f47d29443089f4e06fc77d7ff20fcea048f86aa84124b9 languageName: node linkType: hard @@ -1123,20 +571,6 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/switch@npm:2.1.2": - version: 2.1.2 - resolution: "@chakra-ui/switch@npm:2.1.2" - dependencies: - "@chakra-ui/checkbox": 2.3.2 - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - framer-motion: ">=4.0.0" - react: ">=18" - checksum: 3a4e61b2e6215468e685651b7cfc118d93570210aa0b3529f2aa9eea69be3935e1b00eeb0306050edef4840f6a8920d72ff5353ffb815ef65d7d720f7b33fe82 - languageName: node - linkType: hard - "@chakra-ui/system@npm:2.6.2": version: 2.6.2 resolution: "@chakra-ui/system@npm:2.6.2" @@ -1156,65 +590,6 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/table@npm:2.1.0": - version: 2.1.0 - resolution: "@chakra-ui/table@npm:2.1.0" - dependencies: - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: c82cfc78f2312777ab51c872640549c8d3f3ac9b40eb312ceb61c7651547ebced194729bfb228b5b191e7e965a0371f521c171c60f02d1c09edbe296a37aa09e - languageName: node - linkType: hard - -"@chakra-ui/tabs@npm:3.0.0": - version: 3.0.0 - resolution: "@chakra-ui/tabs@npm:3.0.0" - dependencies: - "@chakra-ui/clickable": 2.1.0 - "@chakra-ui/descendant": 3.1.0 - "@chakra-ui/lazy-utils": 2.0.5 - "@chakra-ui/react-children-utils": 2.0.6 - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/react-use-controllable-state": 2.1.0 - "@chakra-ui/react-use-merge-refs": 2.1.0 - "@chakra-ui/react-use-safe-layout-effect": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: 6c030d8f437c7311159a17c76082487524b0f990572f27e9ef7f7ee2c48e0b246d8e5e1454fe903e6451493f40fc2f865f15d6bc6e26efe88bbf04b5f748b18d - languageName: node - linkType: hard - -"@chakra-ui/tag@npm:3.1.1": - version: 3.1.1 - resolution: "@chakra-ui/tag@npm:3.1.1" - dependencies: - "@chakra-ui/icon": 3.2.0 - "@chakra-ui/react-context": 2.1.0 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: c22abdb6bef8994481ec28266df197d89900688716820b842018b6352eff2df9cbd937d945905e12c1393613d6a1e1f6360e394d29d7dbcf424239787faaef0b - languageName: node - linkType: hard - -"@chakra-ui/textarea@npm:2.1.2": - version: 2.1.2 - resolution: "@chakra-ui/textarea@npm:2.1.2" - dependencies: - "@chakra-ui/form-control": 2.2.0 - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: 35d483cf1d5e87dea1157624129bff651b6595be85ea25797465c1b44ccae617db81cacfb3f35ecefe2db0700a06710db77397ddfdbfec9157a1e920da5f6739 - languageName: node - linkType: hard - "@chakra-ui/theme-tools@npm:2.1.2": version: 2.1.2 resolution: "@chakra-ui/theme-tools@npm:2.1.2" @@ -1228,6 +603,19 @@ __metadata: languageName: node linkType: hard +"@chakra-ui/theme-tools@npm:2.2.9": + version: 2.2.9 + resolution: "@chakra-ui/theme-tools@npm:2.2.9" + dependencies: + "@chakra-ui/anatomy": 2.3.6 + "@chakra-ui/utils": 2.2.5 + color2k: ^2.0.2 + peerDependencies: + "@chakra-ui/styled-system": ">=2.0.0" + checksum: 1e8032912b45ef389623fe4e1d8581307ab8cd6d2b61ed5d692118d6cb3b55a8a463be54da522364aba470df965b13fdb90eb25057f91456d5ed5f22ed664129 + languageName: node + linkType: hard + "@chakra-ui/theme-utils@npm:2.0.21": version: 2.0.21 resolution: "@chakra-ui/theme-utils@npm:2.0.21" @@ -1253,46 +641,16 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/toast@npm:7.0.2": - version: 7.0.2 - resolution: "@chakra-ui/toast@npm:7.0.2" +"@chakra-ui/theme@npm:3.4.9": + version: 3.4.9 + resolution: "@chakra-ui/theme@npm:3.4.9" dependencies: - "@chakra-ui/alert": 2.2.2 - "@chakra-ui/close-button": 2.1.1 - "@chakra-ui/portal": 2.1.0 - "@chakra-ui/react-context": 2.1.0 - "@chakra-ui/react-use-timeout": 2.1.0 - "@chakra-ui/react-use-update-effect": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - "@chakra-ui/styled-system": 2.9.2 - "@chakra-ui/theme": 3.3.1 + "@chakra-ui/anatomy": 2.3.6 + "@chakra-ui/theme-tools": 2.2.9 + "@chakra-ui/utils": 2.2.5 peerDependencies: - "@chakra-ui/system": 2.6.2 - framer-motion: ">=4.0.0" - react: ">=18" - react-dom: ">=18" - checksum: 5e996a53b82628c90e11054d900ab4c714bb6b1a9b74198fbbfc49692175278fc482820578090d0eb27180d3772937ed9fb54ba8f3acfdbbbc20e859c1b55338 - languageName: node - linkType: hard - -"@chakra-ui/tooltip@npm:2.3.1": - version: 2.3.1 - resolution: "@chakra-ui/tooltip@npm:2.3.1" - dependencies: - "@chakra-ui/dom-utils": 2.1.0 - "@chakra-ui/popper": 3.1.0 - "@chakra-ui/portal": 2.1.0 - "@chakra-ui/react-types": 2.0.7 - "@chakra-ui/react-use-disclosure": 2.1.0 - "@chakra-ui/react-use-event-listener": 2.1.0 - "@chakra-ui/react-use-merge-refs": 2.1.0 - "@chakra-ui/shared-utils": 2.0.5 - peerDependencies: - "@chakra-ui/system": ">=2.0.0" - framer-motion: ">=4.0.0" - react: ">=18" - react-dom: ">=18" - checksum: 047bb349fd80382d4f2ee4086119ca80a584b879c4525891e0fb602db0e857dfead4a35c1eb27d4b0c4ce0ac9c0324e63b9fb5f984389297eee2cd1a684f8e1a + "@chakra-ui/styled-system": ">=2.8.0" + checksum: f39d5c85ae68f51186f0a561f658636d48ade5ad48509eeee9b4142951c027bd48bf199bd8aa3a418f6c6dceffbc5d08a113ee695d984d10ee5ff9ef812df59e languageName: node linkType: hard @@ -1320,13 +678,15 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/visually-hidden@npm:2.2.0": - version: 2.2.0 - resolution: "@chakra-ui/visually-hidden@npm:2.2.0" +"@chakra-ui/utils@npm:2.2.5": + version: 2.2.5 + resolution: "@chakra-ui/utils@npm:2.2.5" + dependencies: + "@types/lodash.mergewith": 4.6.9 + lodash.mergewith: 4.6.2 peerDependencies: - "@chakra-ui/system": ">=2.0.0" - react: ">=18" - checksum: 47d6ceb0e26c0d272d1fa19b385d0a16bc8467d8f942d0f6447cc8b86f81c3f479340f4c27a4270667fd36aad32ebf903c6f05b355d106d88086858290761c4a + react: ">=16.8.0" + checksum: afb4d79b01a7f7407667399eda21636680e669d1d906132adb030c27af646c6f33225e718b552f3d9727de9f0e97a563b0195d092c5a031c0c72b4576c36a888 languageName: node linkType: hard @@ -1376,42 +736,70 @@ __metadata: languageName: node linkType: hard -"@emotion/babel-plugin@npm:^11.11.0": - version: 11.11.0 - resolution: "@emotion/babel-plugin@npm:11.11.0" +"@emnapi/core@npm:^1.4.3": + version: 1.4.3 + resolution: "@emnapi/core@npm:1.4.3" + dependencies: + "@emnapi/wasi-threads": 1.0.2 + tslib: ^2.4.0 + checksum: 1c757d380b3cecec637a2eccfb31b770b995060f695d1e15b29a86e2038909a24152947ef6e4b6586759e6716148ff17f40e51367d1b79c9a3e1b6812537bdf4 + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.4.3": + version: 1.4.3 + resolution: "@emnapi/runtime@npm:1.4.3" + dependencies: + tslib: ^2.4.0 + checksum: ff2074809638ed878e476ece370c6eae7e6257bf029a581bb7a290488d8f2a08c420a65988c7f03bfc6bb689218f0cd995d2f935bd182150b357fc2341142f4f + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.0.2": + version: 1.0.2 + resolution: "@emnapi/wasi-threads@npm:1.0.2" + dependencies: + tslib: ^2.4.0 + checksum: c289cd3d0e26f11de23429a4abc7f99927917c0871d5a22637cbb75170f2b58d3a42e80d76dea89d054e529f79e35cdc953324819a7f990305d0db2897fa5fab + languageName: node + linkType: hard + +"@emotion/babel-plugin@npm:^11.13.5": + version: 11.13.5 + resolution: "@emotion/babel-plugin@npm:11.13.5" dependencies: "@babel/helper-module-imports": ^7.16.7 "@babel/runtime": ^7.18.3 - "@emotion/hash": ^0.9.1 - "@emotion/memoize": ^0.8.1 - "@emotion/serialize": ^1.1.2 + "@emotion/hash": ^0.9.2 + "@emotion/memoize": ^0.9.0 + "@emotion/serialize": ^1.3.3 babel-plugin-macros: ^3.1.0 convert-source-map: ^1.5.0 escape-string-regexp: ^4.0.0 find-root: ^1.1.0 source-map: ^0.5.7 stylis: 4.2.0 - checksum: 6b363edccc10290f7a23242c06f88e451b5feb2ab94152b18bb8883033db5934fb0e421e2d67d09907c13837c21218a3ac28c51707778a54d6cd3706c0c2f3f9 + checksum: c41df7e6c19520e76d1939f884be878bf88b5ba00bd3de9d05c5b6c5baa5051686ab124d7317a0645de1b017b574d8139ae1d6390ec267fbe8e85a5252afb542 languageName: node linkType: hard -"@emotion/cache@npm:^11.11.0, @emotion/cache@npm:^11.4.0": - version: 11.11.0 - resolution: "@emotion/cache@npm:11.11.0" +"@emotion/cache@npm:^11.11.0, @emotion/cache@npm:^11.14.0, @emotion/cache@npm:^11.4.0": + version: 11.14.0 + resolution: "@emotion/cache@npm:11.14.0" dependencies: - "@emotion/memoize": ^0.8.1 - "@emotion/sheet": ^1.2.2 - "@emotion/utils": ^1.2.1 - "@emotion/weak-memoize": ^0.3.1 + "@emotion/memoize": ^0.9.0 + "@emotion/sheet": ^1.4.0 + "@emotion/utils": ^1.4.2 + "@emotion/weak-memoize": ^0.4.0 stylis: 4.2.0 - checksum: 8eb1dc22beaa20c21a2e04c284d5a2630a018a9d51fb190e52de348c8d27f4e8ca4bbab003d68b4f6cd9cc1c569ca747a997797e0f76d6c734a660dc29decf08 + checksum: 0a81591541ea43bc7851742e6444b7800d72e98006f94e775ae6ea0806662d14e0a86ff940f5f19d33b4bb2c427c882aa65d417e7322a6e0d5f20fe65ed920c9 languageName: node linkType: hard -"@emotion/hash@npm:^0.9.1": - version: 0.9.1 - resolution: "@emotion/hash@npm:0.9.1" - checksum: 716e17e48bf9047bf9383982c071de49f2615310fb4e986738931776f5a823bc1f29c84501abe0d3df91a3803c80122d24e28b57351bca9e01356ebb33d89876 +"@emotion/hash@npm:^0.9.2": + version: 0.9.2 + resolution: "@emotion/hash@npm:0.9.2" + checksum: 379bde2830ccb0328c2617ec009642321c0e009a46aa383dfbe75b679c6aea977ca698c832d225a893901f29d7b3eef0e38cf341f560f6b2b56f1ff23c172387 languageName: node linkType: hard @@ -1424,12 +812,12 @@ __metadata: languageName: node linkType: hard -"@emotion/is-prop-valid@npm:^1.2.1": - version: 1.2.1 - resolution: "@emotion/is-prop-valid@npm:1.2.1" +"@emotion/is-prop-valid@npm:^1.3.0": + version: 1.3.1 + resolution: "@emotion/is-prop-valid@npm:1.3.1" dependencies: - "@emotion/memoize": ^0.8.1 - checksum: 8f42dc573a3fad79b021479becb639b8fe3b60bdd1081a775d32388bca418ee53074c7602a4c845c5f75fa6831eb1cbdc4d208cc0299f57014ed3a02abcad16a + "@emotion/memoize": ^0.9.0 + checksum: fe6549d54f389e1a17cb02d832af7ee85fb6ea126fc18d02ca47216e8ff19332c1983f4a0ba68602cfcd3b325ffd4ebf0b2d0c6270f1e7e6fe3fca4ba7741e1a languageName: node linkType: hard @@ -1440,136 +828,161 @@ __metadata: languageName: node linkType: hard -"@emotion/memoize@npm:^0.8.1": - version: 0.8.1 - resolution: "@emotion/memoize@npm:0.8.1" - checksum: a19cc01a29fcc97514948eaab4dc34d8272e934466ed87c07f157887406bc318000c69ae6f813a9001c6a225364df04249842a50e692ef7a9873335fbcc141b0 +"@emotion/memoize@npm:^0.9.0": + version: 0.9.0 + resolution: "@emotion/memoize@npm:0.9.0" + checksum: 038132359397348e378c593a773b1148cd0cf0a2285ffd067a0f63447b945f5278860d9de718f906a74c7c940ba1783ac2ca18f1c06a307b01cc0e3944e783b1 languageName: node linkType: hard "@emotion/react@npm:^11.11.1, @emotion/react@npm:^11.8.1": - version: 11.11.1 - resolution: "@emotion/react@npm:11.11.1" + version: 11.14.0 + resolution: "@emotion/react@npm:11.14.0" dependencies: "@babel/runtime": ^7.18.3 - "@emotion/babel-plugin": ^11.11.0 - "@emotion/cache": ^11.11.0 - "@emotion/serialize": ^1.1.2 - "@emotion/use-insertion-effect-with-fallbacks": ^1.0.1 - "@emotion/utils": ^1.2.1 - "@emotion/weak-memoize": ^0.3.1 + "@emotion/babel-plugin": ^11.13.5 + "@emotion/cache": ^11.14.0 + "@emotion/serialize": ^1.3.3 + "@emotion/use-insertion-effect-with-fallbacks": ^1.2.0 + "@emotion/utils": ^1.4.2 + "@emotion/weak-memoize": ^0.4.0 hoist-non-react-statics: ^3.3.1 peerDependencies: react: ">=16.8.0" peerDependenciesMeta: "@types/react": optional: true - checksum: aec3c36650f5f0d3d4445ff44d73dd88712b1609645b6af3e6d08049cfbc51f1785fe13dea1a1d4ab1b0800d68f2339ab11e459687180362b1ef98863155aae5 + checksum: 3cf023b11d132b56168713764d6fced8e5a1f0687dfe0caa2782dfd428c8f9e30f9826a919965a311d87b523cd196722aaf75919cd0f6bd0fd57f8a6a0281500 languageName: node linkType: hard -"@emotion/serialize@npm:^1.1.2": - version: 1.1.2 - resolution: "@emotion/serialize@npm:1.1.2" +"@emotion/serialize@npm:^1.3.3": + version: 1.3.3 + resolution: "@emotion/serialize@npm:1.3.3" dependencies: - "@emotion/hash": ^0.9.1 - "@emotion/memoize": ^0.8.1 - "@emotion/unitless": ^0.8.1 - "@emotion/utils": ^1.2.1 + "@emotion/hash": ^0.9.2 + "@emotion/memoize": ^0.9.0 + "@emotion/unitless": ^0.10.0 + "@emotion/utils": ^1.4.2 csstype: ^3.0.2 - checksum: 413c352e657f1b5e27ea6437b3ef7dcc3860669b7ae17fd5c18bfbd44e033af1acc56b64d252284a813ca4f3b3e1b0841c42d3fb08e02d2df56fd3cd63d72986 + checksum: 510331233767ae4e09e925287ca2c7269b320fa1d737ea86db5b3c861a734483ea832394c0c1fe5b21468fe335624a75e72818831d303ba38125f54f44ba02e7 languageName: node linkType: hard -"@emotion/sheet@npm:^1.2.2": - version: 1.2.2 - resolution: "@emotion/sheet@npm:1.2.2" - checksum: d973273c9c15f1c291ca2269728bf044bd3e92a67bca87943fa9ec6c3cd2b034f9a6bfe95ef1b5d983351d128c75b547b43ff196a00a3875f7e1d269793cecfe +"@emotion/sheet@npm:^1.4.0": + version: 1.4.0 + resolution: "@emotion/sheet@npm:1.4.0" + checksum: eeb1212e3289db8e083e72e7e401cd6d1a84deece87e9ce184f7b96b9b5dbd6f070a89057255a6ff14d9865c3ce31f27c39248a053e4cdd875540359042586b4 languageName: node linkType: hard "@emotion/styled@npm:^11.11.0": - version: 11.11.0 - resolution: "@emotion/styled@npm:11.11.0" + version: 11.14.0 + resolution: "@emotion/styled@npm:11.14.0" dependencies: "@babel/runtime": ^7.18.3 - "@emotion/babel-plugin": ^11.11.0 - "@emotion/is-prop-valid": ^1.2.1 - "@emotion/serialize": ^1.1.2 - "@emotion/use-insertion-effect-with-fallbacks": ^1.0.1 - "@emotion/utils": ^1.2.1 + "@emotion/babel-plugin": ^11.13.5 + "@emotion/is-prop-valid": ^1.3.0 + "@emotion/serialize": ^1.3.3 + "@emotion/use-insertion-effect-with-fallbacks": ^1.2.0 + "@emotion/utils": ^1.4.2 peerDependencies: "@emotion/react": ^11.0.0-rc.0 react: ">=16.8.0" peerDependenciesMeta: "@types/react": optional: true - checksum: 904f641aad3892c65d7d6c0808b036dae1e6d6dad4861c1c7dc0baa59977047c6cad220691206eba7b4059f1a1c6e6c1ef4ebb8c829089e280fa0f2164a01e6b + checksum: 9c1b842e942e69fb6037d1ab161046d2bcfeff95fd2ccfdab30acaaf6b89dc07b14bb00f8cc8ec14df11e6746c8e4e1d781bc54d10bd739aab44966ded64d4fb languageName: node linkType: hard -"@emotion/unitless@npm:^0.8.1": - version: 0.8.1 - resolution: "@emotion/unitless@npm:0.8.1" - checksum: 385e21d184d27853bb350999471f00e1429fa4e83182f46cd2c164985999d9b46d558dc8b9cc89975cb337831ce50c31ac2f33b15502e85c299892e67e7b4a88 +"@emotion/unitless@npm:^0.10.0": + version: 0.10.0 + resolution: "@emotion/unitless@npm:0.10.0" + checksum: d79346df31a933e6d33518e92636afeb603ce043f3857d0a39a2ac78a09ef0be8bedff40130930cb25df1beeee12d96ee38613963886fa377c681a89970b787c languageName: node linkType: hard -"@emotion/use-insertion-effect-with-fallbacks@npm:^1.0.1": - version: 1.0.1 - resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.0.1" +"@emotion/use-insertion-effect-with-fallbacks@npm:^1.2.0": + version: 1.2.0 + resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.2.0" peerDependencies: react: ">=16.8.0" - checksum: 700b6e5bbb37a9231f203bb3af11295eed01d73b2293abece0bc2a2237015e944d7b5114d4887ad9a79776504aa51ed2a8b0ddbc117c54495dd01a6b22f93786 + checksum: 8ff6aec7f2924526ff8c8f8f93d4b8236376e2e12c435314a18c9a373016e24dfdf984e82bbc83712b8e90ff4783cd765eb39fc7050d1a43245e5728740ddd71 languageName: node linkType: hard -"@emotion/utils@npm:^1.2.1": - version: 1.2.1 - resolution: "@emotion/utils@npm:1.2.1" - checksum: e0b44be0705b56b079c55faff93952150be69e79b660ae70ddd5b6e09fc40eb1319654315a9f34bb479d7f4ec94be6068c061abbb9e18b9778ae180ad5d97c73 +"@emotion/utils@npm:^1.4.2": + version: 1.4.2 + resolution: "@emotion/utils@npm:1.4.2" + checksum: 04cf76849c6401205c058b82689fd0ec5bf501aed6974880fe9681a1d61543efb97e848f4c38664ac4a9068c7ad2d1cb84f73bde6cf95f1208aa3c28e0190321 languageName: node linkType: hard -"@emotion/weak-memoize@npm:^0.3.1": - version: 0.3.1 - resolution: "@emotion/weak-memoize@npm:0.3.1" - checksum: b2be47caa24a8122622ea18cd2d650dbb4f8ad37b636dc41ed420c2e082f7f1e564ecdea68122b546df7f305b159bf5ab9ffee872abd0f052e687428459af594 +"@emotion/weak-memoize@npm:^0.4.0": + version: 0.4.0 + resolution: "@emotion/weak-memoize@npm:0.4.0" + checksum: db5da0e89bd752c78b6bd65a1e56231f0abebe2f71c0bd8fc47dff96408f7065b02e214080f99924f6a3bfe7ee15afc48dad999d76df86b39b16e513f7a94f52 languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.7.0": + version: 4.7.0 + resolution: "@eslint-community/eslint-utils@npm:4.7.0" dependencies: - eslint-visitor-keys: ^3.3.0 + eslint-visitor-keys: ^3.4.3 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 + checksum: b177e3b75c0b8d0e5d71f1c532edb7e40b31313db61f0c879f9bf19c3abb2783c6c372b5deb2396dab4432f2946b9972122ac682e77010376c029dfd0149c681 languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.11.0": - version: 4.11.0 - resolution: "@eslint-community/regexpp@npm:4.11.0" - checksum: 97d2fe46690b69417a551bd19a3dc53b6d9590d2295c43cc4c4e44e64131af541e2f4a44d5c12e87de990403654d3dae9d33600081f3a2f0386b368abc9111ec +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 0d628680e204bc316d545b4993d3658427ca404ae646ce541fcc65306b8c712c340e5e573e30fb9f85f4855c0c5f6dca9868931f2fcced06417fbe1a0c6cd2d6 languageName: node linkType: hard -"@eslint/config-array@npm:^0.18.0": - version: 0.18.0 - resolution: "@eslint/config-array@npm:0.18.0" +"@eslint/config-array@npm:^0.20.1": + version: 0.20.1 + resolution: "@eslint/config-array@npm:0.20.1" dependencies: - "@eslint/object-schema": ^2.1.4 + "@eslint/object-schema": ^2.1.6 debug: ^4.3.1 minimatch: ^3.1.2 - checksum: 5ff748e1788745bfb3160c3b3151d62a7c054e336e9fe8069e86cfa6106f3abbd59b24f1253122268295f98c66803e9a7b23d7f947a8c00f62d2060cc44bc7fc + checksum: fe5b518be9eb474a0050bb3d0427ae00967f56e6c204492d8fc0bc3086cf93a0174b7eafd657b2bfddb904b9785943435345985df28853e9354bfbf492b84226 languageName: node linkType: hard -"@eslint/eslintrc@npm:^3.1.0": - version: 3.1.0 - resolution: "@eslint/eslintrc@npm:3.1.0" +"@eslint/config-helpers@npm:^0.2.1": + version: 0.2.3 + resolution: "@eslint/config-helpers@npm:0.2.3" + checksum: 2f0610555e1d7231f03972c9b30df388d617d7b76c186760a9e55de827093e0a0a1d6449694b0673046692d57c836161d8b7bef81fa1f28533f25dc58a0093dd + languageName: node + linkType: hard + +"@eslint/core@npm:^0.14.0": + version: 0.14.0 + resolution: "@eslint/core@npm:0.14.0" + dependencies: + "@types/json-schema": ^7.0.15 + checksum: d68b8282b6f38c5145234f812f18f491d12d716240875591bd54bf5ac32858d979bdf6d38e521997a6e01f2c4223a3e66049714151da7278d0a95ff15b5d46c8 + languageName: node + linkType: hard + +"@eslint/core@npm:^0.15.0": + version: 0.15.0 + resolution: "@eslint/core@npm:0.15.0" + dependencies: + "@types/json-schema": ^7.0.15 + checksum: 74ae0a38678fa1cae44732c5376b800c842993224301e6a4abc57edd123cfcb8c7746f38892adb8747b4f56c0a1c1db71ff619210508628eb9227d08a0d7bb92 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^3.3.1": + version: 3.3.1 + resolution: "@eslint/eslintrc@npm:3.3.1" dependencies: ajv: ^6.12.4 debug: ^4.3.2 @@ -1580,21 +993,31 @@ __metadata: js-yaml: ^4.1.0 minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: b0a9bbd98c8b9e0f4d975b042ff9b874dde722b20834ea2ff46551c3de740d4f10f56c449b790ef34d7f82147cbddfc22b004a43cc885dbc2664bb134766b5e4 + checksum: 8241f998f0857abf5a615072273b90b1244d75c1c45d217c6a8eb444c6e12bbb5506b4879c14fb262eb72b7d8e3d2f0542da2db1a7f414a12496ebb790fb4d62 languageName: node linkType: hard -"@eslint/js@npm:9.9.1": - version: 9.9.1 - resolution: "@eslint/js@npm:9.9.1" - checksum: 24436d7a1023dbc6c63fd199e45afa9eab8537f7bd808872d9d17dd70c5237f599fe3d08f519d55b40e33bfde02a460861df1c96aa07674090c3f98c83b0c178 +"@eslint/js@npm:9.29.0": + version: 9.29.0 + resolution: "@eslint/js@npm:9.29.0" + checksum: 9688a729664af9cc8898f61cbfbeb46d383a67c6fa4cbb1f8f2aa080aa5c34cfd5a3e19da6dde4d56f33e44873cedf064d612bd0fdc0ac003f9b9f741bd4953e languageName: node linkType: hard -"@eslint/object-schema@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/object-schema@npm:2.1.4" - checksum: 5a03094115bcdab7991dbbc5d17a9713f394cebb4b44d3eaf990d7487b9b8e1877b817997334ab40be52e299a0384595c6f6ba91b389901e5e1d21efda779271 +"@eslint/object-schema@npm:^2.1.6": + version: 2.1.6 + resolution: "@eslint/object-schema@npm:2.1.6" + checksum: e32e565319f6544d36d3fa69a3e163120722d12d666d1a4525c9a6f02e9b54c29d9b1f03139e25d7e759e08dda8da433590bc23c09db8d511162157ef1b86a4c + languageName: node + linkType: hard + +"@eslint/plugin-kit@npm:^0.3.1": + version: 0.3.2 + resolution: "@eslint/plugin-kit@npm:0.3.2" + dependencies: + "@eslint/core": ^0.15.0 + levn: ^0.4.1 + checksum: c2ff2993908d41ee1d897dbc51d7557b19ed171fb9ee5cf3b3b862ca1931c9ecacb3fd4cc565d40ca3c60672899ac78eff6fcf13354f14225178eeafbfb3b700 languageName: node linkType: hard @@ -1605,110 +1028,84 @@ __metadata: languageName: node linkType: hard -"@floating-ui/core@npm:^1.4.2": - version: 1.5.2 - resolution: "@floating-ui/core@npm:1.5.2" +"@floating-ui/core@npm:^1.7.1": + version: 1.7.1 + resolution: "@floating-ui/core@npm:1.7.1" dependencies: - "@floating-ui/utils": ^0.1.3 - checksum: e22de0a5e8a703fe14d9cfb72aeb67c0056c4ae6aa241539934ecb2af56448534b434a7587ecb5de154c21c3c73e44c19249b05c6b67a58eae7861188c8e69ac + "@floating-ui/utils": ^0.2.9 + checksum: dccd6efe7cdc9039ce62e805efd20f4572996e03decf6b1451b4de649b8841c841b68999148003e1b22e2184afc6d8cd22b38c9697f2b2bb9301ba52ebdf7824 languageName: node linkType: hard -"@floating-ui/core@npm:^1.6.0": - version: 1.6.4 - resolution: "@floating-ui/core@npm:1.6.4" +"@floating-ui/dom@npm:^1.0.0, @floating-ui/dom@npm:^1.0.1": + version: 1.7.1 + resolution: "@floating-ui/dom@npm:1.7.1" dependencies: - "@floating-ui/utils": ^0.2.4 - checksum: 6855472c00ceaa14e0f1cb4bd5de0de01d05cd46bdf12cb19bd6a89fa70bdfba0460a776dc50d28ab40e3bddc291e2211958497528fdd98653ea7260d61e0442 - languageName: node - linkType: hard - -"@floating-ui/dom@npm:^1.0.0": - version: 1.6.7 - resolution: "@floating-ui/dom@npm:1.6.7" - dependencies: - "@floating-ui/core": ^1.6.0 - "@floating-ui/utils": ^0.2.4 - checksum: 66605a2948bfe7532408197b4c522fecf04cf11e7839623d0dca0d22362b42d64a5db2f3be865053e9b0d44c89faf1befa9a4ce1b7fa595d1b3dc82f635d079c - languageName: node - linkType: hard - -"@floating-ui/dom@npm:^1.0.1": - version: 1.5.3 - resolution: "@floating-ui/dom@npm:1.5.3" - dependencies: - "@floating-ui/core": ^1.4.2 - "@floating-ui/utils": ^0.1.3 - checksum: 00053742064aac70957f0bd5c1542caafb3bfe9716588bfe1d409fef72a67ed5e60450d08eb492a77f78c22ed1ce4f7955873cc72bf9f9caf2b0f43ae3561c21 + "@floating-ui/core": ^1.7.1 + "@floating-ui/utils": ^0.2.9 + checksum: 557c96169fb086b52f83819ec9810aaa06fe50a386edd615ad9f484d1bb8d3de2396ded216482b15c0b6164929d39cb94dffdb5102ba5a736b8c50e02a33c250 languageName: node linkType: hard "@floating-ui/react-dom@npm:^2.0.0": - version: 2.1.1 - resolution: "@floating-ui/react-dom@npm:2.1.1" + version: 2.1.3 + resolution: "@floating-ui/react-dom@npm:2.1.3" dependencies: "@floating-ui/dom": ^1.0.0 peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 6d1a023e6b0a3f298117223d8cdb0a4767f24469d193181da7002f692b756ccafb1e9756c242fa0c072f8ab8a5710ea7cf5cf2a6e92278d1fcd6f0fc0586c27c + checksum: 2e2aab5dcc3c8c8ad706580e6d43fbd3b303b3b7fba08c0cf0d4edd5bf1f2fdcc7db6b07321c4d1ff9a607a03da1a742fc12f55224556bbab37ce0fafd0fae5f languageName: node linkType: hard -"@floating-ui/utils@npm:^0.1.3": - version: 0.1.6 - resolution: "@floating-ui/utils@npm:0.1.6" - checksum: b34d4b5470869727f52e312e08272edef985ba5a450a76de0917ba0a9c6f5df2bdbeb99448e2c60f39b177fb8981c772ff1831424e75123471a27ebd5b52c1eb +"@floating-ui/utils@npm:^0.2.9": + version: 0.2.9 + resolution: "@floating-ui/utils@npm:0.2.9" + checksum: d518b80cec5a323e54a069a1dd99a20f8221a4853ed98ac16c75275a0cc22f75de4f8ac5b121b4f8990bd45da7ad1fb015b9a1e4bac27bb1cd62444af84e9784 languageName: node linkType: hard -"@floating-ui/utils@npm:^0.2.4": - version: 0.2.4 - resolution: "@floating-ui/utils@npm:0.2.4" - checksum: af44cdb3f394fbee6abc933fc3c25bf22f3f0bac58150eee8cc1dcc7e9be56a19b13e438820160614a90712e5a43f84b091afa6689318a10504042930ae9cf44 - languageName: node - linkType: hard - -"@fortawesome/fontawesome-common-types@npm:6.4.0": - version: 6.4.0 - resolution: "@fortawesome/fontawesome-common-types@npm:6.4.0" - checksum: a9b79136caa615352bd921cfe2710516321b402cd76c3f0ae68e579a7e3d7645c5a5c0ecd7516c0b207adeeffd1d2174978638d8c0d3c8c937d66fca4f2ff556 +"@fortawesome/fontawesome-common-types@npm:6.7.2": + version: 6.7.2 + resolution: "@fortawesome/fontawesome-common-types@npm:6.7.2" + checksum: 9c17f03032e56b8e8e996e5b2c15c8b47baf6f8d5c0703025b0b2711907245f94a7032b3da52d2714b5aeff1c14d3535e6869a82086136dcacae9ccd479dc6a2 languageName: node linkType: hard "@fortawesome/fontawesome-svg-core@npm:^6.4.0": - version: 6.4.0 - resolution: "@fortawesome/fontawesome-svg-core@npm:6.4.0" + version: 6.7.2 + resolution: "@fortawesome/fontawesome-svg-core@npm:6.7.2" dependencies: - "@fortawesome/fontawesome-common-types": 6.4.0 - checksum: 5d4e6c15f814f5ce29053b666d0c7d194dc8ba173d128a38cc5856403a09d4e817e54956d30ed8d48d621f2f5ebcc71756f4e8fe5c5a091c636fc728fcb2362b + "@fortawesome/fontawesome-common-types": 6.7.2 + checksum: b3c269545d99202111d8334955466a7f050c38cf80c6be5fdd36baae36822421e0806986db8d1670834fab6595ce527e06ea58248e053703722d03f19eccbb82 languageName: node linkType: hard "@fortawesome/free-solid-svg-icons@npm:^6.4.0": - version: 6.4.0 - resolution: "@fortawesome/free-solid-svg-icons@npm:6.4.0" + version: 6.7.2 + resolution: "@fortawesome/free-solid-svg-icons@npm:6.7.2" dependencies: - "@fortawesome/fontawesome-common-types": 6.4.0 - checksum: efdd1688620be3d52aacaeac36c955571962e174ae981fc697b6e92fb0996b00166d02e7729a59ea93713a514e2c8d564ab1aa79c9653b4cfed0263e4874d070 + "@fortawesome/fontawesome-common-types": 6.7.2 + checksum: 457cc180399be57efd1a5908aaa76c8530dec5469fa676904179f73976c10bb030c6de9bf866e2a83e042cfd23856ba5fa1ca5acdb83f4e90c6b4aa9e5412d3c languageName: node linkType: hard "@fortawesome/react-fontawesome@npm:^0.2.0": - version: 0.2.0 - resolution: "@fortawesome/react-fontawesome@npm:0.2.0" + version: 0.2.2 + resolution: "@fortawesome/react-fontawesome@npm:0.2.2" dependencies: prop-types: ^15.8.1 peerDependencies: "@fortawesome/fontawesome-svg-core": ~1 || ~6 react: ">=16.3" - checksum: f652a0c2172e7b209e2d9e7e511f9b8c17abad85f55e0bd09bb1175ea1927693215da47eb6cd95b1f3a23bd124368553c677907fa76cb17c5093afc1fcffe338 + checksum: e4bed35bfb7fc88b5bcf2305d08ee1835b82fa7705945c4d310df33bb747b05ef07a33ac9db643c8870ca4f835228978290d84d82f2c6c6a70b9ab4c886731a6 languageName: node linkType: hard "@hey-api/openapi-ts@npm:^0.48.0": - version: 0.48.1 - resolution: "@hey-api/openapi-ts@npm:0.48.1" + version: 0.48.3 + resolution: "@hey-api/openapi-ts@npm:0.48.3" dependencies: "@apidevtools/json-schema-ref-parser": 11.6.4 c12: 1.11.1 @@ -1719,7 +1116,24 @@ __metadata: typescript: ^5.x bin: openapi-ts: bin/index.cjs - checksum: b4441f6d04c3e2a4cae03c0185a2394cb6d9ead595e91d7e5206d9accdb790c29833f8f565730784fe831f1b2462fb650cb283a88899f1cceaa695332fee2be2 + checksum: 11c4b4269dab32a97acdb873cc54a9cf3aa9eb2f19005d8ae2a5f94bc05b5491a4b6a6dff685226499d8a64da6388827bf4cd64d726c75fd3ce75a46fd3760f8 + languageName: node + linkType: hard + +"@humanfs/core@npm:^0.19.1": + version: 0.19.1 + resolution: "@humanfs/core@npm:0.19.1" + checksum: 611e0545146f55ddfdd5c20239cfb7911f9d0e28258787c4fc1a1f6214250830c9367aaaeace0096ed90b6739bee1e9c52ad5ba8adaf74ab8b449119303babfe + languageName: node + linkType: hard + +"@humanfs/node@npm:^0.16.6": + version: 0.16.6 + resolution: "@humanfs/node@npm:0.16.6" + dependencies: + "@humanfs/core": ^0.19.1 + "@humanwhocodes/retry": ^0.3.0 + checksum: f9cb52bb235f8b9c6fcff43a7e500669a38f8d6ce26593404a9b56365a1644e0ed60c720dc65ff6a696b1f85f3563ab055bb554ec8674f2559085ba840e47710 languageName: node linkType: hard @@ -1731,9 +1145,16 @@ __metadata: linkType: hard "@humanwhocodes/retry@npm:^0.3.0": - version: 0.3.0 - resolution: "@humanwhocodes/retry@npm:0.3.0" - checksum: 4349cb8b60466a000e945fde8f8551cefb01ebba22ead4a92ac7b145f67f5da6b52e5a1e0c53185d732d0a49958ac29327934a4a5ac1d0bc20efb4429a4f7bf7 + version: 0.3.1 + resolution: "@humanwhocodes/retry@npm:0.3.1" + checksum: 7e5517bb51dbea3e02ab6cacef59a8f4b0ca023fc4b0b8cbc40de0ad29f46edd50b897c6e7fba79366a0217e3f48e2da8975056f6c35cfe19d9cc48f1d03c1dd + languageName: node + linkType: hard + +"@humanwhocodes/retry@npm:^0.4.2": + version: 0.4.3 + resolution: "@humanwhocodes/retry@npm:0.4.3" + checksum: d423455b9d53cf01f778603404512a4246fb19b83e74fe3e28c70d9a80e9d4ae147d2411628907ca983e91a855a52535859a8bb218050bc3f6dbd7a553b7b442 languageName: node linkType: hard @@ -1767,72 +1188,58 @@ __metadata: languageName: node linkType: hard -"@jest/schemas@npm:^29.6.0": - version: 29.6.0 - resolution: "@jest/schemas@npm:29.6.0" +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" dependencies: "@sinclair/typebox": ^0.27.8 - checksum: c00511c69cf89138a7d974404d3a5060af375b5a52b9c87215d91873129b382ca11c1ff25bd6d605951404bb381ddce5f8091004a61e76457da35db1f5c51365 + checksum: 910040425f0fc93cd13e68c750b7885590b8839066dfa0cd78e7def07bbb708ad869381f725945d66f2284de5663bbecf63e8fdd856e2ae6e261ba30b1687e93 languageName: node linkType: hard -"@jest/types@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/types@npm:29.6.1" +"@jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" dependencies: - "@jest/schemas": ^29.6.0 + "@jest/schemas": ^29.6.3 "@types/istanbul-lib-coverage": ^2.0.0 "@types/istanbul-reports": ^3.0.0 "@types/node": "*" "@types/yargs": ^17.0.8 chalk: ^4.0.0 - checksum: 89fc1ccf71a84fe0da643e0675b1cfe6a6f19ea72e935b2ab1dbdb56ec547e94433fb59b3536d3832a6e156c077865b7176fe9dae707dab9c3d2f9405ba6233c + checksum: a0bcf15dbb0eca6bdd8ce61a3fb055349d40268622a7670a3b2eb3c3dbafe9eb26af59938366d520b86907b9505b0f9b29b85cec11579a9e580694b87cd90fcc languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.2": - version: 0.3.3 - resolution: "@jridgewell/gen-mapping@npm:0.3.3" +"@jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.8 + resolution: "@jridgewell/gen-mapping@npm:0.3.8" dependencies: - "@jridgewell/set-array": ^1.0.1 + "@jridgewell/set-array": ^1.2.1 "@jridgewell/sourcemap-codec": ^1.4.10 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 4a74944bd31f22354fc01c3da32e83c19e519e3bbadafa114f6da4522ea77dd0c2842607e923a591d60a76699d819a2fbb6f3552e277efdb9b58b081390b60ab + "@jridgewell/trace-mapping": ^0.3.24 + checksum: c0687b5227461717aa537fe71a42e356bcd1c43293b3353796a148bf3b0d6f59109def46c22f05b60e29a46f19b2e4676d027959a7c53a6c92b9d5b0d87d0420 languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:3.1.0": - version: 3.1.0 - resolution: "@jridgewell/resolve-uri@npm:3.1.0" - checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.0.3": +"@jridgewell/resolve-uri@npm:^3.0.3, @jridgewell/resolve-uri@npm:^3.1.0": version: 3.1.2 resolution: "@jridgewell/resolve-uri@npm:3.1.2" checksum: 83b85f72c59d1c080b4cbec0fef84528963a1b5db34e4370fa4bd1e3ff64a0d80e0cee7369d11d73c704e0286fb2865b530acac7a871088fbe92b5edf1000870 languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.0.1": - version: 1.1.2 - resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e +"@jridgewell/set-array@npm:^1.2.1": + version: 1.2.1 + resolution: "@jridgewell/set-array@npm:1.2.1" + checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:1.4.14": - version: 1.4.14 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" - checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13": - version: 1.4.15 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" - checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.13, @jridgewell/sourcemap-codec@npm:^1.4.14": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 05df4f2538b3b0f998ea4c1cd34574d0feba216fa5d4ccaef0187d12abf82eafe6021cec8b49f9bb4d90f2ba4582ccc581e72986a5fcf4176ae0cfeb04cf52ec languageName: node linkType: hard @@ -1846,13 +1253,13 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.18 - resolution: "@jridgewell/trace-mapping@npm:0.3.18" +"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": + version: 0.3.25 + resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: - "@jridgewell/resolve-uri": 3.1.0 - "@jridgewell/sourcemap-codec": 1.4.14 - checksum: 0572669f855260808c16fe8f78f5f1b4356463b11d3f2c7c0b5580c8ba1cbf4ae53efe9f627595830856e57dbac2325ac17eb0c3dd0ec42102e6f227cc289c02 + "@jridgewell/resolve-uri": ^3.1.0 + "@jridgewell/sourcemap-codec": ^1.4.14 + checksum: 9d3c40d225e139987b50c48988f8717a54a8c994d8a948ee42e1412e08988761d0754d7d10b803061cc3aebf35f92a5dbbab493bd0e1a9ef9e89a2130e83ba34 languageName: node linkType: hard @@ -1882,85 +1289,103 @@ __metadata: languageName: node linkType: hard -"@next/env@npm:14.2.7": - version: 14.2.7 - resolution: "@next/env@npm:14.2.7" - checksum: 8d3c4338f1a06683f938492391634ce1dd7a5c4a3dff030f4aeddc06fb0feb05904d292af42d5c87c4bb2521c9186c973d6146410a89d1161966b3f6a8d46c75 +"@napi-rs/wasm-runtime@npm:^0.2.11": + version: 0.2.11 + resolution: "@napi-rs/wasm-runtime@npm:0.2.11" + dependencies: + "@emnapi/core": ^1.4.3 + "@emnapi/runtime": ^1.4.3 + "@tybys/wasm-util": ^0.9.0 + checksum: 7c614625784ab467cc7b36b4d7384854891469d0ddce8ca831d28b2abdf8cb3f014d8e8a181c98000719effb46950ab9134b245ab9a8044ad7a7da725b40f858 languageName: node linkType: hard -"@next/eslint-plugin-next@npm:14.2.7": - version: 14.2.7 - resolution: "@next/eslint-plugin-next@npm:14.2.7" +"@next/env@npm:14.2.30": + version: 14.2.30 + resolution: "@next/env@npm:14.2.30" + checksum: 3ea103d4f1f82e5d971af460e909ef014c6973555d449049e073ad16a091383167889a7e438d45b3e0bf702fbc9116ba78b175215331378457147e2a0f8e8080 + languageName: node + linkType: hard + +"@next/eslint-plugin-next@npm:14.2.30": + version: 14.2.30 + resolution: "@next/eslint-plugin-next@npm:14.2.30" dependencies: glob: 10.3.10 - checksum: 69115572c2a05a00ceed91c21b42371c8386722e185737458994c6035aaac4dd54af4b2326723cfa4c0ce1103a4cf0c99953a80364ce5bc3957186a08c7a205b + checksum: c9525be3815b569c93b21e0402ca096c8ab54a84e9c0fbf1286e974e8b06d279cf9310b3a0fdeae94f73d2308a3ed2f2c76c437d804b1db17c6a751f8d08f96e languageName: node linkType: hard -"@next/swc-darwin-arm64@npm:14.2.7": - version: 14.2.7 - resolution: "@next/swc-darwin-arm64@npm:14.2.7" +"@next/swc-darwin-arm64@npm:14.2.30": + version: 14.2.30 + resolution: "@next/swc-darwin-arm64@npm:14.2.30" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@next/swc-darwin-x64@npm:14.2.7": - version: 14.2.7 - resolution: "@next/swc-darwin-x64@npm:14.2.7" +"@next/swc-darwin-x64@npm:14.2.30": + version: 14.2.30 + resolution: "@next/swc-darwin-x64@npm:14.2.30" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@next/swc-linux-arm64-gnu@npm:14.2.7": - version: 14.2.7 - resolution: "@next/swc-linux-arm64-gnu@npm:14.2.7" +"@next/swc-linux-arm64-gnu@npm:14.2.30": + version: 14.2.30 + resolution: "@next/swc-linux-arm64-gnu@npm:14.2.30" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-arm64-musl@npm:14.2.7": - version: 14.2.7 - resolution: "@next/swc-linux-arm64-musl@npm:14.2.7" +"@next/swc-linux-arm64-musl@npm:14.2.30": + version: 14.2.30 + resolution: "@next/swc-linux-arm64-musl@npm:14.2.30" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@next/swc-linux-x64-gnu@npm:14.2.7": - version: 14.2.7 - resolution: "@next/swc-linux-x64-gnu@npm:14.2.7" +"@next/swc-linux-x64-gnu@npm:14.2.30": + version: 14.2.30 + resolution: "@next/swc-linux-x64-gnu@npm:14.2.30" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@next/swc-linux-x64-musl@npm:14.2.7": - version: 14.2.7 - resolution: "@next/swc-linux-x64-musl@npm:14.2.7" +"@next/swc-linux-x64-musl@npm:14.2.30": + version: 14.2.30 + resolution: "@next/swc-linux-x64-musl@npm:14.2.30" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@next/swc-win32-arm64-msvc@npm:14.2.7": - version: 14.2.7 - resolution: "@next/swc-win32-arm64-msvc@npm:14.2.7" +"@next/swc-win32-arm64-msvc@npm:14.2.30": + version: 14.2.30 + resolution: "@next/swc-win32-arm64-msvc@npm:14.2.30" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@next/swc-win32-ia32-msvc@npm:14.2.7": - version: 14.2.7 - resolution: "@next/swc-win32-ia32-msvc@npm:14.2.7" +"@next/swc-win32-ia32-msvc@npm:14.2.30": + version: 14.2.30 + resolution: "@next/swc-win32-ia32-msvc@npm:14.2.30" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@next/swc-win32-x64-msvc@npm:14.2.7": - version: 14.2.7 - resolution: "@next/swc-win32-x64-msvc@npm:14.2.7" +"@next/swc-win32-x64-msvc@npm:14.2.30": + version: 14.2.30 + resolution: "@next/swc-win32-x64-msvc@npm:14.2.30" conditions: os=win32 & cpu=x64 languageName: node linkType: hard +"@noble/hashes@npm:^1.1.5": + version: 1.8.0 + resolution: "@noble/hashes@npm:1.8.0" + checksum: c94e98b941963676feaba62475b1ccfa8341e3f572adbb3b684ee38b658df44100187fa0ef4220da580b13f8d27e87d5492623c8a02ecc61f23fb9960c7918f5 + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -1978,7 +1403,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": +"@nodelib/fs.walk@npm:^1.2.3": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -1988,6 +1413,13 @@ __metadata: languageName: node linkType: hard +"@nolyfill/is-core-module@npm:1.0.39": + version: 1.0.39 + resolution: "@nolyfill/is-core-module@npm:1.0.39" + checksum: 0d6e098b871eca71d875651288e1f0fa770a63478b0b50479c99dc760c64175a56b5b04f58d5581bbcc6b552b8191ab415eada093d8df9597ab3423c8cac1815 + languageName: node + linkType: hard + "@npmcli/agent@npm:^3.0.0": version: 3.0.0 resolution: "@npmcli/agent@npm:3.0.0" @@ -2017,6 +1449,159 @@ __metadata: languageName: node linkType: hard +"@paralleldrive/cuid2@npm:^2.2.2": + version: 2.2.2 + resolution: "@paralleldrive/cuid2@npm:2.2.2" + dependencies: + "@noble/hashes": ^1.1.5 + checksum: f7f6ac70e0268ec2c72e555719240d5c2c9a859ce541ac1c637eed3f3ee971b42881d299dedafbded53e7365b9e98176c5a31c442c1112f7e9e7306f2fd0ecbb + languageName: node + linkType: hard + +"@parcel/watcher-android-arm64@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-android-arm64@npm:2.5.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-arm64@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-darwin-arm64@npm:2.5.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-darwin-x64@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-darwin-x64@npm:2.5.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-freebsd-x64@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-freebsd-x64@npm:2.5.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm-glibc@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-linux-arm-glibc@npm:2.5.1" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm-musl@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-linux-arm-musl@npm:2.5.1" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-glibc@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-linux-arm64-glibc@npm:2.5.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-arm64-musl@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-linux-arm64-musl@npm:2.5.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-glibc@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-linux-x64-glibc@npm:2.5.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@parcel/watcher-linux-x64-musl@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-linux-x64-musl@npm:2.5.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@parcel/watcher-win32-arm64@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-win32-arm64@npm:2.5.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@parcel/watcher-win32-ia32@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-win32-ia32@npm:2.5.1" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@parcel/watcher-win32-x64@npm:2.5.1": + version: 2.5.1 + resolution: "@parcel/watcher-win32-x64@npm:2.5.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@parcel/watcher@npm:^2.4.1": + version: 2.5.1 + resolution: "@parcel/watcher@npm:2.5.1" + dependencies: + "@parcel/watcher-android-arm64": 2.5.1 + "@parcel/watcher-darwin-arm64": 2.5.1 + "@parcel/watcher-darwin-x64": 2.5.1 + "@parcel/watcher-freebsd-x64": 2.5.1 + "@parcel/watcher-linux-arm-glibc": 2.5.1 + "@parcel/watcher-linux-arm-musl": 2.5.1 + "@parcel/watcher-linux-arm64-glibc": 2.5.1 + "@parcel/watcher-linux-arm64-musl": 2.5.1 + "@parcel/watcher-linux-x64-glibc": 2.5.1 + "@parcel/watcher-linux-x64-musl": 2.5.1 + "@parcel/watcher-win32-arm64": 2.5.1 + "@parcel/watcher-win32-ia32": 2.5.1 + "@parcel/watcher-win32-x64": 2.5.1 + detect-libc: ^1.0.3 + is-glob: ^4.0.3 + micromatch: ^4.0.5 + node-addon-api: ^7.0.0 + node-gyp: latest + dependenciesMeta: + "@parcel/watcher-android-arm64": + optional: true + "@parcel/watcher-darwin-arm64": + optional: true + "@parcel/watcher-darwin-x64": + optional: true + "@parcel/watcher-freebsd-x64": + optional: true + "@parcel/watcher-linux-arm-glibc": + optional: true + "@parcel/watcher-linux-arm-musl": + optional: true + "@parcel/watcher-linux-arm64-glibc": + optional: true + "@parcel/watcher-linux-arm64-musl": + optional: true + "@parcel/watcher-linux-x64-glibc": + optional: true + "@parcel/watcher-linux-x64-musl": + optional: true + "@parcel/watcher-win32-arm64": + optional: true + "@parcel/watcher-win32-ia32": + optional: true + "@parcel/watcher-win32-x64": + optional: true + checksum: c6444cd20212929ef2296d5620c0d41343a1719232cb0c947ced51155b8afc1e470c09d238b92f6c3a589e0320048badf5b73cb41790229521be224cbf89e0f4 + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -2024,25 +1609,25 @@ __metadata: languageName: node linkType: hard -"@popperjs/core@npm:^2.9.3": +"@popperjs/core@npm:^2.11.8, @popperjs/core@npm:^2.9.3": version: 2.11.8 resolution: "@popperjs/core@npm:2.11.8" checksum: e5c69fdebf52a4012f6a1f14817ca8e9599cb1be73dd1387e1785e2ed5e5f0862ff817f420a87c7fc532add1f88a12e25aeb010ffcbdc98eace3d55ce2139cf0 languageName: node linkType: hard -"@radix-ui/primitive@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/primitive@npm:1.1.0" - checksum: 7cbf70bfd4b2200972dbd52a9366801b5a43dd844743dc97eb673b3ec8e64f5dd547538faaf9939abbfe8bb275773767ecf5a87295d90ba09c15cba2b5528c89 +"@radix-ui/primitive@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/primitive@npm:1.1.2" + checksum: 6cb2ac097faf77b7288bdfd87d92e983e357252d00ee0d2b51ad8e7897bf9f51ec53eafd7dd64c613671a2b02cb8166177bc3de444a6560ec60835c363321c18 languageName: node linkType: hard -"@radix-ui/react-arrow@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-arrow@npm:1.1.0" +"@radix-ui/react-arrow@npm:1.1.7": + version: 1.1.7 + resolution: "@radix-ui/react-arrow@npm:1.1.7" dependencies: - "@radix-ui/react-primitive": 2.0.0 + "@radix-ui/react-primitive": 2.1.3 peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -2053,45 +1638,45 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 8522e0a8095ecc32d3a719f9c3bc0514c677a9c9d5ac26985d5416576dbc487c2a49ba2484397d9de502b54657856cb41ca3ea0b2165563eeeae45a83750885b + checksum: 6cdf74f06090f8994cdf6d3935a44ea3ac309163a4f59c476482c4907e8e0775f224045030abf10fa4f9e1cb7743db034429249b9e59354988e247eeb0f4fdcf languageName: node linkType: hard -"@radix-ui/react-compose-refs@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-compose-refs@npm:1.1.0" +"@radix-ui/react-compose-refs@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-compose-refs@npm:1.1.2" peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: 047a4ed5f87cb848be475507cd62836cf5af5761484681f521ea543ea7c9d59d61d42806d6208863d5e2380bf38cdf4cff73c2bbe5f52dbbe50fb04e1a13ac72 + checksum: 9a91f0213014ffa40c5b8aae4debb993be5654217e504e35aa7422887eb2d114486d37e53c482d0fffb00cd44f51b5269fcdf397b280c71666fa11b7f32f165d languageName: node linkType: hard -"@radix-ui/react-context@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-context@npm:1.1.0" +"@radix-ui/react-context@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-context@npm:1.1.2" peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: d48df5e5193a1d963a1ff7a58f08497c60ddc364216c59090c8267985bd478447dd617847ea277afe10e67c4e0c528894c8d7407082325e0650038625140558a + checksum: 6d08437f23df362672259e535ae463e70bf7a0069f09bfa06c983a5a90e15250bde19da1d63ef8e3da06df1e1b4f92afa9d28ca6aa0297bb1c8aaf6ca83d28c5 languageName: node linkType: hard -"@radix-ui/react-dismissable-layer@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-dismissable-layer@npm:1.1.0" +"@radix-ui/react-dismissable-layer@npm:1.1.10": + version: 1.1.10 + resolution: "@radix-ui/react-dismissable-layer@npm:1.1.10" dependencies: - "@radix-ui/primitive": 1.1.0 - "@radix-ui/react-compose-refs": 1.1.0 - "@radix-ui/react-primitive": 2.0.0 - "@radix-ui/react-use-callback-ref": 1.1.0 - "@radix-ui/react-use-escape-keydown": 1.1.0 + "@radix-ui/primitive": 1.1.2 + "@radix-ui/react-compose-refs": 1.1.2 + "@radix-ui/react-primitive": 2.1.3 + "@radix-ui/react-use-callback-ref": 1.1.1 + "@radix-ui/react-use-escape-keydown": 1.1.1 peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -2102,30 +1687,30 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 857feab2d5184a72df4e6dd9430c8e4b9fe7304790ef69512733346eee5fc33a6527256fc135d4bee6d94e8cc9c1b83c3d91da96cb4bf8300f88e9c660b71b08 + checksum: c4f31e8e93ae979a1bcd60726f8ebe7b79f23baafcd1d1e65f62cff6b322b2c6ff6132d82f2e63737f9955a8f04407849036f5b64b478e9a5678747d835957d8 languageName: node linkType: hard -"@radix-ui/react-focus-guards@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-focus-guards@npm:1.1.0" +"@radix-ui/react-focus-guards@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-focus-guards@npm:1.1.2" peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: 199717e7da1ba9b3fa74b04f6a245aaebf6bdb8ae7d6f4b5f21f95f4086414a3587beebc77399a99be7d3a4b2499eaa52bf72bef660f8e69856b0fd0593b074f + checksum: 618658e2b98575198b94ccfdd27f41beb37f83721c9a04617e848afbc47461124ae008d703d713b9644771d96d4852e49de322cf4be3b5f10a4f94d200db5248 languageName: node linkType: hard -"@radix-ui/react-focus-scope@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-focus-scope@npm:1.1.0" +"@radix-ui/react-focus-scope@npm:1.1.7": + version: 1.1.7 + resolution: "@radix-ui/react-focus-scope@npm:1.1.7" dependencies: - "@radix-ui/react-compose-refs": 1.1.0 - "@radix-ui/react-primitive": 2.0.0 - "@radix-ui/react-use-callback-ref": 1.1.0 + "@radix-ui/react-compose-refs": 1.1.2 + "@radix-ui/react-primitive": 2.1.3 + "@radix-ui/react-use-callback-ref": 1.1.1 peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -2136,44 +1721,44 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: bea6c993752780c46c69f0c21a0fd96f11b9ed7edac23deb0953fbd8524d90938bf4c8060ccac7cad14caba3eb493f2642be7f8933910f4b6fa184666b7fcb40 + checksum: bb642d192d3da8431f8b39f64959b493a7ba743af8501b76699ef93357c96507c11fb76d468824b52b0e024eaee130a641f3a213268ac7c9af34883b45610c9b languageName: node linkType: hard -"@radix-ui/react-id@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-id@npm:1.1.0" +"@radix-ui/react-id@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-id@npm:1.1.1" dependencies: - "@radix-ui/react-use-layout-effect": 1.1.0 + "@radix-ui/react-use-layout-effect": 1.1.1 peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: 6fbc9d1739b3b082412da10359e63967b4f3a60383ebda4c9e56b07a722d29bee53b203b3b1418f88854a29315a7715867133bb149e6e22a027a048cdd20d970 + checksum: 8d68e200778eb3038906870fc869b3d881f4a46715fb20cddd9c76cba42fdaaa4810a3365b6ec2daf0f185b9201fc99d009167f59c7921bc3a139722c2e976db languageName: node linkType: hard "@radix-ui/react-popover@npm:^1.0.7": - version: 1.1.1 - resolution: "@radix-ui/react-popover@npm:1.1.1" + version: 1.1.14 + resolution: "@radix-ui/react-popover@npm:1.1.14" dependencies: - "@radix-ui/primitive": 1.1.0 - "@radix-ui/react-compose-refs": 1.1.0 - "@radix-ui/react-context": 1.1.0 - "@radix-ui/react-dismissable-layer": 1.1.0 - "@radix-ui/react-focus-guards": 1.1.0 - "@radix-ui/react-focus-scope": 1.1.0 - "@radix-ui/react-id": 1.1.0 - "@radix-ui/react-popper": 1.2.0 - "@radix-ui/react-portal": 1.1.1 - "@radix-ui/react-presence": 1.1.0 - "@radix-ui/react-primitive": 2.0.0 - "@radix-ui/react-slot": 1.1.0 - "@radix-ui/react-use-controllable-state": 1.1.0 - aria-hidden: ^1.1.1 - react-remove-scroll: 2.5.7 + "@radix-ui/primitive": 1.1.2 + "@radix-ui/react-compose-refs": 1.1.2 + "@radix-ui/react-context": 1.1.2 + "@radix-ui/react-dismissable-layer": 1.1.10 + "@radix-ui/react-focus-guards": 1.1.2 + "@radix-ui/react-focus-scope": 1.1.7 + "@radix-ui/react-id": 1.1.1 + "@radix-ui/react-popper": 1.2.7 + "@radix-ui/react-portal": 1.1.9 + "@radix-ui/react-presence": 1.1.4 + "@radix-ui/react-primitive": 2.1.3 + "@radix-ui/react-slot": 1.2.3 + "@radix-ui/react-use-controllable-state": 1.2.2 + aria-hidden: ^1.2.4 + react-remove-scroll: ^2.6.3 peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -2184,24 +1769,24 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: ff00fc7653d3713d0d919e2c8f64bbcded875c43978036c0bb3e5ab023f1ae335b690856918ef1f4129301169bbfe12c7fa04568d84061482c1085de2c73cdc1 + checksum: 50f146117ebf675944181ef2df4fbc2d7ca017c71a2ab78eaa67159eb8a0101c682fa02bafa2b132ea7744592b7f103d02935ace2c1f430ab9040a0ece9246c8 languageName: node linkType: hard -"@radix-ui/react-popper@npm:1.2.0": - version: 1.2.0 - resolution: "@radix-ui/react-popper@npm:1.2.0" +"@radix-ui/react-popper@npm:1.2.7": + version: 1.2.7 + resolution: "@radix-ui/react-popper@npm:1.2.7" dependencies: "@floating-ui/react-dom": ^2.0.0 - "@radix-ui/react-arrow": 1.1.0 - "@radix-ui/react-compose-refs": 1.1.0 - "@radix-ui/react-context": 1.1.0 - "@radix-ui/react-primitive": 2.0.0 - "@radix-ui/react-use-callback-ref": 1.1.0 - "@radix-ui/react-use-layout-effect": 1.1.0 - "@radix-ui/react-use-rect": 1.1.0 - "@radix-ui/react-use-size": 1.1.0 - "@radix-ui/rect": 1.1.0 + "@radix-ui/react-arrow": 1.1.7 + "@radix-ui/react-compose-refs": 1.1.2 + "@radix-ui/react-context": 1.1.2 + "@radix-ui/react-primitive": 2.1.3 + "@radix-ui/react-use-callback-ref": 1.1.1 + "@radix-ui/react-use-layout-effect": 1.1.1 + "@radix-ui/react-use-rect": 1.1.1 + "@radix-ui/react-use-size": 1.1.1 + "@radix-ui/rect": 1.1.1 peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -2212,194 +1797,212 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 95b2390181abe3296274b3e3836d295dc7b1624462ca88cc283b70c4efa25b1a640ff56cfe2cc8606bfe493f81b57a86345f962d86a027ad673aed58390545c6 + checksum: 1d672b8b635846501212eb0cd15273c8acdd31e76e78d2b9ba29ce29730d5a2d3a61a8ed49bb689c94f67f45d1dffe0d49449e0810f08c4e112d8aef8430e76d languageName: node linkType: hard -"@radix-ui/react-portal@npm:1.1.1": +"@radix-ui/react-portal@npm:1.1.9": + version: 1.1.9 + resolution: "@radix-ui/react-portal@npm:1.1.9" + dependencies: + "@radix-ui/react-primitive": 2.1.3 + "@radix-ui/react-use-layout-effect": 1.1.1 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: bd6be39bf021d5c917e2474ecba411e2625171f7ef96862b9af04bbd68833bb3662a7f1fbdeb5a7a237111b10e811e76d2cd03e957dadd6e668ef16541bfbd68 + languageName: node + linkType: hard + +"@radix-ui/react-presence@npm:1.1.4": + version: 1.1.4 + resolution: "@radix-ui/react-presence@npm:1.1.4" + dependencies: + "@radix-ui/react-compose-refs": 1.1.2 + "@radix-ui/react-use-layout-effect": 1.1.1 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: d3b0976368fccdfa07100c1f07ca434d0092d4132d1ed4a5c213802f7318d77fc1fd61d1b7038b87e82912688fafa97d8af000a6cca4027b09d92c5477f79dd0 + languageName: node + linkType: hard + +"@radix-ui/react-primitive@npm:2.1.3": + version: 2.1.3 + resolution: "@radix-ui/react-primitive@npm:2.1.3" + dependencies: + "@radix-ui/react-slot": 1.2.3 + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 01f82e4bad76b57767198762c905e5bcea04f4f52129749791e31adfcb1b36f6fdc89c73c40017d812b6e25e4ac925d837214bb280cfeaa5dc383457ce6940b0 + languageName: node + linkType: hard + +"@radix-ui/react-slot@npm:1.2.3": + version: 1.2.3 + resolution: "@radix-ui/react-slot@npm:1.2.3" + dependencies: + "@radix-ui/react-compose-refs": 1.1.2 + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 2731089e15477dd5eef98a5757c36113dd932d0c52ff05123cd89f05f0412e95e5b205229185d1cd705cda4a674a838479cce2b3b46ed903f82f5d23d9e3f3c2 + languageName: node + linkType: hard + +"@radix-ui/react-use-callback-ref@npm:1.1.1": version: 1.1.1 - resolution: "@radix-ui/react-portal@npm:1.1.1" + resolution: "@radix-ui/react-use-callback-ref@npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: cde8c40f1d4e79e6e71470218163a746858304bad03758ac84dc1f94247a046478e8e397518350c8d6609c84b7e78565441d7505bb3ed573afce82cfdcd19faf + languageName: node + linkType: hard + +"@radix-ui/react-use-controllable-state@npm:1.2.2": + version: 1.2.2 + resolution: "@radix-ui/react-use-controllable-state@npm:1.2.2" dependencies: - "@radix-ui/react-primitive": 2.0.0 - "@radix-ui/react-use-layout-effect": 1.1.0 + "@radix-ui/react-use-effect-event": 0.0.2 + "@radix-ui/react-use-layout-effect": 1.1.1 peerDependencies: "@types/react": "*" - "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - "@types/react-dom": - optional: true - checksum: 84dab64ce9c9f4ed7d75df6d1d82877dc7976a98cc192287d39ba2ea512415ed7bf34caf02d579a18fe21766403fa9ae41d2482a14dee5514179ee1b09cc333c + checksum: b438ee199d0630bf95eaafe8bf4bce219e73b371cfc8465f47548bfa4ee231f1134b5c6696b242890a01a0fd25fa34a7b172346bbfc5ee25cfb28b3881b1dc92 languageName: node linkType: hard -"@radix-ui/react-presence@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-presence@npm:1.1.0" +"@radix-ui/react-use-effect-event@npm:0.0.2": + version: 0.0.2 + resolution: "@radix-ui/react-use-effect-event@npm:0.0.2" dependencies: - "@radix-ui/react-compose-refs": 1.1.0 - "@radix-ui/react-use-layout-effect": 1.1.0 + "@radix-ui/react-use-layout-effect": 1.1.1 peerDependencies: "@types/react": "*" - "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - "@types/react-dom": - optional: true - checksum: 7f482268aa5bb5a4214dcf39d20ad93cac96585f1f248931be897ed8a9f99965b7f9b2e8bd4f4140c64eb243b471c471bf148e107f49578cc582faa773d3e83a + checksum: 5a1950a30a399ea7e4b98154da9f536737a610de80189b7aacd4f064a89a3cd0d2a48571d527435227252e72e872bdb544ff6ffcfbdd02de2efd011be4aaa902 languageName: node linkType: hard -"@radix-ui/react-primitive@npm:2.0.0": - version: 2.0.0 - resolution: "@radix-ui/react-primitive@npm:2.0.0" +"@radix-ui/react-use-escape-keydown@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-use-escape-keydown@npm:1.1.1" dependencies: - "@radix-ui/react-slot": 1.1.0 + "@radix-ui/react-use-callback-ref": 1.1.1 peerDependencies: "@types/react": "*" - "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - "@types/react-dom": - optional: true - checksum: 04afc0f3a5ccf1de6e4861f755a89f31640d5a07237c5ac5bffe47bcd8fdf318257961fa56fedc823af49281800ee755752a371561c36fd92f008536a0553748 + checksum: 0eb0756c2c55ddcde9ff01446ab01c085ab2bf799173e97db7ef5f85126f9e8600225570801a1f64740e6d14c39ffe8eed7c14d29737345a5797f4622ac96f6f languageName: node linkType: hard -"@radix-ui/react-slot@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-slot@npm:1.1.0" +"@radix-ui/react-use-layout-effect@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-use-layout-effect@npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: bad2ba4f206e6255263582bedfb7868773c400836f9a1b423c0b464ffe4a17e13d3f306d1ce19cf7a19a492e9d0e49747464f2656451bb7c6a99f5a57bd34de2 + languageName: node + linkType: hard + +"@radix-ui/react-use-rect@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-use-rect@npm:1.1.1" dependencies: - "@radix-ui/react-compose-refs": 1.1.0 + "@radix-ui/rect": 1.1.1 peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: 3c9cd90aabf08f541e20dbecb581744be01c552a0cd16e90d7c218381bcc5307aa8a6013d045864e692ba89d3d8c17bfae08df18ed18be6d223d9330ab0302fa + checksum: 116461bebc49472f7497e66a9bd413541181b3d00c5e0aaeef45d790dc1fbd7c8dcea80b169ea273306228b9a3c2b70067e902d1fd5004b3057e3bbe35b9d55d languageName: node linkType: hard -"@radix-ui/react-use-callback-ref@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-use-callback-ref@npm:1.1.0" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 2ec7903c67e3034b646005556f44fd975dc5204db6885fc58403e3584f27d95f0b573bc161de3d14fab9fda25150bf3b91f718d299fdfc701c736bd0bd2281fa - languageName: node - linkType: hard - -"@radix-ui/react-use-controllable-state@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-use-controllable-state@npm:1.1.0" +"@radix-ui/react-use-size@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-use-size@npm:1.1.1" dependencies: - "@radix-ui/react-use-callback-ref": 1.1.0 + "@radix-ui/react-use-layout-effect": 1.1.1 peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: a6c167cf8eb0744effbeab1f92ea6c0ad71838b222670c0488599f28eecd941d87ac1eed4b5d3b10df6dc7b7b2edb88a54e99d92c2942ce3b21f81d5c188f32d + checksum: 64e61f65feb67ffc80e1fc4a8d5e32480fb6d68475e2640377e021178dead101568cba5f936c9c33e6c142c7cf2fb5d76ad7b23ef80e556ba142d56cf306147b languageName: node linkType: hard -"@radix-ui/react-use-escape-keydown@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-use-escape-keydown@npm:1.1.0" - dependencies: - "@radix-ui/react-use-callback-ref": 1.1.0 - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 9bf88ea272b32ea0f292afd336780a59c5646f795036b7e6105df2d224d73c54399ee5265f61d571eb545d28382491a8b02dc436e3088de8dae415d58b959b71 - languageName: node - linkType: hard - -"@radix-ui/react-use-layout-effect@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-use-layout-effect@npm:1.1.0" - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 271ea0bf1cd74718895a68414a6e95537737f36e02ad08eeb61a82b229d6abda9cff3135a479e134e1f0ce2c3ff97bb85babbdce751985fb755a39b231d7ccf2 - languageName: node - linkType: hard - -"@radix-ui/react-use-rect@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-use-rect@npm:1.1.0" - dependencies: - "@radix-ui/rect": 1.1.0 - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: facc9528af43df3b01952dbb915ff751b5924db2c31d41f053ddea19a7cc5cac5b096c4d7a2059e8f564a3f0d4a95bcd909df8faed52fa01709af27337628e2c - languageName: node - linkType: hard - -"@radix-ui/react-use-size@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/react-use-size@npm:1.1.0" - dependencies: - "@radix-ui/react-use-layout-effect": 1.1.0 - peerDependencies: - "@types/react": "*" - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 01a11d4c07fc620b8a081e53d7ec8495b19a11e02688f3d9f47cf41a5fe0428d1e52ed60b2bf88dfd447dc2502797b9dad2841097389126dd108530913c4d90d - languageName: node - linkType: hard - -"@radix-ui/rect@npm:1.1.0": - version: 1.1.0 - resolution: "@radix-ui/rect@npm:1.1.0" - checksum: 1ad93efbc9fc3b878bae5e8bb26ffa1005235d8b5b9fca8339eb5dbcf7bf53abc9ccd2a8ce128557820168c8600521e48e0ea4dda96aa5f116381f66f46aeda3 +"@radix-ui/rect@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/rect@npm:1.1.1" + checksum: c1c111edeab70b14a735bca43601de6468c792482864b766ac8940b43321492e5c0ae62f92b156cecdc9265ec3c680c32b3fa0c8a90b5e796923a9af13c5dc20 languageName: node linkType: hard "@reduxjs/toolkit@npm:^2.2.3": - version: 2.2.6 - resolution: "@reduxjs/toolkit@npm:2.2.6" + version: 2.8.2 + resolution: "@reduxjs/toolkit@npm:2.8.2" dependencies: + "@standard-schema/spec": ^1.0.0 + "@standard-schema/utils": ^0.3.0 immer: ^10.0.3 redux: ^5.0.1 redux-thunk: ^3.1.0 reselect: ^5.1.0 peerDependencies: - react: ^16.9.0 || ^17.0.0 || ^18 + react: ^16.9.0 || ^17.0.0 || ^18 || ^19 react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 peerDependenciesMeta: react: optional: true react-redux: optional: true - checksum: 9cd02df5c7f2a40ce9ea41c74a7684a9be2b4adf75c2ad897375fb64b57c039e4fa7f2b74c86588434f795f3ab90b71a14ab6768ace8fd5c6d0153a6ed93ba83 + checksum: 94bb4714ff734ea2c0e632a29b0b165507321be097258e6bd66dddca81760610defcc9eff3a46d35e1de010402d24078a7e74648cbc94d5eacfc84dcb01c7161 languageName: node linkType: hard @@ -2433,55 +2036,88 @@ __metadata: linkType: hard "@rollup/pluginutils@npm:^5.0.1": - version: 5.0.2 - resolution: "@rollup/pluginutils@npm:5.0.2" + version: 5.2.0 + resolution: "@rollup/pluginutils@npm:5.2.0" dependencies: "@types/estree": ^1.0.0 estree-walker: ^2.0.2 - picomatch: ^2.3.1 + picomatch: ^4.0.2 peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - checksum: edea15e543bebc7dcac3b0ac8bc7b8e8e6dbd46e2864dbe5dd28072de1fbd5b0e10d545a610c0edaa178e8a7ac432e2a2a52e547ece1308471412caba47db8ce + checksum: d34a7215cddbc11fff7663f8ca05e8e04b48af4c4b19f5545902bef07e508c029cd254d6c5ae66d2e3309d459d44f326f1adaa6b6a4dae3c27bd26a3baef70a4 + languageName: node + linkType: hard + +"@rtsao/scc@npm:^1.1.0": + version: 1.1.0 + resolution: "@rtsao/scc@npm:1.1.0" + checksum: 17d04adf404e04c1e61391ed97bca5117d4c2767a76ae3e879390d6dec7b317fcae68afbf9e98badee075d0b64fa60f287729c4942021b4d19cd01db77385c01 languageName: node linkType: hard "@rushstack/eslint-patch@npm:^1.3.3": - version: 1.6.1 - resolution: "@rushstack/eslint-patch@npm:1.6.1" - checksum: d0c0fcc430dae71d9d929e593844aeaec8d326b1d6c27f18059e22dad486d8df43d6f0206b2021a0df789baf514642355bd86eae7a42c457b7b2f48a29bb0f53 + version: 1.11.0 + resolution: "@rushstack/eslint-patch@npm:1.11.0" + checksum: d1d7e4d36c693b93c06b25022df094ef629b53805db2c7a7ecbb099c34ea525eb96c19f6e5ea5ad1f8b69aba6792cfd8cdd410655b6aa9da15c69c4593019bfc languageName: node linkType: hard -"@sentry-internal/tracing@npm:7.77.0": - version: 7.77.0 - resolution: "@sentry-internal/tracing@npm:7.77.0" +"@sentry-internal/feedback@npm:7.120.3": + version: 7.120.3 + resolution: "@sentry-internal/feedback@npm:7.120.3" dependencies: - "@sentry/core": 7.77.0 - "@sentry/types": 7.77.0 - "@sentry/utils": 7.77.0 - checksum: dc6162db6d426212440abd66f9e37a4ce1849a79dd067158091702b273f3312ea131984c7aad58708745340b2a0ddb652b898c27dbf409d8691dbd4ee8a9ebde + "@sentry/core": 7.120.3 + "@sentry/types": 7.120.3 + "@sentry/utils": 7.120.3 + checksum: ed368abb502d892c6497fe357a2fe54dcf0b3d8aa8d4952e8412ce93e66352dbbe67c670d45027dbbe1683572911b7c02718f23a489088ac17fcf54f3b06b4d2 languageName: node linkType: hard -"@sentry/browser@npm:7.77.0": - version: 7.77.0 - resolution: "@sentry/browser@npm:7.77.0" +"@sentry-internal/replay-canvas@npm:7.120.3": + version: 7.120.3 + resolution: "@sentry-internal/replay-canvas@npm:7.120.3" dependencies: - "@sentry-internal/tracing": 7.77.0 - "@sentry/core": 7.77.0 - "@sentry/replay": 7.77.0 - "@sentry/types": 7.77.0 - "@sentry/utils": 7.77.0 - checksum: b3c4ecbf27e8d940c42bc151fc39e9e3659889c0091e69a39f3b8f0e316caa9cdd17aa2c00b151ff9976eff459f023e69cb51f8efa96a840191afd4091cc7573 + "@sentry/core": 7.120.3 + "@sentry/replay": 7.120.3 + "@sentry/types": 7.120.3 + "@sentry/utils": 7.120.3 + checksum: 7bd14aecd8de73c61886a8c77484b48f2eca416b06efd27af2e7652969cb0e61dcd82cb51934c6bb3f9a89474c3eb775cd31d1ec31f7ac32d9d3093b9c8f47a5 languageName: node linkType: hard -"@sentry/cli@npm:^1.74.6": - version: 1.75.2 - resolution: "@sentry/cli@npm:1.75.2" +"@sentry-internal/tracing@npm:7.120.3": + version: 7.120.3 + resolution: "@sentry-internal/tracing@npm:7.120.3" + dependencies: + "@sentry/core": 7.120.3 + "@sentry/types": 7.120.3 + "@sentry/utils": 7.120.3 + checksum: baf4af52c20fbe41a1f61f0c1f43cc149a7c5181097f9d281213bf85b10d78ab156ad7e5f6b345febc0f7383fcfd56b5632cc5974be777998528e5a9d8d5f3e3 + languageName: node + linkType: hard + +"@sentry/browser@npm:7.120.3": + version: 7.120.3 + resolution: "@sentry/browser@npm:7.120.3" + dependencies: + "@sentry-internal/feedback": 7.120.3 + "@sentry-internal/replay-canvas": 7.120.3 + "@sentry-internal/tracing": 7.120.3 + "@sentry/core": 7.120.3 + "@sentry/integrations": 7.120.3 + "@sentry/replay": 7.120.3 + "@sentry/types": 7.120.3 + "@sentry/utils": 7.120.3 + checksum: 30dd14c6c96b4b4356f6b108875c969ee8562b23a42cb2490d29f309f085611770059ef6f83ee9e273b038835085f47c994ad82d04ed7c96e35c8da95de9477e + languageName: node + linkType: hard + +"@sentry/cli@npm:^1.77.1": + version: 1.77.3 + resolution: "@sentry/cli@npm:1.77.3" dependencies: https-proxy-agent: ^5.0.0 mkdirp: ^0.5.5 @@ -2491,48 +2127,48 @@ __metadata: which: ^2.0.2 bin: sentry-cli: bin/sentry-cli - checksum: a0f29b2766cc3054cf20741869ff6991c5543b36b355757babcee9e997182d8862caccc985a9cf360e59000a2be2adfae42d41e0f180e495329e5a41242620d7 + checksum: 193a144c5b449d5c0ea709d7c5678da3f1daa15f31aefa7de40197ed1152fef7c2a0abe168ce2447f1cc2f6eed6fdbcdaa5f20dc4502f8987d656d3e5e87fe99 languageName: node linkType: hard -"@sentry/core@npm:7.77.0": - version: 7.77.0 - resolution: "@sentry/core@npm:7.77.0" +"@sentry/core@npm:7.120.3": + version: 7.120.3 + resolution: "@sentry/core@npm:7.120.3" dependencies: - "@sentry/types": 7.77.0 - "@sentry/utils": 7.77.0 - checksum: f76e83ba5da4710b87b5e03f747ac5b5f93c93814447d29e1863b6bd3734d87f3a8fb197060a9a8370430d1d47b5c8c33dc86acc7f7b212322630e280435c6d8 + "@sentry/types": 7.120.3 + "@sentry/utils": 7.120.3 + checksum: c23f87920d0095c41dde6652293d69818aff4778af2987333e4b4c657559afd0b2b170ce11e09e99fa209159b85024217726fa2b583c4a46881161cfd9404fa3 languageName: node linkType: hard -"@sentry/integrations@npm:7.77.0": - version: 7.77.0 - resolution: "@sentry/integrations@npm:7.77.0" +"@sentry/integrations@npm:7.120.3": + version: 7.120.3 + resolution: "@sentry/integrations@npm:7.120.3" dependencies: - "@sentry/core": 7.77.0 - "@sentry/types": 7.77.0 - "@sentry/utils": 7.77.0 + "@sentry/core": 7.120.3 + "@sentry/types": 7.120.3 + "@sentry/utils": 7.120.3 localforage: ^1.8.1 - checksum: b34f1e0a5a28154698b0eb42c9a3c968c35cbe1ba0411df7b4b83008a58cb3db2a2c07eee5e7a6e55f8b6aae9c74c8433d0e97a3e6289c979b361c09ced4475a + checksum: 3442566e82772853cee42bedf5083aeb50f0057c17d072d4449debc62cd56f5945e5682accbff2c3df51e961e7dbd8a703b5fbd0c24e6fad46d50d5b20a76923 languageName: node linkType: hard "@sentry/nextjs@npm:^7.77.0": - version: 7.77.0 - resolution: "@sentry/nextjs@npm:7.77.0" + version: 7.120.3 + resolution: "@sentry/nextjs@npm:7.120.3" dependencies: "@rollup/plugin-commonjs": 24.0.0 - "@sentry/core": 7.77.0 - "@sentry/integrations": 7.77.0 - "@sentry/node": 7.77.0 - "@sentry/react": 7.77.0 - "@sentry/types": 7.77.0 - "@sentry/utils": 7.77.0 - "@sentry/vercel-edge": 7.77.0 - "@sentry/webpack-plugin": 1.20.0 + "@sentry/core": 7.120.3 + "@sentry/integrations": 7.120.3 + "@sentry/node": 7.120.3 + "@sentry/react": 7.120.3 + "@sentry/types": 7.120.3 + "@sentry/utils": 7.120.3 + "@sentry/vercel-edge": 7.120.3 + "@sentry/webpack-plugin": 1.21.0 chalk: 3.0.0 resolve: 1.22.8 - rollup: 2.78.0 + rollup: 2.79.2 stacktrace-parser: ^0.1.10 peerDependencies: next: ^10.0.8 || ^11.0 || ^12.0 || ^13.0 || ^14.0 @@ -2541,83 +2177,86 @@ __metadata: peerDependenciesMeta: webpack: optional: true - checksum: 293019ff3bc85f1f041f15f1836cb98587cbecf780c26d7758a470d382042c9aa9522408853afbe16a73945f0e4edb6d5b3d704e8b8501b9d90304a6a9492afe + checksum: 88f165a1570f0de5f4eff49a78c1b70ec1246fa4b24bfc64d22f7f2a471400a56de22444f1bdbd88e50c0006433131542adca27abd8177aaf599a4309c1f7aba languageName: node linkType: hard -"@sentry/node@npm:7.77.0": - version: 7.77.0 - resolution: "@sentry/node@npm:7.77.0" +"@sentry/node@npm:7.120.3": + version: 7.120.3 + resolution: "@sentry/node@npm:7.120.3" dependencies: - "@sentry-internal/tracing": 7.77.0 - "@sentry/core": 7.77.0 - "@sentry/types": 7.77.0 - "@sentry/utils": 7.77.0 - https-proxy-agent: ^5.0.0 - checksum: 11034db59a547f3b35208f601fa4704dc7ef6e1f9730136562c1764de8f7b286b355b701711febb44b972ed7009b3467c21ffda15f07024f7dee36979ca9e1c1 + "@sentry-internal/tracing": 7.120.3 + "@sentry/core": 7.120.3 + "@sentry/integrations": 7.120.3 + "@sentry/types": 7.120.3 + "@sentry/utils": 7.120.3 + checksum: 603d7be1b91392d2196b1c078bf4438f79c0754d04a4984e39f811878507241af5a6bf98427716adacf79ddb8a2bc87e872eb8c5dec37e872b7e7024e7e03fbc languageName: node linkType: hard -"@sentry/react@npm:7.77.0": - version: 7.77.0 - resolution: "@sentry/react@npm:7.77.0" +"@sentry/react@npm:7.120.3": + version: 7.120.3 + resolution: "@sentry/react@npm:7.120.3" dependencies: - "@sentry/browser": 7.77.0 - "@sentry/types": 7.77.0 - "@sentry/utils": 7.77.0 + "@sentry/browser": 7.120.3 + "@sentry/core": 7.120.3 + "@sentry/types": 7.120.3 + "@sentry/utils": 7.120.3 hoist-non-react-statics: ^3.3.2 peerDependencies: react: 15.x || 16.x || 17.x || 18.x - checksum: 18af780c76b6b0c52ea476963b8ef0b7a346796c5d0e04dd7c4cb73eb3e52b2fd00b8c1cd5529c29983398a57e325d0d45a689bc8b9822d7c9b10339870869f9 + checksum: 660cf785d86770cd91312c0df600af849728b6a5d49f89cfbb49f865f1b764b29025c31072dc048ad5910f28f0f920e0a3801e7270c489be2f405262e303d4a9 languageName: node linkType: hard -"@sentry/replay@npm:7.77.0": - version: 7.77.0 - resolution: "@sentry/replay@npm:7.77.0" +"@sentry/replay@npm:7.120.3": + version: 7.120.3 + resolution: "@sentry/replay@npm:7.120.3" dependencies: - "@sentry-internal/tracing": 7.77.0 - "@sentry/core": 7.77.0 - "@sentry/types": 7.77.0 - "@sentry/utils": 7.77.0 - checksum: 95bbd554a33a17273501fffadd7a51050787ef5a0ec26de5cccba35f6bfd5d88b2c13f735beaf74274cdb5f77d3a310fa2699d9629220de4b79e4d4c27a14e20 + "@sentry-internal/tracing": 7.120.3 + "@sentry/core": 7.120.3 + "@sentry/types": 7.120.3 + "@sentry/utils": 7.120.3 + checksum: 8adf821cf43eaa6272d9833a783f654c592e9f47e6d7f8bd36a0d0bf2ab99ff9c2e37eb7105f0928ed6b0f29e42d9827b7e50b9cdd774fd17e6c4a51c4882638 languageName: node linkType: hard -"@sentry/types@npm:7.77.0": - version: 7.77.0 - resolution: "@sentry/types@npm:7.77.0" - checksum: ff8047425d4b0caae9221a9fa52fa0122ddf23b51152b7d71914f6465cf72dc3fdf00b7db16e3e95b4a1d2d429824d91ed586b1abac6d5286bd7800504e30824 +"@sentry/types@npm:7.120.3": + version: 7.120.3 + resolution: "@sentry/types@npm:7.120.3" + checksum: 2b84ae52eb4849770977ab2120872d2993ba0c41eac3ebe66e7db3abee06e48079085c6ce947ff41a4f4f91f40ce8f8b1cc1d418469b3661aa300c6e83a49ed2 languageName: node linkType: hard -"@sentry/utils@npm:7.77.0": - version: 7.77.0 - resolution: "@sentry/utils@npm:7.77.0" +"@sentry/utils@npm:7.120.3": + version: 7.120.3 + resolution: "@sentry/utils@npm:7.120.3" dependencies: - "@sentry/types": 7.77.0 - checksum: 000bb1caec44812dc39a8026ecba78c14a8332f15cb78d2935c91a7ba8d61eab9553a791a4af528a113ca90b83db6e81791e3562b2559b76596accc69e4d57ad + "@sentry/types": 7.120.3 + checksum: ad643d422eccd13e2e9044c998a516eec5c0609ff374c4e245a1211e73a454da3cac3f70e5027ee3ae06bd8cf88eb038cc89e6c9accd889ef3252d19f7f3c990 languageName: node linkType: hard -"@sentry/vercel-edge@npm:7.77.0": - version: 7.77.0 - resolution: "@sentry/vercel-edge@npm:7.77.0" +"@sentry/vercel-edge@npm:7.120.3": + version: 7.120.3 + resolution: "@sentry/vercel-edge@npm:7.120.3" dependencies: - "@sentry/core": 7.77.0 - "@sentry/types": 7.77.0 - "@sentry/utils": 7.77.0 - checksum: 3c23c46af233fe3d50f48509fd8e89c24be54d79419e0368bbcc574b6f1d886ff182300e507bbe5fb587c1219ee9663eaa1591783ca0a7bbebdd85b8b35a07ad + "@sentry-internal/tracing": 7.120.3 + "@sentry/core": 7.120.3 + "@sentry/integrations": 7.120.3 + "@sentry/types": 7.120.3 + "@sentry/utils": 7.120.3 + checksum: 49a1212ec66c17b483e2485a851d54334ac1bb27090e4680bd2912c5d5a3c86ade416046e0c7ed97d585be1f70a9ce2258a36601f11baa3b33aa59c412079a22 languageName: node linkType: hard -"@sentry/webpack-plugin@npm:1.20.0": - version: 1.20.0 - resolution: "@sentry/webpack-plugin@npm:1.20.0" +"@sentry/webpack-plugin@npm:1.21.0": + version: 1.21.0 + resolution: "@sentry/webpack-plugin@npm:1.21.0" dependencies: - "@sentry/cli": ^1.74.6 + "@sentry/cli": ^1.77.1 webpack-sources: ^2.0.0 || ^3.0.0 - checksum: d582026c3686f287ddc23de4e64c6f03afc2a73a84ec5a8fd3eded56a45683094bf132f4c624a35386fff872eb518771109d5c0b91a2cf79da0aff035c5bb05b + checksum: 218cdf40df735fc8c358833dbeb16121cf4b0cf61f10adc233561877d4149b5ed0ac3f8b0efcdf3bc66e94d506820e641b2327487e435caecad93e9465b3522a languageName: node linkType: hard @@ -2642,6 +2281,20 @@ __metadata: languageName: node linkType: hard +"@standard-schema/spec@npm:^1.0.0": + version: 1.0.0 + resolution: "@standard-schema/spec@npm:1.0.0" + checksum: 2d7d73a1c9706622750ab06fc40ef7c1d320b52d5e795f8a1c7a77d0d6a9f978705092bc4149327b3cff4c9a14e5b3800d3b00dc945489175a2d3031ded8332a + languageName: node + linkType: hard + +"@standard-schema/utils@npm:^0.3.0": + version: 0.3.0 + resolution: "@standard-schema/utils@npm:0.3.0" + checksum: 7084f875d322792f2e0a5904009434c8374b9345b09ba89828b68fd56fa3c2b366d35bf340d9e8c72736ef01793c2f70d350c372ed79845dc3566c58d34b4b51 + languageName: node + linkType: hard + "@swc/counter@npm:^0.1.3": version: 0.1.3 resolution: "@swc/counter@npm:0.1.3" @@ -2706,16 +2359,16 @@ __metadata: languageName: node linkType: hard -"@types/debug@npm:^4.0.0": - version: 4.1.9 - resolution: "@types/debug@npm:4.1.9" +"@tybys/wasm-util@npm:^0.9.0": + version: 0.9.0 + resolution: "@tybys/wasm-util@npm:0.9.0" dependencies: - "@types/ms": "*" - checksum: e88ee8b19d106f33eb0d3bc58bacff9702e98d821fd1ebd1de8942e6b97419e19a1ccf39370f1764a1dc66f79fd4619f3412e1be6eeb9f0b76412f5ffe4ead93 + tslib: ^2.4.0 + checksum: 8d44c64e64e39c746e45b5dff7b534716f20e1f6e8fc206f8e4c8ac454ec0eb35b65646e446dd80745bc898db37a4eca549a936766d447c2158c9c43d44e7708 languageName: node linkType: hard -"@types/debug@npm:^4.1.12": +"@types/debug@npm:^4.0.0, @types/debug@npm:^4.1.12": version: 4.1.12 resolution: "@types/debug@npm:4.1.12" dependencies: @@ -2724,44 +2377,53 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.0": - version: 1.0.1 - resolution: "@types/estree@npm:1.0.1" - checksum: e9aa175eacb797216fafce4d41e8202c7a75555bc55232dee0f9903d7171f8f19f0ae7d5191bb1a88cb90e65468be508c0df850a9fb81b4433b293a5a749899d +"@types/estree-jsx@npm:^1.0.0": + version: 1.0.5 + resolution: "@types/estree-jsx@npm:1.0.5" + dependencies: + "@types/estree": "*" + checksum: a028ab0cd7b2950168a05c6a86026eb3a36a54a4adfae57f13911d7b49dffe573d9c2b28421b2d029b49b3d02fcd686611be2622dc3dad6d9791166c083f6008 + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6": + version: 1.0.8 + resolution: "@types/estree@npm:1.0.8" + checksum: bd93e2e415b6f182ec4da1074e1f36c480f1d26add3e696d54fb30c09bc470897e41361c8fd957bf0985024f8fbf1e6e2aff977d79352ef7eb93a5c6dcff6c11 languageName: node linkType: hard "@types/hast@npm:^3.0.0": - version: 3.0.1 - resolution: "@types/hast@npm:3.0.1" + version: 3.0.4 + resolution: "@types/hast@npm:3.0.4" dependencies: "@types/unist": "*" - checksum: b7ae475436575273dcc7e6d724f50e7fae86ba42f11fabf74243ac3db37379974fe017582a92ef2e00028cc6299690c6fdd8e15823ac9e68ee745c6258efa1f0 + checksum: 7a973e8d16fcdf3936090fa2280f408fb2b6a4f13b42edeb5fbd614efe042b82eac68e298e556d50f6b4ad585a3a93c353e9c826feccdc77af59de8dd400d044 languageName: node linkType: hard "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0": - version: 2.0.4 - resolution: "@types/istanbul-lib-coverage@npm:2.0.4" - checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7 + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 3feac423fd3e5449485afac999dcfcb3d44a37c830af898b689fadc65d26526460bedb889db278e0d4d815a670331796494d073a10ee6e3a6526301fe7415778 languageName: node linkType: hard "@types/istanbul-lib-report@npm:*": - version: 3.0.0 - resolution: "@types/istanbul-lib-report@npm:3.0.0" + version: 3.0.3 + resolution: "@types/istanbul-lib-report@npm:3.0.3" dependencies: "@types/istanbul-lib-coverage": "*" - checksum: 656398b62dc288e1b5226f8880af98087233cdb90100655c989a09f3052b5775bf98ba58a16c5ae642fb66c61aba402e07a9f2bff1d1569e3b306026c59f3f36 + checksum: b91e9b60f865ff08cb35667a427b70f6c2c63e88105eadd29a112582942af47ed99c60610180aa8dcc22382fa405033f141c119c69b95db78c4c709fbadfeeb4 languageName: node linkType: hard "@types/istanbul-reports@npm:^3.0.0": - version: 3.0.1 - resolution: "@types/istanbul-reports@npm:3.0.1" + version: 3.0.4 + resolution: "@types/istanbul-reports@npm:3.0.4" dependencies: "@types/istanbul-lib-report": "*" - checksum: f1ad54bc68f37f60b30c7915886b92f86b847033e597f9b34f2415acdbe5ed742fa559a0a40050d74cdba3b6a63c342cac1f3a64dba5b68b66a6941f4abd7903 + checksum: 93eb18835770b3431f68ae9ac1ca91741ab85f7606f310a34b3586b5a34450ec038c3eed7ab19266635499594de52ff73723a54a72a75b9f7d6a956f01edee95 languageName: node linkType: hard @@ -2788,33 +2450,54 @@ __metadata: languageName: node linkType: hard +"@types/lodash.mergewith@npm:4.6.9": + version: 4.6.9 + resolution: "@types/lodash.mergewith@npm:4.6.9" + dependencies: + "@types/lodash": "*" + checksum: c5a67e83040103decfd37090127118f5758773d0ce2a1756d442b371721737c7752f48f62544cc970f44abec8471f260cc4c844e1a4fdef8b76cb96bdec8a595 + languageName: node + linkType: hard + "@types/lodash@npm:*": - version: 4.14.202 - resolution: "@types/lodash@npm:4.14.202" - checksum: a91acf3564a568c6f199912f3eb2c76c99c5a0d7e219394294213b3f2d54f672619f0fde4da22b29dc5d4c31457cd799acc2e5cb6bd90f9af04a1578483b6ff7 + version: 4.17.17 + resolution: "@types/lodash@npm:4.17.17" + checksum: cfa34a752f3c540a196e9f92dbaff93ae15fe4058da8cce1918dd9219076dc19eec33b043aae45865e2b3ef8234a845bb57366144ec8e52551e2bc3f119e04a1 languageName: node linkType: hard "@types/mdast@npm:^4.0.0": - version: 4.0.1 - resolution: "@types/mdast@npm:4.0.1" + version: 4.0.4 + resolution: "@types/mdast@npm:4.0.4" dependencies: "@types/unist": "*" - checksum: 3d8fe54a6fb747376c4cc2f05c319730a5737b77844d8ea58d2d696417fa933cd270c20e197f531fc1b4be5e340dc416129f8b4f5fa2f0d2d0cf51850928340a + checksum: 20c4e9574cc409db662a35cba52b068b91eb696b3049e94321219d47d34c8ccc99a142be5c76c80a538b612457b03586bc2f6b727a3e9e7530f4c8568f6282ee languageName: node linkType: hard "@types/ms@npm:*": - version: 0.7.32 - resolution: "@types/ms@npm:0.7.32" - checksum: 610744605c5924aa2657c8a62d307052af4f0e38e2aa015f154ef03391fabb4fd903f9c9baacb41f6e5798b8697e898463c351e5faf638738603ed29137b5254 + version: 2.1.0 + resolution: "@types/ms@npm:2.1.0" + checksum: 532d2ebb91937ccc4a89389715e5b47d4c66e708d15942fe6cc25add6dc37b2be058230a327dd50f43f89b8b6d5d52b74685a9e8f70516edfc9bdd6be910eff4 + languageName: node + linkType: hard + +"@types/node-fetch@npm:^2.6.12": + version: 2.6.12 + resolution: "@types/node-fetch@npm:2.6.12" + dependencies: + "@types/node": "*" + form-data: ^4.0.0 + checksum: 9647e68f9a125a090220c38d77b3c8e669c488658ae7506f1b4f9568214beba087624b1705bba1dc76649a65281ce3fd5b400e15266cbef8088027fb88777557 languageName: node linkType: hard "@types/node@npm:*": - version: 20.4.5 - resolution: "@types/node@npm:20.4.5" - checksum: 36a0304a8dc346a1b2d2edac4c4633eecf70875793d61a5274d0df052d7a7af7a8e34f29884eac4fbd094c4f0201477dcb39c0ecd3307ca141688806538d1138 + version: 24.0.3 + resolution: "@types/node@npm:24.0.3" + dependencies: + undici-types: ~7.8.0 + checksum: 84ab3ee3b752ea06efa1d3da8391d47ebac4551559c8fb5e48fc06fc6f79971540dcee0ee9864b4b399c213d2c93873e14cda7b0b251c95440863c6d777d8f74 languageName: node linkType: hard @@ -2840,29 +2523,18 @@ __metadata: linkType: hard "@types/prop-types@npm:*": - version: 15.7.5 - resolution: "@types/prop-types@npm:15.7.5" - checksum: 5b43b8b15415e1f298243165f1d44390403bb2bd42e662bca3b5b5633fdd39c938e91b7fce3a9483699db0f7a715d08cef220c121f723a634972fdf596aec980 + version: 15.7.15 + resolution: "@types/prop-types@npm:15.7.15" + checksum: 31aa2f59b28f24da6fb4f1d70807dae2aedfce090ec63eaf9ea01727a9533ef6eaf017de5bff99fbccad7d1c9e644f52c6c2ba30869465dd22b1a7221c29f356 languageName: node linkType: hard "@types/react-transition-group@npm:^4.4.0": - version: 4.4.10 - resolution: "@types/react-transition-group@npm:4.4.10" - dependencies: + version: 4.4.12 + resolution: "@types/react-transition-group@npm:4.4.12" + peerDependencies: "@types/react": "*" - checksum: fe2ea11f70251e9f79f368e198c18fd469b1d4f1e1d44e4365845b44e15974b0ec925100036f449b023b0ca3480a82725c5f0a73040e282ad32ec7b0def9b57c - languageName: node - linkType: hard - -"@types/react@npm:*": - version: 18.2.45 - resolution: "@types/react@npm:18.2.45" - dependencies: - "@types/prop-types": "*" - "@types/scheduler": "*" - csstype: ^3.0.2 - checksum: 40b256bdce67b026348022b4f8616a693afdad88cf493b77f7b4e6c5f4b0e4ba13a6068e690b9b94572920840ff30d501ea3d8518e1f21cc8fb8204d4b140c8a + checksum: 13d36396cae4d3c316b03d4a0ba299f0d039c59368ba65e04b0c3dc06fd0a16f59d2c669c3e32d6d525a95423f156b84e550d26bff0bdd8df285f305f8f3a0ed languageName: node linkType: hard @@ -2878,103 +2550,189 @@ __metadata: linkType: hard "@types/scheduler@npm:*": - version: 0.16.3 - resolution: "@types/scheduler@npm:0.16.3" - checksum: 2b0aec39c24268e3ce938c5db2f2e77f5c3dd280e05c262d9c2fe7d890929e4632a6b8e94334017b66b45e4f92a5aa42ba3356640c2a1175fa37bef2f5200767 + version: 0.26.0 + resolution: "@types/scheduler@npm:0.26.0" + checksum: 295ede5e7f991c7c52f9ed8e58d3076526be9a560e59ae11bf1c1414f9755a17bd750f3bfed4657b118283d1eb082bb27dcbe2eadf335a982b0c3b6a562771c2 + languageName: node + linkType: hard + +"@types/ua-parser-js@npm:^0.7.39": + version: 0.7.39 + resolution: "@types/ua-parser-js@npm:0.7.39" + checksum: 81046605eb2815b098228743b7dfde887cc8990369f2ad56e71f1400b4cef5078481c7ca91ca3dddf2e8d4e183fe93224bfdeee13bfe034a1e62d55cfbac9e26 languageName: node linkType: hard "@types/unist@npm:*, @types/unist@npm:^3.0.0": - version: 3.0.0 - resolution: "@types/unist@npm:3.0.0" - checksum: e9d21a8fb5e332be0acef29192d82632875b2ef3e700f1bc64fdfc1520189542de85c3d4f3bcfbc2f4afdb210f4c23f68061f3fbf10744e920d4f18430d19f49 + version: 3.0.3 + resolution: "@types/unist@npm:3.0.3" + checksum: 96e6453da9e075aaef1dc22482463898198acdc1eeb99b465e65e34303e2ec1e3b1ed4469a9118275ec284dc98019f63c3f5d49422f0e4ac707e5ab90fb3b71a languageName: node linkType: hard -"@types/use-sync-external-store@npm:^0.0.3": - version: 0.0.3 - resolution: "@types/use-sync-external-store@npm:0.0.3" - checksum: 161ddb8eec5dbe7279ac971531217e9af6b99f7783213566d2b502e2e2378ea19cf5e5ea4595039d730aa79d3d35c6567d48599f69773a02ffcff1776ec2a44e +"@types/unist@npm:^2.0.0": + version: 2.0.11 + resolution: "@types/unist@npm:2.0.11" + checksum: 6d436e832bc35c6dde9f056ac515ebf2b3384a1d7f63679d12358766f9b313368077402e9c1126a14d827f10370a5485e628bf61aa91117cf4fc882423191a4e + languageName: node + linkType: hard + +"@types/use-sync-external-store@npm:^0.0.6": + version: 0.0.6 + resolution: "@types/use-sync-external-store@npm:0.0.6" + checksum: a95ce330668501ad9b1c5b7f2b14872ad201e552a0e567787b8f1588b22c7040c7c3d80f142cbb9f92d13c4ea41c46af57a20f2af4edf27f224d352abcfe4049 languageName: node linkType: hard "@types/yargs-parser@npm:*": - version: 21.0.0 - resolution: "@types/yargs-parser@npm:21.0.0" - checksum: b2f4c8d12ac18a567440379909127cf2cec393daffb73f246d0a25df36ea983b93b7e9e824251f959e9f928cbc7c1aab6728d0a0ff15d6145f66cec2be67d9a2 + version: 21.0.3 + resolution: "@types/yargs-parser@npm:21.0.3" + checksum: ef236c27f9432983e91432d974243e6c4cdae227cb673740320eff32d04d853eed59c92ca6f1142a335cfdc0e17cccafa62e95886a8154ca8891cc2dec4ee6fc languageName: node linkType: hard "@types/yargs@npm:^17.0.8": - version: 17.0.24 - resolution: "@types/yargs@npm:17.0.24" + version: 17.0.33 + resolution: "@types/yargs@npm:17.0.33" dependencies: "@types/yargs-parser": "*" - checksum: 5f3ac4dc4f6e211c1627340160fbe2fd247ceba002190da6cf9155af1798450501d628c9165a183f30a224fc68fa5e700490d740ff4c73e2cdef95bc4e8ba7bf + checksum: ee013f257472ab643cb0584cf3e1ff9b0c44bca1c9ba662395300a7f1a6c55fa9d41bd40ddff42d99f5d95febb3907c9ff600fbcb92dadbec22c6a76de7e1236 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0": - version: 7.2.0 - resolution: "@typescript-eslint/parser@npm:7.2.0" +"@typescript-eslint/eslint-plugin@npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": + version: 8.34.1 + resolution: "@typescript-eslint/eslint-plugin@npm:8.34.1" dependencies: - "@typescript-eslint/scope-manager": 7.2.0 - "@typescript-eslint/types": 7.2.0 - "@typescript-eslint/typescript-estree": 7.2.0 - "@typescript-eslint/visitor-keys": 7.2.0 + "@eslint-community/regexpp": ^4.10.0 + "@typescript-eslint/scope-manager": 8.34.1 + "@typescript-eslint/type-utils": 8.34.1 + "@typescript-eslint/utils": 8.34.1 + "@typescript-eslint/visitor-keys": 8.34.1 + graphemer: ^1.4.0 + ignore: ^7.0.0 + natural-compare: ^1.4.0 + ts-api-utils: ^2.1.0 + peerDependencies: + "@typescript-eslint/parser": ^8.34.1 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: ea7cd0e45eb7b8dcbe3703afd10ffbc0e88d985ea1bb96733f087140d83d5bbb03b42d8b75fc962dfc85c0d867b8a0a0134b7a339e9ddd5e0468cd03e22d6202 + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": + version: 8.34.1 + resolution: "@typescript-eslint/parser@npm:8.34.1" + dependencies: + "@typescript-eslint/scope-manager": 8.34.1 + "@typescript-eslint/types": 8.34.1 + "@typescript-eslint/typescript-estree": 8.34.1 + "@typescript-eslint/visitor-keys": 8.34.1 debug: ^4.3.4 peerDependencies: - eslint: ^8.56.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 21deb2e7ad1fc730f637af08f5c549f30ef5b50f424639f57f5bc01274e648db47c696bb994bb24e87424b593d4084e306447c9431a0c0e4807952996db306f4 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 4d2a5c7615cfa3065366fa3682739703a9803d5974bd75e1edd107ae0de6f89448b51c502f4423fbb9615ab9c35b1a014cd7f2769194703758087fb5083c8cbb languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:7.2.0": - version: 7.2.0 - resolution: "@typescript-eslint/scope-manager@npm:7.2.0" +"@typescript-eslint/project-service@npm:8.34.1": + version: 8.34.1 + resolution: "@typescript-eslint/project-service@npm:8.34.1" dependencies: - "@typescript-eslint/types": 7.2.0 - "@typescript-eslint/visitor-keys": 7.2.0 - checksum: b4ef8e35a56f590fa56cf769e111907828abb4793f482bf57e3fc8c987294ec119acb96359aa4b0150eea7416816e0b2d8635dccd1e4a5c2b02678b0f74def94 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:7.2.0": - version: 7.2.0 - resolution: "@typescript-eslint/types@npm:7.2.0" - checksum: 237acd24aa55b762ee98904e4f422ba86579325200dcd058b3cbfe70775926e7f00ee0295788d81eb728f3a6326fe4401c648aee9eb1480d9030a441c17520e8 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:7.2.0": - version: 7.2.0 - resolution: "@typescript-eslint/typescript-estree@npm:7.2.0" - dependencies: - "@typescript-eslint/types": 7.2.0 - "@typescript-eslint/visitor-keys": 7.2.0 + "@typescript-eslint/tsconfig-utils": ^8.34.1 + "@typescript-eslint/types": ^8.34.1 debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - minimatch: 9.0.3 - semver: ^7.5.4 - ts-api-utils: ^1.0.1 - peerDependenciesMeta: - typescript: - optional: true - checksum: fe882195cad45bb67e7e127efa9c31977348d0ca923ef26bb9fbd03a2ab64e6772e6e60954ba07a437684fae8e35897d71f0e6a1ef8fbf3f0025cd314960cd9d + peerDependencies: + typescript: ">=4.8.4 <5.9.0" + checksum: 41c128ab88b0a2a206c78f98f549d03d1b2d8d80e50c869892c4230a2dfa8a803791b3257c6c841fca1ab715023b13e8c93d20f2a65d25b83fc3452842875caf languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:7.2.0": - version: 7.2.0 - resolution: "@typescript-eslint/visitor-keys@npm:7.2.0" +"@typescript-eslint/scope-manager@npm:8.34.1": + version: 8.34.1 + resolution: "@typescript-eslint/scope-manager@npm:8.34.1" dependencies: - "@typescript-eslint/types": 7.2.0 - eslint-visitor-keys: ^3.4.1 - checksum: d9b11b52737450f213cea5c6e07e4672684da48325905c096ee09302b6b261c0bb226e1e350011bdf127c0cbbdd9e6474c905befdfa0a2118fc89ece16770f2b + "@typescript-eslint/types": 8.34.1 + "@typescript-eslint/visitor-keys": 8.34.1 + checksum: 6853a5639ee026c64a374782ccbabbf150c2dca133490ba63b9dc55c4ac4f8dd0e2797eeb6b112d1f5a8a0f1daf182a62c1fbff31e0619d0b01383b2dce167b7 + languageName: node + linkType: hard + +"@typescript-eslint/tsconfig-utils@npm:8.34.1, @typescript-eslint/tsconfig-utils@npm:^8.34.1": + version: 8.34.1 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.34.1" + peerDependencies: + typescript: ">=4.8.4 <5.9.0" + checksum: 81a874a433c4e91ee2509d4eda43932b8348e9404da2d11e621bf3b8bec26a6ab84bd3870215dcb09df950182e2b5e2539be30fc262c30edff0e42ca5d707465 + languageName: node + linkType: hard + +"@typescript-eslint/type-utils@npm:8.34.1": + version: 8.34.1 + resolution: "@typescript-eslint/type-utils@npm:8.34.1" + dependencies: + "@typescript-eslint/typescript-estree": 8.34.1 + "@typescript-eslint/utils": 8.34.1 + debug: ^4.3.4 + ts-api-utils: ^2.1.0 + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: c1c53ff76f3fedc2bd3317602ce76440a3f95e1f7615984a40dcd46afc502056d3bcb824d3f8327e20c4a0ebdc58e6f9658f712bec0c4fad0b762fccb574072b + languageName: node + linkType: hard + +"@typescript-eslint/types@npm:8.34.1, @typescript-eslint/types@npm:^8.34.1": + version: 8.34.1 + resolution: "@typescript-eslint/types@npm:8.34.1" + checksum: e05a8e56f8b624edc4b6bf8229133410b0e1e1431cc451a25dbc2ab68c3af580a096dcb7e2d609407ff7052b157ecb55337d2c5f51934d9820fcfac6f9dfd21b + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:8.34.1": + version: 8.34.1 + resolution: "@typescript-eslint/typescript-estree@npm:8.34.1" + dependencies: + "@typescript-eslint/project-service": 8.34.1 + "@typescript-eslint/tsconfig-utils": 8.34.1 + "@typescript-eslint/types": 8.34.1 + "@typescript-eslint/visitor-keys": 8.34.1 + debug: ^4.3.4 + fast-glob: ^3.3.2 + is-glob: ^4.0.3 + minimatch: ^9.0.4 + semver: ^7.6.0 + ts-api-utils: ^2.1.0 + peerDependencies: + typescript: ">=4.8.4 <5.9.0" + checksum: 1800ce71b8227ed0cbef9b02565e57cdf41b0ed8cb9e1f5fba9a29233872eae76d55c35dd159ebf6eeda9d0d8e7864f14cdef3e9e92eb80b4debef003fa46335 + languageName: node + linkType: hard + +"@typescript-eslint/utils@npm:8.34.1": + version: 8.34.1 + resolution: "@typescript-eslint/utils@npm:8.34.1" + dependencies: + "@eslint-community/eslint-utils": ^4.7.0 + "@typescript-eslint/scope-manager": 8.34.1 + "@typescript-eslint/types": 8.34.1 + "@typescript-eslint/typescript-estree": 8.34.1 + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 6e465f04543496026c73c5cf3d85b8396105f3ce7d0aebc02b225c9ce93b49b66bcc61c50bc5cd2d51b66e9e112cf13537c645ee38a14aa0e8b308084f13fe7f + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:8.34.1": + version: 8.34.1 + resolution: "@typescript-eslint/visitor-keys@npm:8.34.1" + dependencies: + "@typescript-eslint/types": 8.34.1 + eslint-visitor-keys: ^4.2.1 + checksum: 2a0e5b9db8cd10111dbbb19e1b9f3f881e91b8c555819afae87d2525bba5ea2543c538ce340d52c56b6d5419cd13751b563fbf600dc67e70e648cbe363dc68d2 languageName: node linkType: hard @@ -3000,9 +2758,9 @@ __metadata: linkType: hard "@ungap/structured-clone@npm:^1.0.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 + version: 1.3.0 + resolution: "@ungap/structured-clone@npm:1.3.0" + checksum: 64ed518f49c2b31f5b50f8570a1e37bde3b62f2460042c50f132430b2d869c4a6586f13aa33a58a4722715b8158c68cae2827389d6752ac54da2893c83e480fc languageName: node linkType: hard @@ -3027,19 +2785,154 @@ __metadata: languageName: node linkType: hard -"@upstash/redis@npm:^1.31.3": - version: 1.34.0 - resolution: "@upstash/redis@npm:1.34.0" - dependencies: - crypto-js: ^4.2.0 - checksum: 127e55e23ce65f72ad74d62cd73a716e3beb4b09ffc3806049d53c2884a2b4d649a00f6e3fd3f6a093fb8e6508d33924b68647cc3739a187adc39d8fb87877bc +"@unrs/resolver-binding-android-arm-eabi@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-android-arm-eabi@npm:1.9.0" + conditions: os=android & cpu=arm languageName: node linkType: hard -"@vercel/build-utils@npm:8.3.9": - version: 8.3.9 - resolution: "@vercel/build-utils@npm:8.3.9" - checksum: 1c86925a8d85a81e27ceaeb22f7f33cc8aa8b7fddd9c8522be4436bd00cec2a3623ea60b5585781df0ab98c4651df3339a3935b9e4208290597897fa64938c0f +"@unrs/resolver-binding-android-arm64@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-android-arm64@npm:1.9.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-darwin-arm64@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.9.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-darwin-x64@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-darwin-x64@npm:1.9.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-freebsd-x64@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.9.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.9.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm-musleabihf@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.9.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm64-gnu@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.9.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm64-musl@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.9.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-ppc64-gnu@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.9.0" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-riscv64-gnu@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-linux-riscv64-gnu@npm:1.9.0" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-riscv64-musl@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-linux-riscv64-musl@npm:1.9.0" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-s390x-gnu@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.9.0" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-x64-gnu@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.9.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-x64-musl@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.9.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@unrs/resolver-binding-wasm32-wasi@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.9.0" + dependencies: + "@napi-rs/wasm-runtime": ^0.2.11 + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@unrs/resolver-binding-win32-arm64-msvc@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.9.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-win32-ia32-msvc@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.9.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@unrs/resolver-binding-win32-x64-msvc@npm:1.9.0": + version: 1.9.0 + resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.9.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@upstash/redis@npm:^1.31.3": + version: 1.35.0 + resolution: "@upstash/redis@npm:1.35.0" + dependencies: + uncrypto: ^0.1.3 + checksum: f97aa7afb1b5a366334781e7ef49887affa13e9187f06ddea33c45f9bc47117c96138866d9a09e6c53cb93989983390a14ba83674f956d8a95876bd46682fee7 + languageName: node + linkType: hard + +"@vercel/build-utils@npm:8.4.12": + version: 8.4.12 + resolution: "@vercel/build-utils@npm:8.4.12" + checksum: ef4b914a975c50fc2e1d38c94d495d4d9ed6b668710860a5ab838732941cfca5d83cdaabd189aade088ff7e639e3bf05d4d6a9bb5cf95af27492a75a77d99cca languageName: node linkType: hard @@ -3103,34 +2996,34 @@ __metadata: languageName: node linkType: hard -"@vercel/gatsby-plugin-vercel-builder@npm:2.0.43": - version: 2.0.43 - resolution: "@vercel/gatsby-plugin-vercel-builder@npm:2.0.43" +"@vercel/gatsby-plugin-vercel-builder@npm:2.0.56": + version: 2.0.56 + resolution: "@vercel/gatsby-plugin-vercel-builder@npm:2.0.56" dependencies: "@sinclair/typebox": 0.25.24 - "@vercel/build-utils": 8.3.9 + "@vercel/build-utils": 8.4.12 "@vercel/routing-utils": 3.1.0 esbuild: 0.14.47 etag: 1.8.1 fs-extra: 11.1.0 - checksum: cf59dc2022da577731fcee258e74f92e9b98bfa206cee29a7439ae7a3405eac092b5ccdb9296cc501569c2e33e34a1ab18bc210963e561bdeba33115f9b50dc7 + checksum: 4436f8d52ab75a308c801fa45160d1d98e4d94d46d65b6b2b141920e3a3a1d1257405fa4ef191887971d8fa78990cdebc0f356535f59d056b7cabbbebf10e78f languageName: node linkType: hard -"@vercel/go@npm:3.1.2": - version: 3.1.2 - resolution: "@vercel/go@npm:3.1.2" - checksum: c57b996b654c5c8a3d764e6b73abf6c6b9e7cdff2317c96e539145605e205360e9deb3dd8eea98c0791278942727a5a294a45b3e5ed203f8fb6d48fe1374cbef +"@vercel/go@npm:3.2.0": + version: 3.2.0 + resolution: "@vercel/go@npm:3.2.0" + checksum: 323a828ca38e925762060b98d3c5d70ad0d2b2fa1e63f07729c49b5b6251b9ae747ae76ef156f8007c09e537653f7607539202c44c8b4e29fe3512e8462d031f languageName: node linkType: hard -"@vercel/hydrogen@npm:1.0.4": - version: 1.0.4 - resolution: "@vercel/hydrogen@npm:1.0.4" +"@vercel/hydrogen@npm:1.0.9": + version: 1.0.9 + resolution: "@vercel/hydrogen@npm:1.0.9" dependencies: "@vercel/static-config": 3.0.0 ts-morph: 12.0.0 - checksum: 58a12e664d46ded40bba5984d29a5c47e7184d79b3177f6d2d37375e3c787ae141075bab40fb49ee76765c066f6f3a9ea803e70818d9dd2919d79e51cab7ec28 + checksum: 2387e552c5bb64df1fb377b59b7f87fca7f4a4c47643d445e5ad0b438a902b81182163d06c0ccc243125da09b496e315f3beca0b5290a5dfe5f38eef5b0ba37b languageName: node linkType: hard @@ -3143,12 +3036,12 @@ __metadata: languageName: node linkType: hard -"@vercel/next@npm:4.3.7": - version: 4.3.7 - resolution: "@vercel/next@npm:4.3.7" +"@vercel/next@npm:4.3.18": + version: 4.3.18 + resolution: "@vercel/next@npm:4.3.18" dependencies: "@vercel/nft": 0.27.3 - checksum: 6e657c0c3bccf1f638da6ebbd4cc6ada7d39c8b9efe4721322b63785781ccbf8d06b39ddcc72e165966d10649eff0f1fc1f75efd0c3a21105e3fc5654726abc2 + checksum: b894cf9588bf4ded5200fb697cc720c512ed6ee74b239fc920c41411cf407847a5cfc421f4c7039c7b97ced1a905bc0802fc81eacf44ef150b28e63414b4ec4f languageName: node linkType: hard @@ -3174,15 +3067,15 @@ __metadata: languageName: node linkType: hard -"@vercel/node@npm:3.2.11": - version: 3.2.11 - resolution: "@vercel/node@npm:3.2.11" +"@vercel/node@npm:3.2.24": + version: 3.2.24 + resolution: "@vercel/node@npm:3.2.24" dependencies: "@edge-runtime/node-utils": 2.3.0 "@edge-runtime/primitives": 4.1.0 "@edge-runtime/vm": 3.2.0 "@types/node": 16.18.11 - "@vercel/build-utils": 8.3.9 + "@vercel/build-utils": 8.4.12 "@vercel/error-utils": 2.0.2 "@vercel/nft": 0.27.3 "@vercel/static-config": 3.0.0 @@ -3198,7 +3091,7 @@ __metadata: ts-node: 10.9.1 typescript: 4.9.5 undici: 5.28.4 - checksum: 8cef9fc0ce7c5d0c216a7550ab903a76066241508a35d95c5f45738ddf6d40d79783ce5a6ed37a1fe0ca931e20e27d0bafac21d0d9cf98a362f5db252a8539aa + checksum: 63173ebc77d9f1d5715c0869ac8687674ff9a94280552a2af3d30be319bd916da98fae57702dcb73d40771abed5cb49da6eedf0ad426b0c441353aa84bf2e351 languageName: node linkType: hard @@ -3209,28 +3102,28 @@ __metadata: languageName: node linkType: hard -"@vercel/redwood@npm:2.1.3": - version: 2.1.3 - resolution: "@vercel/redwood@npm:2.1.3" +"@vercel/redwood@npm:2.1.8": + version: 2.1.8 + resolution: "@vercel/redwood@npm:2.1.8" dependencies: "@vercel/nft": 0.27.3 "@vercel/routing-utils": 3.1.0 "@vercel/static-config": 3.0.0 semver: 6.3.1 ts-morph: 12.0.0 - checksum: e3b8c060e4c20bcd9f531dc203f3e0d755e8d005faa142f81a3829d97269916759af772af2369b0c11fb68aa16c8dfcc3f4a4922ee92a210f1aff785d871a019 + checksum: 2ce605c2501ecb0808124d3ef3abb23a54348c136edb45f41d6089470313084b606e8e5a3a0aceac9611b4d3f7d7c1bd61fe6c0c2cf2b70428d1121f4f770675 languageName: node linkType: hard -"@vercel/remix-builder@npm:2.2.6": - version: 2.2.6 - resolution: "@vercel/remix-builder@npm:2.2.6" +"@vercel/remix-builder@npm:2.2.13": + version: 2.2.13 + resolution: "@vercel/remix-builder@npm:2.2.13" dependencies: "@vercel/error-utils": 2.0.2 "@vercel/nft": 0.27.3 "@vercel/static-config": 3.0.0 ts-morph: 12.0.0 - checksum: c2e5880022eefcb2c4b49cf0bf89f4ea31b3e0b5985febb36cd5d81845c3f4413f7b595b23504517974647a72c20290afbc0ebd2d9bfcdc40acf8e33f9291e81 + checksum: 110a19b886e6645162d31ede7ac8fb23366b2c72c42fe3f4b0bd27e0b4a95fdb020e15cdf07d76d7244ecf541e2eb4b0f599c450990e06ca93664899c51cb878 languageName: node linkType: hard @@ -3254,15 +3147,15 @@ __metadata: languageName: node linkType: hard -"@vercel/static-build@npm:2.5.21": - version: 2.5.21 - resolution: "@vercel/static-build@npm:2.5.21" +"@vercel/static-build@npm:2.5.34": + version: 2.5.34 + resolution: "@vercel/static-build@npm:2.5.34" dependencies: "@vercel/gatsby-plugin-vercel-analytics": 1.0.11 - "@vercel/gatsby-plugin-vercel-builder": 2.0.43 + "@vercel/gatsby-plugin-vercel-builder": 2.0.56 "@vercel/static-config": 3.0.0 ts-morph: 12.0.0 - checksum: c2f3d08f88eed717d92c03ffd54b522c1e96a789575241334140767e6363ded60acb2fb3a646e99c7b22313edd2a999785b66d59635039022e293ee680a8d387 + checksum: 11bc20316a132dc88989d2f065b878194429d4c9ac6b881f70fb0c9c028d82437dbd8d79feb4d490abbf6620d15f9834a43d628baead50e02fc8bccc6e90a538 languageName: node linkType: hard @@ -3278,76 +3171,78 @@ __metadata: linkType: hard "@whereby.com/browser-sdk@npm:^3.3.4": - version: 3.3.4 - resolution: "@whereby.com/browser-sdk@npm:3.3.4" + version: 3.12.17 + resolution: "@whereby.com/browser-sdk@npm:3.12.17" dependencies: "@radix-ui/react-popover": ^1.0.7 "@reduxjs/toolkit": ^2.2.3 - "@whereby.com/core": 0.19.5 + "@whereby.com/core": 0.33.9 clsx: ^2.1.1 heresy: ^1.0.4 react-redux: ^9.1.1 runes: ^0.4.3 peerDependencies: - react: ^18.2.0 - react-dom: ^18.2.0 - checksum: be535b74447bc993fa3420cbef3b64e75bc22245d21326146f95e05f6b6aba24985c337f5a18901276715eee409f19f0218b0300f267ace92fd2782e251695e7 + react: ">=18.2.0" + react-dom: ">=18.2.0" + checksum: 36d46326184512c8f36ba71596a6eafc6463eb6ddf8dcbee47fc9c493f4196352a91b0d0236de089e20ee3bf9f89e36fcccf1165e126447e8ccae86f2380a405 languageName: node linkType: hard -"@whereby.com/core@npm:0.19.5": - version: 0.19.5 - resolution: "@whereby.com/core@npm:0.19.5" +"@whereby.com/core@npm:0.33.9": + version: 0.33.9 + resolution: "@whereby.com/core@npm:0.33.9" dependencies: "@reduxjs/toolkit": ^2.2.3 - "@whereby.com/media": 1.6.5 + "@whereby.com/media": 1.28.0 axios: ^1.2.3 btoa: ^1.2.1 events: ^3.3.0 - checksum: 50fd3721d675e1c5a4454dd31d29fafd948f45e2bfac1d4a586252db62fd8786099de1fb5967abc3bc4f646449cc19faa46c314a47ecb4badf8350d8d2b3e002 + checksum: 07034a3020971ef1e2fa1f3a3bf128361c6893d4a8b2415efaca61a7803a3727b8fc25662c43dcfd7eeb81e9783478584e0160ae5b4a595e4685be034ceacca8 languageName: node linkType: hard -"@whereby.com/media@npm:1.6.5": - version: 1.6.5 - resolution: "@whereby.com/media@npm:1.6.5" +"@whereby.com/media@npm:1.28.0": + version: 1.28.0 + resolution: "@whereby.com/media@npm:1.28.0" dependencies: + "@types/ua-parser-js": ^0.7.39 check-ip: ^1.1.1 events: ^3.3.0 ip-address: ^9.0.5 - mediasoup-client: 3.7.12 - rtcstats: "github:whereby/rtcstats#5.4.0" + mediasoup-client: 3.7.18 + rtcstats: "github:whereby/rtcstats#5.4.1" sdp: ^3.2.0 sdp-transform: ^2.14.2 socket.io-client: 4.7.2 typescript: ^5.3.3 + ua-parser-js: ^1.0.38 uuid: ^9.0.1 uuid-validate: ^0.0.3 - webrtc-adapter: ^8.2.3 - checksum: 075a7a5eb88fa2a52df82e4689ad7db75961205456903b0fda046eefcbd344fa257455520027ffcbb644d7d19a627e14bd7b91b5730ee04e3f0ae44c3296876e + webrtc-adapter: ^9.0.1 + checksum: 52402e4fd7236d974996f8a327ffc803025cce9a13e7ecaead6cbfee13ac540a853c9709e8f8456310b93ec8c4d61d0076f75a8740c57a54ded955e64438da9b languageName: node linkType: hard -"@zag-js/dom-query@npm:0.16.0": - version: 0.16.0 - resolution: "@zag-js/dom-query@npm:0.16.0" - checksum: a207018be1215716487b789c50056c6e28ebf067db26e31147bdef6f4ae1a20fb74b6a7f1a1334210c92295479761df7da2fb60a9cef9aaf64ea376dead3a1f7 +"@zag-js/dom-query@npm:0.31.1": + version: 0.31.1 + resolution: "@zag-js/dom-query@npm:0.31.1" + checksum: edde6374f69c04ebaa6ca2738d7c6f8240567d1f0fc664aa683de4b2babd08d4949e196e0137ce5c864263ae124cbaae728384a9bb5d3e93ee27c09a458fce27 languageName: node linkType: hard -"@zag-js/element-size@npm:0.10.5": - version: 0.10.5 - resolution: "@zag-js/element-size@npm:0.10.5" - checksum: 1a269fbe5124b430008617e705049c929301fae98af4f4ad9da9e533784c883ba899083242a9b7b2a15e503f94dcc7958e8489e98dbd0e098d2d968fb1b41355 +"@zag-js/element-size@npm:0.31.1": + version: 0.31.1 + resolution: "@zag-js/element-size@npm:0.31.1" + checksum: 2ff3946fbb178f73a5f9ab7b6f61e8fa4e7fce28109bae66bab97732314fcb3f4f97c6f413cffeb61f19986528830091246732187166a8f929da01ba9eaa8877 languageName: node linkType: hard -"@zag-js/focus-visible@npm:0.16.0": - version: 0.16.0 - resolution: "@zag-js/focus-visible@npm:0.16.0" +"@zag-js/focus-visible@npm:^0.31.1": + version: 0.31.1 + resolution: "@zag-js/focus-visible@npm:0.31.1" dependencies: - "@zag-js/dom-query": 0.16.0 - checksum: 4bf4530a865200c175d04a70169929defce865a69e7c068a365106cb0b19dbae5ed56163f02cbf543f4b26e60449e150e4aec67dbd819a9d1b3eba9fc667f488 + "@zag-js/dom-query": 0.31.1 + checksum: 297c967a6f153969c148287b1db0bd601ffdfb0a1a26f891cad1aaae858687a9f2d5a37b9ae13401f027f516780cbe6d9a945a42add6a3b1689d87b7a0189e90 languageName: node linkType: hard @@ -3384,20 +3279,20 @@ __metadata: linkType: hard "acorn-walk@npm:^8.1.1": - version: 8.3.3 - resolution: "acorn-walk@npm:8.3.3" + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" dependencies: acorn: ^8.11.0 - checksum: 0f09d351fc30b69b2b9982bf33dc30f3d35a34e030e5f1ed3c49fc4e3814a192bf3101e4c30912a0595410f5e91bb70ddba011ea73398b3ecbfe41c7334c6dd0 + checksum: 4ff03f42323e7cf90f1683e08606b0f460e1e6ac263d2730e3df91c7665b6f64e696db6ea27ee4bed18c2599569be61f28a8399fa170c611161a348c402ca19c languageName: node linkType: hard -"acorn@npm:^8.11.0, acorn@npm:^8.11.3, acorn@npm:^8.12.0, acorn@npm:^8.4.1, acorn@npm:^8.6.0": - version: 8.12.1 - resolution: "acorn@npm:8.12.1" +"acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.15.0, acorn@npm:^8.4.1, acorn@npm:^8.6.0": + version: 8.15.0 + resolution: "acorn@npm:8.15.0" bin: acorn: bin/acorn - checksum: 677880034aee5bdf7434cc2d25b641d7bedb0b5ef47868a78dadabedccf58e1c5457526d9d8249cd253f2df087e081c3fe7d903b448d8e19e5131a3065b83c07 + checksum: 309c6b49aedf1a2e34aaf266de06de04aab6eb097c02375c66fdeb0f64556a6a823540409914fb364d9a11bc30d79d485a2eba29af47992d3490e9886c4391c3 languageName: node linkType: hard @@ -3449,18 +3344,9 @@ __metadata: linkType: hard "ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: ^1.9.0 - checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: 495834a53b0856c02acd40446f7130cb0f8284f4a39afdab20d5dc42b2e198b1196119fe887beed8f9055c4ff2055e3b2f6d4641d0be018cdfb64fedf6fc1aac languageName: node linkType: hard @@ -3542,125 +3428,126 @@ __metadata: languageName: node linkType: hard -"aria-hidden@npm:^1.1.1": - version: 1.2.4 - resolution: "aria-hidden@npm:1.2.4" +"aria-hidden@npm:^1.2.3, aria-hidden@npm:^1.2.4": + version: 1.2.6 + resolution: "aria-hidden@npm:1.2.6" dependencies: tslib: ^2.0.0 - checksum: 2ac90b70d29c6349d86d90e022cf01f4885f9be193932d943a14127cf28560dd0baf068a6625f084163437a4be0578f513cf7892f4cc63bfe91aa41dce27c6b2 + checksum: 56409c55c43ad917607f3f3aa67748dcf30a27e8bb5cb3c5d86b43e38babadd63cd77731a27bc8a8c4332c2291741ed92333bf7ca45f8b99ebc87b94a8070a6e languageName: node linkType: hard -"aria-hidden@npm:^1.2.3": - version: 1.2.3 - resolution: "aria-hidden@npm:1.2.3" +"aria-query@npm:^5.3.2": + version: 5.3.2 + resolution: "aria-query@npm:5.3.2" + checksum: d971175c85c10df0f6d14adfe6f1292409196114ab3c62f238e208b53103686f46cc70695a4f775b73bc65f6a09b6a092fd963c4f3a5a7d690c8fc5094925717 + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "array-buffer-byte-length@npm:1.0.2" dependencies: - tslib: ^2.0.0 - checksum: 7d7d211629eef315e94ed3b064c6823d13617e609d3f9afab1c2ed86399bb8e90405f9bdd358a85506802766f3ecb468af985c67c846045a34b973bcc0289db9 + call-bound: ^1.0.3 + is-array-buffer: ^3.0.5 + checksum: 0ae3786195c3211b423e5be8dd93357870e6fb66357d81da968c2c39ef43583ef6eece1f9cb1caccdae4806739c65dea832b44b8593414313cd76a89795fca63 languageName: node linkType: hard -"aria-query@npm:^5.3.0": - version: 5.3.0 - resolution: "aria-query@npm:5.3.0" +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": + version: 3.1.9 + resolution: "array-includes@npm:3.1.9" dependencies: - dequal: ^2.0.3 - checksum: 305bd73c76756117b59aba121d08f413c7ff5e80fa1b98e217a3443fcddb9a232ee790e24e432b59ae7625aebcf4c47cb01c2cac872994f0b426f5bdfcd96ba9 + call-bind: ^1.0.8 + call-bound: ^1.0.4 + define-properties: ^1.2.1 + es-abstract: ^1.24.0 + es-object-atoms: ^1.1.1 + get-intrinsic: ^1.3.0 + is-string: ^1.1.1 + math-intrinsics: ^1.1.0 + checksum: b58dc526fe415252e50319eaf88336e06e75aa673e3b58d252414739a4612dbe56e7b613fdcc7c90561dc9cf9202bbe5ca029ccd8c08362746459475ae5a8f3e languageName: node linkType: hard -"array-buffer-byte-length@npm:^1.0.0": - version: 1.0.0 - resolution: "array-buffer-byte-length@npm:1.0.0" +"array.prototype.findlast@npm:^1.2.5": + version: 1.2.5 + resolution: "array.prototype.findlast@npm:1.2.5" dependencies: - call-bind: ^1.0.2 - is-array-buffer: ^3.0.1 - checksum: 044e101ce150f4804ad19c51d6c4d4cfa505c5b2577bd179256e4aa3f3f6a0a5e9874c78cd428ee566ac574c8a04d7ce21af9fe52e844abfdccb82b33035a7c3 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + es-shim-unscopables: ^1.0.2 + checksum: 83ce4ad95bae07f136d316f5a7c3a5b911ac3296c3476abe60225bc4a17938bf37541972fcc37dd5adbc99cbb9c928c70bbbfc1c1ce549d41a415144030bb446 languageName: node linkType: hard -"array-includes@npm:^3.1.6, array-includes@npm:^3.1.7": - version: 3.1.7 - resolution: "array-includes@npm:3.1.7" +"array.prototype.findlastindex@npm:^1.2.5": + version: 1.2.6 + resolution: "array.prototype.findlastindex@npm:1.2.6" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 - is-string: ^1.0.7 - checksum: 06f9e4598fac12a919f7c59a3f04f010ea07f0b7f0585465ed12ef528a60e45f374e79d1bddbb34cdd4338357d00023ddbd0ac18b0be36964f5e726e8965d7fc - languageName: node - linkType: hard - -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d - languageName: node - linkType: hard - -"array.prototype.findlastindex@npm:^1.2.3": - version: 1.2.3 - resolution: "array.prototype.findlastindex@npm:1.2.3" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - es-shim-unscopables: ^1.0.0 - get-intrinsic: ^1.2.1 - checksum: 31f35d7b370c84db56484618132041a9af401b338f51899c2e78ef7690fbba5909ee7ca3c59a7192085b328cc0c68c6fd1f6d1553db01a689a589ae510f3966e + call-bind: ^1.0.8 + call-bound: ^1.0.4 + define-properties: ^1.2.1 + es-abstract: ^1.23.9 + es-errors: ^1.3.0 + es-object-atoms: ^1.1.1 + es-shim-unscopables: ^1.1.0 + checksum: bd2665bd51f674d4e1588ce5d5848a8adb255f414070e8e652585598b801480516df2c6cef2c60b6ea1a9189140411c49157a3f112d52e9eabb4e9fc80936ea6 languageName: node linkType: hard "array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.2": - version: 1.3.2 - resolution: "array.prototype.flat@npm:1.3.2" + version: 1.3.3 + resolution: "array.prototype.flat@npm:1.3.3" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - es-shim-unscopables: ^1.0.0 - checksum: 5d6b4bf102065fb3f43764bfff6feb3295d372ce89591e6005df3d0ce388527a9f03c909af6f2a973969a4d178ab232ffc9236654149173e0e187ec3a1a6b87b + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-abstract: ^1.23.5 + es-shim-unscopables: ^1.0.2 + checksum: 5d5a7829ab2bb271a8d30a1c91e6271cef0ec534593c0fe6d2fb9ebf8bb62c1e5326e2fddcbbcbbe5872ca04f5e6b54a1ecf092e0af704fb538da9b2bfd95b40 languageName: node linkType: hard -"array.prototype.flatmap@npm:^1.3.1, array.prototype.flatmap@npm:^1.3.2": - version: 1.3.2 - resolution: "array.prototype.flatmap@npm:1.3.2" +"array.prototype.flatmap@npm:^1.3.2, array.prototype.flatmap@npm:^1.3.3": + version: 1.3.3 + resolution: "array.prototype.flatmap@npm:1.3.3" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - es-shim-unscopables: ^1.0.0 - checksum: ce09fe21dc0bcd4f30271f8144083aa8c13d4639074d6c8dc82054b847c7fc9a0c97f857491f4da19d4003e507172a78f4bcd12903098adac8b9cd374f734be3 + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-abstract: ^1.23.5 + es-shim-unscopables: ^1.0.2 + checksum: 11b4de09b1cf008be6031bb507d997ad6f1892e57dc9153583de6ebca0f74ea403fffe0f203461d359de05048d609f3f480d9b46fed4099652d8b62cc972f284 languageName: node linkType: hard -"array.prototype.tosorted@npm:^1.1.1": - version: 1.1.2 - resolution: "array.prototype.tosorted@npm:1.1.2" +"array.prototype.tosorted@npm:^1.1.4": + version: 1.1.4 + resolution: "array.prototype.tosorted@npm:1.1.4" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - es-shim-unscopables: ^1.0.0 - get-intrinsic: ^1.2.1 - checksum: 3607a7d6b117f0ffa6f4012457b7af0d47d38cf05e01d50e09682fd2fb782a66093a5e5fbbdbad77c8c824794a9d892a51844041641f719ad41e3a974f0764de + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.3 + es-errors: ^1.3.0 + es-shim-unscopables: ^1.0.2 + checksum: e4142d6f556bcbb4f393c02e7dbaea9af8f620c040450c2be137c9cbbd1a17f216b9c688c5f2c08fbb038ab83f55993fa6efdd9a05881d84693c7bcb5422127a languageName: node linkType: hard -"arraybuffer.prototype.slice@npm:^1.0.2": - version: 1.0.2 - resolution: "arraybuffer.prototype.slice@npm:1.0.2" +"arraybuffer.prototype.slice@npm:^1.0.4": + version: 1.0.4 + resolution: "arraybuffer.prototype.slice@npm:1.0.4" dependencies: - array-buffer-byte-length: ^1.0.0 - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 - is-array-buffer: ^3.0.2 - is-shared-array-buffer: ^1.0.2 - checksum: c200faf437786f5b2c80d4564ff5481c886a16dee642ef02abdc7306c7edd523d1f01d1dd12b769c7eb42ac9bc53874510db19a92a2c035c0f6696172aafa5d3 + array-buffer-byte-length: ^1.0.1 + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-abstract: ^1.23.5 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 + is-array-buffer: ^3.0.4 + checksum: b1d1fd20be4e972a3779b1569226f6740170dca10f07aa4421d42cefeec61391e79c557cda8e771f5baefe47d878178cd4438f60916ce831813c08132bced765 languageName: node linkType: hard @@ -3678,6 +3565,13 @@ __metadata: languageName: node linkType: hard +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 9102e246d1ed9b37ac36f57f0a6ca55226876553251a31fc80677e71471f463a54c872dc78d5d7f80740c8ba624395cccbe8b60f7b690c4418f487d8e9fd1106 + languageName: node + linkType: hard + "async-listen@npm:1.2.0": version: 1.2.0 resolution: "async-listen@npm:1.2.0" @@ -3706,15 +3600,6 @@ __metadata: languageName: node linkType: hard -"asynciterator.prototype@npm:^1.0.0": - version: 1.0.0 - resolution: "asynciterator.prototype@npm:1.0.0" - dependencies: - has-symbols: ^1.0.3 - checksum: e8ebfd9493ac651cf9b4165e9d64030b3da1d17181bb1963627b59e240cdaf021d9b59d44b827dc1dde4e22387ec04c2d0f8720cf58a1c282e34e40cc12721b3 - languageName: node - linkType: hard - "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -3750,57 +3635,46 @@ __metadata: languageName: node linkType: hard -"available-typed-arrays@npm:^1.0.5": - version: 1.0.5 - resolution: "available-typed-arrays@npm:1.0.5" - checksum: 20eb47b3cefd7db027b9bbb993c658abd36d4edd3fe1060e83699a03ee275b0c9b216cc076ff3f2db29073225fb70e7613987af14269ac1fe2a19803ccc97f1a +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: ^1.0.0 + checksum: 1aa3ffbfe6578276996de660848b6e95669d9a95ad149e3dd0c0cda77db6ee1dbd9d1dd723b65b6d277b882dd0c4b91a654ae9d3cf9e1254b7e93e4908d78fd3 languageName: node linkType: hard "awaitqueue@npm:^3.0.2": - version: 3.0.2 - resolution: "awaitqueue@npm:3.0.2" + version: 3.2.0 + resolution: "awaitqueue@npm:3.2.0" dependencies: - debug: ^4.3.4 - checksum: 213cd992d1c4897aac1571ec1a0e75c124a544a1cbfaa9782f41fe24af8a68a9cfd1c751ae8da30d9ef16bea516bc4e390ab2084bd710d5068ff1f89b76105eb + debug: ^4.4.0 + checksum: ba1c9c5340efa9e9d7b5488d8aa9395926e47384cac20ff9032011707b48b9564a838dc53b0c4edb364c7db1b813abb75202542e5f4776dfd3bd5a286e0e7f82 languageName: node linkType: hard -"axe-core@npm:=4.7.0": - version: 4.7.0 - resolution: "axe-core@npm:4.7.0" - checksum: f086bcab42be1761ba2b0b127dec350087f4c3a853bba8dd58f69d898cefaac31a1561da23146f6f3c07954c76171d1f2ce460e555e052d2b02cd79af628fa4a +"axe-core@npm:^4.10.0": + version: 4.10.3 + resolution: "axe-core@npm:4.10.3" + checksum: e89fa5bcad9216f2de29bbdf95d6211d8c5b1025cbdcf56b6695c18b2e9a1eebd0b997a0141334169f6f062fc68fd39a5b97f86348d9f5be05958eade5c1ec78 languageName: node linkType: hard -"axios@npm:^1.2.3": - version: 1.7.2 - resolution: "axios@npm:1.7.2" +"axios@npm:^1.2.3, axios@npm:^1.6.2": + version: 1.10.0 + resolution: "axios@npm:1.10.0" dependencies: follow-redirects: ^1.15.6 form-data: ^4.0.0 proxy-from-env: ^1.1.0 - checksum: e457e2b0ab748504621f6fa6609074ac08c824bf0881592209dfa15098ece7e88495300e02cd22ba50b3468fd712fe687e629dcb03d6a3f6a51989727405aedf + checksum: b5fd840d499469bf968e44b8ac96f4b363c6aa4c791a50834c086a7cffbc2d77fe24f27af1aba46c3e1f4840aaf991461fc27537990596b93dea0f4df3245a86 languageName: node linkType: hard -"axios@npm:^1.6.2": - version: 1.6.2 - resolution: "axios@npm:1.6.2" - dependencies: - follow-redirects: ^1.15.0 - form-data: ^4.0.0 - proxy-from-env: ^1.1.0 - checksum: 4a7429e2b784be0f2902ca2680964391eae7236faa3967715f30ea45464b98ae3f1c6f631303b13dfe721b17126b01f486c7644b9ef276bfc63112db9fd379f8 - languageName: node - linkType: hard - -"axobject-query@npm:^3.2.1": - version: 3.2.1 - resolution: "axobject-query@npm:3.2.1" - dependencies: - dequal: ^2.0.3 - checksum: a94047e702b57c91680e6a952ec4a1aaa2cfd0d80ead76bc8c954202980d8c51968a6ea18b4d8010e8e2cf95676533d8022a8ebba9abc1dfe25686721df26fd2 +"axobject-query@npm:^4.1.0": + version: 4.1.0 + resolution: "axobject-query@npm:4.1.0" + checksum: 7d1e87bf0aa7ae7a76cd39ab627b7c48fda3dc40181303d9adce4ba1d5b5ce73b5e5403ee6626ec8e91090448c887294d6144e24b6741a976f5be9347e3ae1df languageName: node linkType: hard @@ -3837,9 +3711,9 @@ __metadata: linkType: hard "binary-extensions@npm:^2.0.0": - version: 2.2.0 - resolution: "binary-extensions@npm:2.2.0" - checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 + version: 2.3.0 + resolution: "binary-extensions@npm:2.3.0" + checksum: bcad01494e8a9283abf18c1b967af65ee79b0c6a9e6fcfafebfe91dbe6e0fc7272bafb73389e198b310516ae04f7ad17d79aacf6cb4c0d5d5202a7e2e52c7d98 languageName: node linkType: hard @@ -3853,34 +3727,25 @@ __metadata: linkType: hard "brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" + version: 1.1.12 + resolution: "brace-expansion@npm:1.1.12" dependencies: balanced-match: ^1.0.0 concat-map: 0.0.1 - checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + checksum: 12cb6d6310629e3048cadb003e1aca4d8c9bb5c67c3c321bafdd7e7a50155de081f78ea3e0ed92ecc75a9015e784f301efc8132383132f4f7904ad1ac529c562 languageName: node linkType: hard "brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" + version: 2.0.2 + resolution: "brace-expansion@npm:2.0.2" dependencies: balanced-match: ^1.0.0 - checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + checksum: 01dff195e3646bc4b0d27b63d9bab84d2ebc06121ff5013ad6e5356daa5a9d6b60fa26cf73c74797f2dc3fbec112af13578d51f75228c1112b26c790a87b0488 languageName: node linkType: hard -"braces@npm:^3.0.2, braces@npm:~3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" - dependencies: - fill-range: ^7.0.1 - checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 - languageName: node - linkType: hard - -"braces@npm:^3.0.3": +"braces@npm:^3.0.3, braces@npm:~3.0.2": version: 3.0.3 resolution: "braces@npm:3.0.3" dependencies: @@ -3890,16 +3755,16 @@ __metadata: linkType: hard "browserslist@npm:^4.23.3": - version: 4.23.3 - resolution: "browserslist@npm:4.23.3" + version: 4.25.0 + resolution: "browserslist@npm:4.25.0" dependencies: - caniuse-lite: ^1.0.30001646 - electron-to-chromium: ^1.5.4 - node-releases: ^2.0.18 - update-browserslist-db: ^1.1.0 + caniuse-lite: ^1.0.30001718 + electron-to-chromium: ^1.5.160 + node-releases: ^2.0.19 + update-browserslist-db: ^1.1.3 bin: browserslist: cli.js - checksum: 7906064f9970aeb941310b2fcb8b4ace4a1b50aa657c986677c6f1553a8cabcc94ee9c5922f715baffbedaa0e6cf0831b6fed7b059dde6873a4bfadcbe069c7e + checksum: 0d34fa0c6e23e962598ba68ee9f4566a4b575ec550ff7e9e7287c5e94a6e0f208f75f4f7d578ccd060f843167e0e495bde8f6d278f353f0da783cd50f758e5c7 languageName: node linkType: hard @@ -3990,24 +3855,35 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0": +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": version: 1.0.2 - resolution: "call-bind@npm:1.0.2" + resolution: "call-bind-apply-helpers@npm:1.0.2" dependencies: - function-bind: ^1.1.1 - get-intrinsic: ^1.0.2 - checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + checksum: b2863d74fcf2a6948221f65d95b91b4b2d90cfe8927650b506141e669f7d5de65cea191bf788838bc40d13846b7886c5bc5c84ab96c3adbcf88ad69a72fcdc6b languageName: node linkType: hard -"call-bind@npm:^1.0.2, call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": - version: 1.0.5 - resolution: "call-bind@npm:1.0.5" +"call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": + version: 1.0.8 + resolution: "call-bind@npm:1.0.8" dependencies: - function-bind: ^1.1.2 - get-intrinsic: ^1.2.1 - set-function-length: ^1.1.1 - checksum: 449e83ecbd4ba48e7eaac5af26fea3b50f8f6072202c2dd7c5a6e7a6308f2421abe5e13a3bbd55221087f76320c5e09f25a8fdad1bab2b77c68ae74d92234ea5 + call-bind-apply-helpers: ^1.0.0 + es-define-property: ^1.0.0 + get-intrinsic: ^1.2.4 + set-function-length: ^1.2.2 + checksum: aa2899bce917a5392fd73bd32e71799c37c0b7ab454e0ed13af7f6727549091182aade8bbb7b55f304a5bc436d543241c14090fb8a3137e9875e23f444f4f5a9 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" + dependencies: + call-bind-apply-helpers: ^1.0.2 + get-intrinsic: ^1.3.0 + checksum: 2f6399488d1c272f56306ca60ff696575e2b7f31daf23bc11574798c84d9f2759dceb0cb1f471a85b77f28962a7ac6411f51d283ea2e45319009a19b6ccab3b2 languageName: node linkType: hard @@ -4032,30 +3908,31 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001646": - version: 1.0.30001655 - resolution: "caniuse-lite@npm:1.0.30001655" - checksum: 3739c8f6d0fb55cff3c631d28c4fdafc81ab28756ce17a373428042c06f84a5877288d89fbe41be5ac494dd5092dca38ab91c9304e81935b9f2938419d2c23b3 +"caniuse-lite@npm:^1.0.30001579, caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001718": + version: 1.0.30001723 + resolution: "caniuse-lite@npm:1.0.30001723" + checksum: 0acd7f33f15cfc6cf81a5155bb288afb34ce63cddd90bbf1740243b3c6c1de813ad10b393650f1c15e47f13ff4da61a8d14b02fac8e47e7367aede3ef162a1c6 + languageName: node + linkType: hard + +"ccount@npm:^2.0.0": + version: 2.0.1 + resolution: "ccount@npm:2.0.1" + checksum: 48193dada54c9e260e0acf57fc16171a225305548f9ad20d5471e0f7a8c026aedd8747091dccb0d900cde7df4e4ddbd235df0d8de4a64c71b12f0d3303eeafd4 languageName: node linkType: hard "chakra-react-select@npm:^4.9.1": - version: 4.9.1 - resolution: "chakra-react-select@npm:4.9.1" + version: 4.10.1 + resolution: "chakra-react-select@npm:4.10.1" dependencies: - react-select: 5.8.0 + react-select: 5.8.x peerDependencies: - "@chakra-ui/form-control": ^2.0.0 - "@chakra-ui/icon": ^3.0.0 - "@chakra-ui/layout": ^2.0.0 - "@chakra-ui/media-query": ^3.0.0 - "@chakra-ui/menu": ^2.0.0 - "@chakra-ui/spinner": ^2.0.0 - "@chakra-ui/system": ^2.0.0 + "@chakra-ui/react": 2.x "@emotion/react": ^11.8.1 react: ^18.0.0 react-dom: ^18.0.0 - checksum: c509af255234ef92c0b4fbcfa215d6409b6c871a97bf359d773c01d63934769b4b2013a5afa4af15f63e5653bf4492bac58b67e75bf97881266abc11c32675ee + checksum: fac5b0120391f72da643b87457270fa2abaa6011a4ef2d7776f54bbacfe7e7453e42cd726f4dd164803070e5dea0547fc4eb938ce79c8261849d67e677d4b52e languageName: node linkType: hard @@ -4069,17 +3946,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: ^3.2.1 - escape-string-regexp: ^1.0.5 - supports-color: ^5.3.0 - checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 - languageName: node - linkType: hard - "chalk@npm:^4.0.0": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -4090,6 +3956,20 @@ __metadata: languageName: node linkType: hard +"character-entities-html4@npm:^2.0.0": + version: 2.1.0 + resolution: "character-entities-html4@npm:2.1.0" + checksum: 7034aa7c7fa90309667f6dd50499c8a760c3d3a6fb159adb4e0bada0107d194551cdbad0714302f62d06ce4ed68565c8c2e15fdef2e8f8764eb63fa92b34b11d + languageName: node + linkType: hard + +"character-entities-legacy@npm:^3.0.0": + version: 3.0.0 + resolution: "character-entities-legacy@npm:3.0.0" + checksum: 7582af055cb488b626d364b7d7a4e46b06abd526fb63c0e4eb35bcb9c9799cc4f76b39f34fdccef2d1174ac95e53e9ab355aae83227c1a2505877893fce77731 + languageName: node + linkType: hard + "character-entities@npm:^2.0.0": version: 2.0.2 resolution: "character-entities@npm:2.0.2" @@ -4097,6 +3977,13 @@ __metadata: languageName: node linkType: hard +"character-reference-invalid@npm:^2.0.0": + version: 2.0.1 + resolution: "character-reference-invalid@npm:2.0.1" + checksum: 98d3b1a52ae510b7329e6ee7f6210df14f1e318c5415975d4c9e7ee0ef4c07875d47c6e74230c64551f12f556b4a8ccc24d9f3691a2aa197019e72a95e9297ee + languageName: node + linkType: hard + "check-ip@npm:^1.1.1": version: 1.1.1 resolution: "check-ip@npm:1.1.1" @@ -4125,25 +4012,6 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.5.3": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" - dependencies: - anymatch: ~3.1.2 - braces: ~3.0.2 - fsevents: ~2.3.2 - glob-parent: ~5.1.2 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.6.0 - dependenciesMeta: - fsevents: - optional: true - checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c - languageName: node - linkType: hard - "chokidar@npm:^3.6.0": version: 3.6.0 resolution: "chokidar@npm:3.6.0" @@ -4163,6 +4031,15 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^4.0.0": + version: 4.0.3 + resolution: "chokidar@npm:4.0.3" + dependencies: + readdirp: ^4.0.1 + checksum: a8765e452bbafd04f3f2fad79f04222dd65f43161488bb6014a41099e6ca18d166af613d59a90771908c1c823efa3f46ba36b86ac50b701c20c1b9908c5fe36e + languageName: node + linkType: hard + "chownr@npm:^1.1.4": version: 1.1.4 resolution: "chownr@npm:1.1.4" @@ -4185,9 +4062,9 @@ __metadata: linkType: hard "ci-info@npm:^3.2.0": - version: 3.8.0 - resolution: "ci-info@npm:3.8.0" - checksum: d0a4d3160497cae54294974a7246202244fff031b0a6ea20dd57b10ec510aa17399c41a1b0982142c105f3255aff2173e5c0dd7302ee1b2f28ba3debda375098 + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 6b19dc9b2966d1f8c2041a838217299718f15d6c4b63ae36e4674edd2bee48f780e94761286a56aa59eb305a85fbea4ddffb7630ec063e7ec7e7e5ad42549a87 languageName: node linkType: hard @@ -4208,9 +4085,9 @@ __metadata: linkType: hard "classnames@npm:^2.2.3": - version: 2.3.2 - resolution: "classnames@npm:2.3.2" - checksum: 2c62199789618d95545c872787137262e741f9db13328e216b093eea91c85ef2bfb152c1f9e63027204e2559a006a92eb74147d46c800a9f96297ae1d9f96f4e + version: 2.5.1 + resolution: "classnames@npm:2.5.1" + checksum: da424a8a6f3a96a2e87d01a432ba19315503294ac7e025f9fece656db6b6a0f7b5003bb1fbb51cbb0d9624d964f1b9bb35a51c73af9b2434c7b292c42231c1e5 languageName: node linkType: hard @@ -4242,15 +4119,6 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: 1.1.3 - checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 - languageName: node - linkType: hard - "color-convert@npm:^2.0.1": version: 2.0.1 resolution: "color-convert@npm:2.0.1" @@ -4260,13 +4128,6 @@ __metadata: languageName: node linkType: hard -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d - languageName: node - linkType: hard - "color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" @@ -4328,16 +4189,9 @@ __metadata: linkType: hard "component-emitter@npm:^1.3.0": - version: 1.3.0 - resolution: "component-emitter@npm:1.3.0" - checksum: b3c46de38ffd35c57d1c02488355be9f218e582aec72d72d1b8bbec95a3ac1b38c96cd6e03ff015577e68f550fbb361a3bfdbd9bb248be9390b7b3745691be6b - languageName: node - linkType: hard - -"compute-scroll-into-view@npm:3.0.3": - version: 3.0.3 - resolution: "compute-scroll-into-view@npm:3.0.3" - checksum: 7143869648d4de8ff2cb60eb8e96a21b47948c3210d15d1bfaa7e88de722c7f83f06676b97ebff94831dde0c03e42458ecfbde466747945187ee5c7667c68395 + version: 1.3.1 + resolution: "component-emitter@npm:1.3.1" + checksum: 94550aa462c7bd5a61c1bc480e28554aa306066930152d1b1844a0dd3845d4e5db7e261ddec62ae184913b3e59b55a2ad84093b9d3596a8f17c341514d6c483d languageName: node linkType: hard @@ -4348,17 +4202,17 @@ __metadata: languageName: node linkType: hard -"confbox@npm:^0.1.7": - version: 0.1.7 - resolution: "confbox@npm:0.1.7" - checksum: bde836c26f5154a348b0c0a757f8a0138929e5737e0553be3c4f07a056abca618b861aa63ac3b22d344789b56be99a1382928933e08cd500df00213bf4d8fb43 +"confbox@npm:^0.1.7, confbox@npm:^0.1.8": + version: 0.1.8 + resolution: "confbox@npm:0.1.8" + checksum: 5c7718ab22cf9e35a31c21ef124156076ae8c9dc65e6463d54961caf5a1d529284485a0fdf83fd23b27329f3b75b0c8c07d2e36c699f5151a2efe903343f976a languageName: node linkType: hard -"consola@npm:^3.2.3": - version: 3.2.3 - resolution: "consola@npm:3.2.3" - checksum: 32ec70e177dd2385c42e38078958cc7397be91db21af90c6f9faa0b16168b49b1c61d689338604bbb2d64370b9347a35f42a9197663a913d3a405bb0ce728499 +"consola@npm:^3.2.3, consola@npm:^3.4.0": + version: 3.4.2 + resolution: "consola@npm:3.4.2" + checksum: 32d1339e0505842f033ca34cb4572a841281caa367f438b785d3b284ab2a06134f009e605908480402c5f57f56c1e3210090c37e6417923416f76ce730d39361 languageName: node linkType: hard @@ -4390,10 +4244,10 @@ __metadata: languageName: node linkType: hard -"cookie@npm:^0.5.0": - version: 0.5.0 - resolution: "cookie@npm:0.5.0" - checksum: 1f4bd2ca5765f8c9689a7e8954183f5332139eb72b6ff783d8947032ec1fdf43109852c178e21a953a30c0dd42257828185be01b49d1eb1a67fd054ca588a180 +"cookie@npm:^0.7.0": + version: 0.7.2 + resolution: "cookie@npm:0.7.2" + checksum: 9bf8555e33530affd571ea37b615ccad9b9a34febbf2c950c86787088eb00a8973690833b0f8ebd6b69b753c62669ea60cec89178c1fb007bf0749abed74f93e languageName: node linkType: hard @@ -4433,21 +4287,14 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" dependencies: path-key: ^3.1.0 shebang-command: ^2.0.0 which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - -"crypto-js@npm:^4.2.0": - version: 4.2.0 - resolution: "crypto-js@npm:4.2.0" - checksum: f051666dbc077c8324777f44fbd3aaea2986f198fe85092535130d17026c7c2ccf2d23ee5b29b36f7a4a07312db2fae23c9094b644cc35f7858b1b4fcaf27774 + checksum: 8d306efacaf6f3f60e0224c287664093fa9185680b2d195852ba9a863f85d02dcc737094c6e512175f8ee0161f9b87c73c6826034c2422e39de7d6569cf4503b languageName: node linkType: hard @@ -4469,14 +4316,7 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.2": - version: 3.1.2 - resolution: "csstype@npm:3.1.2" - checksum: e1a52e6c25c1314d6beef5168da704ab29c5186b877c07d822bd0806717d9a265e8493a2e35ca7e68d0f5d472d43fac1cdce70fd79fd0853dff81f3028d857b5 - languageName: node - linkType: hard - -"csstype@npm:^3.1.2": +"csstype@npm:^3.0.2, csstype@npm:^3.1.2": version: 3.1.3 resolution: "csstype@npm:3.1.3" checksum: 8db785cc92d259102725b3c694ec0c823f5619a84741b5c7991b8ad135dfaa66093038a1cc63e03361a6cd28d122be48f2106ae72334e067dd619a51f49eddf7 @@ -4490,15 +4330,48 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.3.2, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" +"data-view-buffer@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-buffer@npm:1.0.2" dependencies: - ms: 2.1.2 + call-bound: ^1.0.3 + es-errors: ^1.3.0 + is-data-view: ^1.0.2 + checksum: 1e1cd509c3037ac0f8ba320da3d1f8bf1a9f09b0be09394b5e40781b8cc15ff9834967ba7c9f843a425b34f9fe14ce44cf055af6662c44263424c1eb8d65659b + languageName: node + linkType: hard + +"data-view-byte-length@npm:^1.0.2": + version: 1.0.2 + resolution: "data-view-byte-length@npm:1.0.2" + dependencies: + call-bound: ^1.0.3 + es-errors: ^1.3.0 + is-data-view: ^1.0.2 + checksum: 3600c91ced1cfa935f19ef2abae11029e01738de8d229354d3b2a172bf0d7e4ed08ff8f53294b715569fdf72dfeaa96aa7652f479c0f60570878d88e7e8bddf6 + languageName: node + linkType: hard + +"data-view-byte-offset@npm:^1.0.1": + version: 1.0.1 + resolution: "data-view-byte-offset@npm:1.0.1" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + is-data-view: ^1.0.1 + checksum: 8dd492cd51d19970876626b5b5169fbb67ca31ec1d1d3238ee6a71820ca8b80cafb141c485999db1ee1ef02f2cc3b99424c5eda8d59e852d9ebb79ab290eb5ee + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.7, debug@npm:^4.4.0": + version: 4.4.1 + resolution: "debug@npm:4.4.1" + dependencies: + ms: ^2.1.3 peerDependenciesMeta: supports-color: optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + checksum: a43826a01cda685ee4cec00fb2d3322eaa90ccadbef60d9287debc2a886be3e835d9199c80070ede75a409ee57828c4c6cd80e4b154f2843f0dc95a570dc0729 languageName: node linkType: hard @@ -4520,36 +4393,24 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.3.1": - version: 4.3.6 - resolution: "debug@npm:4.3.6" +"debug@npm:~4.3.1, debug@npm:~4.3.2": + version: 4.3.7 + resolution: "debug@npm:4.3.7" dependencies: - ms: 2.1.2 + ms: ^2.1.3 peerDependenciesMeta: supports-color: optional: true - checksum: 1630b748dea3c581295e02137a9f5cbe2c1d85fea35c1e6597a65ca2b16a6fce68cec61b299d480787ef310ba927dc8c92d3061faba0ad06c6a724672f66be7f - languageName: node - linkType: hard - -"debug@npm:^4.3.5, debug@npm:~4.3.1, debug@npm:~4.3.2": - version: 4.3.5 - resolution: "debug@npm:4.3.5" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 7c002b51e256257f936dda09eb37167df952758c57badf6bf44bdc40b89a4bcb8e5a0a2e4c7b53f97c69e2970dd5272d33a757378a12c8f8e64ea7bf99e8e86e + checksum: 822d74e209cd910ef0802d261b150314bbcf36c582ccdbb3e70f0894823c17e49a50d3e66d96b633524263975ca16b6a833f3e3b7e030c157169a5fabac63160 languageName: node linkType: hard "decode-named-character-reference@npm:^1.0.0": - version: 1.0.2 - resolution: "decode-named-character-reference@npm:1.0.2" + version: 1.2.0 + resolution: "decode-named-character-reference@npm:1.2.0" dependencies: character-entities: ^2.0.0 - checksum: f4c71d3b93105f20076052f9cb1523a22a9c796b8296cd35eef1ca54239c78d182c136a848b83ff8da2071e3ae2b1d300bf29d00650a6d6e675438cc31b11d78 + checksum: f26b23046c1a137c0b41fa51e3ce07ba8364640322c742a31570999784abc8572fc24cb108a76b14ff72ddb75d35aad3d14b10d7743639112145a2664b9d1864 languageName: node linkType: hard @@ -4560,18 +4421,18 @@ __metadata: languageName: node linkType: hard -"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.1": - version: 1.1.1 - resolution: "define-data-property@npm:1.1.1" +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" dependencies: - get-intrinsic: ^1.2.1 + es-define-property: ^1.0.0 + es-errors: ^1.3.0 gopd: ^1.0.1 - has-property-descriptors: ^1.0.0 - checksum: a29855ad3f0630ea82e3c5012c812efa6ca3078d5c2aa8df06b5f597c1cde6f7254692df41945851d903e05a1668607b6d34e778f402b9ff9ffb38111f1a3f0d + checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" dependencies: @@ -4617,7 +4478,7 @@ __metadata: languageName: node linkType: hard -"dequal@npm:^2.0.0, dequal@npm:^2.0.3": +"dequal@npm:^2.0.0": version: 2.0.3 resolution: "dequal@npm:2.0.3" checksum: 8679b850e1a3d0ebbc46ee780d5df7b478c23f335887464023a631d1b9af051ad4a6595a44220f9ff8ff95a8ddccf019b5ad778a976fd7bbf77383d36f412f90 @@ -4625,16 +4486,32 @@ __metadata: linkType: hard "destr@npm:^2.0.3": - version: 2.0.3 - resolution: "destr@npm:2.0.3" - checksum: 4521b145ba6118919a561f7d979d623793695a516d1b9df704de81932601bf9cf21c47278e1cb93a309c88a14f4fd1f18680bb49ebef8b2546cc7f415e7ae48e + version: 2.0.5 + resolution: "destr@npm:2.0.5" + checksum: e6d5b9e922f528527cd98035249b4d34077828debd2be448a33e268ac1f803bd9a53e7cf0f5184ef68a67573b7f0a6033a89913f61eadaf0e180de49b148606e + languageName: node + linkType: hard + +"detect-europe-js@npm:^0.1.2": + version: 0.1.2 + resolution: "detect-europe-js@npm:0.1.2" + checksum: 5a69602302955f50d36dc880ccecb481f24976f2f242aa0b359b5a6477b7e5085bb9bc7bdefdbf3a5bb9fbc3a8e892adda23dc65b9304edac49807caf75446e3 + languageName: node + linkType: hard + +"detect-libc@npm:^1.0.3": + version: 1.0.3 + resolution: "detect-libc@npm:1.0.3" + bin: + detect-libc: ./bin/detect-libc.js + checksum: daaaed925ffa7889bd91d56e9624e6c8033911bb60f3a50a74a87500680652969dbaab9526d1e200a4c94acf80fc862a22131841145a0a8482d60a99c24f4a3e languageName: node linkType: hard "detect-libc@npm:^2.0.0": - version: 2.0.3 - resolution: "detect-libc@npm:2.0.3" - checksum: 2ba6a939ae55f189aea996ac67afceb650413c7a34726ee92c40fb0deb2400d57ef94631a8a3f052055eea7efb0f99a9b5e6ce923415daa3e68221f963cfc27d + version: 2.0.4 + resolution: "detect-libc@npm:2.0.4" + checksum: 3d186b7d4e16965e10e21db596c78a4e131f9eee69c0081d13b85e6a61d7448d3ba23fe7997648022bdfa3b0eb4cc3c289a44c8188df949445a20852689abef6 languageName: node linkType: hard @@ -4645,7 +4522,7 @@ __metadata: languageName: node linkType: hard -"devlop@npm:^1.0.0": +"devlop@npm:^1.0.0, devlop@npm:^1.1.0": version: 1.1.0 resolution: "devlop@npm:1.1.0" dependencies: @@ -4678,15 +4555,6 @@ __metadata: languageName: node linkType: hard -"dir-glob@npm:^3.0.1": - version: 3.0.1 - resolution: "dir-glob@npm:3.0.1" - dependencies: - path-type: ^4.0.0 - checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 - languageName: node - linkType: hard - "dlv@npm:^1.1.3": version: 1.1.3 resolution: "dlv@npm:1.1.3" @@ -4745,9 +4613,20 @@ __metadata: linkType: hard "dotenv@npm:^16.4.5": - version: 16.4.5 - resolution: "dotenv@npm:16.4.5" - checksum: 301a12c3d44fd49888b74eb9ccf9f07a1f5df43f489e7fcb89647a2edcd84c42d6bc349dc8df099cd18f07c35c7b04685c1a4f3e6a6a9e6b30f8d48c15b7f49c + version: 16.5.0 + resolution: "dotenv@npm:16.5.0" + checksum: 6543fe87b5ddf2d60dd42df6616eec99148a5fc150cb4530fef5bda655db5204a3afa0e6f25f7cd64b20657ace4d79c0ef974bec32fdb462cad18754191e7a90 + languageName: node + linkType: hard + +"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: ^1.0.1 + es-errors: ^1.3.0 + gopd: ^1.2.0 + checksum: 149207e36f07bd4941921b0ca929e3a28f1da7bd6b6ff8ff7f4e2f2e460675af4576eeba359c635723dc189b64cdd4787e0255897d5b135ccc5d15cb8685fc90 languageName: node linkType: hard @@ -4777,10 +4656,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.4": - version: 1.5.13 - resolution: "electron-to-chromium@npm:1.5.13" - checksum: f18ac84dd3bf9a200654a6a9292b9ec4bced0cf9bd26cec9941b775f4470c581c9d043e70b37a124d9752dcc0f47fc96613d52b2defd8e59632852730cb418b9 +"electron-to-chromium@npm:^1.5.160": + version: 1.5.169 + resolution: "electron-to-chromium@npm:1.5.169" + checksum: 299a0dc36ce00460aafb5cbc4029b70c12c6842d3c81c5bf0ec070f8fda80bea54b545a8ddebfdead8969127aa04c93d440f8255db2a4723ef2e275d1cf89016 languageName: node linkType: hard @@ -4808,11 +4687,11 @@ __metadata: linkType: hard "end-of-stream@npm:^1.1.0": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" + version: 1.4.5 + resolution: "end-of-stream@npm:1.4.5" dependencies: once: ^1.4.0 - checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b + checksum: 1e0cfa6e7f49887544e03314f9dfc56a8cb6dde910cbb445983ecc2ff426fc05946df9d75d8a21a3a64f2cecfe1bf88f773952029f46756b2ed64a24e95b1fb8 languageName: node linkType: hard @@ -4845,16 +4724,6 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.12.0": - version: 5.15.0 - resolution: "enhanced-resolve@npm:5.15.0" - dependencies: - graceful-fs: ^4.2.4 - tapable: ^2.2.0 - checksum: fbd8cdc9263be71cc737aa8a7d6c57b43d6aa38f6cc75dde6fcd3598a130cc465f979d2f4d01bb3bf475acb43817749c79f8eef9be048683602ca91ab52e4f11 - languageName: node - linkType: hard - "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -4885,72 +4754,103 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.22.1": - version: 1.22.3 - resolution: "es-abstract@npm:1.22.3" +"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9, es-abstract@npm:^1.24.0": + version: 1.24.0 + resolution: "es-abstract@npm:1.24.0" dependencies: - array-buffer-byte-length: ^1.0.0 - arraybuffer.prototype.slice: ^1.0.2 - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.5 - es-set-tostringtag: ^2.0.1 - es-to-primitive: ^1.2.1 - function.prototype.name: ^1.1.6 - get-intrinsic: ^1.2.2 - get-symbol-description: ^1.0.0 - globalthis: ^1.0.3 - gopd: ^1.0.1 - has-property-descriptors: ^1.0.0 - has-proto: ^1.0.1 - has-symbols: ^1.0.3 - hasown: ^2.0.0 - internal-slot: ^1.0.5 - is-array-buffer: ^3.0.2 + array-buffer-byte-length: ^1.0.2 + arraybuffer.prototype.slice: ^1.0.4 + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.4 + data-view-buffer: ^1.0.2 + data-view-byte-length: ^1.0.2 + data-view-byte-offset: ^1.0.1 + es-define-property: ^1.0.1 + es-errors: ^1.3.0 + es-object-atoms: ^1.1.1 + es-set-tostringtag: ^2.1.0 + es-to-primitive: ^1.3.0 + function.prototype.name: ^1.1.8 + get-intrinsic: ^1.3.0 + get-proto: ^1.0.1 + get-symbol-description: ^1.1.0 + globalthis: ^1.0.4 + gopd: ^1.2.0 + has-property-descriptors: ^1.0.2 + has-proto: ^1.2.0 + has-symbols: ^1.1.0 + hasown: ^2.0.2 + internal-slot: ^1.1.0 + is-array-buffer: ^3.0.5 is-callable: ^1.2.7 - is-negative-zero: ^2.0.2 - is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.2 - is-string: ^1.0.7 - is-typed-array: ^1.1.12 - is-weakref: ^1.0.2 - object-inspect: ^1.13.1 + is-data-view: ^1.0.2 + is-negative-zero: ^2.0.3 + is-regex: ^1.2.1 + is-set: ^2.0.3 + is-shared-array-buffer: ^1.0.4 + is-string: ^1.1.1 + is-typed-array: ^1.1.15 + is-weakref: ^1.1.1 + math-intrinsics: ^1.1.0 + object-inspect: ^1.13.4 object-keys: ^1.1.1 - object.assign: ^4.1.4 - regexp.prototype.flags: ^1.5.1 - safe-array-concat: ^1.0.1 - safe-regex-test: ^1.0.0 - string.prototype.trim: ^1.2.8 - string.prototype.trimend: ^1.0.7 - string.prototype.trimstart: ^1.0.7 - typed-array-buffer: ^1.0.0 - typed-array-byte-length: ^1.0.0 - typed-array-byte-offset: ^1.0.0 - typed-array-length: ^1.0.4 - unbox-primitive: ^1.0.2 - which-typed-array: ^1.1.13 - checksum: b1bdc962856836f6e72be10b58dc128282bdf33771c7a38ae90419d920fc3b36cc5d2b70a222ad8016e3fc322c367bf4e9e89fc2bc79b7e933c05b218e83d79a + object.assign: ^4.1.7 + own-keys: ^1.0.1 + regexp.prototype.flags: ^1.5.4 + safe-array-concat: ^1.1.3 + safe-push-apply: ^1.0.0 + safe-regex-test: ^1.1.0 + set-proto: ^1.0.0 + stop-iteration-iterator: ^1.1.0 + string.prototype.trim: ^1.2.10 + string.prototype.trimend: ^1.0.9 + string.prototype.trimstart: ^1.0.8 + typed-array-buffer: ^1.0.3 + typed-array-byte-length: ^1.0.3 + typed-array-byte-offset: ^1.0.4 + typed-array-length: ^1.0.7 + unbox-primitive: ^1.1.0 + which-typed-array: ^1.1.19 + checksum: 06b3d605e56e3da9d16d4db2629a42dac1ca31f2961a41d15c860422a266115e865b43e82d6b9da81a0fabbbb65ebc12fb68b0b755bc9dbddacb6bf7450e96df languageName: node linkType: hard -"es-iterator-helpers@npm:^1.0.12, es-iterator-helpers@npm:^1.0.15": - version: 1.0.15 - resolution: "es-iterator-helpers@npm:1.0.15" +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 0512f4e5d564021c9e3a644437b0155af2679d10d80f21adaf868e64d30efdfbd321631956f20f42d655fedb2e3a027da479fad3fa6048f768eb453a80a5f80a + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 + languageName: node + linkType: hard + +"es-iterator-helpers@npm:^1.2.1": + version: 1.2.1 + resolution: "es-iterator-helpers@npm:1.2.1" dependencies: - asynciterator.prototype: ^1.0.0 - call-bind: ^1.0.2 + call-bind: ^1.0.8 + call-bound: ^1.0.3 define-properties: ^1.2.1 - es-abstract: ^1.22.1 - es-set-tostringtag: ^2.0.1 - function-bind: ^1.1.1 - get-intrinsic: ^1.2.1 - globalthis: ^1.0.3 - has-property-descriptors: ^1.0.0 - has-proto: ^1.0.1 - has-symbols: ^1.0.3 - internal-slot: ^1.0.5 - iterator.prototype: ^1.1.2 - safe-array-concat: ^1.0.1 - checksum: 50081ae5c549efe62e5c1d244df0194b40b075f7897fc2116b7e1aa437eb3c41f946d2afda18c33f9b31266ec544765932542765af839f76fa6d7b7855d1e0e1 + es-abstract: ^1.23.6 + es-errors: ^1.3.0 + es-set-tostringtag: ^2.0.3 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.6 + globalthis: ^1.0.4 + gopd: ^1.2.0 + has-property-descriptors: ^1.0.2 + has-proto: ^1.2.0 + has-symbols: ^1.1.0 + internal-slot: ^1.1.0 + iterator.prototype: ^1.1.4 + safe-array-concat: ^1.1.3 + checksum: 952808dd1df3643d67ec7adf20c30b36e5eecadfbf36354e6f39ed3266c8e0acf3446ce9bc465e38723d613cb1d915c1c07c140df65bdce85da012a6e7bda62b languageName: node linkType: hard @@ -4961,34 +4861,44 @@ __metadata: languageName: node linkType: hard -"es-set-tostringtag@npm:^2.0.1": - version: 2.0.2 - resolution: "es-set-tostringtag@npm:2.0.2" +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" dependencies: - get-intrinsic: ^1.2.2 - has-tostringtag: ^1.0.0 - hasown: ^2.0.0 - checksum: afcec3a4c9890ae14d7ec606204858441c801ff84f312538e1d1ccf1e5493c8b17bd672235df785f803756472cb4f2d49b87bde5237aef33411e74c22f194e07 + es-errors: ^1.3.0 + checksum: 214d3767287b12f36d3d7267ef342bbbe1e89f899cfd67040309fc65032372a8e60201410a99a1645f2f90c1912c8c49c8668066f6bdd954bcd614dda2e3da97 languageName: node linkType: hard -"es-shim-unscopables@npm:^1.0.0": - version: 1.0.2 - resolution: "es-shim-unscopables@npm:1.0.2" +"es-set-tostringtag@npm:^2.0.3, es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" dependencies: - hasown: ^2.0.0 - checksum: 432bd527c62065da09ed1d37a3f8e623c423683285e6188108286f4a1e8e164a5bcbfbc0051557c7d14633cd2a41ce24c7048e6bbb66a985413fd32f1be72626 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 + has-tostringtag: ^1.0.2 + hasown: ^2.0.2 + checksum: 789f35de4be3dc8d11fdcb91bc26af4ae3e6d602caa93299a8c45cf05d36cc5081454ae2a6d3afa09cceca214b76c046e4f8151e092e6fc7feeb5efb9e794fc6 languageName: node linkType: hard -"es-to-primitive@npm:^1.2.1": - version: 1.2.1 - resolution: "es-to-primitive@npm:1.2.1" +"es-shim-unscopables@npm:^1.0.2, es-shim-unscopables@npm:^1.1.0": + version: 1.1.0 + resolution: "es-shim-unscopables@npm:1.1.0" dependencies: - is-callable: ^1.1.4 - is-date-object: ^1.0.1 - is-symbol: ^1.0.2 - checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed + hasown: ^2.0.2 + checksum: 33cfb1ebcb2f869f0bf528be1a8660b4fe8b6cec8fc641f330e508db2284b58ee2980fad6d0828882d22858c759c0806076427a3673b6daa60f753e3b558ee15 + languageName: node + linkType: hard + +"es-to-primitive@npm:^1.3.0": + version: 1.3.0 + resolution: "es-to-primitive@npm:1.3.0" + dependencies: + is-callable: ^1.2.7 + is-date-object: ^1.0.5 + is-symbol: ^1.0.4 + checksum: 966965880356486cd4d1fe9a523deda2084c81b3702d951212c098f5f2ee93605d1b7c1840062efb48a07d892641c7ed1bc194db563645c0dd2b919cb6d65b93 languageName: node linkType: hard @@ -5203,20 +5113,13 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.1.2": +"escalade@npm:^3.2.0": version: 3.2.0 resolution: "escalade@npm:3.2.0" checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e languageName: node linkType: hard -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 - languageName: node - linkType: hard - "escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" @@ -5225,12 +5128,13 @@ __metadata: linkType: hard "eslint-config-next@npm:^14.2.7": - version: 14.2.7 - resolution: "eslint-config-next@npm:14.2.7" + version: 14.2.30 + resolution: "eslint-config-next@npm:14.2.30" dependencies: - "@next/eslint-plugin-next": 14.2.7 + "@next/eslint-plugin-next": 14.2.30 "@rushstack/eslint-patch": ^1.3.3 - "@typescript-eslint/parser": ^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0 + "@typescript-eslint/eslint-plugin": ^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0 + "@typescript-eslint/parser": ^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0 eslint-import-resolver-node: ^0.3.6 eslint-import-resolver-typescript: ^3.5.2 eslint-plugin-import: ^2.28.1 @@ -5243,7 +5147,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: db8aafac229b4788e002b6df6da0ba747bb14e46c73b997a8dcb962d4c238cca04bd7e0782c2d103847f7d562ba12f85ff8424747e984187349978bf57ee79be + checksum: 320c2a4bc8ab119dfed5d021e4517a3a3035a41ef1dd0b4b37030a5eea17dc2b9fc0d289ada281cf29b05d4d272897712f37a90dc1a6cf6cd3c7505936b48e5c languageName: node linkType: hard @@ -5259,167 +5163,181 @@ __metadata: linkType: hard "eslint-import-resolver-typescript@npm:^3.5.2": - version: 3.6.1 - resolution: "eslint-import-resolver-typescript@npm:3.6.1" + version: 3.10.1 + resolution: "eslint-import-resolver-typescript@npm:3.10.1" dependencies: - debug: ^4.3.4 - enhanced-resolve: ^5.12.0 - eslint-module-utils: ^2.7.4 - fast-glob: ^3.3.1 - get-tsconfig: ^4.5.0 - is-core-module: ^2.11.0 - is-glob: ^4.0.3 + "@nolyfill/is-core-module": 1.0.39 + debug: ^4.4.0 + get-tsconfig: ^4.10.0 + is-bun-module: ^2.0.0 + stable-hash: ^0.0.5 + tinyglobby: ^0.2.13 + unrs-resolver: ^1.6.2 peerDependencies: eslint: "*" eslint-plugin-import: "*" - checksum: 454fa0646533050fb57f13d27daf8c71f51b0bb9156d6a461290ccb8576d892209fcc6702a89553f3f5ea8e5b407395ca2e5de169a952c953685f1f7c46b4496 + eslint-plugin-import-x: "*" + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + checksum: 57acb58fe28257024236b52ebfe6a3d2e3970a88002e02e771ff327c850c76b2a6b90175b54a980e9efe4787ac09bafe53cb3ebabf3fd165d3ff2a80b2d7e50d languageName: node linkType: hard -"eslint-module-utils@npm:^2.7.4, eslint-module-utils@npm:^2.8.0": - version: 2.8.0 - resolution: "eslint-module-utils@npm:2.8.0" +"eslint-module-utils@npm:^2.12.0": + version: 2.12.0 + resolution: "eslint-module-utils@npm:2.12.0" dependencies: debug: ^3.2.7 peerDependenciesMeta: eslint: optional: true - checksum: 74c6dfea7641ebcfe174be61168541a11a14aa8d72e515f5f09af55cd0d0862686104b0524aa4b8e0ce66418a44aa38a94d2588743db5fd07a6b49ffd16921d2 + checksum: be3ac52e0971c6f46daeb1a7e760e45c7c45f820c8cc211799f85f10f04ccbf7afc17039165d56cb2da7f7ca9cec2b3a777013cddf0b976784b37eb9efa24180 languageName: node linkType: hard "eslint-plugin-import@npm:^2.28.1": - version: 2.29.1 - resolution: "eslint-plugin-import@npm:2.29.1" + version: 2.31.0 + resolution: "eslint-plugin-import@npm:2.31.0" dependencies: - array-includes: ^3.1.7 - array.prototype.findlastindex: ^1.2.3 + "@rtsao/scc": ^1.1.0 + array-includes: ^3.1.8 + array.prototype.findlastindex: ^1.2.5 array.prototype.flat: ^1.3.2 array.prototype.flatmap: ^1.3.2 debug: ^3.2.7 doctrine: ^2.1.0 eslint-import-resolver-node: ^0.3.9 - eslint-module-utils: ^2.8.0 - hasown: ^2.0.0 - is-core-module: ^2.13.1 + eslint-module-utils: ^2.12.0 + hasown: ^2.0.2 + is-core-module: ^2.15.1 is-glob: ^4.0.3 minimatch: ^3.1.2 - object.fromentries: ^2.0.7 - object.groupby: ^1.0.1 - object.values: ^1.1.7 + object.fromentries: ^2.0.8 + object.groupby: ^1.0.3 + object.values: ^1.2.0 semver: ^6.3.1 + string.prototype.trimend: ^1.0.8 tsconfig-paths: ^3.15.0 peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: e65159aef808136d26d029b71c8c6e4cb5c628e65e5de77f1eb4c13a379315ae55c9c3afa847f43f4ff9df7e54515c77ffc6489c6a6f81f7dd7359267577468c + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + checksum: b1d2ac268b3582ff1af2a72a2c476eae4d250c100f2e335b6e102036e4a35efa530b80ec578dfc36761fabb34a635b9bf5ab071abe9d4404a4bb054fdf22d415 languageName: node linkType: hard "eslint-plugin-jsx-a11y@npm:^6.7.1": - version: 6.8.0 - resolution: "eslint-plugin-jsx-a11y@npm:6.8.0" + version: 6.10.2 + resolution: "eslint-plugin-jsx-a11y@npm:6.10.2" dependencies: - "@babel/runtime": ^7.23.2 - aria-query: ^5.3.0 - array-includes: ^3.1.7 + aria-query: ^5.3.2 + array-includes: ^3.1.8 array.prototype.flatmap: ^1.3.2 ast-types-flow: ^0.0.8 - axe-core: =4.7.0 - axobject-query: ^3.2.1 + axe-core: ^4.10.0 + axobject-query: ^4.1.0 damerau-levenshtein: ^1.0.8 emoji-regex: ^9.2.2 - es-iterator-helpers: ^1.0.15 - hasown: ^2.0.0 + hasown: ^2.0.2 jsx-ast-utils: ^3.3.5 language-tags: ^1.0.9 minimatch: ^3.1.2 - object.entries: ^1.1.7 - object.fromentries: ^2.0.7 + object.fromentries: ^2.0.8 + safe-regex-test: ^1.0.3 + string.prototype.includes: ^2.0.1 peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 3dec00e2a3089c4c61ac062e4196a70985fb7eda1fd67fe035363d92578debde92fdb8ed2e472321fc0d71e75f4a1e8888c6a3218c14dd93c8e8d19eb6f51554 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + checksum: 0cc861398fa26ada61ed5703eef5b335495fcb96253263dcd5e399488ff019a2636372021baacc040e3560d1a34bfcd5d5ad9f1754f44cd0509c956f7df94050 languageName: node linkType: hard "eslint-plugin-react-hooks@npm:^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": - version: 4.6.0 - resolution: "eslint-plugin-react-hooks@npm:4.6.0" + version: 5.0.0-canary-7118f5dd7-20230705 + resolution: "eslint-plugin-react-hooks@npm:5.0.0-canary-7118f5dd7-20230705" peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - checksum: 23001801f14c1d16bf0a837ca7970d9dd94e7b560384b41db378b49b6e32dc43d6e2790de1bd737a652a86f81a08d6a91f402525061b47719328f586a57e86c3 + checksum: 20e334e60bf5e56cf9f760598411847525c3ff826e6ae7757c8efdc60b33d47a97ddbe1b94ce95956ea9f7bbef37995b19c716be50bd44e6a1e789cba08b6224 languageName: node linkType: hard "eslint-plugin-react@npm:^7.33.2": - version: 7.33.2 - resolution: "eslint-plugin-react@npm:7.33.2" + version: 7.37.5 + resolution: "eslint-plugin-react@npm:7.37.5" dependencies: - array-includes: ^3.1.6 - array.prototype.flatmap: ^1.3.1 - array.prototype.tosorted: ^1.1.1 + array-includes: ^3.1.8 + array.prototype.findlast: ^1.2.5 + array.prototype.flatmap: ^1.3.3 + array.prototype.tosorted: ^1.1.4 doctrine: ^2.1.0 - es-iterator-helpers: ^1.0.12 + es-iterator-helpers: ^1.2.1 estraverse: ^5.3.0 + hasown: ^2.0.2 jsx-ast-utils: ^2.4.1 || ^3.0.0 minimatch: ^3.1.2 - object.entries: ^1.1.6 - object.fromentries: ^2.0.6 - object.hasown: ^1.1.2 - object.values: ^1.1.6 + object.entries: ^1.1.9 + object.fromentries: ^2.0.8 + object.values: ^1.2.1 prop-types: ^15.8.1 - resolve: ^2.0.0-next.4 + resolve: ^2.0.0-next.5 semver: ^6.3.1 - string.prototype.matchall: ^4.0.8 + string.prototype.matchall: ^4.0.12 + string.prototype.repeat: ^1.0.0 peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: b4c3d76390b0ae6b6f9fed78170604cc2c04b48e6778a637db339e8e3911ec9ef22510b0ae77c429698151d0f1b245f282177f384105b6830e7b29b9c9b26610 + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + checksum: 8675e7558e646e3c2fcb04bb60cfe416000b831ef0b363f0117838f5bfc799156113cb06058ad4d4b39fc730903b7360b05038da11093064ca37caf76b7cf2ca languageName: node linkType: hard -"eslint-scope@npm:^8.0.2": - version: 8.0.2 - resolution: "eslint-scope@npm:8.0.2" +"eslint-scope@npm:^8.4.0": + version: 8.4.0 + resolution: "eslint-scope@npm:8.4.0" dependencies: esrecurse: ^4.3.0 estraverse: ^5.2.0 - checksum: bd1e7a0597ec605cf3bc9b35c9e13d7ea6c11fee031b0cada9e8993b0ecf16d81d6f40f1dcd463424af439abf53cd62302ea25707c1599689eb2750d6aa29688 + checksum: cf88f42cd5e81490d549dc6d350fe01e6fe420f9d9ea34f134bb359b030e3c4ef888d36667632e448937fe52449f7181501df48c08200e3d3b0fee250d05364e languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1": +"eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 languageName: node linkType: hard -"eslint-visitor-keys@npm:^4.0.0": - version: 4.0.0 - resolution: "eslint-visitor-keys@npm:4.0.0" - checksum: 5c09f89cf29d87cdbfbac38802a880d3c2e65f8cb61c689888346758f1e24a4c7f6caefeac9474dfa52058a99920623599bdb00516976a30134abeba91275aa2 +"eslint-visitor-keys@npm:^4.2.1": + version: 4.2.1 + resolution: "eslint-visitor-keys@npm:4.2.1" + checksum: 3a77e3f99a49109f6fb2c5b7784bc78f9743b834d238cdba4d66c602c6b52f19ed7bcd0a5c5dbbeae3a8689fd785e76c001799f53d2228b278282cf9f699fff5 languageName: node linkType: hard "eslint@npm:^9.9.1": - version: 9.9.1 - resolution: "eslint@npm:9.9.1" + version: 9.29.0 + resolution: "eslint@npm:9.29.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 - "@eslint-community/regexpp": ^4.11.0 - "@eslint/config-array": ^0.18.0 - "@eslint/eslintrc": ^3.1.0 - "@eslint/js": 9.9.1 + "@eslint-community/regexpp": ^4.12.1 + "@eslint/config-array": ^0.20.1 + "@eslint/config-helpers": ^0.2.1 + "@eslint/core": ^0.14.0 + "@eslint/eslintrc": ^3.3.1 + "@eslint/js": 9.29.0 + "@eslint/plugin-kit": ^0.3.1 + "@humanfs/node": ^0.16.6 "@humanwhocodes/module-importer": ^1.0.1 - "@humanwhocodes/retry": ^0.3.0 - "@nodelib/fs.walk": ^1.2.8 + "@humanwhocodes/retry": ^0.4.2 + "@types/estree": ^1.0.6 + "@types/json-schema": ^7.0.15 ajv: ^6.12.4 chalk: ^4.0.0 - cross-spawn: ^7.0.2 + cross-spawn: ^7.0.6 debug: ^4.3.2 escape-string-regexp: ^4.0.0 - eslint-scope: ^8.0.2 - eslint-visitor-keys: ^4.0.0 - espree: ^10.1.0 + eslint-scope: ^8.4.0 + eslint-visitor-keys: ^4.2.1 + espree: ^10.4.0 esquery: ^1.5.0 esutils: ^2.0.2 fast-deep-equal: ^3.1.3 @@ -5429,15 +5347,11 @@ __metadata: ignore: ^5.2.0 imurmurhash: ^0.1.4 is-glob: ^4.0.0 - is-path-inside: ^3.0.3 json-stable-stringify-without-jsonify: ^1.0.1 - levn: ^0.4.1 lodash.merge: ^4.6.2 minimatch: ^3.1.2 natural-compare: ^1.4.0 optionator: ^0.9.3 - strip-ansi: ^6.0.1 - text-table: ^0.2.0 peerDependencies: jiti: "*" peerDependenciesMeta: @@ -5445,18 +5359,18 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: a1ff85cd26a6f138e0f52e17668b7794371c81fd0ac66634c4d554dc2d878dcfbe6047a025e63e85168c897c83dfa453501a10395cbefda7debd79fe6ea00eab + checksum: fa4381d9d7db444912defcec93c54e6d470e24a73d5bae5b04b34b0fb03aad8a6cbedd79fe3f4e6120d5590785d02d633ce9f854a540283a62493f11d8ff9408 languageName: node linkType: hard -"espree@npm:^10.0.1, espree@npm:^10.1.0": - version: 10.1.0 - resolution: "espree@npm:10.1.0" +"espree@npm:^10.0.1, espree@npm:^10.4.0": + version: 10.4.0 + resolution: "espree@npm:10.4.0" dependencies: - acorn: ^8.12.0 + acorn: ^8.15.0 acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^4.0.0 - checksum: a4708ab987f6c03734b8738b1588e9f31b2e305e869ca4677c60d82294eb05f7099b6687eb39eeb0913bb2d49bdf0bd0f31c511599ea7ee171281f871a9c897e + eslint-visitor-keys: ^4.2.1 + checksum: 5f9d0d7c81c1bca4bfd29a55270067ff9d575adb8c729a5d7f779c2c7b910bfc68ccf8ec19b29844b707440fc159a83868f22c8e87bbf7cbcb225ed067df6c85 languageName: node linkType: hard @@ -5485,6 +5399,13 @@ __metadata: languageName: node linkType: hard +"estree-util-is-identifier-name@npm:^3.0.0": + version: 3.0.0 + resolution: "estree-util-is-identifier-name@npm:3.0.0" + checksum: ea3909f0188ea164af0aadeca87c087e3e5da78d76da5ae9c7954ff1340ea3e4679c4653bbf4299ffb70caa9b322218cc1128db2541f3d2976eb9704f9857787 + languageName: node + linkType: hard + "estree-walker@npm:2.0.2, estree-walker@npm:^2.0.1, estree-walker@npm:^2.0.2": version: 2.0.2 resolution: "estree-walker@npm:2.0.2" @@ -5545,23 +5466,6 @@ __metadata: languageName: node linkType: hard -"execa@npm:^8.0.1": - version: 8.0.1 - resolution: "execa@npm:8.0.1" - dependencies: - cross-spawn: ^7.0.3 - get-stream: ^8.0.1 - human-signals: ^5.0.0 - is-stream: ^3.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^5.1.0 - onetime: ^6.0.0 - signal-exit: ^4.1.0 - strip-final-newline: ^3.0.0 - checksum: cac1bf86589d1d9b73bdc5dda65c52012d1a9619c44c526891956745f7b366ca2603d29fe3f7460bacc2b48c6eab5d6a4f7afe0534b31473d3708d1265545e1f - languageName: node - linkType: hard - "exponential-backoff@npm:^3.1.1": version: 3.1.2 resolution: "exponential-backoff@npm:3.1.2" @@ -5593,29 +5497,16 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.12": - version: 3.3.0 - resolution: "fast-glob@npm:3.3.0" +"fast-glob@npm:^3.2.7, fast-glob@npm:^3.3.2": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" dependencies: "@nodelib/fs.stat": ^2.0.2 "@nodelib/fs.walk": ^1.2.3 glob-parent: ^5.1.2 merge2: ^1.3.0 - micromatch: ^4.0.4 - checksum: 20df62be28eb5426fe8e40e0d05601a63b1daceb7c3d87534afcad91bdcf1e4b1743cf2d5247d6e225b120b46df0b9053a032b2691ba34ee121e033acd81f547 - languageName: node - linkType: hard - -"fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.1": - version: 3.3.2 - resolution: "fast-glob@npm:3.3.2" - dependencies: - "@nodelib/fs.stat": ^2.0.2 - "@nodelib/fs.walk": ^1.2.3 - glob-parent: ^5.1.2 - merge2: ^1.3.0 - micromatch: ^4.0.4 - checksum: 900e4979f4dbc3313840078419245621259f349950411ca2fa445a2f9a1a6d98c3b5e7e0660c5ccd563aa61abe133a21765c6c0dec8e57da1ba71d8000b05ec1 + micromatch: ^4.0.8 + checksum: 0704d7b85c0305fd2cef37777337dfa26230fdd072dce9fb5c82a4b03156f3ffb8ed3e636033e65d45d2a5805a4e475825369a27404c0307f2db0c8eb3366fbd languageName: node linkType: hard @@ -5641,11 +5532,11 @@ __metadata: linkType: hard "fastq@npm:^1.6.0": - version: 1.15.0 - resolution: "fastq@npm:1.15.0" + version: 1.19.1 + resolution: "fastq@npm:1.19.1" dependencies: reusify: ^1.0.4 - checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a + checksum: 7691d1794fb84ad0ec2a185f10e00f0e1713b894e2c9c4d42f0bc0ba5f8c00e6e655a202074ca0b91b9c3d977aab7c30c41a8dc069fb5368576ac0054870a0e6 languageName: node linkType: hard @@ -5686,15 +5577,6 @@ __metadata: languageName: node linkType: hard -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" - dependencies: - to-regex-range: ^5.0.1 - checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 - languageName: node - linkType: hard - "fill-range@npm:^7.1.1": version: 7.1.1 resolution: "fill-range@npm:7.1.1" @@ -5732,38 +5614,28 @@ __metadata: linkType: hard "flatted@npm:^3.2.9": - version: 3.2.9 - resolution: "flatted@npm:3.2.9" - checksum: f14167fbe26a9d20f6fca8d998e8f1f41df72c8e81f9f2c9d61ed2bea058248f5e1cbd05e7f88c0e5087a6a0b822a1e5e2b446e879f3cfbe0b07ba2d7f80b026 + version: 3.3.3 + resolution: "flatted@npm:3.3.3" + checksum: 8c96c02fbeadcf4e8ffd0fa24983241e27698b0781295622591fc13585e2f226609d95e422bcf2ef044146ffacb6b68b1f20871454eddf75ab3caa6ee5f4a1fe languageName: node linkType: hard -"focus-lock@npm:^1.0.0": - version: 1.0.0 - resolution: "focus-lock@npm:1.0.0" +"focus-lock@npm:^1.3.6": + version: 1.3.6 + resolution: "focus-lock@npm:1.3.6" dependencies: tslib: ^2.0.3 - checksum: 85eb62534e8c0314026453c4f734bf6450054a19b248280f3f69c98b5d5481707124e2206d7dc515650a6f28da827a2de297455056a9c8f398e5f8ba5dba8419 - languageName: node - linkType: hard - -"follow-redirects@npm:^1.15.0": - version: 1.15.2 - resolution: "follow-redirects@npm:1.15.2" - peerDependenciesMeta: - debug: - optional: true - checksum: faa66059b66358ba65c234c2f2a37fcec029dc22775f35d9ad6abac56003268baf41e55f9ee645957b32c7d9f62baf1f0b906e68267276f54ec4b4c597c2b190 + checksum: c1fb33976a6451b8957e6ac7ae9aff96d84b39c66b596fb74a8b0325d08c7a40b02492a6a8782a83bb850d9960d8b08be9380a1ffb56ca73adee6961478a9a7d languageName: node linkType: hard "follow-redirects@npm:^1.15.6": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" peerDependenciesMeta: debug: optional: true - checksum: a62c378dfc8c00f60b9c80cab158ba54e99ba0239a5dd7c81245e5a5b39d10f0c35e249c3379eae719ff0285fff88c365dd446fab19dee771f1d76252df1bbf5 + checksum: 859e2bacc7a54506f2bf9aacb10d165df78c8c1b0ceb8023f966621b233717dab56e8d08baadc3ad3b9db58af290413d585c999694b7c146aaf2616340c3d2a6 languageName: node linkType: hard @@ -5774,45 +5646,47 @@ __metadata: languageName: node linkType: hard -"for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" +"for-each@npm:^0.3.3, for-each@npm:^0.3.5": + version: 0.3.5 + resolution: "for-each@npm:0.3.5" dependencies: - is-callable: ^1.1.3 - checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 + is-callable: ^1.2.7 + checksum: 3c986d7e11f4381237cc98baa0a2f87eabe74719eee65ed7bed275163082b940ede19268c61d04c6260e0215983b12f8d885e3c8f9aa8c2113bf07c37051745c languageName: node linkType: hard "foreground-child@npm:^3.1.0": - version: 3.3.0 - resolution: "foreground-child@npm:3.3.0" + version: 3.3.1 + resolution: "foreground-child@npm:3.3.1" dependencies: - cross-spawn: ^7.0.0 + cross-spawn: ^7.0.6 signal-exit: ^4.0.1 - checksum: 1989698488f725b05b26bc9afc8a08f08ec41807cd7b92ad85d96004ddf8243fd3e79486b8348c64a3011ae5cc2c9f0936af989e1f28339805d8bc178a75b451 + checksum: b2c1a6fc0bf0233d645d9fefdfa999abf37db1b33e5dab172b3cbfb0662b88bfbd2c9e7ab853533d199050ec6b65c03fcf078fc212d26e4990220e98c6930eef languageName: node linkType: hard "form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" + version: 4.0.3 + resolution: "form-data@npm:4.0.3" dependencies: asynckit: ^0.4.0 combined-stream: ^1.0.8 + es-set-tostringtag: ^2.1.0 + hasown: ^2.0.2 mime-types: ^2.1.12 - checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c + checksum: b8e2568c0853ce167b2b9c9c4b81fe563f9ade647178baf6b6381cf8a11e3c01dd2b78a63ba367e6f5eab59afab8284a9438bb5ae768133f9d9fce6567fbc26a languageName: node linkType: hard "formidable@npm:^2.1.2": - version: 2.1.2 - resolution: "formidable@npm:2.1.2" + version: 2.1.5 + resolution: "formidable@npm:2.1.5" dependencies: + "@paralleldrive/cuid2": ^2.2.2 dezalgo: ^1.0.4 - hexoid: ^1.0.0 once: ^1.4.0 qs: ^6.11.0 - checksum: 81c8e5d89f5eb873e992893468f0de22c01678ca3d315db62be0560f9de1c77d4faefc9b1f4575098eb2263b3c81ba1024833a9fc3206297ddbac88a4f69b7a8 + checksum: b7a38dbf3f2d32858e9199f9e1597038d22854dc7f3120e30a05097fd538c3a5ebdfcb1b14ed3d68139f592176e64a3544aa14b5be624e26fe5b383a5c096a74 languageName: node linkType: hard @@ -5824,8 +5698,8 @@ __metadata: linkType: hard "framer-motion@npm:^10.16.16": - version: 10.16.16 - resolution: "framer-motion@npm:10.16.16" + version: 10.18.0 + resolution: "framer-motion@npm:10.18.0" dependencies: "@emotion/is-prop-valid": ^0.8.2 tslib: ^2.4.0 @@ -5840,7 +5714,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 992d755faab7171aecd4b548ea4c3baf6a9172b9348a98033e594a46a9f3f90c6f5854898d48884c3ecf7db4fc2ae3f05e27e125b4c5b397e836d765265577c1 + checksum: b43f1edcfc8c2226e3325517612d2abb7455455c4d2232d62499d70a603a51ffdd6a810aa7b5e783a25860856ec6c6e5b3bcf749846facedc54a063f9a548f0b languageName: node linkType: hard @@ -5920,11 +5794,11 @@ __metadata: linkType: hard "fsevents@npm:~2.3.2": - version: 2.3.2 - resolution: "fsevents@npm:2.3.2" + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" dependencies: node-gyp: latest - checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f + checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 conditions: os=darwin languageName: node linkType: hard @@ -5939,21 +5813,14 @@ __metadata: linkType: hard "fsevents@patch:fsevents@~2.3.2#~builtin": - version: 2.3.2 - resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1" + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1" dependencies: node-gyp: latest conditions: os=darwin languageName: node linkType: hard -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a - languageName: node - linkType: hard - "function-bind@npm:^1.1.2": version: 1.1.2 resolution: "function-bind@npm:1.1.2" @@ -5961,15 +5828,17 @@ __metadata: languageName: node linkType: hard -"function.prototype.name@npm:^1.1.5, function.prototype.name@npm:^1.1.6": - version: 1.1.6 - resolution: "function.prototype.name@npm:1.1.6" +"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": + version: 1.1.8 + resolution: "function.prototype.name@npm:1.1.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 + call-bind: ^1.0.8 + call-bound: ^1.0.3 + define-properties: ^1.2.1 functions-have-names: ^1.2.3 - checksum: 7a3f9bd98adab09a07f6e1f03da03d3f7c26abbdeaeee15223f6c04a9fb5674792bdf5e689dac19b97ac71de6aad2027ba3048a9b883aa1b3173eed6ab07f479 + hasown: ^2.0.2 + is-callable: ^1.2.7 + checksum: 3a366535dc08b25f40a322efefa83b2da3cd0f6da41db7775f2339679120ef63b6c7e967266182609e655b8f0a8f65596ed21c7fd72ad8bd5621c2340edd4010 languageName: node linkType: hard @@ -6011,27 +5880,21 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2": - version: 1.2.1 - resolution: "get-intrinsic@npm:1.2.1" - dependencies: - function-bind: ^1.1.1 - has: ^1.0.3 - has-proto: ^1.0.1 - has-symbols: ^1.0.3 - checksum: 5b61d88552c24b0cf6fa2d1b3bc5459d7306f699de060d76442cce49a4721f52b8c560a33ab392cf5575b7810277d54ded9d4d39a1ea61855619ebc005aa7e5f - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": - version: 1.2.2 - resolution: "get-intrinsic@npm:1.2.2" +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": + version: 1.3.0 + resolution: "get-intrinsic@npm:1.3.0" dependencies: + call-bind-apply-helpers: ^1.0.2 + es-define-property: ^1.0.1 + es-errors: ^1.3.0 + es-object-atoms: ^1.1.1 function-bind: ^1.1.2 - has-proto: ^1.0.1 - has-symbols: ^1.0.3 - hasown: ^2.0.0 - checksum: 447ff0724df26829908dc033b62732359596fcf66027bc131ab37984afb33842d9cd458fd6cecadfe7eac22fd8a54b349799ed334cf2726025c921c7250e7417 + get-proto: ^1.0.1 + gopd: ^1.2.0 + has-symbols: ^1.1.0 + hasown: ^2.0.2 + math-intrinsics: ^1.1.0 + checksum: 301008e4482bb9a9cb49e132b88fee093bff373b4e6def8ba219b1e96b60158a6084f273ef5cafe832e42cd93462f4accb46a618d35fe59a2b507f2388c5b79d languageName: node linkType: hard @@ -6042,6 +5905,16 @@ __metadata: languageName: node linkType: hard +"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: ^1.0.1 + es-object-atoms: ^1.0.0 + checksum: 4fc96afdb58ced9a67558698b91433e6b037aaa6f1493af77498d7c85b141382cf223c0e5946f334fb328ee85dfe6edd06d218eaf09556f4bc4ec6005d7f5f7b + languageName: node + linkType: hard + "get-stream@npm:^5.0.0": version: 5.2.0 resolution: "get-stream@npm:5.2.0" @@ -6051,47 +5924,40 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^8.0.1": - version: 8.0.1 - resolution: "get-stream@npm:8.0.1" - checksum: 01e3d3cf29e1393f05f44d2f00445c5f9ec3d1c49e8179b31795484b9c117f4c695e5e07b88b50785d5c8248a788c85d9913a79266fc77e3ef11f78f10f1b974 - languageName: node - linkType: hard - -"get-symbol-description@npm:^1.0.0": - version: 1.0.0 - resolution: "get-symbol-description@npm:1.0.0" +"get-symbol-description@npm:^1.1.0": + version: 1.1.0 + resolution: "get-symbol-description@npm:1.1.0" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.1 - checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 + call-bound: ^1.0.3 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 + checksum: 655ed04db48ee65ef2ddbe096540d4405e79ba0a7f54225775fef43a7e2afcb93a77d141c5f05fdef0afce2eb93bcbfb3597142189d562ac167ff183582683cd languageName: node linkType: hard -"get-tsconfig@npm:^4.5.0": - version: 4.7.2 - resolution: "get-tsconfig@npm:4.7.2" +"get-tsconfig@npm:^4.10.0": + version: 4.10.1 + resolution: "get-tsconfig@npm:4.10.1" dependencies: resolve-pkg-maps: ^1.0.0 - checksum: 172358903250eff0103943f816e8a4e51d29b8e5449058bdf7266714a908a48239f6884308bd3a6ff28b09f692b9533dbebfd183ab63e4e14f073cda91f1bca9 + checksum: 22925debda6bd0992171a44ee79a22c32642063ba79534372c4d744e0c9154abe2c031659da0fb86bc9e73fc56a3b76b053ea5d24ca3ac3da43d2e6f7d1c3c33 languageName: node linkType: hard "giget@npm:^1.2.3": - version: 1.2.3 - resolution: "giget@npm:1.2.3" + version: 1.2.5 + resolution: "giget@npm:1.2.5" dependencies: citty: ^0.1.6 - consola: ^3.2.3 + consola: ^3.4.0 defu: ^6.1.4 - node-fetch-native: ^1.6.3 - nypm: ^0.3.8 - ohash: ^1.1.3 - pathe: ^1.1.2 - tar: ^6.2.0 + node-fetch-native: ^1.6.6 + nypm: ^0.5.4 + pathe: ^2.0.3 + tar: ^6.2.1 bin: giget: dist/cli.mjs - checksum: ec6e9126cb210377b952c090338dee5df0f58f724666318a14a505f1d2c961b91fd1b364b86a038b24a21a5ef44702c9d6841f8726b09aeb88a74720b6b682dd + checksum: 9263ccbcb446f2182b73b4e494de9419275dbb0b83e93c2b051e936abfa087259bc5bd471a5f069cd1dc40a312c5cac2247c23a45cebbc31a042c6eb51887857 languageName: node linkType: hard @@ -6128,21 +5994,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:7.1.6": - version: 7.1.6 - resolution: "glob@npm:7.1.6" - dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.0.4 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 351d549dd90553b87c2d3f90ce11aed9e1093c74130440e7ae0592e11bbcd2ce7f0ebb8ba6bfe63aaf9b62166a7f4c80cb84490ae5d78408bb2572bf7d4ee0a6 - languageName: node - linkType: hard - -"glob@npm:^10.2.2": +"glob@npm:^10.2.2, glob@npm:^10.3.10": version: 10.4.5 resolution: "glob@npm:10.4.5" dependencies: @@ -6185,6 +6037,13 @@ __metadata: languageName: node linkType: hard +"globals@npm:^11.1.0": + version: 11.12.0 + resolution: "globals@npm:11.12.0" + checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e + languageName: node + linkType: hard + "globals@npm:^14.0.0": version: 14.0.0 resolution: "globals@npm:14.0.0" @@ -6192,52 +6051,43 @@ __metadata: languageName: node linkType: hard -"globalthis@npm:^1.0.3": - version: 1.0.3 - resolution: "globalthis@npm:1.0.3" +"globalthis@npm:^1.0.4": + version: 1.0.4 + resolution: "globalthis@npm:1.0.4" dependencies: - define-properties: ^1.1.3 - checksum: fbd7d760dc464c886d0196166d92e5ffb4c84d0730846d6621a39fbbc068aeeb9c8d1421ad330e94b7bca4bb4ea092f5f21f3d36077812af5d098b4dc006c998 + define-properties: ^1.2.1 + gopd: ^1.0.1 + checksum: 39ad667ad9f01476474633a1834a70842041f70a55571e8dcef5fb957980a92da5022db5430fca8aecc5d47704ae30618c0bc877a579c70710c904e9ef06108a languageName: node linkType: hard -"globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - dependencies: - array-union: ^2.1.0 - dir-glob: ^3.0.1 - fast-glob: ^3.2.9 - ignore: ^5.2.0 - merge2: ^1.4.1 - slash: ^3.0.0 - checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: cc6d8e655e360955bdccaca51a12a474268f95bb793fc3e1f2bdadb075f28bfd1fd988dab872daf77a61d78cbaf13744bc8727a17cfb1d150d76047d805375f3 languageName: node linkType: hard -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: ^1.1.3 - checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.11, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 languageName: node linkType: hard +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 + languageName: node + linkType: hard + "h264-profile-level-id@npm:^2.0.0": - version: 2.0.0 - resolution: "h264-profile-level-id@npm:2.0.0" + version: 2.2.0 + resolution: "h264-profile-level-id@npm:2.2.0" dependencies: - "@types/debug": ^4.1.12 - debug: ^4.3.4 - checksum: 83913b664a0bbc5fb6e5e54e6ff9f93c6fc629b2395fc01bb7720b351a317cf49295859834cd774990c0637524ff8646775b9d339043e680679b93a642a8c9f4 + debug: ^4.4.0 + checksum: 6057139108fe15bc3e1ba066fc00d626378621d65ca2db629048b6fa3335a14fd777965acf6446f60de7191cec0d3b33d9eaede3828247d35931181d82738cd8 languageName: node linkType: hard @@ -6259,17 +6109,10 @@ __metadata: languageName: node linkType: hard -"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": - version: 1.0.2 - resolution: "has-bigints@npm:1.0.2" - checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b +"has-bigints@npm:^1.0.2": + version: 1.1.0 + resolution: "has-bigints@npm:1.1.0" + checksum: 79730518ae02c77e4af6a1d1a0b6a2c3e1509785532771f9baf0241e83e36329542c3d7a0e723df8cbc85f74eff4f177828a2265a01ba576adbdc2d40d86538b languageName: node linkType: hard @@ -6280,35 +6123,37 @@ __metadata: languageName: node linkType: hard -"has-property-descriptors@npm:^1.0.0": - version: 1.0.1 - resolution: "has-property-descriptors@npm:1.0.1" +"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" dependencies: - get-intrinsic: ^1.2.2 - checksum: 2bcc6bf6ec6af375add4e4b4ef586e43674850a91ad4d46666d0b28ba8e1fd69e424c7677d24d60f69470ad0afaa2f3197f508b20b0bb7dd99a8ab77ffc4b7c4 + es-define-property: ^1.0.0 + checksum: fcbb246ea2838058be39887935231c6d5788babed499d0e9d0cc5737494c48aba4fe17ba1449e0d0fbbb1e36175442faa37f9c427ae357d6ccb1d895fbcd3de3 languageName: node linkType: hard -"has-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "has-proto@npm:1.0.1" - checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 - languageName: node - linkType: hard - -"has-tostringtag@npm:^1.0.0": - version: 1.0.0 - resolution: "has-tostringtag@npm:1.0.0" +"has-proto@npm:^1.2.0": + version: 1.2.0 + resolution: "has-proto@npm:1.2.0" dependencies: - has-symbols: ^1.0.2 - checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c + dunder-proto: ^1.0.0 + checksum: f55010cb94caa56308041d77967c72a02ffd71386b23f9afa8447e58bc92d49d15c19bf75173713468e92fe3fb1680b03b115da39c21c32c74886d1d50d3e7ff + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: b2316c7302a0e8ba3aaba215f834e96c22c86f192e7310bdf689dd0e6999510c89b00fbc5742571507cebf25764d68c988b3a0da217369a73596191ac0ce694b + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: ^1.0.3 + checksum: 999d60bb753ad714356b2c6c87b7fb74f32463b8426e159397da4bde5bca7e598ab1073f4d8d4deafac297f2eb311484cd177af242776bf05f0d11565680468d languageName: node linkType: hard @@ -6319,38 +6164,35 @@ __metadata: languageName: node linkType: hard -"has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" - dependencies: - function-bind: ^1.1.1 - checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 - languageName: node - linkType: hard - -"hasown@npm:^2.0.0": - version: 2.0.0 - resolution: "hasown@npm:2.0.0" +"hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" dependencies: function-bind: ^1.1.2 - checksum: 6151c75ca12554565098641c98a40f4cc86b85b0fd5b6fe92360967e4605a4f9610f7757260b4e8098dd1c2ce7f4b095f2006fe72a570e3b6d2d28de0298c176 + checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db languageName: node linkType: hard "hast-util-to-jsx-runtime@npm:^2.0.0": - version: 2.2.0 - resolution: "hast-util-to-jsx-runtime@npm:2.2.0" + version: 2.3.6 + resolution: "hast-util-to-jsx-runtime@npm:2.3.6" dependencies: + "@types/estree": ^1.0.0 "@types/hast": ^3.0.0 "@types/unist": ^3.0.0 comma-separated-tokens: ^2.0.0 + devlop: ^1.0.0 + estree-util-is-identifier-name: ^3.0.0 hast-util-whitespace: ^3.0.0 - property-information: ^6.0.0 + mdast-util-mdx-expression: ^2.0.0 + mdast-util-mdx-jsx: ^3.0.0 + mdast-util-mdxjs-esm: ^2.0.0 + property-information: ^7.0.0 space-separated-tokens: ^2.0.0 - style-to-object: ^0.4.0 + style-to-js: ^1.0.0 unist-util-position: ^5.0.0 vfile-message: ^4.0.0 - checksum: cc8d9029673eb9c2b7bc2355f9dee2f625ccfc897a54636d4050fc70145e32623119f79bd56d90f8f2cb381d8f1c95ddae8069a52d99f397c07ea6d9882f0666 + checksum: 78c25465cf010f1004b22f0bbb3bd47793f458ead3561c779ea2b9204ceb1adc9c048592b0a15025df0c683a12ebe16a8bef008c06d9c0369f51116f64b35a2d languageName: node linkType: hard @@ -6377,13 +6219,6 @@ __metadata: languageName: node linkType: hard -"hexoid@npm:^1.0.0": - version: 1.0.0 - resolution: "hexoid@npm:1.0.0" - checksum: 27a148ca76a2358287f40445870116baaff4a0ed0acc99900bf167f0f708ffd82e044ff55e9949c71963852b580fc024146d3ac6d5d76b508b78d927fa48ae2d - languageName: node - linkType: hard - "hoist-non-react-statics@npm:^3.3.1, hoist-non-react-statics@npm:^3.3.2": version: 3.3.2 resolution: "hoist-non-react-statics@npm:3.3.2" @@ -6394,9 +6229,9 @@ __metadata: linkType: hard "html-url-attributes@npm:^3.0.0": - version: 3.0.0 - resolution: "html-url-attributes@npm:3.0.0" - checksum: 9f499d33e6ddff6c2d2766fd73d2f22f3c370b4e485a92b0b2938303665b306dc7f36b2724c9466764e8f702351c01f342f5ec933be41a31c1fa40b72087b91d + version: 3.0.1 + resolution: "html-url-attributes@npm:3.0.1" + checksum: 1ecbf9cae0c438d2802386710177b7bbf7e30cc61327e9f125eb32fca7302cd1e3ab45c441859cb1e7646109be322fc1163592ad4dfde9b14d09416d101a6573 languageName: node linkType: hard @@ -6467,13 +6302,6 @@ __metadata: languageName: node linkType: hard -"human-signals@npm:^5.0.0": - version: 5.0.0 - resolution: "human-signals@npm:5.0.0" - checksum: 6504560d5ed91444f16bea3bd9dfc66110a339442084e56c3e7fa7bbdf3f406426d6563d662bdce67064b165eac31eeabfc0857ed170aaa612cf14ec9f9a464c - languageName: node - linkType: hard - "hyperhtml-style@npm:^0.1.2": version: 0.1.3 resolution: "hyperhtml-style@npm:0.1.3" @@ -6507,9 +6335,16 @@ __metadata: linkType: hard "ignore@npm:^5.2.0": - version: 5.3.0 - resolution: "ignore@npm:5.3.0" - checksum: 2736da6621f14ced652785cb05d86301a66d70248597537176612bd0c8630893564bd5f6421f8806b09e8472e75c591ef01672ab8059c07c6eb2c09cefe04bf9 + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 2acfd32a573260ea522ea0bfeff880af426d68f6831f973129e2ba7363f422923cf53aab62f8369cbf4667c7b25b6f8a3761b34ecdb284ea18e87a5262a865be + languageName: node + linkType: hard + +"ignore@npm:^7.0.0": + version: 7.0.5 + resolution: "ignore@npm:7.0.5" + checksum: d0862bf64d3d58bf34d5fb0a9f725bec9ca5ce8cd1aecc8f28034269e8f69b8009ffd79ca3eda96962a6a444687781cd5efdb8c7c8ddc0a6996e36d31c217f14 languageName: node linkType: hard @@ -6527,20 +6362,20 @@ __metadata: languageName: node linkType: hard -"immutable@npm:^4.0.0": - version: 4.3.1 - resolution: "immutable@npm:4.3.1" - checksum: a3a5ba29bd43f3f9a2e4d599763d7455d11a0ea57e50bf43f2836672fc80003e90d69f2a4f5b589f1f3d6986faf97f08ce1e253583740dd33c00adebab88b217 +"immutable@npm:^5.0.2": + version: 5.1.3 + resolution: "immutable@npm:5.1.3" + checksum: 63a1df5f68bbcaa7b1cb17aeaa8bc327734ad7b6936afe33b157fbdb480542c95fbab2de800b4969b5d45d51f2974aa916c78fa5c0d3a48810604268e72824cc languageName: node linkType: hard "import-fresh@npm:^3.2.1": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" dependencies: parent-module: ^1.0.0 resolve-from: ^4.0.0 - checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + checksum: a06b19461b4879cc654d46f8a6244eb55eb053437afd4cbb6613cad6be203811849ed3e4ea038783092879487299fda24af932b86bdfff67c9055ba3612b8c87 languageName: node linkType: hard @@ -6575,36 +6410,27 @@ __metadata: languageName: node linkType: hard -"inline-style-parser@npm:0.1.1": - version: 0.1.1 - resolution: "inline-style-parser@npm:0.1.1" - checksum: 5d545056a3e1f2bf864c928a886a0e1656a3517127d36917b973de581bd54adc91b4bf1febcb0da054f204b4934763f1a4e09308b4d55002327cf1d48ac5d966 +"inline-style-parser@npm:0.2.4": + version: 0.2.4 + resolution: "inline-style-parser@npm:0.2.4" + checksum: 5df20a21dd8d67104faaae29774bb50dc9690c75bc5c45dac107559670a5530104ead72c4cf54f390026e617e7014c65b3d68fb0bb573a37c4d1f94e9c36e1ca languageName: node linkType: hard -"internal-slot@npm:^1.0.5": - version: 1.0.6 - resolution: "internal-slot@npm:1.0.6" +"internal-slot@npm:^1.1.0": + version: 1.1.0 + resolution: "internal-slot@npm:1.1.0" dependencies: - get-intrinsic: ^1.2.2 - hasown: ^2.0.0 - side-channel: ^1.0.4 - checksum: 7872454888047553ce97a3fa1da7cc054a28ec5400a9c2e9f4dbe4fe7c1d041cb8e8301467614b80d4246d50377aad2fb58860b294ed74d6700cc346b6f89549 - languageName: node - linkType: hard - -"invariant@npm:^2.2.4": - version: 2.2.4 - resolution: "invariant@npm:2.2.4" - dependencies: - loose-envify: ^1.0.0 - checksum: cc3182d793aad82a8d1f0af697b462939cb46066ec48bbf1707c150ad5fad6406137e91a262022c269702e01621f35ef60269f6c0d7fd178487959809acdfb14 + es-errors: ^1.3.0 + hasown: ^2.0.2 + side-channel: ^1.1.0 + checksum: 8e0991c2d048cc08dab0a91f573c99f6a4215075887517ea4fa32203ce8aea60fa03f95b177977fa27eb502e5168366d0f3e02c762b799691411d49900611861 languageName: node linkType: hard "ioredis@npm:^5.4.1": - version: 5.4.1 - resolution: "ioredis@npm:5.4.1" + version: 5.6.1 + resolution: "ioredis@npm:5.6.1" dependencies: "@ioredis/commands": ^1.1.1 cluster-key-slot: ^1.1.0 @@ -6615,7 +6441,7 @@ __metadata: redis-errors: ^1.2.0 redis-parser: ^3.0.0 standard-as-callback: ^2.1.0 - checksum: 92210294f75800febe7544c27b07e4892480172363b11971aa575be5b68f023bfed4bc858abc9792230c153aa80409047a358f174062c14d17536aa4499fe10b + checksum: 89100a97b2210fed2aca45daf902adee8aa2294e56f817742651c86234a3efa56f82aa5aa762a94f5fbf806942f259ef5e628f626d1841d20d5cbb163fc8bd3f languageName: node linkType: hard @@ -6645,14 +6471,31 @@ __metadata: languageName: node linkType: hard -"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": - version: 3.0.2 - resolution: "is-array-buffer@npm:3.0.2" +"is-alphabetical@npm:^2.0.0": + version: 2.0.1 + resolution: "is-alphabetical@npm:2.0.1" + checksum: 56207db8d9de0850f0cd30f4966bf731eb82cedfe496cbc2e97e7c3bacaf66fc54a972d2d08c0d93bb679cb84976a05d24c5ad63de56fabbfc60aadae312edaa + languageName: node + linkType: hard + +"is-alphanumerical@npm:^2.0.0": + version: 2.0.1 + resolution: "is-alphanumerical@npm:2.0.1" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.2.0 - is-typed-array: ^1.1.10 - checksum: dcac9dda66ff17df9cabdc58214172bf41082f956eab30bb0d86bc0fab1e44b690fc8e1f855cf2481245caf4e8a5a006a982a71ddccec84032ed41f9d8da8c14 + is-alphabetical: ^2.0.0 + is-decimal: ^2.0.0 + checksum: 87acc068008d4c9c4e9f5bd5e251041d42e7a50995c77b1499cf6ed248f971aadeddb11f239cabf09f7975ee58cac7a48ffc170b7890076d8d227b24a68663c9 + languageName: node + linkType: hard + +"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5": + version: 3.0.5 + resolution: "is-array-buffer@npm:3.0.5" + dependencies: + call-bind: ^1.0.8 + call-bound: ^1.0.3 + get-intrinsic: ^1.2.6 + checksum: f137a2a6e77af682cdbffef1e633c140cf596f72321baf8bba0f4ef22685eb4339dde23dfe9e9ca430b5f961dee4d46577dcf12b792b68518c8449b134fb9156 languageName: node linkType: hard @@ -6664,20 +6507,24 @@ __metadata: linkType: hard "is-async-function@npm:^2.0.0": - version: 2.0.0 - resolution: "is-async-function@npm:2.0.0" + version: 2.1.1 + resolution: "is-async-function@npm:2.1.1" dependencies: - has-tostringtag: ^1.0.0 - checksum: e3471d95e6c014bf37cad8a93f2f4b6aac962178e0a5041e8903147166964fdc1c5c1d2ef87e86d77322c370ca18f2ea004fa7420581fa747bcaf7c223069dbd + async-function: ^1.0.0 + call-bound: ^1.0.3 + get-proto: ^1.0.1 + has-tostringtag: ^1.0.2 + safe-regex-test: ^1.1.0 + checksum: 9bece45133da26636488ca127d7686b85ad3ca18927e2850cff1937a650059e90be1c71a48623f8791646bb7a241b0cabf602a0b9252dcfa5ab273f2399000e6 languageName: node linkType: hard -"is-bigint@npm:^1.0.1": - version: 1.0.4 - resolution: "is-bigint@npm:1.0.4" +"is-bigint@npm:^1.1.0": + version: 1.1.0 + resolution: "is-bigint@npm:1.1.0" dependencies: - has-bigints: ^1.0.1 - checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 + has-bigints: ^1.0.2 + checksum: ee1544f0e664f253306786ed1dce494b8cf242ef415d6375d8545b4d8816b0f054bd9f948a8988ae2c6325d1c28260dd02978236b2f7b8fb70dfc4838a6c9fa7 languageName: node linkType: hard @@ -6690,38 +6537,66 @@ __metadata: languageName: node linkType: hard -"is-boolean-object@npm:^1.1.0": - version: 1.1.2 - resolution: "is-boolean-object@npm:1.1.2" +"is-boolean-object@npm:^1.2.1": + version: 1.2.2 + resolution: "is-boolean-object@npm:1.2.2" dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 + call-bound: ^1.0.3 + has-tostringtag: ^1.0.2 + checksum: 0415b181e8f1bfd5d3f8a20f8108e64d372a72131674eea9c2923f39d065b6ad08d654765553bdbffbd92c3746f1007986c34087db1bd89a31f71be8359ccdaa languageName: node linkType: hard -"is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": +"is-bun-module@npm:^2.0.0": + version: 2.0.0 + resolution: "is-bun-module@npm:2.0.0" + dependencies: + semver: ^7.7.1 + checksum: e75bd87cb1aaff7c97cf085509669559a713f741a43b4fd5979cb44c5c0c16c05670ce5f23fc22337d1379211fac118c525c5ed73544076ddaf181c1c21ace35 + languageName: node + linkType: hard + +"is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac languageName: node linkType: hard -"is-core-module@npm:^2.11.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1": - version: 2.13.1 - resolution: "is-core-module@npm:2.13.1" +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.15.1, is-core-module@npm:^2.16.0": + version: 2.16.1 + resolution: "is-core-module@npm:2.16.1" dependencies: - hasown: ^2.0.0 - checksum: 256559ee8a9488af90e4bad16f5583c6d59e92f0742e9e8bb4331e758521ee86b810b93bae44f390766ffbc518a0488b18d9dab7da9a5ff997d499efc9403f7c + hasown: ^2.0.2 + checksum: 6ec5b3c42d9cbf1ac23f164b16b8a140c3cec338bf8f884c076ca89950c7cc04c33e78f02b8cae7ff4751f3247e3174b2330f1fe4de194c7210deb8b1ea316a7 languageName: node linkType: hard -"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" +"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": + version: 1.0.2 + resolution: "is-data-view@npm:1.0.2" dependencies: - has-tostringtag: ^1.0.0 - checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc + call-bound: ^1.0.2 + get-intrinsic: ^1.2.6 + is-typed-array: ^1.1.13 + checksum: 31600dd19932eae7fd304567e465709ffbfa17fa236427c9c864148e1b54eb2146357fcf3aed9b686dee13c217e1bb5a649cb3b9c479e1004c0648e9febde1b2 + languageName: node + linkType: hard + +"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": + version: 1.1.0 + resolution: "is-date-object@npm:1.1.0" + dependencies: + call-bound: ^1.0.2 + has-tostringtag: ^1.0.2 + checksum: d6c36ab9d20971d65f3fc64cef940d57a4900a2ac85fb488a46d164c2072a33da1cb51eefcc039e3e5c208acbce343d3480b84ab5ff0983f617512da2742562a + languageName: node + linkType: hard + +"is-decimal@npm:^2.0.0": + version: 2.0.1 + resolution: "is-decimal@npm:2.0.1" + checksum: 97132de7acdce77caa7b797632970a2ecd649a88e715db0e4dbc00ab0708b5e7574ba5903962c860cd4894a14fd12b100c0c4ac8aed445cf6f55c6cf747a4158 languageName: node linkType: hard @@ -6732,12 +6607,12 @@ __metadata: languageName: node linkType: hard -"is-finalizationregistry@npm:^1.0.2": - version: 1.0.2 - resolution: "is-finalizationregistry@npm:1.0.2" +"is-finalizationregistry@npm:^1.1.0": + version: 1.1.1 + resolution: "is-finalizationregistry@npm:1.1.1" dependencies: - call-bind: ^1.0.2 - checksum: 4f243a8e06228cd45bdab8608d2cb7abfc20f6f0189c8ac21ea8d603f1f196eabd531ce0bb8e08cbab047e9845ef2c191a3761c9a17ad5cabf8b35499c4ad35d + call-bound: ^1.0.3 + checksum: 38c646c506e64ead41a36c182d91639833311970b6b6c6268634f109eef0a1a9d2f1f2e499ef4cb43c744a13443c4cdd2f0812d5afdcee5e9b65b72b28c48557 languageName: node linkType: hard @@ -6749,11 +6624,14 @@ __metadata: linkType: hard "is-generator-function@npm:^1.0.10": - version: 1.0.10 - resolution: "is-generator-function@npm:1.0.10" + version: 1.1.0 + resolution: "is-generator-function@npm:1.1.0" dependencies: - has-tostringtag: ^1.0.0 - checksum: d54644e7dbaccef15ceb1e5d91d680eb5068c9ee9f9eb0a9e04173eb5542c9b51b5ab52c5537f5703e48d5fddfd376817c1ca07a84a407b7115b769d4bdde72b + call-bound: ^1.0.3 + get-proto: ^1.0.0 + has-tostringtag: ^1.0.2 + safe-regex-test: ^1.1.0 + checksum: f7f7276131bdf7e28169b86ac55a5b080012a597f9d85a0cbef6fe202a7133fa450a3b453e394870e3cb3685c5a764c64a9f12f614684b46969b1e6f297bed6b languageName: node linkType: hard @@ -6766,26 +6644,34 @@ __metadata: languageName: node linkType: hard -"is-map@npm:^2.0.1": - version: 2.0.2 - resolution: "is-map@npm:2.0.2" - checksum: ace3d0ecd667bbdefdb1852de601268f67f2db725624b1958f279316e13fecb8fa7df91fd60f690d7417b4ec180712f5a7ee967008e27c65cfd475cc84337728 +"is-hexadecimal@npm:^2.0.0": + version: 2.0.1 + resolution: "is-hexadecimal@npm:2.0.1" + checksum: 66a2ea85994c622858f063f23eda506db29d92b52580709eb6f4c19550552d4dcf3fb81952e52f7cf972097237959e00adc7bb8c9400cd12886e15bf06145321 languageName: node linkType: hard -"is-negative-zero@npm:^2.0.2": - version: 2.0.2 - resolution: "is-negative-zero@npm:2.0.2" - checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a +"is-map@npm:^2.0.3": + version: 2.0.3 + resolution: "is-map@npm:2.0.3" + checksum: e6ce5f6380f32b141b3153e6ba9074892bbbbd655e92e7ba5ff195239777e767a976dcd4e22f864accaf30e53ebf961ab1995424aef91af68788f0591b7396cc languageName: node linkType: hard -"is-number-object@npm:^1.0.4": - version: 1.0.7 - resolution: "is-number-object@npm:1.0.7" +"is-negative-zero@npm:^2.0.3": + version: 2.0.3 + resolution: "is-negative-zero@npm:2.0.3" + checksum: c1e6b23d2070c0539d7b36022d5a94407132411d01aba39ec549af824231f3804b1aea90b5e4e58e807a65d23ceb538ed6e355ce76b267bdd86edb757ffcbdcd + languageName: node + linkType: hard + +"is-number-object@npm:^1.1.1": + version: 1.1.1 + resolution: "is-number-object@npm:1.1.1" dependencies: - has-tostringtag: ^1.0.0 - checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 + call-bound: ^1.0.3 + has-tostringtag: ^1.0.2 + checksum: 6517f0a0e8c4b197a21afb45cd3053dc711e79d45d8878aa3565de38d0102b130ca8732485122c7b336e98c27dacd5236854e3e6526e0eb30cae64956535662f languageName: node linkType: hard @@ -6796,13 +6682,6 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - "is-plain-obj@npm:^4.0.0": version: 4.1.0 resolution: "is-plain-obj@npm:4.1.0" @@ -6819,29 +6698,38 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.1.4": - version: 1.1.4 - resolution: "is-regex@npm:1.1.4" +"is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 + call-bound: ^1.0.2 + gopd: ^1.2.0 + has-tostringtag: ^1.0.2 + hasown: ^2.0.2 + checksum: 99ee0b6d30ef1bb61fa4b22fae7056c6c9b3c693803c0c284ff7a8570f83075a7d38cda53b06b7996d441215c27895ea5d1af62124562e13d91b3dbec41a5e13 languageName: node linkType: hard -"is-set@npm:^2.0.1": - version: 2.0.2 - resolution: "is-set@npm:2.0.2" - checksum: b64343faf45e9387b97a6fd32be632ee7b269bd8183701f3b3f5b71a7cf00d04450ed8669d0bd08753e08b968beda96fca73a10fd0ff56a32603f64deba55a57 +"is-set@npm:^2.0.3": + version: 2.0.3 + resolution: "is-set@npm:2.0.3" + checksum: 36e3f8c44bdbe9496c9689762cc4110f6a6a12b767c5d74c0398176aa2678d4467e3bf07595556f2dba897751bde1422480212b97d973c7b08a343100b0c0dfe languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "is-shared-array-buffer@npm:1.0.2" +"is-shared-array-buffer@npm:^1.0.4": + version: 1.0.4 + resolution: "is-shared-array-buffer@npm:1.0.4" dependencies: - call-bind: ^1.0.2 - checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a + call-bound: ^1.0.3 + checksum: 1611fedc175796eebb88f4dfc393dd969a4a8e6c69cadaff424ee9d4464f9f026399a5f84a90f7c62d6d7ee04e3626a912149726de102b0bd6c1ee6a9868fa5a + languageName: node + linkType: hard + +"is-standalone-pwa@npm:^0.1.1": + version: 0.1.1 + resolution: "is-standalone-pwa@npm:0.1.1" + checksum: bbd2ee7cbea985139f66fe8785e7699f52311e9c14d74190659885222b79dd1e8845b02f69b9221a23a2b4b00e8d4bea0a5a2603b2f26cb6d2071d46093ccf84 languageName: node linkType: hard @@ -6852,63 +6740,59 @@ __metadata: languageName: node linkType: hard -"is-stream@npm:^3.0.0": - version: 3.0.0 - resolution: "is-stream@npm:3.0.0" - checksum: 172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 - languageName: node - linkType: hard - -"is-string@npm:^1.0.5, is-string@npm:^1.0.7": - version: 1.0.7 - resolution: "is-string@npm:1.0.7" +"is-string@npm:^1.1.1": + version: 1.1.1 + resolution: "is-string@npm:1.1.1" dependencies: - has-tostringtag: ^1.0.0 - checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 + call-bound: ^1.0.3 + has-tostringtag: ^1.0.2 + checksum: 2eeaaff605250f5e836ea3500d33d1a5d3aa98d008641d9d42fb941e929ffd25972326c2ef912987e54c95b6f10416281aaf1b35cdf81992cfb7524c5de8e193 languageName: node linkType: hard -"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": - version: 1.0.4 - resolution: "is-symbol@npm:1.0.4" +"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": + version: 1.1.1 + resolution: "is-symbol@npm:1.1.1" dependencies: - has-symbols: ^1.0.2 - checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 + call-bound: ^1.0.2 + has-symbols: ^1.1.0 + safe-regex-test: ^1.1.0 + checksum: bfafacf037af6f3c9d68820b74be4ae8a736a658a3344072df9642a090016e281797ba8edbeb1c83425879aae55d1cb1f30b38bf132d703692b2570367358032 languageName: node linkType: hard -"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.12, is-typed-array@npm:^1.1.9": - version: 1.1.12 - resolution: "is-typed-array@npm:1.1.12" +"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15": + version: 1.1.15 + resolution: "is-typed-array@npm:1.1.15" dependencies: - which-typed-array: ^1.1.11 - checksum: 4c89c4a3be07186caddadf92197b17fda663a9d259ea0d44a85f171558270d36059d1c386d34a12cba22dfade5aba497ce22778e866adc9406098c8fc4771796 + which-typed-array: ^1.1.16 + checksum: ea7cfc46c282f805d19a9ab2084fd4542fed99219ee9dbfbc26284728bd713a51eac66daa74eca00ae0a43b61322920ba334793607dc39907465913e921e0892 languageName: node linkType: hard -"is-weakmap@npm:^2.0.1": - version: 2.0.1 - resolution: "is-weakmap@npm:2.0.1" - checksum: 1222bb7e90c32bdb949226e66d26cb7bce12e1e28e3e1b40bfa6b390ba3e08192a8664a703dff2a00a84825f4e022f9cd58c4599ff9981ab72b1d69479f4f7f6 - languageName: node - linkType: hard - -"is-weakref@npm:^1.0.2": - version: 1.0.2 - resolution: "is-weakref@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de - languageName: node - linkType: hard - -"is-weakset@npm:^2.0.1": +"is-weakmap@npm:^2.0.2": version: 2.0.2 - resolution: "is-weakset@npm:2.0.2" + resolution: "is-weakmap@npm:2.0.2" + checksum: f36aef758b46990e0d3c37269619c0a08c5b29428c0bb11ecba7f75203442d6c7801239c2f31314bc79199217ef08263787f3837d9e22610ad1da62970d6616d + languageName: node + linkType: hard + +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.1": + version: 1.1.1 + resolution: "is-weakref@npm:1.1.1" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.1 - checksum: 5d8698d1fa599a0635d7ca85be9c26d547b317ed8fd83fc75f03efbe75d50001b5eececb1e9971de85fcde84f69ae6f8346bc92d20d55d46201d328e4c74a367 + call-bound: ^1.0.3 + checksum: 1769b9aed5d435a3a989ffc18fc4ad1947d2acdaf530eb2bd6af844861b545047ea51102f75901f89043bed0267ed61d914ee21e6e8b9aa734ec201cdfc0726f + languageName: node + linkType: hard + +"is-weakset@npm:^2.0.3": + version: 2.0.4 + resolution: "is-weakset@npm:2.0.4" + dependencies: + call-bound: ^1.0.3 + get-intrinsic: ^1.2.6 + checksum: 5c6c8415a06065d78bdd5e3a771483aa1cd928df19138aa73c4c51333226f203f22117b4325df55cc8b3085a6716870a320c2d757efee92d7a7091a039082041 languageName: node linkType: hard @@ -6940,16 +6824,17 @@ __metadata: languageName: node linkType: hard -"iterator.prototype@npm:^1.1.2": - version: 1.1.2 - resolution: "iterator.prototype@npm:1.1.2" +"iterator.prototype@npm:^1.1.4": + version: 1.1.5 + resolution: "iterator.prototype@npm:1.1.5" dependencies: - define-properties: ^1.2.1 - get-intrinsic: ^1.2.1 - has-symbols: ^1.0.3 - reflect.getprototypeof: ^1.0.4 - set-function-name: ^2.0.1 - checksum: d8a507e2ccdc2ce762e8a1d3f4438c5669160ac72b88b648e59a688eec6bc4e64b22338e74000518418d9e693faf2a092d2af21b9ec7dbf7763b037a54701168 + define-data-property: ^1.1.4 + es-object-atoms: ^1.0.0 + get-intrinsic: ^1.2.6 + get-proto: ^1.0.0 + has-symbols: ^1.1.0 + set-function-name: ^2.0.2 + checksum: 7db23c42629ba4790e6e15f78b555f41dbd08818c85af306988364bd19d86716a1187cb333444f3a0036bfc078a0e9cb7ec67fef3a61662736d16410d7f77869 languageName: node linkType: hard @@ -6979,51 +6864,42 @@ __metadata: languageName: node linkType: hard -"jest-util@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-util@npm:29.6.2" +"jest-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-util@npm:29.7.0" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@types/node": "*" chalk: ^4.0.0 ci-info: ^3.2.0 graceful-fs: ^4.2.9 picomatch: ^2.2.3 - checksum: 8aedc0c80083d0cabd6c6c4f04dea1cbcac609fd7bc3b1fc05a3999291bd6e63dd52b0c806f9378d5cae28eff5a6191709a4987861001293f8d03e53984adca4 + checksum: 042ab4980f4ccd4d50226e01e5c7376a8556b472442ca6091a8f102488c0f22e6e8b89ea874111d2328a2080083bf3225c86f3788c52af0bd0345a00eb57a3ca languageName: node linkType: hard "jest-worker@npm:^29.6.2": - version: 29.6.2 - resolution: "jest-worker@npm:29.6.2" + version: 29.7.0 + resolution: "jest-worker@npm:29.7.0" dependencies: "@types/node": "*" - jest-util: ^29.6.2 + jest-util: ^29.7.0 merge-stream: ^2.0.0 supports-color: ^8.0.0 - checksum: 11035564534bf181ead80b25be138c2d42372bd5626151a3e705200d47a74fd9da3ca79f8a7b15806cdc325ad73c3d21d23acceeed99d50941589ff02915ed38 - languageName: node - linkType: hard - -"jiti@npm:^1.18.2": - version: 1.19.1 - resolution: "jiti@npm:1.19.1" - bin: - jiti: bin/jiti.js - checksum: fdf55e315f9e81c04ae902416642062851d92c6cdcc17a59d5d1d35e1a0842e4e79be38da86613c5776fa18c579954542a441b93d1c347a50137dee2e558cbd0 + checksum: 30fff60af49675273644d408b650fc2eb4b5dcafc5a0a455f238322a8f9d8a98d847baca9d51ff197b6747f54c7901daa2287799230b856a0f48287d131f8c13 languageName: node linkType: hard "jiti@npm:^1.21.6": - version: 1.21.6 - resolution: "jiti@npm:1.21.6" + version: 1.21.7 + resolution: "jiti@npm:1.21.7" bin: jiti: bin/jiti.js - checksum: 9ea4a70a7bb950794824683ed1c632e2ede26949fbd348e2ba5ec8dc5efa54dc42022d85ae229cadaa60d4b95012e80ea07d625797199b688cc22ab0e8891d32 + checksum: 9cd20dabf82e3a4cceecb746a69381da7acda93d34eed0cdb9c9bdff3bce07e4f2f4a016ca89924392c935297d9aedc58ff9f7d3281bc5293319ad244926e0b7 languageName: node linkType: hard -"jose@npm:^4.15.5": +"jose@npm:^4.15.5, jose@npm:^4.15.9": version: 4.15.9 resolution: "jose@npm:4.15.9" checksum: 41abe1c99baa3cf8a78ebbf93da8f8e50e417b7a26754c4afa21865d87527b8ac2baf66de2c5f6accc3f7d7158658dae7364043677236ea1d07895b040097f15 @@ -7055,6 +6931,15 @@ __metadata: languageName: node linkType: hard +"jsesc@npm:^3.0.2": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" + bin: + jsesc: bin/jsesc + checksum: 19c94095ea026725540c0d29da33ab03144f6bcf2d4159e4833d534976e99e0c09c38cefa9a575279a51fc36b31166f8d6d05c9fe2645d5f15851d690b41f17f + languageName: node + linkType: hard + "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -7158,9 +7043,9 @@ __metadata: linkType: hard "language-subtag-registry@npm:^0.3.20": - version: 0.3.22 - resolution: "language-subtag-registry@npm:0.3.22" - checksum: 8ab70a7e0e055fe977ac16ea4c261faec7205ac43db5e806f72e5b59606939a3b972c4bd1e10e323b35d6ffa97c3e1c4c99f6553069dad2dfdd22020fa3eb56a + version: 0.3.23 + resolution: "language-subtag-registry@npm:0.3.23" + checksum: 0b64c1a6c5431c8df648a6d25594ff280613c886f4a1a542d9b864e5472fb93e5c7856b9c41595c38fac31370328fc79fcc521712e89ea6d6866cbb8e0995d81 languageName: node linkType: hard @@ -7209,10 +7094,10 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:^2.0.5, lilconfig@npm:^2.1.0": - version: 2.1.0 - resolution: "lilconfig@npm:2.1.0" - checksum: 8549bb352b8192375fed4a74694cd61ad293904eee33f9d4866c2192865c44c4eb35d10782966242634e0cbc1e91fe62b1247f148dc5514918e3a966da7ea117 +"lilconfig@npm:^3.0.0, lilconfig@npm:^3.1.3": + version: 3.1.3 + resolution: "lilconfig@npm:3.1.3" + checksum: 644eb10830350f9cdc88610f71a921f510574ed02424b57b0b3abb66ea725d7a082559552524a842f4e0272c196b88dfe1ff7d35ffcc6f45736777185cd67c9a languageName: node linkType: hard @@ -7269,7 +7154,14 @@ __metadata: languageName: node linkType: hard -"loose-envify@npm:^1.0.0, loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": +"longest-streak@npm:^3.0.0": + version: 3.1.0 + resolution: "longest-streak@npm:3.1.0" + checksum: d7f952ed004cbdb5c8bcfc4f7f5c3d65449e6c5a9e9be4505a656e3df5a57ee125f284286b4bf8ecea0c21a7b3bf2b8f9001ad506c319b9815ad6a63a47d0fd0 + languageName: node + linkType: hard + +"loose-envify@npm:^1.1.0, loose-envify@npm:^1.4.0": version: 1.4.0 resolution: "loose-envify@npm:1.4.0" dependencies: @@ -7340,9 +7232,16 @@ __metadata: languageName: node linkType: hard +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 0e513b29d120f478c85a70f49da0b8b19bc638975eca466f2eeae0071f3ad00454c621bf66e16dd435896c208e719fc91ad79bbfba4e400fe0b372e7c1c9c9a2 + languageName: node + linkType: hard + "mdast-util-from-markdown@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-from-markdown@npm:2.0.0" + version: 2.0.2 + resolution: "mdast-util-from-markdown@npm:2.0.2" dependencies: "@types/mdast": ^4.0.0 "@types/unist": ^3.0.0 @@ -7356,13 +7255,71 @@ __metadata: micromark-util-symbol: ^2.0.0 micromark-util-types: ^2.0.0 unist-util-stringify-position: ^4.0.0 - checksum: 4e8d8a46b4b588486c41b80c39da333a91593bc8d60cd7421c6cd3c22003b8e5a62478292fb7bc97b9255b6301a2250cca32340ef43c309156e215453c5b92be + checksum: 1ad19f48b30ac6e0cb756070c210c78ad93c26876edfb3f75127783bc6df8b9402016d8f3e9964f3d1d5430503138ec65c145e869438727e1aa7f3cebf228fba + languageName: node + linkType: hard + +"mdast-util-mdx-expression@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-mdx-expression@npm:2.0.1" + dependencies: + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + devlop: ^1.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: 6af56b06bde3ab971129db9855dcf0d31806c70b3b052d7a90a5499a366b57ffd0c2efca67d281c448c557298ba7e3e61bd07133733b735440840dd339b28e19 + languageName: node + linkType: hard + +"mdast-util-mdx-jsx@npm:^3.0.0": + version: 3.2.0 + resolution: "mdast-util-mdx-jsx@npm:3.2.0" + dependencies: + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + "@types/unist": ^3.0.0 + ccount: ^2.0.0 + devlop: ^1.1.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + parse-entities: ^4.0.0 + stringify-entities: ^4.0.0 + unist-util-stringify-position: ^4.0.0 + vfile-message: ^4.0.0 + checksum: 224f5f6ad247f0f2622ee36c82ac7a4c6a60c31850de4056bf95f531bd2f7ec8943ef34dfe8a8375851f65c07e4913c4f33045d703df4ff4d11b2de5a088f7f9 + languageName: node + linkType: hard + +"mdast-util-mdxjs-esm@npm:^2.0.0": + version: 2.0.1 + resolution: "mdast-util-mdxjs-esm@npm:2.0.1" + dependencies: + "@types/estree-jsx": ^1.0.0 + "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 + devlop: ^1.0.0 + mdast-util-from-markdown: ^2.0.0 + mdast-util-to-markdown: ^2.0.0 + checksum: 1f9dad04d31d59005332e9157ea9510dc1d03092aadbc607a10475c7eec1c158b475aa0601a3a4f74e13097ca735deb8c2d9d37928ddef25d3029fd7c9e14dc3 + languageName: node + linkType: hard + +"mdast-util-phrasing@npm:^4.0.0": + version: 4.1.0 + resolution: "mdast-util-phrasing@npm:4.1.0" + dependencies: + "@types/mdast": ^4.0.0 + unist-util-is: ^6.0.0 + checksum: 3a97533e8ad104a422f8bebb34b3dde4f17167b8ed3a721cf9263c7416bd3447d2364e6d012a594aada40cac9e949db28a060bb71a982231693609034ed5324e languageName: node linkType: hard "mdast-util-to-hast@npm:^13.0.0": - version: 13.0.2 - resolution: "mdast-util-to-hast@npm:13.0.2" + version: 13.2.0 + resolution: "mdast-util-to-hast@npm:13.2.0" dependencies: "@types/hast": ^3.0.0 "@types/mdast": ^4.0.0 @@ -7372,7 +7329,25 @@ __metadata: trim-lines: ^3.0.0 unist-util-position: ^5.0.0 unist-util-visit: ^5.0.0 - checksum: 8fef6c3752476461d9c00b1dea4f141bc7d980e1b3bac7bd965bc68f532b6d30fb1c9e810433327c167176e68e071b8f4ab5a45355954857dc095c878421f35e + vfile: ^6.0.0 + checksum: 7e5231ff3d4e35e1421908437577fd5098141f64918ff5cc8a0f7a8a76c5407f7a3ee88d75f7a1f7afb763989c9f357475fa0ba8296c00aaff1e940098fe86a6 + languageName: node + linkType: hard + +"mdast-util-to-markdown@npm:^2.0.0": + version: 2.1.2 + resolution: "mdast-util-to-markdown@npm:2.1.2" + dependencies: + "@types/mdast": ^4.0.0 + "@types/unist": ^3.0.0 + longest-streak: ^3.0.0 + mdast-util-phrasing: ^4.0.0 + mdast-util-to-string: ^4.0.0 + micromark-util-classify-character: ^2.0.0 + micromark-util-decode-string: ^2.0.0 + unist-util-visit: ^5.0.0 + zwitch: ^2.0.0 + checksum: 288d152bd50c00632e6e01c610bb904a220d1e226c8086c40627877959746f83ab0b872f4150cb7d910198953b1bf756e384ac3fee3e7b0ddb4517f9084c5803 languageName: node linkType: hard @@ -7385,22 +7360,22 @@ __metadata: languageName: node linkType: hard -"mediasoup-client@npm:3.7.12": - version: 3.7.12 - resolution: "mediasoup-client@npm:3.7.12" +"mediasoup-client@npm:3.7.18": + version: 3.7.18 + resolution: "mediasoup-client@npm:3.7.18" dependencies: "@types/debug": ^4.1.12 "@types/npm-events-package": "npm:@types/events@^3.0.3" awaitqueue: ^3.0.2 - debug: ^4.3.5 + debug: ^4.3.7 fake-mediastreamtrack: ^1.2.0 h264-profile-level-id: ^2.0.0 npm-events-package: "npm:events@^3.3.0" queue-microtask: ^1.2.3 - sdp-transform: ^2.14.2 + sdp-transform: ^2.15.0 supports-color: ^9.4.0 - ua-parser-js: ^1.0.38 - checksum: 5df538bbe04c6f14c58d6d913985afe2e855146881b24022035621167456c296a3410f2da63ddca41fd90b8c80426163e3a94c8ac0064469368b973f1ca7e976 + ua-parser-js: ^2.0.0 + checksum: 9117bf78661d1f98fab62f4a2c01e4b90217b84ae4b8e488a1fc39d84773320b7916adf5c39b6e0cc83eaed0305bbb06208a1f45263343bad40963c0b4553bab languageName: node linkType: hard @@ -7418,7 +7393,7 @@ __metadata: languageName: node linkType: hard -"merge2@npm:^1.3.0, merge2@npm:^1.4.1": +"merge2@npm:^1.3.0": version: 1.4.1 resolution: "merge2@npm:1.4.1" checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 @@ -7446,8 +7421,8 @@ __metadata: linkType: hard "micromark-core-commonmark@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-core-commonmark@npm:2.0.0" + version: 2.0.3 + resolution: "micromark-core-commonmark@npm:2.0.3" dependencies: decode-named-character-reference: ^1.0.0 devlop: ^1.0.0 @@ -7465,200 +7440,200 @@ __metadata: micromark-util-subtokenize: ^2.0.0 micromark-util-symbol: ^2.0.0 micromark-util-types: ^2.0.0 - checksum: 9c12fb580cf4ce71f60872043bd2794efe129f44d7b2b73afa155bbc0a66b7bc35655ba8cef438a6bd068441837ed3b6dc6ad7e5a18f815462c1750793e03a42 + checksum: cfb0fd9c895f86a4e9344f7f0344fe6bd1018945798222835248146a42430b8c7bc0b2857af574cf4e1b4ce4e5c1a35a1479942421492e37baddde8de85814dc languageName: node linkType: hard "micromark-factory-destination@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-destination@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-destination@npm:2.0.1" dependencies: micromark-util-character: ^2.0.0 micromark-util-symbol: ^2.0.0 micromark-util-types: ^2.0.0 - checksum: d36e65ed1c072ff4148b016783148ba7c68a078991154625723e24bda3945160268fb91079fb28618e1613c2b6e70390a8ddc544c45410288aa27b413593071a + checksum: 9c4baa9ca2ed43c061bbf40ddd3d85154c2a0f1f485de9dea41d7dd2ad994ebb02034a003b2c1dbe228ba83a0576d591f0e90e0bf978713f84ee7d7f3aa98320 languageName: node linkType: hard "micromark-factory-label@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-label@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-label@npm:2.0.1" dependencies: devlop: ^1.0.0 micromark-util-character: ^2.0.0 micromark-util-symbol: ^2.0.0 micromark-util-types: ^2.0.0 - checksum: c021dbd0ed367610d35f2bae21209bc804d1a6d1286ffce458fd6a717f4d7fe581a7cba7d5c2d7a63757c44eb927c80d6a571d6ea7969fae1b48ab6461d109c4 + checksum: bd03f5a75f27cdbf03b894ddc5c4480fc0763061fecf9eb927d6429233c930394f223969a99472df142d570c831236134de3dc23245d23d9f046f9d0b623b5c2 languageName: node linkType: hard "micromark-factory-space@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-space@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-space@npm:2.0.1" dependencies: micromark-util-character: ^2.0.0 micromark-util-types: ^2.0.0 - checksum: 4ffdcdc2f759887bbb356500cb460b3915ecddcb5d85c3618d7df68ad05d13ed02b1153ee1845677b7d8126df8f388288b84fcf0d943bd9c92bcc71cd7222e37 + checksum: 1bd68a017c1a66f4787506660c1e1c5019169aac3b1cb075d49ac5e360e0b2065e984d4e1d6e9e52a9d44000f2fa1c98e66a743d7aae78b4b05616bf3242ed71 languageName: node linkType: hard "micromark-factory-title@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-title@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-title@npm:2.0.1" dependencies: micromark-factory-space: ^2.0.0 micromark-util-character: ^2.0.0 micromark-util-symbol: ^2.0.0 micromark-util-types: ^2.0.0 - checksum: 39e1ac23af3554e6e652e56065579bc7faf21ade7b8704b29c175871b4152b7109b790bb3cae0f7e088381139c6bac9553b8400772c3d322e4fa635f813a3578 + checksum: b4d2e4850a8ba0dff25ce54e55a3eb0d43dda88a16293f53953153288f9d84bcdfa8ca4606b2cfbb4f132ea79587bbb478a73092a349f893f5264fbcdbce2ee1 languageName: node linkType: hard "micromark-factory-whitespace@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-whitespace@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-whitespace@npm:2.0.1" dependencies: micromark-factory-space: ^2.0.0 micromark-util-character: ^2.0.0 micromark-util-symbol: ^2.0.0 micromark-util-types: ^2.0.0 - checksum: 9587c2546d1a58b4d5472b42adf05463f6212d0449455285662d63cd8eaed89c6b159ac82713fcee5f9dd88628c24307d9533cccd8971a2f3f4d48702f8f850a + checksum: 67b3944d012a42fee9e10e99178254a04d48af762b54c10a50fcab988688799993efb038daf9f5dbc04001a97b9c1b673fc6f00e6a56997877ab25449f0c8650 languageName: node linkType: hard "micromark-util-character@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-character@npm:2.0.1" + version: 2.1.1 + resolution: "micromark-util-character@npm:2.1.1" dependencies: micromark-util-symbol: ^2.0.0 micromark-util-types: ^2.0.0 - checksum: 318d6e16fdcbe9d89e18b8e7796568d986abbb10a9f3037b7ac9b92a236bcc962f3cd380e26a7c49df40fd1d9ca33eb546268956345b662f4c4ca4962c7695f2 + checksum: e9e409efe4f2596acd44587e8591b722bfc041c1577e8fe0d9c007a4776fb800f9b3637a22862ad2ba9489f4bdf72bb547fce5767dbbfe0a5e6760e2a21c6495 languageName: node linkType: hard "micromark-util-chunked@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-chunked@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-chunked@npm:2.0.1" dependencies: micromark-util-symbol: ^2.0.0 - checksum: 324f95cccdae061332a8241936eaba6ef0782a1e355bac5c607ad2564fd3744929be7dc81651315a2921535747a33243e6a5606bcb64b7a56d49b6d74ea1a3d4 + checksum: f8cb2a67bcefe4bd2846d838c97b777101f0043b9f1de4f69baf3e26bb1f9885948444e3c3aec66db7595cad8173bd4567a000eb933576c233d54631f6323fe4 languageName: node linkType: hard "micromark-util-classify-character@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-classify-character@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-classify-character@npm:2.0.1" dependencies: micromark-util-character: ^2.0.0 micromark-util-symbol: ^2.0.0 micromark-util-types: ^2.0.0 - checksum: 086e52904deffebb793fb1c08c94aabb8901f76958142dfc3a6282890ebaa983b285e69bd602b9d507f1b758ed38e75a994d2ad9fbbefa7de2584f67a16af405 + checksum: 4d8bbe3a6dbf69ac0fc43516866b5bab019fe3f4568edc525d4feaaaf78423fa54e6b6732b5bccbeed924455279a3758ffc9556954aafb903982598a95a02704 languageName: node linkType: hard "micromark-util-combine-extensions@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-combine-extensions@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-combine-extensions@npm:2.0.1" dependencies: micromark-util-chunked: ^2.0.0 micromark-util-types: ^2.0.0 - checksum: 107c47700343f365b4ed81551e18bc3458b573c500e56ac052b2490bd548adc475216e41d2271633a8867fac66fc22ba3e0a2d74a31ed79b9870ca947eb4e3ba + checksum: 5d22fb9ee37e8143adfe128a72b50fa09568c2cc553b3c76160486c96dbbb298c5802a177a10a215144a604b381796071b5d35be1f2c2b2ee17995eda92f0c8e languageName: node linkType: hard "micromark-util-decode-numeric-character-reference@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.0" + version: 2.0.2 + resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.2" dependencies: micromark-util-symbol: ^2.0.0 - checksum: 705715a2dd6f10d85c69371b4176a0b2fec5811a14f7d26f66f358ac5adebb12975f79597b1a1a184a6dcf6799319f7cf8eb91398e47c1faa2cab2c84f155b78 + checksum: ee11c8bde51e250e302050474c4a2adca094bca05c69f6cdd241af12df285c48c88d19ee6e022b9728281c280be16328904adca994605680c43af56019f4b0b6 languageName: node linkType: hard "micromark-util-decode-string@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-decode-string@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-decode-string@npm:2.0.1" dependencies: decode-named-character-reference: ^1.0.0 micromark-util-character: ^2.0.0 micromark-util-decode-numeric-character-reference: ^2.0.0 micromark-util-symbol: ^2.0.0 - checksum: a75daf32a4a6b549e9f19b4d833ebfeb09a32a9a1f9ce50f35dec6b6a3e4f9f121f49024ba7f9c91c55ebe792f7c7a332fc9604795181b6a612637df0df5b959 + checksum: e9546ae53f9b5a4f9aa6aaf3e750087100d3429485ca80dbacec99ff2bb15a406fa7d93784a0fc2fe05ad7296b9295e75160ef71faec9e90110b7be2ae66241a languageName: node linkType: hard "micromark-util-encode@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-encode@npm:2.0.0" - checksum: 853a3f33fce72aaf4ffa60b7f2b6fcfca40b270b3466e1b96561b02185d2bd8c01dd7948bc31a24ac014f4cc854e545ca9a8e9cf7ea46262f9d24c9e88551c66 + version: 2.0.1 + resolution: "micromark-util-encode@npm:2.0.1" + checksum: be890b98e78dd0cdd953a313f4148c4692cc2fb05533e56fef5f421287d3c08feee38ca679f318e740530791fc251bfe8c80efa926fcceb4419b269c9343d226 languageName: node linkType: hard "micromark-util-html-tag-name@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-html-tag-name@npm:2.0.0" - checksum: d786d4486f93eb0ac5b628779809ca97c5dc60f3c9fc03eb565809831db181cf8cb7f05f9ac76852f3eb35461af0f89fa407b46f3a03f4f97a96754d8dc540d8 + version: 2.0.1 + resolution: "micromark-util-html-tag-name@npm:2.0.1" + checksum: dea365f5ad28ad74ff29fcb581f7b74fc1f80271c5141b3b2bc91c454cbb6dfca753f28ae03730d657874fcbd89d0494d0e3965dfdca06d9855f467c576afa9d languageName: node linkType: hard "micromark-util-normalize-identifier@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-normalize-identifier@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-normalize-identifier@npm:2.0.1" dependencies: micromark-util-symbol: ^2.0.0 - checksum: b36da2d3fd102053dadd953ce5c558328df12a63a8ac0e5aad13d4dda8e43b6a5d4a661baafe0a1cd8a260bead4b4a8e6e0e74193dd651e8484225bd4f4e68aa + checksum: 1eb9a289d7da067323df9fdc78bfa90ca3207ad8fd893ca02f3133e973adcb3743b233393d23d95c84ccaf5d220ae7f5a28402a644f135dcd4b8cfa60a7b5f84 languageName: node linkType: hard "micromark-util-resolve-all@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-resolve-all@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-resolve-all@npm:2.0.1" dependencies: micromark-util-types: ^2.0.0 - checksum: 31fe703b85572cb3f598ebe32750e59516925c7ff1f66cfe6afaebe0771a395a9eaa770787f2523d3c46082ea80e6c14f83643303740b3d650af7c96ebd30ccc + checksum: 9275f3ddb6c26f254dd2158e66215d050454b279707a7d9ce5a3cd0eba23201021cedcb78ae1a746c1b23227dcc418ee40dd074ade195359506797a5493550cc languageName: node linkType: hard "micromark-util-sanitize-uri@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-sanitize-uri@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-sanitize-uri@npm:2.0.1" dependencies: micromark-util-character: ^2.0.0 micromark-util-encode: ^2.0.0 micromark-util-symbol: ^2.0.0 - checksum: ea4c28bbffcf2430e9aff2d18554296789a8b0a1f54ac24020d1dde76624a7f93e8f2a83e88cd5a846b6d2c4287b71b1142d1b89fa7f1b0363a9b33711a141fe + checksum: d01517840c17de67aaa0b0f03bfe05fac8a41d99723cd8ce16c62f6810e99cd3695364a34c335485018e5e2c00e69031744630a1b85c6868aa2f2ca1b36daa2f languageName: node linkType: hard "micromark-util-subtokenize@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-subtokenize@npm:2.0.0" + version: 2.1.0 + resolution: "micromark-util-subtokenize@npm:2.1.0" dependencies: devlop: ^1.0.0 micromark-util-chunked: ^2.0.0 micromark-util-symbol: ^2.0.0 micromark-util-types: ^2.0.0 - checksum: 77d9c7d59c05a20468d49ce2a3640e9cb268c083ccad02322f26c84e1094c25b44f4b8139ef0a247ca11a4fef7620c5bf82fbffd98acdb2989e79cbe7bd8f1db + checksum: 2e194bc8a5279d256582020500e5072a95c1094571be49043704343032e1fffbe09c862ef9c131cf5c762e296ddb54ff8bc767b3786a798524a68d1db6942934 languageName: node linkType: hard "micromark-util-symbol@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-symbol@npm:2.0.0" - checksum: fa4a05bff575d9fbf0ad96a1013003e3bb6087ed6b34b609a141b6c0d2137b57df594aca409a95f4c5fda199f227b56a7d8b1f82cea0768df161d8a3a3660764 + version: 2.0.1 + resolution: "micromark-util-symbol@npm:2.0.1" + checksum: fb7346950550bc85a55793dda94a8b3cb3abc068dbd7570d1162db7aee803411d06c0a5de4ae59cd945f46143bdeadd4bba02a02248fa0d18cc577babaa00044 languageName: node linkType: hard "micromark-util-types@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-types@npm:2.0.0" - checksum: 819fef3ab5770c37893d2a60381fb2694396c8d22803b6e103c830c3a1bc1490363c2b0470bb2acaaddad776dfbc2fc1fcfde39cb63c4f54d95121611672e3d0 + version: 2.0.2 + resolution: "micromark-util-types@npm:2.0.2" + checksum: 884f7974839e4bc6d2bd662e57c973a9164fd5c0d8fe16cddf07472b86a7e6726747c00674952c0321d17685d700cd3295e9f58a842a53acdf6c6d55ab051aab languageName: node linkType: hard "micromark@npm:^4.0.0": - version: 4.0.0 - resolution: "micromark@npm:4.0.0" + version: 4.0.2 + resolution: "micromark@npm:4.0.2" dependencies: "@types/debug": ^4.0.0 debug: ^4.0.0 @@ -7677,11 +7652,11 @@ __metadata: micromark-util-subtokenize: ^2.0.0 micromark-util-symbol: ^2.0.0 micromark-util-types: ^2.0.0 - checksum: b84ab5ab1a0b28c063c52e9c2c9d7d44b954507235c10c9492d66e0b38f7de24bf298f914a1fbdf109f2a57a88cf0412de217c84cfac5fd60e3e42a74dbac085 + checksum: 5306c15dd12f543755bc627fc361d4255dfc430e7af6069a07ac0eacc338fbd761fe8e93f02a8bfab6097bab12ee903192fe31389222459d5029242a5aaba3b8 languageName: node linkType: hard -"micromatch@npm:^4.0.2": +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -7691,16 +7666,6 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": - version: 4.0.5 - resolution: "micromatch@npm:4.0.5" - dependencies: - braces: ^3.0.2 - picomatch: ^2.3.1 - checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc - languageName: node - linkType: hard - "mime-db@npm:1.52.0": version: 1.52.0 resolution: "mime-db@npm:1.52.0" @@ -7733,22 +7698,6 @@ __metadata: languageName: node linkType: hard -"mimic-fn@npm:^4.0.0": - version: 4.0.0 - resolution: "mimic-fn@npm:4.0.0" - checksum: 995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 - languageName: node - linkType: hard - -"minimatch@npm:9.0.3": - version: 9.0.3 - resolution: "minimatch@npm:9.0.3" - dependencies: - brace-expansion: ^2.0.1 - checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 - languageName: node - linkType: hard - "minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -7924,15 +7873,15 @@ __metadata: languageName: node linkType: hard -"mlly@npm:^1.7.1": - version: 1.7.1 - resolution: "mlly@npm:1.7.1" +"mlly@npm:^1.7.1, mlly@npm:^1.7.4": + version: 1.7.4 + resolution: "mlly@npm:1.7.4" dependencies: - acorn: ^8.11.3 - pathe: ^1.1.2 - pkg-types: ^1.1.1 - ufo: ^1.5.3 - checksum: 956a6d54119eef782f302580f63a9800654e588cd70015b4218a00069c6ef11b87984e8ffe140a4668b0100ad4022b11d1f9b11ac2c6dbafa4d8bc33ae3a08a8 + acorn: ^8.14.0 + pathe: ^2.0.1 + pkg-types: ^1.3.0 + ufo: ^1.5.4 + checksum: a290da940d208f9d77ceed7ed1db3397e37ff083d28bf75e3c92097a8e58967a2b2e2bea33fdcdc63005e2987854cd081dd0621461d89eee4b61c977b5fa020c languageName: node linkType: hard @@ -7950,14 +7899,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:^2.1.1": +"ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -7975,12 +7917,21 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.6": - version: 3.3.6 - resolution: "nanoid@npm:3.3.6" +"nanoid@npm:^3.3.11, nanoid@npm:^3.3.6": + version: 3.3.11 + resolution: "nanoid@npm:3.3.11" bin: nanoid: bin/nanoid.cjs - checksum: 7d0eda657002738aa5206107bd0580aead6c95c460ef1bdd0b1a87a9c7ae6277ac2e9b945306aaa5b32c6dcb7feaf462d0f552e7f8b5718abfc6ead5c94a71b3 + checksum: 3be20d8866a57a6b6d218e82549711c8352ed969f9ab3c45379da28f405363ad4c9aeb0b39e9abc101a529ca65a72ff9502b00bf74a912c4b64a9d62dfd26c29 + languageName: node + linkType: hard + +"napi-postinstall@npm:^0.2.2": + version: 0.2.4 + resolution: "napi-postinstall@npm:0.2.4" + bin: + napi-postinstall: lib/cli.js + checksum: a0d07495a42953983bbefdf7bae7aa4114b01e231261bd01869568f4a0147347bf5e921dc0d4f618f93e56d54cc6e0d01f49e8da5d1f353ece019cc56157ab4b languageName: node linkType: hard @@ -8006,12 +7957,12 @@ __metadata: linkType: hard "next-auth@npm:^4.24.7": - version: 4.24.7 - resolution: "next-auth@npm:4.24.7" + version: 4.24.11 + resolution: "next-auth@npm:4.24.11" dependencies: "@babel/runtime": ^7.20.13 "@panva/hkdf": ^1.0.2 - cookie: ^0.5.0 + cookie: ^0.7.0 jose: ^4.15.5 oauth: ^0.9.15 openid-client: ^5.4.0 @@ -8019,31 +7970,34 @@ __metadata: preact-render-to-string: ^5.1.19 uuid: ^8.3.2 peerDependencies: - next: ^12.2.5 || ^13 || ^14 + "@auth/core": 0.34.2 + next: ^12.2.5 || ^13 || ^14 || ^15 nodemailer: ^6.6.5 - react: ^17.0.2 || ^18 - react-dom: ^17.0.2 || ^18 + react: ^17.0.2 || ^18 || ^19 + react-dom: ^17.0.2 || ^18 || ^19 peerDependenciesMeta: + "@auth/core": + optional: true nodemailer: optional: true - checksum: e7849ecf86394d86f08730b96f869c9353b6cc003794fcd953db2949f1ab06a2ce4f7a67312fdb8c7b3bbe7e99a8a215f11ef4eba5ec93f6c3e8ac1954e8b3e6 + checksum: f599366ac8c43b9973bd5fbb4e73cab3ad7f583dd5b2c54cf5c6b5219459117262b0a2012dc3234ef1240de9134a04854abbbccc8bca58fcc48aae45ef347bba languageName: node linkType: hard "next@npm:^14.2.7": - version: 14.2.7 - resolution: "next@npm:14.2.7" + version: 14.2.30 + resolution: "next@npm:14.2.30" dependencies: - "@next/env": 14.2.7 - "@next/swc-darwin-arm64": 14.2.7 - "@next/swc-darwin-x64": 14.2.7 - "@next/swc-linux-arm64-gnu": 14.2.7 - "@next/swc-linux-arm64-musl": 14.2.7 - "@next/swc-linux-x64-gnu": 14.2.7 - "@next/swc-linux-x64-musl": 14.2.7 - "@next/swc-win32-arm64-msvc": 14.2.7 - "@next/swc-win32-ia32-msvc": 14.2.7 - "@next/swc-win32-x64-msvc": 14.2.7 + "@next/env": 14.2.30 + "@next/swc-darwin-arm64": 14.2.30 + "@next/swc-darwin-x64": 14.2.30 + "@next/swc-linux-arm64-gnu": 14.2.30 + "@next/swc-linux-arm64-musl": 14.2.30 + "@next/swc-linux-x64-gnu": 14.2.30 + "@next/swc-linux-x64-musl": 14.2.30 + "@next/swc-win32-arm64-msvc": 14.2.30 + "@next/swc-win32-ia32-msvc": 14.2.30 + "@next/swc-win32-x64-msvc": 14.2.30 "@swc/helpers": 0.5.5 busboy: 1.6.0 caniuse-lite: ^1.0.30001579 @@ -8084,7 +8038,7 @@ __metadata: optional: true bin: next: dist/bin/next - checksum: bc0237acb57c338803e0ef5ecc1b51908583da9d9dd325ece8b5862beba27b0ab556e9f8bdea863fc4fbf8378200946dcb0ad911ea978d166c8741c434461fe7 + checksum: 60add50e630872ef83392757d239817a328f49457b1b1880f1eeee78eef4c26dc7d1050eb17110683ba06eee4115e5581e22e76cda8613fbbac1d7e945b2ca5e languageName: node linkType: hard @@ -8095,10 +8049,19 @@ __metadata: languageName: node linkType: hard -"node-fetch-native@npm:^1.6.3": - version: 1.6.4 - resolution: "node-fetch-native@npm:1.6.4" - checksum: 7b159f610e037e8813750096a6616ec6771e9abf868aa6e75e5b790bfc2ba2d92cf2abcce33c18fd01f2e5e5cc72de09c78bd4381e7f8c0887f7de21bd96f045 +"node-addon-api@npm:^7.0.0": + version: 7.1.1 + resolution: "node-addon-api@npm:7.1.1" + dependencies: + node-gyp: latest + checksum: 46051999e3289f205799dfaf6bcb017055d7569090f0004811110312e2db94cb4f8654602c7eb77a60a1a05142cc2b96e1b5c56ca4622c41a5c6370787faaf30 + languageName: node + linkType: hard + +"node-fetch-native@npm:^1.6.6": + version: 1.6.6 + resolution: "node-fetch-native@npm:1.6.6" + checksum: 1d8559b0828784d089c10bdaccdbfac35af41d8c93edfaf14b3aa7bb9fc1ea33a252a43f2dc31e95b7e8c6516794b227a532d9647483dea85e48beb93cbcfb83 languageName: node linkType: hard @@ -8130,9 +8093,9 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.7": - version: 2.6.12 - resolution: "node-fetch@npm:2.6.12" +"node-fetch@npm:^2.6.7, node-fetch@npm:^2.7.0": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" dependencies: whatwg-url: ^5.0.0 peerDependencies: @@ -8140,18 +8103,18 @@ __metadata: peerDependenciesMeta: encoding: optional: true - checksum: 3bc1655203d47ee8e313c0d96664b9673a3d4dd8002740318e9d27d14ef306693a4b2ef8d6525775056fd912a19e23f3ac0d7111ad8925877b7567b29a625592 + checksum: d76d2f5edb451a3f05b15115ec89fc6be39de37c6089f1b6368df03b91e1633fd379a7e01b7ab05089a25034b2023d959b47e59759cb38d88341b2459e89d6e5 languageName: node linkType: hard "node-gyp-build@npm:^4.2.2": - version: 4.8.2 - resolution: "node-gyp-build@npm:4.8.2" + version: 4.8.4 + resolution: "node-gyp-build@npm:4.8.4" bin: node-gyp-build: bin.js node-gyp-build-optional: optional.js node-gyp-build-test: build-test.js - checksum: 1a57bba8c4c193f808bd8ad1484d4ebdd8106dd9f04a3e82554dc716e3a2d87d7e369e9503c145e0e6a7e2c663fec0d8aaf52bd8156342ec7fc388195f37824e + checksum: 8b81ca8ffd5fa257ad8d067896d07908a36918bc84fb04647af09d92f58310def2d2b8614d8606d129d9cd9b48890a5d2bec18abe7fcff54818f72bedd3a7d74 languageName: node linkType: hard @@ -8175,10 +8138,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.18": - version: 2.0.18 - resolution: "node-releases@npm:2.0.18" - checksum: ef55a3d853e1269a6d6279b7692cd6ff3e40bc74947945101138745bfdc9a5edabfe72cb19a31a8e45752e1910c4c65c77d931866af6357f242b172b7283f5b3 +"node-releases@npm:^2.0.19": + version: 2.0.19 + resolution: "node-releases@npm:2.0.19" + checksum: 917dbced519f48c6289a44830a0ca6dc944c3ee9243c468ebd8515a41c97c8b2c256edb7f3f750416bc37952cc9608684e6483c7b6c6f39f6bd8d86c52cfe658 languageName: node linkType: hard @@ -8227,15 +8190,6 @@ __metadata: languageName: node linkType: hard -"npm-run-path@npm:^5.1.0": - version: 5.3.0 - resolution: "npm-run-path@npm:5.3.0" - dependencies: - path-key: ^4.0.0 - checksum: ae8e7a89da9594fb9c308f6555c73f618152340dcaae423e5fb3620026fefbec463618a8b761920382d666fa7a2d8d240b6fe320e8a6cdd54dc3687e2b659d25 - languageName: node - linkType: hard - "npmlog@npm:^5.0.1": version: 5.0.1 resolution: "npmlog@npm:5.0.1" @@ -8248,19 +8202,19 @@ __metadata: languageName: node linkType: hard -"nypm@npm:^0.3.8": - version: 0.3.9 - resolution: "nypm@npm:0.3.9" +"nypm@npm:^0.5.4": + version: 0.5.4 + resolution: "nypm@npm:0.5.4" dependencies: citty: ^0.1.6 - consola: ^3.2.3 - execa: ^8.0.1 - pathe: ^1.1.2 - pkg-types: ^1.1.1 - ufo: ^1.5.3 + consola: ^3.4.0 + pathe: ^2.0.3 + pkg-types: ^1.3.1 + tinyexec: ^0.3.2 + ufo: ^1.5.4 bin: nypm: dist/cli.mjs - checksum: 67fb85384d097fa281047d8dccc23bff4a4ffd7be8952c575c3ceda1b3bbc1401b8e0660d7a0f742b80e8b63f097d040dbba410cae4b94b8cad6a66e94ad8710 + checksum: cd3710a5a27924120ac4ea3404fe18357742804d6ffae89a1d483dd48b2e0daed899e6bc465295a2e97a09855ed9aa3fe5c25d5e62304615f5f5be0935ca24cf languageName: node linkType: hard @@ -8292,17 +8246,10 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.1": - version: 1.13.1 - resolution: "object-inspect@npm:1.13.1" - checksum: 7d9fa9221de3311dcb5c7c307ee5dc011cdd31dc43624b7c184b3840514e118e05ef0002be5388304c416c0eb592feb46e983db12577fc47e47d5752fbbfb61f - languageName: node - linkType: hard - -"object-inspect@npm:^1.9.0": - version: 1.12.3 - resolution: "object-inspect@npm:1.12.3" - checksum: dabfd824d97a5f407e6d5d24810d888859f6be394d8b733a77442b277e0808860555176719c5905e765e3743a7cada6b8b0a3b85e5331c530fd418cc8ae991db +"object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 582810c6a8d2ef988ea0a39e69e115a138dad8f42dd445383b394877e5816eb4268489f316a6f74ee9c4e0a984b3eab1028e3e79d62b1ed67c726661d55c7a8b languageName: node linkType: hard @@ -8313,84 +8260,78 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.4": - version: 4.1.5 - resolution: "object.assign@npm:4.1.5" +"object.assign@npm:^4.1.4, object.assign@npm:^4.1.7": + version: 4.1.7 + resolution: "object.assign@npm:4.1.7" dependencies: - call-bind: ^1.0.5 + call-bind: ^1.0.8 + call-bound: ^1.0.3 define-properties: ^1.2.1 - has-symbols: ^1.0.3 + es-object-atoms: ^1.0.0 + has-symbols: ^1.1.0 object-keys: ^1.1.1 - checksum: f9aeac0541661370a1fc86e6a8065eb1668d3e771f7dbb33ee54578201336c057b21ee61207a186dd42db0c62201d91aac703d20d12a79fc79c353eed44d4e25 + checksum: 60e07d2651cf4f5528c485f1aa4dbded9b384c47d80e8187cefd11320abb1aebebf78df5483451dfa549059f8281c21f7b4bf7d19e9e5e97d8d617df0df298de languageName: node linkType: hard -"object.entries@npm:^1.1.6, object.entries@npm:^1.1.7": - version: 1.1.7 - resolution: "object.entries@npm:1.1.7" +"object.entries@npm:^1.1.9": + version: 1.1.9 + resolution: "object.entries@npm:1.1.9" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: da287d434e7e32989586cd734382364ba826a2527f2bc82e6acbf9f9bfafa35d51018b66ec02543ffdfa2a5ba4af2b6f1ca6e588c65030cb4fd9c67d6ced594c + call-bind: ^1.0.8 + call-bound: ^1.0.4 + define-properties: ^1.2.1 + es-object-atoms: ^1.1.1 + checksum: 0ab2ef331c4d6a53ff600a5d69182948d453107c3a1f7fd91bc29d387538c2aba21d04949a74f57c21907208b1f6fb175567fd1f39f1a7a4046ba1bca762fb41 languageName: node linkType: hard -"object.fromentries@npm:^2.0.6, object.fromentries@npm:^2.0.7": - version: 2.0.7 - resolution: "object.fromentries@npm:2.0.7" +"object.fromentries@npm:^2.0.8": + version: 2.0.8 + resolution: "object.fromentries@npm:2.0.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 7341ce246e248b39a431b87a9ddd331ff52a454deb79afebc95609f94b1f8238966cf21f52188f2a353f0fdf83294f32f1ebf1f7826aae915ebad21fd0678065 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + es-object-atoms: ^1.0.0 + checksum: 29b2207a2db2782d7ced83f93b3ff5d425f901945f3665ffda1821e30a7253cd1fd6b891a64279976098137ddfa883d748787a6fea53ecdb51f8df8b8cec0ae1 languageName: node linkType: hard -"object.groupby@npm:^1.0.1": - version: 1.0.1 - resolution: "object.groupby@npm:1.0.1" +"object.groupby@npm:^1.0.3": + version: 1.0.3 + resolution: "object.groupby@npm:1.0.3" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 - checksum: d7959d6eaaba358b1608066fc67ac97f23ce6f573dc8fc661f68c52be165266fcb02937076aedb0e42722fdda0bdc0bbf74778196ac04868178888e9fd3b78b5 + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.2 + checksum: 0d30693ca3ace29720bffd20b3130451dca7a56c612e1926c0a1a15e4306061d84410bdb1456be2656c5aca53c81b7a3661eceaa362db1bba6669c2c9b6d1982 languageName: node linkType: hard -"object.hasown@npm:^1.1.2": - version: 1.1.3 - resolution: "object.hasown@npm:1.1.3" +"object.values@npm:^1.1.6, object.values@npm:^1.2.0, object.values@npm:^1.2.1": + version: 1.2.1 + resolution: "object.values@npm:1.2.1" dependencies: - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 76bc17356f6124542fb47e5d0e78d531eafa4bba3fc2d6fc4b1a8ce8b6878912366c0d99f37ce5c84ada8fd79df7aa6ea1214fddf721f43e093ad2df51f27da1 - languageName: node - linkType: hard - -"object.values@npm:^1.1.6, object.values@npm:^1.1.7": - version: 1.1.7 - resolution: "object.values@npm:1.1.7" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: f3e4ae4f21eb1cc7cebb6ce036d4c67b36e1c750428d7b7623c56a0db90edced63d08af8a316d81dfb7c41a3a5fa81b05b7cc9426e98d7da986b1682460f0777 + call-bind: ^1.0.8 + call-bound: ^1.0.3 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: f9b9a2a125ccf8ded29414d7c056ae0d187b833ee74919821fc60d7e216626db220d9cb3cf33f965c84aaaa96133626ca13b80f3c158b673976dc8cfcfcd26bb languageName: node linkType: hard "ohash@npm:^1.1.3": - version: 1.1.3 - resolution: "ohash@npm:1.1.3" - checksum: 44c7321cb950ce6e87d46584fd5cc8dd3dd15fcd4ade0ac2995d0497dc6b6b1ae9bd844c59af185d63923da5cfe9b37ae37a9dbd9ac455f3ad0cdfb5a73d5ef6 + version: 1.1.6 + resolution: "ohash@npm:1.1.6" + checksum: 1400de55726d8a653618da1b5bf85b8e05c3ff5035071e0a4b483993d0826c98667a54da931042a59058a7fa9c8708b3de3f140eb9148a06cb81d9777b285b1b languageName: node linkType: hard "oidc-token-hash@npm:^5.0.3": - version: 5.0.3 - resolution: "oidc-token-hash@npm:5.0.3" - checksum: 35fa19aea9ff2c509029ec569d74b778c8a215b92bd5e6e9bc4ebbd7ab035f44304ff02430a6397c3fb7c1d15ebfa467807ca0bcd31d06ba610b47798287d303 + version: 5.1.0 + resolution: "oidc-token-hash@npm:5.1.0" + checksum: b1ac3bf07315b1e26a8a33da714d1adee58f4aa488a5680cee49adb58e3b7fd7b00be5acca86d93215de1ce1a7d53720cbc7eba8347124f251703ede3abdbcb6 languageName: node linkType: hard @@ -8421,38 +8362,29 @@ __metadata: languageName: node linkType: hard -"onetime@npm:^6.0.0": - version: 6.0.0 - resolution: "onetime@npm:6.0.0" - dependencies: - mimic-fn: ^4.0.0 - checksum: 0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 - languageName: node - linkType: hard - "openid-client@npm:^5.4.0": - version: 5.6.5 - resolution: "openid-client@npm:5.6.5" + version: 5.7.1 + resolution: "openid-client@npm:5.7.1" dependencies: - jose: ^4.15.5 + jose: ^4.15.9 lru-cache: ^6.0.0 object-hash: ^2.2.0 oidc-token-hash: ^5.0.3 - checksum: 2240079f761173b10635ce5fefbac04b6820f54e00d588ab2afdddb6c0f0ab6568e663cf1ab6a4a2297fbdbb73e42d78b8190f91dba7e1b80d287b2127fcbc7c + checksum: 497aad2c8a022cef112ade19ed88fba6c8ca0e79607ebe5efdcf75c4095d7924ca479085c1c94f689f6dbc9442c61aab3c2443eb347bcbc6ef51df68827c7c47 languageName: node linkType: hard "optionator@npm:^0.9.3": - version: 0.9.3 - resolution: "optionator@npm:0.9.3" + version: 0.9.4 + resolution: "optionator@npm:0.9.4" dependencies: - "@aashutoshrathi/word-wrap": ^1.2.3 deep-is: ^0.1.3 fast-levenshtein: ^2.0.6 levn: ^0.4.1 prelude-ls: ^1.2.1 type-check: ^0.4.0 - checksum: 09281999441f2fe9c33a5eeab76700795365a061563d66b098923eb719251a42bdbe432790d35064d0816ead9296dbeb1ad51a733edf4167c96bd5d0882e428a + word-wrap: ^1.2.5 + checksum: ecbd010e3dc73e05d239976422d9ef54a82a13f37c11ca5911dff41c98a6c7f0f163b27f922c37e7f8340af9d36febd3b6e9cef508f3339d4c393d7276d716bb languageName: node linkType: hard @@ -8463,6 +8395,17 @@ __metadata: languageName: node linkType: hard +"own-keys@npm:^1.0.1": + version: 1.0.1 + resolution: "own-keys@npm:1.0.1" + dependencies: + get-intrinsic: ^1.2.6 + object-keys: ^1.1.1 + safe-push-apply: ^1.0.0 + checksum: cc9dd7d85c4ccfbe8109fce307d581ac7ede7b26de892b537873fbce2dc6a206d89aea0630dbb98e47ce0873517cefeaa7be15fcf94aaf4764a3b34b474a5b61 + languageName: node + linkType: hard + "p-finally@npm:^2.0.0": version: 2.0.1 resolution: "p-finally@npm:2.0.1" @@ -8511,6 +8454,21 @@ __metadata: languageName: node linkType: hard +"parse-entities@npm:^4.0.0": + version: 4.0.2 + resolution: "parse-entities@npm:4.0.2" + dependencies: + "@types/unist": ^2.0.0 + character-entities-legacy: ^3.0.0 + character-reference-invalid: ^2.0.0 + decode-named-character-reference: ^1.0.0 + is-alphanumerical: ^2.0.0 + is-decimal: ^2.0.0 + is-hexadecimal: ^2.0.0 + checksum: db22b46da1a62af00409c929ac49fbd306b5ebf0dbacf4646d2ae2b58616ef90a40eedc282568a3cf740fac2a7928bc97146973a628f6977ca274dedc2ad6edc + languageName: node + linkType: hard + "parse-json@npm:^5.0.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" @@ -8558,13 +8516,6 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^4.0.0": - version: 4.0.0 - resolution: "path-key@npm:4.0.0" - checksum: 8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 - languageName: node - linkType: hard - "path-match@npm:1.2.4": version: 1.2.4 resolution: "path-match@npm:1.2.4" @@ -8607,11 +8558,11 @@ __metadata: linkType: hard "path-to-regexp@npm:^1.0.0": - version: 1.8.0 - resolution: "path-to-regexp@npm:1.8.0" + version: 1.9.0 + resolution: "path-to-regexp@npm:1.9.0" dependencies: isarray: 0.0.1 - checksum: 709f6f083c0552514ef4780cb2e7e4cf49b0cc89a97439f2b7cc69a608982b7690fb5d1720a7473a59806508fc2dae0be751ba49f495ecf89fd8fbc62abccbcd + checksum: 5b2ac9cab2a9f82effd30a35164b20998b18d99d96608281dd2cab6e66c0e4536187970369b185ab21d3815da1ecb7dcb2d5f97a4bf0ee6e31a9612299fca147 languageName: node linkType: hard @@ -8629,6 +8580,13 @@ __metadata: languageName: node linkType: hard +"pathe@npm:^2.0.1, pathe@npm:^2.0.3": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 0602bdd4acb54d91044e0c56f1fb63467ae7d44ab3afea1f797947b0eb2b4d1d91cf0d58d065fdb0a8ab0c4acbbd8d3a5b424983eaf10dd5285d37a16f6e3ee9 + languageName: node + linkType: hard + "pend@npm:~1.2.0": version: 1.2.0 resolution: "pend@npm:1.2.0" @@ -8643,17 +8601,17 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:1.0.0, picocolors@npm:^1.0.0": +"picocolors@npm:1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 languageName: node linkType: hard -"picocolors@npm:^1.0.1": - version: 1.0.1 - resolution: "picocolors@npm:1.0.1" - checksum: fa68166d1f56009fc02a34cdfd112b0dd3cf1ef57667ac57281f714065558c01828cdf4f18600ad6851cbe0093952ed0660b1e0156bddf2184b6aaf5817553a5 +"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 languageName: node linkType: hard @@ -8679,20 +8637,27 @@ __metadata: linkType: hard "pirates@npm:^4.0.1": - version: 4.0.6 - resolution: "pirates@npm:4.0.6" - checksum: 46a65fefaf19c6f57460388a5af9ab81e3d7fd0e7bc44ca59d753cb5c4d0df97c6c6e583674869762101836d68675f027d60f841c105d72734df9dfca97cbcc6 + version: 4.0.7 + resolution: "pirates@npm:4.0.7" + checksum: 3dcbaff13c8b5bc158416feb6dc9e49e3c6be5fddc1ea078a05a73ef6b85d79324bbb1ef59b954cdeff000dbf000c1d39f32dc69310c7b78fbada5171b583e40 languageName: node linkType: hard -"pkg-types@npm:^1.1.1": - version: 1.1.3 - resolution: "pkg-types@npm:1.1.3" +"pkg-types@npm:^1.1.1, pkg-types@npm:^1.3.0, pkg-types@npm:^1.3.1": + version: 1.3.1 + resolution: "pkg-types@npm:1.3.1" dependencies: - confbox: ^0.1.7 - mlly: ^1.7.1 - pathe: ^1.1.2 - checksum: 1085f1ed650db71d62ec9201d0ad4dc9455962b0e40d309e26bb8c01bb5b1560087e44d49e8e034497668c7cdde7cb5397995afa79c9fa1e2b35af9c9abafa82 + confbox: ^0.1.8 + mlly: ^1.7.4 + pathe: ^2.0.1 + checksum: 4fa4edb2bb845646cdbd04c5c6bc43cdbc8f02ed4d1c28bfcafb6e65928aece789bcf1335e4cac5f65dfdc376e4bd7435bd509a35e9ec73ef2c076a1b88e289c + languageName: node + linkType: hard + +"possible-typed-array-names@npm:^1.0.0": + version: 1.1.0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: cfcd4f05264eee8fd184cd4897a17890561d1d473434b43ab66ad3673d9c9128981ec01e0cb1d65a52cd6b1eebfb2eae1e53e39b2e0eca86afc823ede7a4f41b languageName: node linkType: hard @@ -8720,12 +8685,12 @@ __metadata: languageName: node linkType: hard -"postcss-load-config@npm:^4.0.1": - version: 4.0.1 - resolution: "postcss-load-config@npm:4.0.1" +"postcss-load-config@npm:^4.0.2": + version: 4.0.2 + resolution: "postcss-load-config@npm:4.0.2" dependencies: - lilconfig: ^2.0.5 - yaml: ^2.1.1 + lilconfig: ^3.0.0 + yaml: ^2.3.4 peerDependencies: postcss: ">=8.0.9" ts-node: ">=9.0.0" @@ -8734,28 +8699,28 @@ __metadata: optional: true ts-node: optional: true - checksum: b61f890499ed7dcda1e36c20a9582b17d745bad5e2b2c7bc96942465e406bc43ae03f270c08e60d1e29dab1ee50cb26970b5eb20c9aae30e066e20bd607ae4e4 + checksum: 7c27dd3801db4eae207a5116fed2db6b1ebb780b40c3dd62a3e57e087093a8e6a14ee17ada729fee903152d6ef4826c6339eb135bee6208e0f3140d7e8090185 languageName: node linkType: hard -"postcss-nested@npm:^6.0.1": - version: 6.0.1 - resolution: "postcss-nested@npm:6.0.1" +"postcss-nested@npm:^6.2.0": + version: 6.2.0 + resolution: "postcss-nested@npm:6.2.0" dependencies: - postcss-selector-parser: ^6.0.11 + postcss-selector-parser: ^6.1.1 peerDependencies: postcss: ^8.2.14 - checksum: 7ddb0364cd797de01e38f644879189e0caeb7ea3f78628c933d91cc24f327c56d31269384454fc02ecaf503b44bfa8e08870a7c4cc56b23bc15640e1894523fa + checksum: 2c86ecf2d0ce68f27c87c7e24ae22dc6dd5515a89fcaf372b2627906e11f5c1f36e4a09e4c15c20fd4a23d628b3d945c35839f44496fbee9a25866258006671b languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.11": - version: 6.0.13 - resolution: "postcss-selector-parser@npm:6.0.13" +"postcss-selector-parser@npm:^6.1.1, postcss-selector-parser@npm:^6.1.2": + version: 6.1.2 + resolution: "postcss-selector-parser@npm:6.1.2" dependencies: cssesc: ^3.0.0 util-deprecate: ^1.0.2 - checksum: f89163338a1ce3b8ece8e9055cd5a3165e79a15e1c408e18de5ad8f87796b61ec2d48a2902d179ae0c4b5de10fccd3a325a4e660596549b040bc5ad1b465f096 + checksum: ce9440fc42a5419d103f4c7c1847cb75488f3ac9cbe81093b408ee9701193a509f664b4d10a2b4d82c694ee7495e022f8f482d254f92b7ffd9ed9dea696c6f84 languageName: node linkType: hard @@ -8766,7 +8731,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.4.25, postcss@npm:^8.4.23": +"postcss@npm:8.4.25": version: 8.4.25 resolution: "postcss@npm:8.4.25" dependencies: @@ -8788,6 +8753,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.4.47": + version: 8.5.6 + resolution: "postcss@npm:8.5.6" + dependencies: + nanoid: ^3.3.11 + picocolors: ^1.1.1 + source-map-js: ^1.2.1 + checksum: 20f3b5d673ffeec2b28d65436756d31ee33f65b0a8bedb3d32f556fbd5973be38c3a7fb5b959a5236c60a5db7b91b0a6b14ffaac0d717dce1b903b964ee1c1bb + languageName: node + linkType: hard + "preact-render-to-string@npm:^5.1.19": version: 5.2.6 resolution: "preact-render-to-string@npm:5.2.6" @@ -8800,9 +8776,9 @@ __metadata: linkType: hard "preact@npm:^10.6.3": - version: 10.23.2 - resolution: "preact@npm:10.23.2" - checksum: 1df6a9d72480c42b4985c1344941184422374c48af0f1e9df0de8d1c3f1f85c996d3a9e2850c8256abe39352d8fd174dd95e2f4177433022661baabfb6547f2c + version: 10.26.9 + resolution: "preact@npm:10.26.9" + checksum: d5a9c521ca4ab35414bd9c7874e2ac4eaf0561875e2a5bb9f3c4c67e6e3d6971e122f763d19333f9b616a5f280b5d22cde526bb9c9fd9820bee15600a2f7269b languageName: node linkType: hard @@ -8814,11 +8790,11 @@ __metadata: linkType: hard "prettier@npm:^3.0.0": - version: 3.0.0 - resolution: "prettier@npm:3.0.0" + version: 3.5.3 + resolution: "prettier@npm:3.5.3" bin: prettier: bin/prettier.cjs - checksum: 6a832876a1552dc58330d2467874e5a0b46b9ccbfc5d3531eb69d15684743e7f83dc9fbd202db6270446deba9c82b79d24383d09924c462b457136a759425e33 + checksum: 61e97bb8e71a95d8f9c71f1fd5229c9aaa9d1e184dedb12399f76aa802fb6fdc8954ecac9df25a7f82ee7311cf8ddbd06baf5507388fc98e5b44036cc6a88a1b languageName: node linkType: hard @@ -8880,10 +8856,10 @@ __metadata: languageName: node linkType: hard -"property-information@npm:^6.0.0": - version: 6.3.0 - resolution: "property-information@npm:6.3.0" - checksum: bf0a15dec097fd4324a42163cabd96b90819e48ef0d8d98756ef0420b2c579bf33646fe0b6e04aa9e79f5a2b5b5860ef11655a79cd8969d8eda58df23c4f96c9 +"property-information@npm:^7.0.0": + version: 7.1.0 + resolution: "property-information@npm:7.1.0" + checksum: 3875161d204bac89d75181f6d3ebc3ecaeb2699b4e2ecfcf5452201d7cdd275168c6742d7ff8cec5ab0c342fae72369ac705e1f8e9680a9acd911692e80dfb88 languageName: node linkType: hard @@ -8895,12 +8871,12 @@ __metadata: linkType: hard "pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" + version: 3.0.3 + resolution: "pump@npm:3.0.3" dependencies: end-of-stream: ^1.1.0 once: ^1.3.1 - checksum: e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 + checksum: 52843fc933b838c0330f588388115a1b28ef2a5ffa7774709b142e35431e8ab0c2edec90de3fa34ebb72d59fef854f151eea7dfc211b6dcf586b384556bd2f39 languageName: node linkType: hard @@ -8919,11 +8895,11 @@ __metadata: linkType: hard "qs@npm:^6.11.0": - version: 6.11.2 - resolution: "qs@npm:6.11.2" + version: 6.14.0 + resolution: "qs@npm:6.14.0" dependencies: - side-channel: ^1.0.4 - checksum: e812f3c590b2262548647d62f1637b6989cc56656dc960b893fe2098d96e1bd633f36576f4cd7564dfbff9db42e17775884db96d846bebe4f37420d073ecdc0b + side-channel: ^1.1.0 + checksum: 189b52ad4e9a0da1a16aff4c58b2a554a8dad9bd7e287c7da7446059b49ca2e33a49e570480e8be406b87fccebf134f51c373cbce36c8c83859efa0c9b71d635 languageName: node linkType: hard @@ -8965,26 +8941,26 @@ __metadata: languageName: node linkType: hard -"react-clientside-effect@npm:^1.2.6": - version: 1.2.6 - resolution: "react-clientside-effect@npm:1.2.6" +"react-clientside-effect@npm:^1.2.7": + version: 1.2.8 + resolution: "react-clientside-effect@npm:1.2.8" dependencies: "@babel/runtime": ^7.12.13 peerDependencies: - react: ^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - checksum: 7db6110027a51458b1a46109d2b63dd822825f483c71afef7c0c0a671f3b1aa155049dbd8651c9d536ffac83601f8823b7c3f8916b4f4ee5c3cb7647a85cce4e + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + checksum: 315e33c4c4c1c22480b7c7ddac8f26e510d71aadc0c745e8b48193d651792f33e2135eac4c173637deb24701482390f99b996c2e52a89152a492bf79b6ed143b languageName: node linkType: hard "react-dom@npm:^18.2.0": - version: 18.2.0 - resolution: "react-dom@npm:18.2.0" + version: 18.3.1 + resolution: "react-dom@npm:18.3.1" dependencies: loose-envify: ^1.1.0 - scheduler: ^0.23.0 + scheduler: ^0.23.2 peerDependencies: - react: ^18.2.0 - checksum: 7d323310bea3a91be2965f9468d552f201b1c27891e45ddc2d6b8f717680c95a75ae0bc1e3f5cf41472446a2589a75aed4483aee8169287909fcd59ad149e8cc + react: ^18.3.1 + checksum: 298954ecd8f78288dcaece05e88b570014d8f6dce5db6f66e6ee91448debeb59dcd31561dddb354eee47e6c1bb234669459060deb238ed0213497146e555a0b9 languageName: node linkType: hard @@ -9007,32 +8983,32 @@ __metadata: languageName: node linkType: hard -"react-focus-lock@npm:^2.9.4": - version: 2.9.6 - resolution: "react-focus-lock@npm:2.9.6" +"react-focus-lock@npm:^2.9.6": + version: 2.13.6 + resolution: "react-focus-lock@npm:2.13.6" dependencies: "@babel/runtime": ^7.0.0 - focus-lock: ^1.0.0 + focus-lock: ^1.3.6 prop-types: ^15.6.2 - react-clientside-effect: ^1.2.6 - use-callback-ref: ^1.3.0 - use-sidecar: ^1.1.2 + react-clientside-effect: ^1.2.7 + use-callback-ref: ^1.3.3 + use-sidecar: ^1.1.3 peerDependencies: - "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: 3ee2b32dfe479839548baf097d53ddab0b9a8df71cd51763edc9dd900eb85ac98e0255130a9152de9a424a038bae6e1782fca6fde0d89ae1f37c2ca802d94351 + checksum: dac0eac0520b2f9ba152969784ade185a72f263b26b98728c79efd7926ab815eb3467184444d2f1911ba019ae6675aa2b66d792653e5b914c50d5a0c256567a7 languageName: node linkType: hard "react-icons@npm:^5.0.1": - version: 5.0.1 - resolution: "react-icons@npm:5.0.1" + version: 5.5.0 + resolution: "react-icons@npm:5.5.0" peerDependencies: react: "*" - checksum: e5df9c5e3bcdb8d68bd4c5e41650c26d2a3ceda61ded0e2abf7caa0e54c9fb712badcd06f0c240cfc645a5dd15a5dc1eb5dd55f60123d86860f516b1fc456474 + checksum: cbd74f4b7982e6e18d59798a6b578268c8eb0909d78d87bcf9b25f99b3e544fd189a76551cb5e770d17f154a60b668551aee108aaf8471309b23f7af3b2c5b07 languageName: node linkType: hard @@ -9044,15 +9020,15 @@ __metadata: linkType: hard "react-markdown@npm:^9.0.0": - version: 9.0.0 - resolution: "react-markdown@npm:9.0.0" + version: 9.1.0 + resolution: "react-markdown@npm:9.1.0" dependencies: "@types/hast": ^3.0.0 + "@types/mdast": ^4.0.0 devlop: ^1.0.0 hast-util-to-jsx-runtime: ^2.0.0 html-url-attributes: ^3.0.0 mdast-util-to-hast: ^13.0.0 - micromark-util-sanitize-uri: ^2.0.0 remark-parse: ^11.0.0 remark-rehype: ^11.0.0 unified: ^11.0.0 @@ -9061,94 +9037,90 @@ __metadata: peerDependencies: "@types/react": ">=18" react: ">=18" - checksum: 7057f60f0657d5c6210f02a2c80d537176d0d29c141e4b52a8f8fa335ee454248c37c29caf27e8bd28a180bc8e14b5522f63e2a61e3ec3ea5201a58ad43f43c6 + checksum: d78ca3b6bea23a3383d067ad8eb0aec3a22a4500663f32773be45ad38572b5f1b823184fafc85c1a35ff6290bddea42b003dc7bdfc02cf20a9e0163ecd3ea605 languageName: node linkType: hard "react-qr-code@npm:^2.0.12": - version: 2.0.12 - resolution: "react-qr-code@npm:2.0.12" + version: 2.0.16 + resolution: "react-qr-code@npm:2.0.16" dependencies: prop-types: ^15.8.1 qr.js: 0.0.0 peerDependencies: - react: ^16.x || ^17.x || ^18.x - react-native-svg: "*" - peerDependenciesMeta: - react-native-svg: - optional: true - checksum: b7bad40d7d5f04f7ff336ae499920dd5ea0e7616ed7fec5f849e54f8f26b5e4acd1ba8e69198be8617dc7fecdf36cf4302c99ff74885320b55bb95d19a09de7c + react: "*" + checksum: 90e64bac9d03d3a700e46e50b9048a71affd51b48c652f40f171afe63d63a0f83cc7612f1b5b2fbe46cc17024251b191dc960f46ca8668991226dfd18b25f081 languageName: node linkType: hard "react-redux@npm:^9.1.1": - version: 9.1.2 - resolution: "react-redux@npm:9.1.2" + version: 9.2.0 + resolution: "react-redux@npm:9.2.0" dependencies: - "@types/use-sync-external-store": ^0.0.3 - use-sync-external-store: ^1.0.0 + "@types/use-sync-external-store": ^0.0.6 + use-sync-external-store: ^1.4.0 peerDependencies: - "@types/react": ^18.2.25 - react: ^18.0 + "@types/react": ^18.2.25 || ^19 + react: ^18.0 || ^19 redux: ^5.0.0 peerDependenciesMeta: "@types/react": optional: true redux: optional: true - checksum: 1ee9cf41f29f68267320b4fc3bcf6a76a3825c82441612582678ddd827a2b60834f687d2a8b755c905885dfce476a1eb41af42b36f4dd71f8ee9991296a1e515 + checksum: 96dfe2929561d7c98d4443722738e4595f08758bde27b7bc20cd98ba9b0dfe9b81b9fa17b6888be94a0c1d2d1305397ae493a8219698536d011a941589eb82bd languageName: node linkType: hard -"react-remove-scroll-bar@npm:^2.3.4": - version: 2.3.4 - resolution: "react-remove-scroll-bar@npm:2.3.4" +"react-remove-scroll-bar@npm:^2.3.7": + version: 2.3.8 + resolution: "react-remove-scroll-bar@npm:2.3.8" dependencies: - react-style-singleton: ^2.2.1 + react-style-singleton: ^2.2.2 tslib: ^2.0.0 peerDependencies: - "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: "@types/react": optional: true - checksum: b5ce5f2f98d65c97a3e975823ae4043a4ba2a3b63b5ba284b887e7853f051b5cd6afb74abde6d57b421931c52f2e1fdbb625dc858b1cb5a32c27c14ab85649d4 + checksum: c4663247f689dbe51c370836edf735487f6d8796acb7f15b09e8a1c14e84c7997360e8e3d54de2bc9c0e782fed2b2c4127d15b4053e4d2cf26839e809e57605f languageName: node linkType: hard -"react-remove-scroll@npm:2.5.7, react-remove-scroll@npm:^2.5.6": - version: 2.5.7 - resolution: "react-remove-scroll@npm:2.5.7" +"react-remove-scroll@npm:^2.5.7, react-remove-scroll@npm:^2.6.3": + version: 2.7.1 + resolution: "react-remove-scroll@npm:2.7.1" dependencies: - react-remove-scroll-bar: ^2.3.4 - react-style-singleton: ^2.2.1 + react-remove-scroll-bar: ^2.3.7 + react-style-singleton: ^2.2.3 tslib: ^2.1.0 - use-callback-ref: ^1.3.0 - use-sidecar: ^1.1.2 + use-callback-ref: ^1.3.3 + use-sidecar: ^1.1.3 peerDependencies: - "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: e0dbb6856beaed2cff4996d9ca62d775686ff72e3e9de34043034d932223b588993b2fc7a18644750dd3d73eb19bd3f2cedb8d91f0e424c1ef8403010da24b1d + checksum: c8b1988d473ca0b4911a0a42f09dc7806d5db998c3ec938ae2791a5f82d807c2cdebb78a1c58a0bab62a83112528dda2f20d509d0e048fe281b9dfc027c39763 languageName: node linkType: hard "react-select-search@npm:^4.1.7": - version: 4.1.7 - resolution: "react-select-search@npm:4.1.7" + version: 4.1.8 + resolution: "react-select-search@npm:4.1.8" peerDependencies: prop-types: ^15.8.1 react: ^18.0.1 || ^17.0.1 react-dom: ^18.0.1 || ^17.0.1 - checksum: 802cddc331071e0cfaa4be72d4c7da067ab770c9c1e124d6359bbf9f5f6fa81e36b4ae7feb6d8ae85ea585e32776980888031a73b5c3a09765bcee96d55d7b96 + checksum: c2f770f7333c5dd222940922cb37893fd3c2be44698f7357a9f4984b273a9848393d4759b796f4638ede73fe815dba6dd7a831c223be23f52585a6c372ea7409 languageName: node linkType: hard -"react-select@npm:5.8.0": - version: 5.8.0 - resolution: "react-select@npm:5.8.0" +"react-select@npm:5.8.x": + version: 5.8.3 + resolution: "react-select@npm:5.8.3" dependencies: "@babel/runtime": ^7.12.0 "@emotion/cache": ^11.4.0 @@ -9162,24 +9134,23 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: c8398cc0aefb5ee5438b6176c86676e2d3fed7457c16b0769f423a0da0ae431a7df25c2cadf13b709700882b8ebd80a58b1e557fec3e22ad3cbf60164ca9e745 + checksum: 7678fdd5d441531deba4dfd0edcc0d53cb04297f0f4b7c8ab32023819b1787b60541e056f44a96c2a58ac720dbe973b02c6544820ff4f0541a6155b814503829 languageName: node linkType: hard -"react-style-singleton@npm:^2.2.1": - version: 2.2.1 - resolution: "react-style-singleton@npm:2.2.1" +"react-style-singleton@npm:^2.2.2, react-style-singleton@npm:^2.2.3": + version: 2.2.3 + resolution: "react-style-singleton@npm:2.2.3" dependencies: get-nonce: ^1.0.0 - invariant: ^2.2.4 tslib: ^2.0.0 peerDependencies: - "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: 7ee8ef3aab74c7ae1d70ff34a27643d11ba1a8d62d072c767827d9ff9a520905223e567002e0bf6c772929d8ea1c781a3ba0cc4a563e92b1e3dc2eaa817ecbe8 + checksum: a7b0bf493c9231065ebafa84c4237aed997c746c561196121b7de82fe155a5355b372db5070a3ac9fe980cf7f60dc0f1e8cf6402a2aa5b2957392932ccf76e76 languageName: node linkType: hard @@ -9199,11 +9170,11 @@ __metadata: linkType: hard "react@npm:^18.2.0": - version: 18.2.0 - resolution: "react@npm:18.2.0" + version: 18.3.1 + resolution: "react@npm:18.3.1" dependencies: loose-envify: ^1.1.0 - checksum: 88e38092da8839b830cda6feef2e8505dec8ace60579e46aa5490fc3dc9bba0bd50336507dc166f43e3afc1c42939c09fe33b25fae889d6f402721dcd78fca1b + checksum: a27bcfa8ff7c15a1e50244ad0d0c1cb2ad4375eeffefd266a64889beea6f6b64c4966c9b37d14ee32d6c9fcd5aa6ba183b6988167ab4d127d13e7cb5b386a376 languageName: node linkType: hard @@ -9227,6 +9198,13 @@ __metadata: languageName: node linkType: hard +"readdirp@npm:^4.0.1": + version: 4.1.2 + resolution: "readdirp@npm:4.1.2" + checksum: 3242ee125422cb7c0e12d51452e993f507e6ed3d8c490bc8bf3366c5cdd09167562224e429b13e9cb2b98d4b8b2b11dc100d3c73883aa92d657ade5a21ded004 + languageName: node + linkType: hard + "readdirp@npm:~3.3.0": version: 3.3.0 resolution: "readdirp@npm:3.3.0" @@ -9286,17 +9264,19 @@ __metadata: languageName: node linkType: hard -"reflect.getprototypeof@npm:^1.0.4": - version: 1.0.4 - resolution: "reflect.getprototypeof@npm:1.0.4" +"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9": + version: 1.0.10 + resolution: "reflect.getprototypeof@npm:1.0.10" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 - globalthis: ^1.0.3 - which-builtin-type: ^1.1.3 - checksum: 16e2361988dbdd23274b53fb2b1b9cefeab876c3941a2543b4cadac6f989e3db3957b07a44aac46cfceb3e06e2871785ec2aac992d824f76292f3b5ee87f66f2 + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-abstract: ^1.23.9 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + get-intrinsic: ^1.2.7 + get-proto: ^1.0.1 + which-builtin-type: ^1.2.1 + checksum: ccc5debeb66125e276ae73909cecb27e47c35d9bb79d9cc8d8d055f008c58010ab8cb401299786e505e4aab733a64cba9daf5f312a58e96a43df66adad221870 languageName: node linkType: hard @@ -9359,21 +9339,17 @@ __metadata: languageName: unknown linkType: soft -"regenerator-runtime@npm:^0.14.0": - version: 0.14.0 - resolution: "regenerator-runtime@npm:0.14.0" - checksum: 1c977ad82a82a4412e4f639d65d22be376d3ebdd30da2c003eeafdaaacd03fc00c2320f18120007ee700900979284fc78a9f00da7fb593f6e6eeebc673fba9a3 - languageName: node - linkType: hard - -"regexp.prototype.flags@npm:^1.5.0, regexp.prototype.flags@npm:^1.5.1": - version: 1.5.1 - resolution: "regexp.prototype.flags@npm:1.5.1" +"regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": + version: 1.5.4 + resolution: "regexp.prototype.flags@npm:1.5.4" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - set-function-name: ^2.0.0 - checksum: 869edff00288442f8d7fa4c9327f91d85f3b3acf8cbbef9ea7a220345cf23e9241b6def9263d2c1ebcf3a316b0aa52ad26a43a84aa02baca3381717b3e307f47 + call-bind: ^1.0.8 + define-properties: ^1.2.1 + es-errors: ^1.3.0 + get-proto: ^1.0.1 + gopd: ^1.2.0 + set-function-name: ^2.0.2 + checksum: 18cb667e56cb328d2dda569d7f04e3ea78f2683135b866d606538cf7b1d4271f7f749f09608c877527799e6cf350e531368f3c7a20ccd1bb41048a48926bdeeb languageName: node linkType: hard @@ -9390,15 +9366,15 @@ __metadata: linkType: hard "remark-rehype@npm:^11.0.0": - version: 11.0.0 - resolution: "remark-rehype@npm:11.0.0" + version: 11.1.2 + resolution: "remark-rehype@npm:11.1.2" dependencies: "@types/hast": ^3.0.0 "@types/mdast": ^4.0.0 mdast-util-to-hast: ^13.0.0 unified: ^11.0.0 vfile: ^6.0.0 - checksum: 0ff0fd948759cbde9d507ca1581028d0b89da0b5f610b35a6cb0a511f8d11621449b6eca573b11ddaea77afd37edd4755f3f1eb086ad49a6f7b970b4a4634e13 + checksum: 6eab55cb3464ec01d8e002cc9fe02ae57f48162899693fd53b5ba553ac8699dae7b55fce9df7131a5981313b19b495d6fbfa98a9d6bd243e7485591364d9b5b3 languageName: node linkType: hard @@ -9444,7 +9420,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:1.22.8, resolve@npm:^1.1.7, resolve@npm:^1.19.0, resolve@npm:^1.22.2, resolve@npm:^1.22.4": +"resolve@npm:1.22.8": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -9457,7 +9433,20 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^2.0.0-next.4": +"resolve@npm:^1.1.7, resolve@npm:^1.19.0, resolve@npm:^1.22.4, resolve@npm:^1.22.8": + version: 1.22.10 + resolution: "resolve@npm:1.22.10" + dependencies: + is-core-module: ^2.16.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: ab7a32ff4046fcd7c6fdd525b24a7527847d03c3650c733b909b01b757f92eb23510afa9cc3e9bf3f26a3e073b48c88c706dfd4c1d2fb4a16a96b73b6328ddcf + languageName: node + linkType: hard + +"resolve@npm:^2.0.0-next.5": version: 2.0.0-next.5 resolution: "resolve@npm:2.0.0-next.5" dependencies: @@ -9470,7 +9459,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@1.22.8#~builtin, resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.22.2#~builtin, resolve@patch:resolve@^1.22.4#~builtin": +"resolve@patch:resolve@1.22.8#~builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -9483,7 +9472,20 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^2.0.0-next.4#~builtin": +"resolve@patch:resolve@^1.1.7#~builtin, resolve@patch:resolve@^1.19.0#~builtin, resolve@patch:resolve@^1.22.4#~builtin, resolve@patch:resolve@^1.22.8#~builtin": + version: 1.22.10 + resolution: "resolve@patch:resolve@npm%3A1.22.10#~builtin::version=1.22.10&hash=c3c19d" + dependencies: + is-core-module: ^2.16.0 + path-parse: ^1.0.7 + supports-preserve-symlinks-flag: ^1.0.0 + bin: + resolve: bin/resolve + checksum: 8aac1e4e4628bd00bf4b94b23de137dd3fe44097a8d528fd66db74484be929936e20c696e1a3edf4488f37e14180b73df6f600992baea3e089e8674291f16c9d + languageName: node + linkType: hard + +"resolve@patch:resolve@^2.0.0-next.5#~builtin": version: 2.0.0-next.5 resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#~builtin::version=2.0.0-next.5&hash=c3c19d" dependencies: @@ -9504,9 +9506,9 @@ __metadata: linkType: hard "reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + version: 1.1.0 + resolution: "reusify@npm:1.1.0" + checksum: 64cb3142ac5e9ad689aca289585cb41d22521f4571f73e9488af39f6b1bd62f0cbb3d65e2ecc768ec6494052523f473f1eb4b55c3e9014b3590c17fc6a03e22a languageName: node linkType: hard @@ -9521,9 +9523,9 @@ __metadata: languageName: node linkType: hard -"rollup@npm:2.78.0": - version: 2.78.0 - resolution: "rollup@npm:2.78.0" +"rollup@npm:2.79.2": + version: 2.79.2 + resolution: "rollup@npm:2.79.2" dependencies: fsevents: ~2.3.2 dependenciesMeta: @@ -9531,14 +9533,14 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 01b5a7ae082d2a14201c973ee973099f0899cc87b65063d5ca5a77c05eeefb3b51e14b1346cf1a0fc879ac2cbb87239d4f960917bfc30b7c52f5dce50a7f56e7 + checksum: df7aa4c8b95245dede157b06ab71e1921de6080757d30e9bf31f8fb142064d12dda865e2bafbab4349588f43425b2965a290c9a5da1c048246a70fc21734ebd7 languageName: node linkType: hard -"rtcstats@github:whereby/rtcstats#5.4.0": - version: 5.4.0 - resolution: "rtcstats@https://github.com/whereby/rtcstats.git#commit=6f6623b4b53e9f6b41f530339793de227f34ea51" - checksum: efa454829eb01537bc4c06524986f9da70423f9d0091d98aa34de64934b167b0a2445c7b59d7937b30991db09db2de02acfeef95d68737888f061fed11e4b58e +"rtcstats@github:whereby/rtcstats#5.4.1": + version: 5.4.1 + resolution: "rtcstats@https://github.com/whereby/rtcstats.git#commit=63bcb6420d76d34161b39e494524ae73aa6dd70d" + checksum: e1e4e1060c138dca12b83c7e25e4392e4ff05a43635326cbf06abe5267e37ecb98f5c7208be94b97013e50d6c13361185eb0c4f10fcb0c4090e062b39c8339eb languageName: node linkType: hard @@ -9558,15 +9560,16 @@ __metadata: languageName: node linkType: hard -"safe-array-concat@npm:^1.0.1": - version: 1.0.1 - resolution: "safe-array-concat@npm:1.0.1" +"safe-array-concat@npm:^1.1.3": + version: 1.1.3 + resolution: "safe-array-concat@npm:1.1.3" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.2.1 - has-symbols: ^1.0.3 + call-bind: ^1.0.8 + call-bound: ^1.0.2 + get-intrinsic: ^1.2.6 + has-symbols: ^1.1.0 isarray: ^2.0.5 - checksum: 001ecf1d8af398251cbfabaf30ed66e3855127fbceee178179524b24160b49d15442f94ed6c0db0b2e796da76bb05b73bf3cc241490ec9c2b741b41d33058581 + checksum: 00f6a68140e67e813f3ad5e73e6dedcf3e42a9fa01f04d44b0d3f7b1f4b257af876832a9bfc82ac76f307e8a6cc652e3cf95876048a26cbec451847cf6ae3707 languageName: node linkType: hard @@ -9577,14 +9580,24 @@ __metadata: languageName: node linkType: hard -"safe-regex-test@npm:^1.0.0": +"safe-push-apply@npm:^1.0.0": version: 1.0.0 - resolution: "safe-regex-test@npm:1.0.0" + resolution: "safe-push-apply@npm:1.0.0" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.3 - is-regex: ^1.1.4 - checksum: bc566d8beb8b43c01b94e67de3f070fd2781685e835959bbbaaec91cc53381145ca91f69bd837ce6ec244817afa0a5e974fc4e40a2957f0aca68ac3add1ddd34 + es-errors: ^1.3.0 + isarray: ^2.0.5 + checksum: 8c11cbee6dc8ff5cc0f3d95eef7052e43494591384015902e4292aef4ae9e539908288520ed97179cee17d6ffb450fe5f05a46ce7a1749685f7524fd568ab5db + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.0.3, safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + is-regex: ^1.2.1 + checksum: 3c809abeb81977c9ed6c869c83aca6873ea0f3ab0f806b8edbba5582d51713f8a6e9757d24d2b4b088f563801475ea946c8e77e7713e8c65cdd02305b6caedab languageName: node linkType: hard @@ -9596,40 +9609,44 @@ __metadata: linkType: hard "sass@npm:^1.63.6": - version: 1.63.6 - resolution: "sass@npm:1.63.6" + version: 1.89.2 + resolution: "sass@npm:1.89.2" dependencies: - chokidar: ">=3.0.0 <4.0.0" - immutable: ^4.0.0 + "@parcel/watcher": ^2.4.1 + chokidar: ^4.0.0 + immutable: ^5.0.2 source-map-js: ">=0.6.2 <2.0.0" + dependenciesMeta: + "@parcel/watcher": + optional: true bin: sass: sass.js - checksum: 3372319904658eeafaf78a09a6fcb3368a68e6d76fe3c43c2d009f4f72e475ab22b82ef483ef5c00fcda3ab00066846c0bd88c36b42771b855f6ab80c7eda541 + checksum: 192a97ffe801d9377d10c0a8a129befe637438c5aa979a56db18fd95da2aa32b656715fa8a2959bfaf059b490792a783e605a94449d44fbbf44d8155aa981490 languageName: node linkType: hard -"scheduler@npm:^0.23.0": - version: 0.23.0 - resolution: "scheduler@npm:0.23.0" +"scheduler@npm:^0.23.2": + version: 0.23.2 + resolution: "scheduler@npm:0.23.2" dependencies: loose-envify: ^1.1.0 - checksum: d79192eeaa12abef860c195ea45d37cbf2bbf5f66e3c4dcd16f54a7da53b17788a70d109ee3d3dde1a0fd50e6a8fc171f4300356c5aee4fc0171de526bf35f8a + checksum: 3e82d1f419e240ef6219d794ff29c7ee415fbdc19e038f680a10c067108e06284f1847450a210b29bbaf97b9d8a97ced5f624c31c681248ac84c80d56ad5a2c4 languageName: node linkType: hard -"sdp-transform@npm:^2.14.2": - version: 2.14.2 - resolution: "sdp-transform@npm:2.14.2" +"sdp-transform@npm:^2.14.2, sdp-transform@npm:^2.15.0": + version: 2.15.0 + resolution: "sdp-transform@npm:2.15.0" bin: sdp-verify: checker.js - checksum: 5d53a8ddde0ffd1d96be37a293d4a72e4256bd4ad9d18b346da729de42671ab16f7435917320afe52a24a8e4c62b64a9e2c7593f3973c1d7864cbe3ee6f39357 + checksum: 63a21fdb3f97adc31019c7fb896e77076bdd2405d9e0eb6bd991b6f51973552bdd99409878aae8f8375f516af162d5a4176e102e090e24c870accafb9f73886f languageName: node linkType: hard "sdp@npm:^3.2.0": - version: 3.2.0 - resolution: "sdp@npm:3.2.0" - checksum: 227885bddab9a5845e56ae184ff51e43ec7bc155e7f1ed2f17ca1b012e6767011d5bd01b6c4064ded8e3b6f6bf3c9b26b2cf754b9c8662285988ed27b54f37b1 + version: 3.2.1 + resolution: "sdp@npm:3.2.1" + checksum: 88c24ceb46bf29f7ad3ece249db6353668a7c970b5831cbf1f4f371d8960ae90a4b0e3b9b05aa499a5038fc145662578456530c7b3efcaf623fdb0ef8ab243a0 languageName: node linkType: hard @@ -9653,23 +9670,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.5": - version: 7.6.3 - resolution: "semver@npm:7.6.3" +"semver@npm:^7.3.5, semver@npm:^7.3.8, semver@npm:^7.6.0, semver@npm:^7.7.1": + version: 7.7.2 + resolution: "semver@npm:7.7.2" bin: semver: bin/semver.js - checksum: 4110ec5d015c9438f322257b1c51fe30276e5f766a3f64c09edd1d7ea7118ecbc3f379f3b69032bacf13116dc7abc4ad8ce0d7e2bd642e26b0d271b56b61a7d8 - languageName: node - linkType: hard - -"semver@npm:^7.3.8, semver@npm:^7.5.4": - version: 7.5.4 - resolution: "semver@npm:7.5.4" - dependencies: - lru-cache: ^6.0.0 - bin: - semver: bin/semver.js - checksum: 12d8ad952fa353b0995bf180cdac205a4068b759a140e5d3c608317098b3575ac2f1e09182206bf2eb26120e1c0ed8fb92c48c592f6099680de56bb071423ca3 + checksum: dd94ba8f1cbc903d8eeb4dd8bf19f46b3deb14262b6717d0de3c804b594058ae785ef2e4b46c5c3b58733c99c83339068203002f9e37cfe44f7e2cc5e3d2f621 languageName: node linkType: hard @@ -9680,26 +9686,40 @@ __metadata: languageName: node linkType: hard -"set-function-length@npm:^1.1.1": - version: 1.1.1 - resolution: "set-function-length@npm:1.1.1" +"set-function-length@npm:^1.2.2": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" dependencies: - define-data-property: ^1.1.1 - get-intrinsic: ^1.2.1 + define-data-property: ^1.1.4 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.4 gopd: ^1.0.1 - has-property-descriptors: ^1.0.0 - checksum: c131d7569cd7e110cafdfbfbb0557249b538477624dfac4fc18c376d879672fa52563b74029ca01f8f4583a8acb35bb1e873d573a24edb80d978a7ee607c6e06 + has-property-descriptors: ^1.0.2 + checksum: a8248bdacdf84cb0fab4637774d9fb3c7a8e6089866d04c817583ff48e14149c87044ce683d7f50759a8c50fb87c7a7e173535b06169c87ef76f5fb276dfff72 languageName: node linkType: hard -"set-function-name@npm:^2.0.0, set-function-name@npm:^2.0.1": - version: 2.0.1 - resolution: "set-function-name@npm:2.0.1" +"set-function-name@npm:^2.0.2": + version: 2.0.2 + resolution: "set-function-name@npm:2.0.2" dependencies: - define-data-property: ^1.0.1 + define-data-property: ^1.1.4 + es-errors: ^1.3.0 functions-have-names: ^1.2.3 - has-property-descriptors: ^1.0.0 - checksum: 4975d17d90c40168eee2c7c9c59d023429f0a1690a89d75656306481ece0c3c1fb1ebcc0150ea546d1913e35fbd037bace91372c69e543e51fc5d1f31a9fa126 + has-property-descriptors: ^1.0.2 + checksum: d6229a71527fd0404399fc6227e0ff0652800362510822a291925c9d7b48a1ca1a468b11b281471c34cd5a2da0db4f5d7ff315a61d26655e77f6e971e6d0c80f + languageName: node + linkType: hard + +"set-proto@npm:^1.0.0": + version: 1.0.0 + resolution: "set-proto@npm:1.0.0" + dependencies: + dunder-proto: ^1.0.1 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + checksum: ec27cbbe334598547e99024403e96da32aca3e530583e4dba7f5db1c43cbc4affa9adfbd77c7b2c210b9b8b2e7b2e600bad2a6c44fd62e804d8233f96bbb62f4 languageName: node linkType: hard @@ -9726,14 +9746,51 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4": - version: 1.0.4 - resolution: "side-channel@npm:1.0.4" +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" dependencies: - call-bind: ^1.0.0 - get-intrinsic: ^1.0.2 - object-inspect: ^1.9.0 - checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 + es-errors: ^1.3.0 + object-inspect: ^1.13.3 + checksum: 603b928997abd21c5a5f02ae6b9cc36b72e3176ad6827fab0417ead74580cc4fb4d5c7d0a8a2ff4ead34d0f9e35701ed7a41853dac8a6d1a664fcce1a044f86f + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.5 + object-inspect: ^1.13.3 + checksum: 42501371cdf71f4ccbbc9c9e2eb00aaaab80a4c1c429d5e8da713fd4d39ef3b8d4a4b37ed4f275798a65260a551a7131fd87fe67e922dba4ac18586d6aab8b06 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.5 + object-inspect: ^1.13.3 + side-channel-map: ^1.0.1 + checksum: a815c89bc78c5723c714ea1a77c938377ea710af20d4fb886d362b0d1f8ac73a17816a5f6640f354017d7e292a43da9c5e876c22145bac00b76cfb3468001736 + languageName: node + linkType: hard + +"side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" + dependencies: + es-errors: ^1.3.0 + object-inspect: ^1.13.3 + side-channel-list: ^1.0.0 + side-channel-map: ^1.0.1 + side-channel-weakmap: ^1.0.2 + checksum: bf73d6d6682034603eb8e99c63b50155017ed78a522d27c2acec0388a792c3ede3238b878b953a08157093b85d05797217d270b7666ba1f111345fbe933380ff languageName: node linkType: hard @@ -9751,7 +9808,7 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^4.0.1, signal-exit@npm:^4.1.0": +"signal-exit@npm:^4.0.1": version: 4.1.0 resolution: "signal-exit@npm:4.1.0" checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 @@ -9773,13 +9830,6 @@ __metadata: languageName: node linkType: hard -"slash@npm:^3.0.0": - version: 3.0.0 - resolution: "slash@npm:3.0.0" - checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c - languageName: node - linkType: hard - "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -9830,10 +9880,10 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.2": - version: 1.0.2 - resolution: "source-map-js@npm:1.0.2" - checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c +"source-map-js@npm:>=0.6.2 <2.0.0, source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 4eb0cd997cdf228bc253bcaff9340afeb706176e64868ecd20efbe6efea931465f43955612346d6b7318789e5265bdc419bc7669c1cebe3db0eb255f57efa76b languageName: node linkType: hard @@ -9874,12 +9924,19 @@ __metadata: languageName: node linkType: hard +"stable-hash@npm:^0.0.5": + version: 0.0.5 + resolution: "stable-hash@npm:0.0.5" + checksum: 9222ea2c558e37c4a576cb4e406966b9e6aa05b93f5c4f09ef4aaabe3577439b9b8fbff407b16840b63e2ae83de74290c7b1c2da7360d571e480e46a4aec0a56 + languageName: node + linkType: hard + "stacktrace-parser@npm:^0.1.10": - version: 0.1.10 - resolution: "stacktrace-parser@npm:0.1.10" + version: 0.1.11 + resolution: "stacktrace-parser@npm:0.1.11" dependencies: type-fest: ^0.7.1 - checksum: f4fbddfc09121d91e587b60de4beb4941108e967d71ad3a171812dc839b010ca374d064ad0a296295fed13acd103609d99a4224a25b4e67de13cae131f1901ee + checksum: 1120cf716606ec6a8e25cc9b6ada79d7b91e6a599bba1a6664e6badc8b5f37987d7df7d9ad0344f717a042781fd8e1e999de08614a5afea451b68902421036b5 languageName: node linkType: hard @@ -9904,6 +9961,16 @@ __metadata: languageName: node linkType: hard +"stop-iteration-iterator@npm:^1.1.0": + version: 1.1.0 + resolution: "stop-iteration-iterator@npm:1.1.0" + dependencies: + es-errors: ^1.3.0 + internal-slot: ^1.1.0 + checksum: be944489d8829fb3bdec1a1cc4a2142c6b6eb317305eeace1ece978d286d6997778afa1ae8cb3bd70e2b274b9aa8c69f93febb1e15b94b1359b11058f9d3c3a1 + languageName: node + linkType: hard + "stream-to-array@npm:~2.3.0": version: 2.3.0 resolution: "stream-to-array@npm:2.3.0" @@ -9953,53 +10020,83 @@ __metadata: languageName: node linkType: hard -"string.prototype.matchall@npm:^4.0.8": - version: 4.0.10 - resolution: "string.prototype.matchall@npm:4.0.10" +"string.prototype.includes@npm:^2.0.1": + version: 2.0.1 + resolution: "string.prototype.includes@npm:2.0.1" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 - has-symbols: ^1.0.3 - internal-slot: ^1.0.5 - regexp.prototype.flags: ^1.5.0 - set-function-name: ^2.0.0 - side-channel: ^1.0.4 - checksum: 3c78bdeff39360c8e435d7c4c6ea19f454aa7a63eda95fa6fadc3a5b984446a2f9f2c02d5c94171ce22268a573524263fbd0c8edbe3ce2e9890d7cc036cdc3ed + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-abstract: ^1.23.3 + checksum: ed4b7058b092f30d41c4df1e3e805eeea92479d2c7a886aa30f42ae32fde8924a10cc99cccc99c29b8e18c48216608a0fe6bf887f8b4aadf9559096a758f313a languageName: node linkType: hard -"string.prototype.trim@npm:^1.2.8": - version: 1.2.8 - resolution: "string.prototype.trim@npm:1.2.8" +"string.prototype.matchall@npm:^4.0.12": + version: 4.0.12 + resolution: "string.prototype.matchall@npm:4.0.12" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 49eb1a862a53aba73c3fb6c2a53f5463173cb1f4512374b623bcd6b43ad49dd559a06fb5789bdec771a40fc4d2a564411c0a75d35fb27e76bbe738c211ecff07 + call-bind: ^1.0.8 + call-bound: ^1.0.3 + define-properties: ^1.2.1 + es-abstract: ^1.23.6 + es-errors: ^1.3.0 + es-object-atoms: ^1.0.0 + get-intrinsic: ^1.2.6 + gopd: ^1.2.0 + has-symbols: ^1.1.0 + internal-slot: ^1.1.0 + regexp.prototype.flags: ^1.5.3 + set-function-name: ^2.0.2 + side-channel: ^1.1.0 + checksum: 98a09d6af91bfc6ee25556f3d7cd6646d02f5f08bda55d45528ed273d266d55a71af7291fe3fc76854deffb9168cc1a917d0b07a7d5a178c7e9537c99e6d2b57 languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.7": - version: 1.0.7 - resolution: "string.prototype.trimend@npm:1.0.7" +"string.prototype.repeat@npm:^1.0.0": + version: 1.0.0 + resolution: "string.prototype.repeat@npm:1.0.0" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 2375516272fd1ba75992f4c4aa88a7b5f3c7a9ca308d963bcd5645adf689eba6f8a04ebab80c33e30ec0aefc6554181a3a8416015c38da0aa118e60ec896310c + define-properties: ^1.1.3 + es-abstract: ^1.17.5 + checksum: 95dfc514ed7f328d80a066dabbfbbb1615c3e51490351085409db2eb7cbfed7ea29fdadaf277647fbf9f4a1e10e6dd9e95e78c0fd2c4e6bb6723ea6e59401004 languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.7": - version: 1.0.7 - resolution: "string.prototype.trimstart@npm:1.0.7" +"string.prototype.trim@npm:^1.2.10": + version: 1.2.10 + resolution: "string.prototype.trim@npm:1.2.10" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - checksum: 13d0c2cb0d5ff9e926fa0bec559158b062eed2b68cd5be777ffba782c96b2b492944e47057274e064549b94dd27cf81f48b27a31fee8af5b574cff253e7eb613 + call-bind: ^1.0.8 + call-bound: ^1.0.2 + define-data-property: ^1.1.4 + define-properties: ^1.2.1 + es-abstract: ^1.23.5 + es-object-atoms: ^1.0.0 + has-property-descriptors: ^1.0.2 + checksum: 87659cd8561237b6c69f5376328fda934693aedde17bb7a2c57008e9d9ff992d0c253a391c7d8d50114e0e49ff7daf86a362f7961cf92f7564cd01342ca2e385 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.8, string.prototype.trimend@npm:^1.0.9": + version: 1.0.9 + resolution: "string.prototype.trimend@npm:1.0.9" + dependencies: + call-bind: ^1.0.8 + call-bound: ^1.0.2 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: cb86f639f41d791a43627784be2175daa9ca3259c7cb83e7a207a729909b74f2ea0ec5d85de5761e6835e5f443e9420c6ff3f63a845378e4a61dd793177bc287 + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.8": + version: 1.0.8 + resolution: "string.prototype.trimstart@npm:1.0.8" + dependencies: + call-bind: ^1.0.7 + define-properties: ^1.2.1 + es-object-atoms: ^1.0.0 + checksum: df1007a7f580a49d692375d996521dc14fd103acda7f3034b3c558a60b82beeed3a64fa91e494e164581793a8ab0ae2f59578a49896a7af6583c1f20472bce96 languageName: node linkType: hard @@ -10012,6 +10109,16 @@ __metadata: languageName: node linkType: hard +"stringify-entities@npm:^4.0.0": + version: 4.0.4 + resolution: "stringify-entities@npm:4.0.4" + dependencies: + character-entities-html4: ^2.0.0 + character-entities-legacy: ^3.0.0 + checksum: ac1344ef211eacf6cf0a0a8feaf96f9c36083835b406560d2c6ff5a87406a41b13f2f0b4c570a3b391f465121c4fd6822b863ffb197e8c0601a64097862cc5b5 + languageName: node + linkType: hard + "strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" @@ -10044,13 +10151,6 @@ __metadata: languageName: node linkType: hard -"strip-final-newline@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-final-newline@npm:3.0.0" - checksum: 23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 - languageName: node - linkType: hard - "strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -10058,12 +10158,21 @@ __metadata: languageName: node linkType: hard -"style-to-object@npm:^0.4.0": - version: 0.4.2 - resolution: "style-to-object@npm:0.4.2" +"style-to-js@npm:^1.0.0": + version: 1.1.17 + resolution: "style-to-js@npm:1.1.17" dependencies: - inline-style-parser: 0.1.1 - checksum: 314a80bcfadde41c2b9c8d717a4b1f2220954561040c2c7740496715da5cb95f99920a8eeefe2d4a862149875f352a12eda9bbef5816d7e0a71910da00d1521f + style-to-object: 1.0.9 + checksum: cdf92a0a42383fcc535972b7ec73395b53e370e5eaa345faf4d360f7918789cd73a20a79eef6d764b6441ff2e532a42ad5830ab87fec60a9dfc177fa438a6876 + languageName: node + linkType: hard + +"style-to-object@npm:1.0.9": + version: 1.0.9 + resolution: "style-to-object@npm:1.0.9" + dependencies: + inline-style-parser: 0.2.4 + checksum: a89e229161a56c53e28d1b91dcdc902f482f577db8b13741d3f056df7df0fbff4ecb44e06e32960f11c3a477b26f056e889a223bef6bc72b162935c5e4828145 languageName: node linkType: hard @@ -10090,13 +10199,13 @@ __metadata: languageName: node linkType: hard -"sucrase@npm:^3.32.0": - version: 3.32.0 - resolution: "sucrase@npm:3.32.0" +"sucrase@npm:^3.35.0": + version: 3.35.0 + resolution: "sucrase@npm:3.35.0" dependencies: "@jridgewell/gen-mapping": ^0.3.2 commander: ^4.0.0 - glob: 7.1.6 + glob: ^10.3.10 lines-and-columns: ^1.1.6 mz: ^2.7.0 pirates: ^4.0.1 @@ -10104,13 +10213,13 @@ __metadata: bin: sucrase: bin/sucrase sucrase-node: bin/sucrase-node - checksum: 79f760aef513adcf22b882d43100296a8afa7f307acef3e8803304b763484cf138a3e2cebc498a6791110ab20c7b8deba097f6ce82f812ca8f1723e3440e5c95 + checksum: 9fc5792a9ab8a14dcf9c47dcb704431d35c1cdff1d17d55d382a31c2e8e3063870ad32ce120a80915498486246d612e30cda44f1624d9d9a10423e1a43487ad1 languageName: node linkType: hard "superagent@npm:^8.0.9": - version: 8.0.9 - resolution: "superagent@npm:8.0.9" + version: 8.1.2 + resolution: "superagent@npm:8.1.2" dependencies: component-emitter: ^1.3.0 cookiejar: ^2.1.4 @@ -10122,16 +10231,7 @@ __metadata: mime: 2.6.0 qs: ^6.11.0 semver: ^7.3.8 - checksum: 5d00cdc7ceb5570663da80604965750e6b1b8d7d7442b7791e285c62bcd8d578a8ead0242a2426432b59a255fb42eb3a196d636157538a1392e7b6c5f1624810 - languageName: node - linkType: hard - -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: ^3.0.0 - checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + checksum: f3601c5ccae34d5ba684a03703394b5d25931f4ae2e1e31a1de809f88a9400e997ece037f9accf148a21c408f950dc829db1e4e23576a7f9fe0efa79fd5c9d2f languageName: node linkType: hard @@ -10168,43 +10268,35 @@ __metadata: linkType: hard "tailwindcss@npm:^3.3.2": - version: 3.3.2 - resolution: "tailwindcss@npm:3.3.2" + version: 3.4.17 + resolution: "tailwindcss@npm:3.4.17" dependencies: "@alloc/quick-lru": ^5.2.0 arg: ^5.0.2 - chokidar: ^3.5.3 + chokidar: ^3.6.0 didyoumean: ^1.2.2 dlv: ^1.1.3 - fast-glob: ^3.2.12 + fast-glob: ^3.3.2 glob-parent: ^6.0.2 is-glob: ^4.0.3 - jiti: ^1.18.2 - lilconfig: ^2.1.0 - micromatch: ^4.0.5 + jiti: ^1.21.6 + lilconfig: ^3.1.3 + micromatch: ^4.0.8 normalize-path: ^3.0.0 object-hash: ^3.0.0 - picocolors: ^1.0.0 - postcss: ^8.4.23 + picocolors: ^1.1.1 + postcss: ^8.4.47 postcss-import: ^15.1.0 postcss-js: ^4.0.1 - postcss-load-config: ^4.0.1 - postcss-nested: ^6.0.1 - postcss-selector-parser: ^6.0.11 - postcss-value-parser: ^4.2.0 - resolve: ^1.22.2 - sucrase: ^3.32.0 + postcss-load-config: ^4.0.2 + postcss-nested: ^6.2.0 + postcss-selector-parser: ^6.1.2 + resolve: ^1.22.8 + sucrase: ^3.35.0 bin: tailwind: lib/cli.js tailwindcss: lib/cli.js - checksum: 4897c70e671c885e151f57434d87ccb806f468a11900f028245b351ffbca5245ff0c10ca5dbb6eb4c7c4df3de8a15a05fe08c2aea4b152cb07bee9bb1d8a14a8 - languageName: node - linkType: hard - -"tapable@npm:^2.2.0": - version: 2.2.1 - resolution: "tapable@npm:2.2.1" - checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 + checksum: bda962f30e9a2f0567e2ee936ec863d5178958078e577ced13da60b3af779062a53a7e95f2f32b5c558f12a7477dea3ce071441a7362c6d7bf50bc9e166728a4 languageName: node linkType: hard @@ -10223,7 +10315,7 @@ __metadata: languageName: node linkType: hard -"tar@npm:^6.1.11, tar@npm:^6.2.0": +"tar@npm:^6.1.11, tar@npm:^6.2.1": version: 6.2.1 resolution: "tar@npm:6.2.1" dependencies: @@ -10251,13 +10343,6 @@ __metadata: languageName: node linkType: hard -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a - languageName: node - linkType: hard - "thenify-all@npm:^1.0.0": version: 1.6.0 resolution: "thenify-all@npm:1.6.0" @@ -10286,13 +10371,20 @@ __metadata: linkType: hard "tiny-invariant@npm:^1.0.6": - version: 1.3.1 - resolution: "tiny-invariant@npm:1.3.1" - checksum: 872dbd1ff20a21303a2fd20ce3a15602cfa7fcf9b228bd694a52e2938224313b5385a1078cb667ed7375d1612194feaca81c4ecbe93121ca1baebe344de4f84c + version: 1.3.3 + resolution: "tiny-invariant@npm:1.3.3" + checksum: 5e185c8cc2266967984ce3b352a4e57cb89dad5a8abb0dea21468a6ecaa67cd5bb47a3b7a85d08041008644af4f667fb8b6575ba38ba5fb00b3b5068306e59fe languageName: node linkType: hard -"tinyglobby@npm:^0.2.12": +"tinyexec@npm:^0.3.2": + version: 0.3.2 + resolution: "tinyexec@npm:0.3.2" + checksum: bd491923020610bdeadb0d8cf5d70e7cbad5a3201620fd01048c9bf3b31ffaa75c33254e1540e13b993ce4e8187852b0b5a93057bb598e7a57afa2ca2048a35c + languageName: node + linkType: hard + +"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.13": version: 0.2.14 resolution: "tinyglobby@npm:0.2.14" dependencies: @@ -10302,13 +10394,6 @@ __metadata: languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 - languageName: node - linkType: hard - "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -10356,18 +10441,18 @@ __metadata: linkType: hard "trough@npm:^2.0.0": - version: 2.1.0 - resolution: "trough@npm:2.1.0" - checksum: a577bb561c2b401cc0e1d9e188fcfcdf63b09b151ff56a668da12197fe97cac15e3d77d5b51f426ccfd94255744a9118e9e9935afe81a3644fa1be9783c82886 + version: 2.2.0 + resolution: "trough@npm:2.2.0" + checksum: 6097df63169aca1f9b08c263b1b501a9b878387f46e161dde93f6d0bba7febba93c95f876a293c5ea370f6cb03bcb687b2488c8955c3cfb66c2c0161ea8c00f6 languageName: node linkType: hard -"ts-api-utils@npm:^1.0.1": - version: 1.0.3 - resolution: "ts-api-utils@npm:1.0.3" +"ts-api-utils@npm:^2.1.0": + version: 2.1.0 + resolution: "ts-api-utils@npm:2.1.0" peerDependencies: - typescript: ">=4.2.0" - checksum: 441cc4489d65fd515ae6b0f4eb8690057add6f3b6a63a36073753547fb6ce0c9ea0e0530220a0b282b0eec535f52c4dfc315d35f8a4c9a91c0def0707a714ca6 + typescript: ">=4.8.4" + checksum: 5b1ef89105654d93d67582308bd8dfe4bbf6874fccbcaa729b08fbb00a940fd4c691ca6d0d2b18c3c70878d9a7e503421b7cc473dbc3d0d54258b86401d4b15d languageName: node linkType: hard @@ -10452,24 +10537,10 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0, tslib@npm:^2.0.3": - version: 2.6.2 - resolution: "tslib@npm:2.6.2" - checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad - languageName: node - linkType: hard - -"tslib@npm:^2.1.0": - version: 2.6.1 - resolution: "tslib@npm:2.6.1" - checksum: b0d176d176487905b66ae4d5856647df50e37beea7571c53b8d10ba9222c074b81f1410fb91da13debaf2cbc970663609068bdebafa844ea9d69b146527c38fe - languageName: node - linkType: hard - -"tslib@npm:^2.4.0": - version: 2.6.0 - resolution: "tslib@npm:2.6.0" - checksum: c01066038f950016a18106ddeca4649b4d76caa76ec5a31e2a26e10586a59fceb4ee45e96719bf6c715648e7c14085a81fee5c62f7e9ebee68e77a5396e5538f +"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.4.0": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a languageName: node linkType: hard @@ -10489,50 +10560,56 @@ __metadata: languageName: node linkType: hard -"typed-array-buffer@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-buffer@npm:1.0.0" +"typed-array-buffer@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-buffer@npm:1.0.3" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.2.1 - is-typed-array: ^1.1.10 - checksum: 3e0281c79b2a40cd97fe715db803884301993f4e8c18e8d79d75fd18f796e8cd203310fec8c7fdb5e6c09bedf0af4f6ab8b75eb3d3a85da69328f28a80456bd3 + call-bound: ^1.0.3 + es-errors: ^1.3.0 + is-typed-array: ^1.1.14 + checksum: 3fb91f0735fb413b2bbaaca9fabe7b8fc14a3fa5a5a7546bab8a57e755be0e3788d893195ad9c2b842620592de0e68d4c077d4c2c41f04ec25b8b5bb82fa9a80 languageName: node linkType: hard -"typed-array-byte-length@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-byte-length@npm:1.0.0" +"typed-array-byte-length@npm:^1.0.3": + version: 1.0.3 + resolution: "typed-array-byte-length@npm:1.0.3" dependencies: - call-bind: ^1.0.2 + call-bind: ^1.0.8 for-each: ^0.3.3 - has-proto: ^1.0.1 - is-typed-array: ^1.1.10 - checksum: b03db16458322b263d87a702ff25388293f1356326c8a678d7515767ef563ef80e1e67ce648b821ec13178dd628eb2afdc19f97001ceae7a31acf674c849af94 + gopd: ^1.2.0 + has-proto: ^1.2.0 + is-typed-array: ^1.1.14 + checksum: cda9352178ebeab073ad6499b03e938ebc30c4efaea63a26839d89c4b1da9d2640b0d937fc2bd1f049eb0a38def6fbe8a061b601292ae62fe079a410ce56e3a6 languageName: node linkType: hard -"typed-array-byte-offset@npm:^1.0.0": - version: 1.0.0 - resolution: "typed-array-byte-offset@npm:1.0.0" - dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - for-each: ^0.3.3 - has-proto: ^1.0.1 - is-typed-array: ^1.1.10 - checksum: 04f6f02d0e9a948a95fbfe0d5a70b002191fae0b8fe0fe3130a9b2336f043daf7a3dda56a31333c35a067a97e13f539949ab261ca0f3692c41603a46a94e960b - languageName: node - linkType: hard - -"typed-array-length@npm:^1.0.4": +"typed-array-byte-offset@npm:^1.0.4": version: 1.0.4 - resolution: "typed-array-length@npm:1.0.4" + resolution: "typed-array-byte-offset@npm:1.0.4" dependencies: - call-bind: ^1.0.2 + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.8 for-each: ^0.3.3 - is-typed-array: ^1.1.9 - checksum: 2228febc93c7feff142b8c96a58d4a0d7623ecde6c7a24b2b98eb3170e99f7c7eff8c114f9b283085cd59dcd2bd43aadf20e25bba4b034a53c5bb292f71f8956 + gopd: ^1.2.0 + has-proto: ^1.2.0 + is-typed-array: ^1.1.15 + reflect.getprototypeof: ^1.0.9 + checksum: 670b7e6bb1d3c2cf6160f27f9f529e60c3f6f9611c67e47ca70ca5cfa24ad95415694c49d1dbfeda016d3372cab7dfc9e38c7b3e1bb8d692cae13a63d3c144d7 + languageName: node + linkType: hard + +"typed-array-length@npm:^1.0.7": + version: 1.0.7 + resolution: "typed-array-length@npm:1.0.7" + dependencies: + call-bind: ^1.0.7 + for-each: ^0.3.3 + gopd: ^1.0.1 + is-typed-array: ^1.1.13 + possible-typed-array-names: ^1.0.0 + reflect.getprototypeof: ^1.0.6 + checksum: deb1a4ffdb27cd930b02c7030cb3e8e0993084c643208e52696e18ea6dd3953dfc37b939df06ff78170423d353dc8b10d5bae5796f3711c1b3abe52872b3774c languageName: node linkType: hard @@ -10546,23 +10623,13 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.1.6": - version: 5.1.6 - resolution: "typescript@npm:5.1.6" +"typescript@npm:^5.1.6, typescript@npm:^5.3.3": + version: 5.8.3 + resolution: "typescript@npm:5.8.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: b2f2c35096035fe1f5facd1e38922ccb8558996331405eb00a5111cc948b2e733163cc22fab5db46992aba7dd520fff637f2c1df4996ff0e134e77d3249a7350 - languageName: node - linkType: hard - -"typescript@npm:^5.3.3": - version: 5.5.3 - resolution: "typescript@npm:5.5.3" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 4b4f14313484d5c86064d04ba892544801fa551f5cf72719b540b498056fec7fc192d0bbdb2ba1448e759b1548769956da9e43e7c16781e8d8856787b0575004 + checksum: cb1d081c889a288b962d3c8ae18d337ad6ee88a8e81ae0103fa1fecbe923737f3ba1dbdb3e6d8b776c72bc73bfa6d8d850c0306eed1a51377d2fccdfd75d92c4 languageName: node linkType: hard @@ -10576,30 +10643,44 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@^5.1.6#~builtin": - version: 5.1.6 - resolution: "typescript@patch:typescript@npm%3A5.1.6#~builtin::version=5.1.6&hash=5da071" +"typescript@patch:typescript@^5.1.6#~builtin, typescript@patch:typescript@^5.3.3#~builtin": + version: 5.8.3 + resolution: "typescript@patch:typescript@npm%3A5.8.3#~builtin::version=5.8.3&hash=14eedb" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: f53bfe97f7c8b2b6d23cf572750d4e7d1e0c5fff1c36d859d0ec84556a827b8785077bc27676bf7e71fae538e517c3ecc0f37e7f593be913d884805d931bc8be + checksum: 1b503525a88ff0ff5952e95870971c4fb2118c17364d60302c21935dedcd6c37e6a0a692f350892bafcef6f4a16d09073fe461158547978d2f16fbe4cb18581c languageName: node linkType: hard -"typescript@patch:typescript@^5.3.3#~builtin": - version: 5.5.3 - resolution: "typescript@patch:typescript@npm%3A5.5.3#~builtin::version=5.5.3&hash=14eedb" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 6853be4607706cc1ad2f16047cf1cd72d39f79acd5f9716e1d23bc0e462c7f59be7458fe58a21665e7657a05433d7ab8419d093a5a4bd5f3a33f879b35d2769b +"ua-is-frozen@npm:^0.1.2": + version: 0.1.2 + resolution: "ua-is-frozen@npm:0.1.2" + checksum: 139c89b175bd4e3aeed2ebd1c972ce078e9507ade5f9d704d4ac0a916b2a5e8ada0bc6f616a8c39415e6b602e967ab172d0c44f0dfe353ce8104139897472f48 languageName: node linkType: hard "ua-parser-js@npm:^1.0.38": - version: 1.0.38 - resolution: "ua-parser-js@npm:1.0.38" - checksum: d0772b22b027338d806ab17d1ac2896ee7485bdf9217c526028159f3cd6bb10272bb18f6196d2f94dde83e3b36dc9d2533daf08a414764f6f4f1844842383838 + version: 1.0.40 + resolution: "ua-parser-js@npm:1.0.40" + bin: + ua-parser-js: script/cli.js + checksum: ae555a33dc9395dd877e295d6adbf5634e047aad7c3358328830218f3ca3a6233e35848cd355465a7612f269860e8029984389282940c7a27c9af4dfcdbba8c3 + languageName: node + linkType: hard + +"ua-parser-js@npm:^2.0.0": + version: 2.0.3 + resolution: "ua-parser-js@npm:2.0.3" + dependencies: + "@types/node-fetch": ^2.6.12 + detect-europe-js: ^0.1.2 + is-standalone-pwa: ^0.1.1 + node-fetch: ^2.7.0 + ua-is-frozen: ^0.1.2 + bin: + ua-parser-js: script/cli.js + checksum: 9febec875b6714e0d70321f8679db5226c81b70bcf38b854c4fac82a52dbb1be800a2485e5440e1c127f94ed81c7f015d72e197a6d75021f36f14c21502b2e4c languageName: node linkType: hard @@ -10611,25 +10692,25 @@ __metadata: linkType: hard "udomdiff@npm:^1.1.0": - version: 1.1.0 - resolution: "udomdiff@npm:1.1.0" - checksum: 237e093a7260707adacff8d6213503d30d787a6ad9db9e7207f5bfb6bf72a3d91ad68231900f8efa6f27c961bba095410e4c07960983a3f6d54248ce91572444 + version: 1.1.2 + resolution: "udomdiff@npm:1.1.2" + checksum: a1968600176a683c07de6be37b8a078b37d03f530a999b12d397d1720d57a779b6f7e43256157ffa56061cde4dc5b75ccd0061099c6741400417b9aab46eb889 languageName: node linkType: hard -"ufo@npm:^1.5.3": - version: 1.5.3 - resolution: "ufo@npm:1.5.3" - checksum: 2f54fa543b2e689cc4ab341fe2194937afe37c5ee43cd782e6ecc184e36859e84d4197a43ae4cd6e9a56f793ca7c5b950dfff3f16fadaeef9b6b88b05c88c8ef +"ufo@npm:^1.5.4": + version: 1.6.1 + resolution: "ufo@npm:1.6.1" + checksum: 2c401dd45bd98ad00806e044aa8571aa2aa1762fffeae5e78c353192b257ef2c638159789f119e5d8d5e5200e34228cd1bbde871a8f7805de25daa8576fb1633 languageName: node linkType: hard "uglify-js@npm:^3.1.4": - version: 3.17.4 - resolution: "uglify-js@npm:3.17.4" + version: 3.19.3 + resolution: "uglify-js@npm:3.19.3" bin: uglifyjs: bin/uglifyjs - checksum: 7b3897df38b6fc7d7d9f4dcd658599d81aa2b1fb0d074829dd4e5290f7318dbca1f4af2f45acb833b95b1fe0ed4698662ab61b87e94328eb4c0a0d3435baf924 + checksum: 7ed6272fba562eb6a3149cfd13cda662f115847865c03099e3995a0e7a910eba37b82d4fccf9e88271bb2bcbe505bb374967450f433c17fa27aa36d94a8d0553 languageName: node linkType: hard @@ -10663,15 +10744,29 @@ __metadata: languageName: node linkType: hard -"unbox-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "unbox-primitive@npm:1.0.2" +"unbox-primitive@npm:^1.1.0": + version: 1.1.0 + resolution: "unbox-primitive@npm:1.1.0" dependencies: - call-bind: ^1.0.2 + call-bound: ^1.0.3 has-bigints: ^1.0.2 - has-symbols: ^1.0.3 - which-boxed-primitive: ^1.0.2 - checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 + has-symbols: ^1.1.0 + which-boxed-primitive: ^1.1.1 + checksum: 729f13b84a5bfa3fead1d8139cee5c38514e63a8d6a437819a473e241ba87eeb593646568621c7fc7f133db300ef18d65d1a5a60dc9c7beb9000364d93c581df + languageName: node + linkType: hard + +"uncrypto@npm:^0.1.3": + version: 0.1.3 + resolution: "uncrypto@npm:0.1.3" + checksum: 07160e08806dd6cea16bb96c3fd54cd70fc801e02fc3c6f86980144d15c9ebbd1c55587f7280a207b3af6cd34901c0d0b77ada5a02c2f7081a033a05acf409e2 + languageName: node + linkType: hard + +"undici-types@npm:~7.8.0": + version: 7.8.0 + resolution: "undici-types@npm:7.8.0" + checksum: 59521a5b9b50e72cb838a29466b3557b4eacbc191a83f4df5a2f7b156bc8263072b145dc4bb8ec41da7d56a7e9b178892458da02af769243d57f801a50ac5751 languageName: node linkType: hard @@ -10685,8 +10780,8 @@ __metadata: linkType: hard "unified@npm:^11.0.0": - version: 11.0.3 - resolution: "unified@npm:11.0.3" + version: 11.0.5 + resolution: "unified@npm:11.0.5" dependencies: "@types/unist": ^3.0.0 bail: ^2.0.0 @@ -10695,7 +10790,7 @@ __metadata: is-plain-obj: ^4.0.0 trough: ^2.0.0 vfile: ^6.0.0 - checksum: 402d6b397b98f8966993faca0e1480f5f1825cc44df6a5236b75ab099f14b10ed808e578155c3f535e60676c12ee3f52346ca08d64343a72181d7a6b4d32011d + checksum: b3bf7fd6f568cc261e074dae21188483b0f2a8ab858d62e6e85b75b96cc655f59532906ae3c64d56a9b257408722d71f1d4135292b3d7ee02907c8b592fb3cf0 languageName: node linkType: hard @@ -10786,17 +10881,84 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.0": - version: 1.1.0 - resolution: "update-browserslist-db@npm:1.1.0" +"unrs-resolver@npm:^1.6.2": + version: 1.9.0 + resolution: "unrs-resolver@npm:1.9.0" dependencies: - escalade: ^3.1.2 - picocolors: ^1.0.1 + "@unrs/resolver-binding-android-arm-eabi": 1.9.0 + "@unrs/resolver-binding-android-arm64": 1.9.0 + "@unrs/resolver-binding-darwin-arm64": 1.9.0 + "@unrs/resolver-binding-darwin-x64": 1.9.0 + "@unrs/resolver-binding-freebsd-x64": 1.9.0 + "@unrs/resolver-binding-linux-arm-gnueabihf": 1.9.0 + "@unrs/resolver-binding-linux-arm-musleabihf": 1.9.0 + "@unrs/resolver-binding-linux-arm64-gnu": 1.9.0 + "@unrs/resolver-binding-linux-arm64-musl": 1.9.0 + "@unrs/resolver-binding-linux-ppc64-gnu": 1.9.0 + "@unrs/resolver-binding-linux-riscv64-gnu": 1.9.0 + "@unrs/resolver-binding-linux-riscv64-musl": 1.9.0 + "@unrs/resolver-binding-linux-s390x-gnu": 1.9.0 + "@unrs/resolver-binding-linux-x64-gnu": 1.9.0 + "@unrs/resolver-binding-linux-x64-musl": 1.9.0 + "@unrs/resolver-binding-wasm32-wasi": 1.9.0 + "@unrs/resolver-binding-win32-arm64-msvc": 1.9.0 + "@unrs/resolver-binding-win32-ia32-msvc": 1.9.0 + "@unrs/resolver-binding-win32-x64-msvc": 1.9.0 + napi-postinstall: ^0.2.2 + dependenciesMeta: + "@unrs/resolver-binding-android-arm-eabi": + optional: true + "@unrs/resolver-binding-android-arm64": + optional: true + "@unrs/resolver-binding-darwin-arm64": + optional: true + "@unrs/resolver-binding-darwin-x64": + optional: true + "@unrs/resolver-binding-freebsd-x64": + optional: true + "@unrs/resolver-binding-linux-arm-gnueabihf": + optional: true + "@unrs/resolver-binding-linux-arm-musleabihf": + optional: true + "@unrs/resolver-binding-linux-arm64-gnu": + optional: true + "@unrs/resolver-binding-linux-arm64-musl": + optional: true + "@unrs/resolver-binding-linux-ppc64-gnu": + optional: true + "@unrs/resolver-binding-linux-riscv64-gnu": + optional: true + "@unrs/resolver-binding-linux-riscv64-musl": + optional: true + "@unrs/resolver-binding-linux-s390x-gnu": + optional: true + "@unrs/resolver-binding-linux-x64-gnu": + optional: true + "@unrs/resolver-binding-linux-x64-musl": + optional: true + "@unrs/resolver-binding-wasm32-wasi": + optional: true + "@unrs/resolver-binding-win32-arm64-msvc": + optional: true + "@unrs/resolver-binding-win32-ia32-msvc": + optional: true + "@unrs/resolver-binding-win32-x64-msvc": + optional: true + checksum: f38edd016942d79045a992f061173d4c50eb8220e9e573bf0bc3b78c439959366f19981181fa6bfc3fd4d560aafe47317940089daaa7c035690423750e3164bf + languageName: node + linkType: hard + +"update-browserslist-db@npm:^1.1.3": + version: 1.1.3 + resolution: "update-browserslist-db@npm:1.1.3" + dependencies: + escalade: ^3.2.0 + picocolors: ^1.1.1 peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 7b74694d96f0c360f01b702e72353dc5a49df4fe6663d3ee4e5c628f061576cddf56af35a3a886238c01dd3d8f231b7a86a8ceaa31e7a9220ae31c1c1238e562 + checksum: 7b6d8d08c34af25ee435bccac542bedcb9e57c710f3c42421615631a80aa6dd28b0a81c9d2afbef53799d482fb41453f714b8a7a0a8003e3b4ec8fb1abb819af languageName: node linkType: hard @@ -10809,55 +10971,55 @@ __metadata: languageName: node linkType: hard -"use-callback-ref@npm:^1.3.0": - version: 1.3.0 - resolution: "use-callback-ref@npm:1.3.0" +"use-callback-ref@npm:^1.3.3": + version: 1.3.3 + resolution: "use-callback-ref@npm:1.3.3" dependencies: tslib: ^2.0.0 peerDependencies: - "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: 7913df383a5a6fcb399212eedefaac2e0c6f843555202d4e3010bac3848afe38ecaa3d0d6500ad1d936fbeffd637e6c517e68edb024af5e6beca7f27f3ce7b21 + checksum: 4da1c82d7a2409cee6c882748a40f4a083decf238308bf12c3d0166f0e338f8d512f37b8d11987eb5a421f14b9b5b991edf3e11ed25c3bb7a6559081f8359b44 languageName: node linkType: hard "use-isomorphic-layout-effect@npm:^1.1.2": - version: 1.1.2 - resolution: "use-isomorphic-layout-effect@npm:1.1.2" + version: 1.2.1 + resolution: "use-isomorphic-layout-effect@npm:1.2.1" peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 peerDependenciesMeta: "@types/react": optional: true - checksum: a6532f7fc9ae222c3725ff0308aaf1f1ddbd3c00d685ef9eee6714fd0684de5cb9741b432fbf51e61a784e2955424864f7ea9f99734a02f237b17ad3e18ea5cb + checksum: a52155ffa7d67a5107ef2033ae2c63f5290c3e3b198de30d4d4f78cd7921e1ab1ea31eeec387defb67ef61adb672d3b8d25b54b7dcc089bacc4f885abde96e9d languageName: node linkType: hard -"use-sidecar@npm:^1.1.2": - version: 1.1.2 - resolution: "use-sidecar@npm:1.1.2" +"use-sidecar@npm:^1.1.3": + version: 1.1.3 + resolution: "use-sidecar@npm:1.1.3" dependencies: detect-node-es: ^1.1.0 tslib: ^2.0.0 peerDependencies: - "@types/react": ^16.9.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + "@types/react": "*" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: 925d1922f9853e516eaad526b6fed1be38008073067274f0ecc3f56b17bb8ab63480140dd7c271f94150027c996cea4efe83d3e3525e8f3eda22055f6a39220b + checksum: 88664c6b2c5b6e53e4d5d987694c9053cea806da43130248c74ca058945c8caa6ccb7b1787205a9eb5b9d124633e42153848904002828acabccdc48cda026622 languageName: node linkType: hard -"use-sync-external-store@npm:^1.0.0": - version: 1.2.2 - resolution: "use-sync-external-store@npm:1.2.2" +"use-sync-external-store@npm:^1.4.0": + version: 1.5.0 + resolution: "use-sync-external-store@npm:1.5.0" peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: fe07c071c4da3645f112c38c0e57beb479a8838616ff4e92598256ecce527f2888c08febc7f9b2f0ce2f0e18540ba3cde41eb2035e4fafcb4f52955037098a81 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 5e639c9273200adb6985b512c96a3a02c458bc8ca1a72e91da9cdc6426144fc6538dca434b0f99b28fb1baabc82e1c383ba7900b25ccdcb43758fb058dc66c34 languageName: node linkType: hard @@ -10919,25 +11081,25 @@ __metadata: linkType: hard "vercel@npm:^37.3.0": - version: 37.3.0 - resolution: "vercel@npm:37.3.0" + version: 37.14.0 + resolution: "vercel@npm:37.14.0" dependencies: - "@vercel/build-utils": 8.3.9 + "@vercel/build-utils": 8.4.12 "@vercel/fun": 1.1.0 - "@vercel/go": 3.1.2 - "@vercel/hydrogen": 1.0.4 - "@vercel/next": 4.3.7 - "@vercel/node": 3.2.11 + "@vercel/go": 3.2.0 + "@vercel/hydrogen": 1.0.9 + "@vercel/next": 4.3.18 + "@vercel/node": 3.2.24 "@vercel/python": 4.3.1 - "@vercel/redwood": 2.1.3 - "@vercel/remix-builder": 2.2.6 + "@vercel/redwood": 2.1.8 + "@vercel/remix-builder": 2.2.13 "@vercel/ruby": 2.1.0 - "@vercel/static-build": 2.5.21 + "@vercel/static-build": 2.5.34 chokidar: 3.3.1 bin: vc: dist/index.js vercel: dist/index.js - checksum: a984144cc5f939a884411189dda101b5939f9344ce6e7e62c70794df67e8ffeaf7eaf61e3b52bec5ba3d509803fd43d84afea76cd63e2b48f22610fe557e85b1 + checksum: 1dabe6ec468dec4a198954f663613a12619784f1b94c3ed4ad7d1ac8d8df58f2dbd364066653d04a06778dc77ff40e32aced12a3176f81de23fe47b44d86a9ad languageName: node linkType: hard @@ -10952,20 +11114,19 @@ __metadata: linkType: hard "vfile@npm:^6.0.0": - version: 6.0.1 - resolution: "vfile@npm:6.0.1" + version: 6.0.3 + resolution: "vfile@npm:6.0.3" dependencies: "@types/unist": ^3.0.0 - unist-util-stringify-position: ^4.0.0 vfile-message: ^4.0.0 - checksum: 05ccee73aeb00402bc8a5d0708af299e9f4a33f5132805449099295085e3ca3b0d018328bad9ff44cf2e6f4cd364f1d558d3fb9b394243a25b2739207edcb0ed + checksum: 152b6729be1af70df723efb65c1a1170fd483d41086557da3651eea69a1dd1f0c22ea4344834d56d30734b9185bcab63e22edc81d3f0e9bed8aa4660d61080af languageName: node linkType: hard "wavesurfer.js@npm:^7.4.2": - version: 7.4.2 - resolution: "wavesurfer.js@npm:7.4.2" - checksum: d609ed88e09d693486cb272226b5709e6f13e78421305f607f0ad6355d0aa691ae9c2a5934ac5b4ed70be0780d658597b53e97c0eee9a64092d69fc0a2c53d74 + version: 7.9.5 + resolution: "wavesurfer.js@npm:7.9.5" + checksum: 75173e090b484241382a2802a4f16f6babcc97d688731131becb6d1658fb90ad0c0cbe52c212f5b11c8647175d47938241d9e19a54af8a55b9fd26122c15d2e7 languageName: node linkType: hard @@ -10984,18 +11145,18 @@ __metadata: linkType: hard "webpack-sources@npm:^2.0.0 || ^3.0.0": - version: 3.2.3 - resolution: "webpack-sources@npm:3.2.3" - checksum: 989e401b9fe3536529e2a99dac8c1bdc50e3a0a2c8669cbafad31271eadd994bc9405f88a3039cd2e29db5e6d9d0926ceb7a1a4e7409ece021fe79c37d9c4607 + version: 3.3.2 + resolution: "webpack-sources@npm:3.3.2" + checksum: c0760437165b241376838b20d682f8cc6aaa4f9cf3787d3063bdb997eaf823ac3300f2b1b14a48bbebde7ce4386cabf78e5d17d632dfdef55e84c59c99c68be0 languageName: node linkType: hard -"webrtc-adapter@npm:^8.2.3": - version: 8.2.3 - resolution: "webrtc-adapter@npm:8.2.3" +"webrtc-adapter@npm:^9.0.1": + version: 9.0.3 + resolution: "webrtc-adapter@npm:9.0.3" dependencies: sdp: ^3.2.0 - checksum: 8239c9452c489c9aad2584b5d00af22462c3e0f1b7885c6e4036b518d2b9411d94c00d2ceadbed987459a3647cfc4ce04c0eb75dd5ae7c3d7df9b810525e6a07 + checksum: 2b29e6e6ed1018f62b2077fffd4f6d7fa9993f98091b7af459261092c2c05125bfa146b4d0dd76ed9e667703a1391743e0bb76a3754239c7d20acb034026eae3 languageName: node linkType: hard @@ -11009,61 +11170,64 @@ __metadata: languageName: node linkType: hard -"which-boxed-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "which-boxed-primitive@npm:1.0.2" +"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": + version: 1.1.1 + resolution: "which-boxed-primitive@npm:1.1.1" dependencies: - is-bigint: ^1.0.1 - is-boolean-object: ^1.1.0 - is-number-object: ^1.0.4 - is-string: ^1.0.5 - is-symbol: ^1.0.3 - checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e + is-bigint: ^1.1.0 + is-boolean-object: ^1.2.1 + is-number-object: ^1.1.1 + is-string: ^1.1.1 + is-symbol: ^1.1.1 + checksum: ee41d0260e4fd39551ad77700c7047d3d281ec03d356f5e5c8393fe160ba0db53ef446ff547d05f76ffabfd8ad9df7c9a827e12d4cccdbc8fccf9239ff8ac21e languageName: node linkType: hard -"which-builtin-type@npm:^1.1.3": - version: 1.1.3 - resolution: "which-builtin-type@npm:1.1.3" +"which-builtin-type@npm:^1.2.1": + version: 1.2.1 + resolution: "which-builtin-type@npm:1.2.1" dependencies: - function.prototype.name: ^1.1.5 - has-tostringtag: ^1.0.0 + call-bound: ^1.0.2 + function.prototype.name: ^1.1.6 + has-tostringtag: ^1.0.2 is-async-function: ^2.0.0 - is-date-object: ^1.0.5 - is-finalizationregistry: ^1.0.2 + is-date-object: ^1.1.0 + is-finalizationregistry: ^1.1.0 is-generator-function: ^1.0.10 - is-regex: ^1.1.4 + is-regex: ^1.2.1 is-weakref: ^1.0.2 isarray: ^2.0.5 - which-boxed-primitive: ^1.0.2 - which-collection: ^1.0.1 - which-typed-array: ^1.1.9 - checksum: 43730f7d8660ff9e33d1d3f9f9451c4784265ee7bf222babc35e61674a11a08e1c2925019d6c03154fcaaca4541df43abe35d2720843b9b4cbcebdcc31408f36 + which-boxed-primitive: ^1.1.0 + which-collection: ^1.0.2 + which-typed-array: ^1.1.16 + checksum: 7a3617ba0e7cafb795f74db418df889867d12bce39a477f3ee29c6092aa64d396955bf2a64eae3726d8578440e26777695544057b373c45a8bcf5fbe920bf633 languageName: node linkType: hard -"which-collection@npm:^1.0.1": - version: 1.0.1 - resolution: "which-collection@npm:1.0.1" +"which-collection@npm:^1.0.2": + version: 1.0.2 + resolution: "which-collection@npm:1.0.2" dependencies: - is-map: ^2.0.1 - is-set: ^2.0.1 - is-weakmap: ^2.0.1 - is-weakset: ^2.0.1 - checksum: c815bbd163107ef9cb84f135e6f34453eaf4cca994e7ba85ddb0d27cea724c623fae2a473ceccfd5549c53cc65a5d82692de418166df3f858e1e5dc60818581c + is-map: ^2.0.3 + is-set: ^2.0.3 + is-weakmap: ^2.0.2 + is-weakset: ^2.0.3 + checksum: c51821a331624c8197916598a738fc5aeb9a857f1e00d89f5e4c03dc7c60b4032822b8ec5696d28268bb83326456a8b8216344fb84270d18ff1d7628051879d9 languageName: node linkType: hard -"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.13, which-typed-array@npm:^1.1.9": - version: 1.1.13 - resolution: "which-typed-array@npm:1.1.13" +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19": + version: 1.1.19 + resolution: "which-typed-array@npm:1.1.19" dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.4 - for-each: ^0.3.3 - gopd: ^1.0.1 - has-tostringtag: ^1.0.0 - checksum: 3828a0d5d72c800e369d447e54c7620742a4cc0c9baf1b5e8c17e9b6ff90d8d861a3a6dd4800f1953dbf80e5e5cec954a289e5b4a223e3bee4aeb1f8c5f33309 + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.4 + for-each: ^0.3.5 + get-proto: ^1.0.1 + gopd: ^1.2.0 + has-tostringtag: ^1.0.2 + checksum: 162d2a07f68ea323f88ed9419861487ce5d02cb876f2cf9dd1e428d04a63133f93a54f89308f337b27cabd312ee3d027cae4a79002b2f0a85b79b9ef4c190670 languageName: node linkType: hard @@ -11098,6 +11262,13 @@ __metadata: languageName: node linkType: hard +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: f93ba3586fc181f94afdaff3a6fef27920b4b6d9eaefed0f428f8e07adea2a7f54a5f2830ce59406c8416f033f86902b91eb824072354645eea687dff3691ccb + languageName: node + linkType: hard + "wordwrap@npm:^1.0.0": version: 1.0.0 resolution: "wordwrap@npm:1.0.0" @@ -11202,10 +11373,12 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.1.1": - version: 2.3.1 - resolution: "yaml@npm:2.3.1" - checksum: 2c7bc9a7cd4c9f40d3b0b0a98e370781b68b8b7c4515720869aced2b00d92f5da1762b4ffa947f9e795d6cd6b19f410bd4d15fdd38aca7bd96df59bd9486fb54 +"yaml@npm:^2.3.4": + version: 2.8.0 + resolution: "yaml@npm:2.8.0" + bin: + yaml: bin.mjs + checksum: 66f103ca5a2f02dac0526895cc7ae7626d91aa8c43aad6fdcff15edf68b1199be4012140b390063877913441aaa5288fdf57eca30e06268a8282dd741525e626 languageName: node linkType: hard @@ -11251,3 +11424,10 @@ __metadata: checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 languageName: node linkType: hard + +"zwitch@npm:^2.0.0": + version: 2.0.4 + resolution: "zwitch@npm:2.0.4" + checksum: f22ec5fc2d5f02c423c93d35cdfa83573a3a3bd98c66b927c368ea4d0e7252a500df2a90a6b45522be536a96a73404393c958e945fdba95e6832c200791702b6 + languageName: node + linkType: hard From 2ac92b2d67979e2f5d57b53ef8de8d378563faec Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Tue, 17 Jun 2025 17:47:04 -0400 Subject: [PATCH 04/30] consent context vibe --- TODO.md | 6 ++- .../[transcriptId]/record/page.tsx | 2 +- .../transcripts/[transcriptId]/shareModal.tsx | 4 ++ www/app/(app)/transcripts/new/page.tsx | 2 + www/app/[roomName]/page.tsx | 46 +++++++++++++------ www/app/layout.tsx | 15 +++--- 6 files changed, 52 insertions(+), 23 deletions(-) diff --git a/TODO.md b/TODO.md index e57a251f..5ceb50fb 100644 --- a/TODO.md +++ b/TODO.md @@ -1,2 +1,4 @@ -- non-auth user consent - store on frontend per session? per meeting? (get meeting from the iframe) -- consent field userIdentity itself - optional \ No newline at end of file +- consent popup itself - make much less invasive, somewhere in the corner +- non-auth user consent AND AUTH user consent - store on frontend per session - per meeting? (get meeting from the iframe) +- actually delete aws +- add externalId to the iframe with the logged in user \ No newline at end of file diff --git a/www/app/(app)/transcripts/[transcriptId]/record/page.tsx b/www/app/(app)/transcripts/[transcriptId]/record/page.tsx index 8f46f76c..009fc519 100644 --- a/www/app/(app)/transcripts/[transcriptId]/record/page.tsx +++ b/www/app/(app)/transcripts/[transcriptId]/record/page.tsx @@ -13,7 +13,7 @@ import useMp3 from "../../useMp3"; import WaveformLoading from "../../waveformLoading"; import { Box, Text, Grid, Heading, VStack, Flex } from "@chakra-ui/react"; import LiveTrancription from "../../liveTranscription"; -import AudioConsentDialog from "../../components/AudioConsentDialog"; +import AudioConsentDialog from "../../../rooms/audioConsentDialog"; import useApi from "../../../../lib/useApi"; type TranscriptDetails = { diff --git a/www/app/(app)/transcripts/[transcriptId]/shareModal.tsx b/www/app/(app)/transcripts/[transcriptId]/shareModal.tsx index 2e8e5ece..88851690 100644 --- a/www/app/(app)/transcripts/[transcriptId]/shareModal.tsx +++ b/www/app/(app)/transcripts/[transcriptId]/shareModal.tsx @@ -133,6 +133,8 @@ const ShareModal = (props: ShareModalProps) => { setStream(val.toString()); }} placeholder="Pick a stream" + onBlur={() => {}} + onFocus={() => {}} /> @@ -145,6 +147,8 @@ const ShareModal = (props: ShareModalProps) => { value={topic} onChange={(val) => setTopic(val.toString())} placeholder="Pick a topic" + onBlur={() => {}} + onFocus={() => {}} /> )} diff --git a/www/app/(app)/transcripts/new/page.tsx b/www/app/(app)/transcripts/new/page.tsx index acc98c6c..6a325f4a 100644 --- a/www/app/(app)/transcripts/new/page.tsx +++ b/www/app/(app)/transcripts/new/page.tsx @@ -177,6 +177,8 @@ const TranscriptCreate = () => { value={targetLanguage} onChange={onLanguageChange} placeholder="Choose your language" + onBlur={() => {}} + onFocus={() => {}} /> {isClient && !loading ? ( diff --git a/www/app/[roomName]/page.tsx b/www/app/[roomName]/page.tsx index a2e28ff5..48c2711d 100644 --- a/www/app/[roomName]/page.tsx +++ b/www/app/[roomName]/page.tsx @@ -9,6 +9,7 @@ import { notFound } from "next/navigation"; import useSessionStatus from "../lib/useSessionStatus"; import AudioConsentDialog from "../(app)/rooms/audioConsentDialog"; import { DomainContext } from "../domainContext"; +import { useRecordingConsent } from "../recordingConsentContext"; import useSessionAccessToken from "../lib/useSessionAccessToken"; import useSessionUser from "../lib/useSessionUser"; @@ -25,7 +26,8 @@ export default function Room(details: RoomDetails) { const router = useRouter(); const { isLoading, isAuthenticated } = useSessionStatus(); const [showConsentDialog, setShowConsentDialog] = useState(false); - const [consentGiven, setConsentGiven] = useState(null); + const [consentLoading, setConsentLoading] = useState(false); + const { state: consentState, touch, hasConsent } = useRecordingConsent(); const { api_url } = useContext(DomainContext); const { accessToken } = useSessionAccessToken(); const { id: userId } = useSessionUser(); @@ -35,6 +37,8 @@ export default function Room(details: RoomDetails) { ? meeting?.response?.host_room_url : meeting?.response?.room_url; + const meetingId = meeting?.response?.id; + const handleLeave = useCallback(() => { router.push("/browse"); }, [router]); @@ -48,9 +52,9 @@ export default function Room(details: RoomDetails) { return null; }, [isAuthenticated, userId]); - const handleConsent = useCallback(async (given: boolean) => { - setConsentGiven(given); - setShowConsentDialog(false); // Close dialog after consent is given + const handleConsent = useCallback(async (meetingId: string, given: boolean) => { + setConsentLoading(true); + setShowConsentDialog(false); // Close dialog immediately if (meeting?.response?.id && api_url) { try { @@ -73,14 +77,20 @@ export default function Room(details: RoomDetails) { body: JSON.stringify(requestBody), }); - if (!response.ok) { + if (response.ok) { + touch(meetingId); + } else { console.error('Failed to submit consent'); } } catch (error) { console.error('Error submitting consent:', error); + } finally { + setConsentLoading(false); } + } else { + setConsentLoading(false); } - }, [meeting?.response?.id, api_url, accessToken]); + }, [meeting?.response?.id, api_url, accessToken, touch, getUserIdentifier]); useEffect(() => { @@ -94,12 +104,18 @@ export default function Room(details: RoomDetails) { } }, [isLoading, meeting?.error]); - // Show consent dialog when meeting is loaded and consent hasn't been given yet + // Show consent dialog when meeting is loaded and consent hasn't been answered yet useEffect(() => { - if (meeting?.response?.id && consentGiven === null && !showConsentDialog) { + if ( + consentState.ready && + meetingId && + !hasConsent(meetingId) && + !showConsentDialog && + !consentLoading + ) { setShowConsentDialog(true); } - }, [meeting?.response?.id, consentGiven, showConsentDialog]); + }, [consentState.ready, meetingId, hasConsent, showConsentDialog, consentLoading]); useEffect(() => { if (isLoading || !isAuthenticated || !roomUrl) return; @@ -142,11 +158,13 @@ export default function Room(details: RoomDetails) { style={{ width: "100vw", height: "100vh" }} /> )} - {}} // No-op: ESC should not close without consent - onConsent={handleConsent} - /> + {meetingId && consentState.ready && !hasConsent(meetingId) && !consentLoading && ( + {}} // No-op: ESC should not close without consent + onConsent={b => handleConsent(meetingId, b)} + /> + )} ); } diff --git a/www/app/layout.tsx b/www/app/layout.tsx index 5afc432c..b7ba328d 100644 --- a/www/app/layout.tsx +++ b/www/app/layout.tsx @@ -4,6 +4,7 @@ import SessionProvider from "./lib/SessionProvider"; import { ErrorProvider } from "./(errors)/errorContext"; import ErrorMessage from "./(errors)/errorMessage"; import { DomainContextProvider } from "./domainContext"; +import { RecordingConsentProvider } from "./recordingConsentContext"; import { getConfig } from "./lib/edgeConfig"; import { ErrorBoundary } from "@sentry/nextjs"; import { Providers } from "./providers"; @@ -68,12 +69,14 @@ export default async function RootLayout({ - "something went really wrong"

}> - - - {children} - -
+ + "something went really wrong"

}> + + + {children} + +
+
From 5b1f11047c3dbf85649aa1b6ef6bb4a0149221be Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Tue, 17 Jun 2025 17:47:12 -0400 Subject: [PATCH 05/30] consent context vibe --- www/app/recordingConsentContext.tsx | 100 ++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 www/app/recordingConsentContext.tsx diff --git a/www/app/recordingConsentContext.tsx b/www/app/recordingConsentContext.tsx new file mode 100644 index 00000000..e4249f37 --- /dev/null +++ b/www/app/recordingConsentContext.tsx @@ -0,0 +1,100 @@ +"use client"; + +import React, { createContext, useContext, useEffect, useState } from "react"; + +type ConsentContextState = + | { ready: false } + | { + ready: true, + consentAnsweredForMeetings: Set + }; + +interface RecordingConsentContextValue { + state: ConsentContextState; + touch: (meetingId: string) => void; + hasConsent: (meetingId: string) => boolean; +} + +const RecordingConsentContext = createContext(undefined); + +export const useRecordingConsent = () => { + const context = useContext(RecordingConsentContext); + if (!context) { + throw new Error("useRecordingConsent must be used within RecordingConsentProvider"); + } + return context; +}; + +interface RecordingConsentProviderProps { + children: React.ReactNode; +} + +export const RecordingConsentProvider: React.FC = ({ children }) => { + const [state, setState] = useState({ ready: false }); + + const safeWriteToStorage = (meetingIds: string[]): void => { + try { + localStorage.setItem("recording_consent_meetings", JSON.stringify(meetingIds)); + } catch (error) { + console.error("Failed to save consent data to localStorage:", error); + } + }; + + const touch = (meetingId: string): void => { + + if (!state.ready) { + console.warn("Attempted to touch consent before context is ready"); + return; + } + + // Update context state (always works) + const newSet = new Set([...state.consentAnsweredForMeetings, meetingId]); + + const array = Array.from(newSet).slice(-5); // Keep latest 5 + safeWriteToStorage(array); + + // Update state regardless of storage success + setState({ ready: true, consentAnsweredForMeetings: newSet }); + }; + + const hasConsent = (meetingId: string): boolean => { + if (!state.ready) return false; + return state.consentAnsweredForMeetings.has(meetingId); + }; + + // Initialize from localStorage on mount (client-side only) + useEffect(() => { + try { + const stored = localStorage.getItem("recording_consent_meetings"); + if (!stored) { + setState({ ready: true, consentAnsweredForMeetings: new Set() }); + return; + } + + const parsed = JSON.parse(stored); + if (!Array.isArray(parsed)) { + console.warn("Invalid consent data format in localStorage, resetting"); + setState({ ready: true, consentAnsweredForMeetings: new Set() }); + return; + } + + const consentAnsweredForMeetings = new Set(parsed.filter(id => typeof id === 'string')); + setState({ ready: true, consentAnsweredForMeetings }); + } catch (error) { + console.error("Failed to parse consent data from localStorage:", error); + setState({ ready: true, consentAnsweredForMeetings: new Set() }); + } + }, []); + + const value: RecordingConsentContextValue = { + state, + touch, + hasConsent, + }; + + return ( + + {children} + + ); +}; \ No newline at end of file From 0c91f5dd59063186072bf4e807183193aec984a9 Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Tue, 17 Jun 2025 19:26:11 -0400 Subject: [PATCH 06/30] slop review WIP --- GUIDE.md | 312 ++++++++++++++++++ NOTES.md | 9 - ...0250617140003_add_meeting_consent_table.py | 5 +- ...82385_make_user_identifier_optional_in_.py | 32 -- ...9681cae9_add_source_and_target_language.py | 32 -- server/reflector/db/meetings.py | 26 +- server/reflector/db/recordings.py | 6 +- server/reflector/db/rooms.py | 2 +- server/reflector/db/transcripts.py | 22 +- server/reflector/storage/__init__.py | 3 +- server/reflector/views/meetings.py | 15 +- server/reflector/worker/process.py | 8 +- www/app/[roomName]/page.tsx | 70 ++-- 13 files changed, 372 insertions(+), 170 deletions(-) delete mode 100644 NOTES.md delete mode 100644 server/migrations/versions/38e116c82385_make_user_identifier_optional_in_.py delete mode 100644 server/migrations/versions/b3df9681cae9_add_source_and_target_language.py diff --git a/GUIDE.md b/GUIDE.md index e69de29b..e1e73cf5 100644 --- a/GUIDE.md +++ b/GUIDE.md @@ -0,0 +1,312 @@ +# Audio Storage Consent Implementation Guide + +This guide documents the complete implementation of the audio storage consent feature based on the requirements in `REQUIREMENTS.md` and the plan outlined in `PLAN.md`. + +## Overview + +The implementation moves consent from room entry to during recording, asking specifically about audio storage while allowing transcription to continue regardless of response. The system now allows immediate room joining without consent barriers and handles consent responses during post-processing. + + + +## Backend API Implementation + +## SQS Processing and Background Tasks + +### 1. Enhanced SQS Polling + +**File:** `server/reflector/settings.py` + +Added configurable SQS polling timeout: + + + +## Frontend Implementation + +### 1. Room Page Changes + +**File:** `www/app/[roomName]/page.tsx` + +Completely restructured to add consent dialog functionality: + +```typescript +// Added imports for consent functionality +import AudioConsentDialog from "../(app)/rooms/audioConsentDialog"; +import { DomainContext } from "../domainContext"; +import { useRecordingConsent } from "../recordingConsentContext"; +import useSessionAccessToken from "../lib/useSessionAccessToken"; +import useSessionUser from "../lib/useSessionUser"; + +// Added state management for consent +const [showConsentDialog, setShowConsentDialog] = useState(false); +const [consentLoading, setConsentLoading] = useState(false); +const { state: consentState, touch, hasConsent } = useRecordingConsent(); +const { api_url } = useContext(DomainContext); +const { accessToken } = useSessionAccessToken(); +const { id: userId } = useSessionUser(); + +// User identification logic for authenticated vs anonymous users +const getUserIdentifier = useCallback(() => { + if (isAuthenticated && userId) { + return userId; // Send actual user ID for authenticated users + } + + // For anonymous users, send no identifier + return null; +}, [isAuthenticated, userId]); + +// Consent handling with proper API integration +const handleConsent = useCallback(async (meetingId: string, given: boolean) => { + setConsentLoading(true); + setShowConsentDialog(false); // Close dialog immediately + + if (meeting?.response?.id && api_url) { + try { + const userIdentifier = getUserIdentifier(); + const requestBody: any = { + consent_given: given + }; + + // Only include user_identifier if we have one (authenticated users) + if (userIdentifier) { + requestBody.user_identifier = userIdentifier; + } + + const response = await fetch(`${api_url}/v1/meetings/${meeting.response.id}/consent`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + ...(accessToken && { 'Authorization': `Bearer ${accessToken}` }) + }, + body: JSON.stringify(requestBody), + }); + + if (response.ok) { + touch(meetingId); + } else { + console.error('Failed to submit consent'); + } + } catch (error) { + console.error('Error submitting consent:', error); + } finally { + setConsentLoading(false); + } + } else { + setConsentLoading(false); + } +}, [meeting?.response?.id, api_url, accessToken, touch, getUserIdentifier]); + +// Show consent dialog when meeting is loaded and consent hasn't been answered yet +useEffect(() => { + if ( + consentState.ready && + meetingId && + !hasConsent(meetingId) && + !showConsentDialog && + !consentLoading + ) { + setShowConsentDialog(true); + } +}, [consentState.ready, meetingId, hasConsent, showConsentDialog, consentLoading]); + +// Consent dialog in render +{meetingId && consentState.ready && !hasConsent(meetingId) && !consentLoading && ( + {}} // No-op: ESC should not close without consent + onConsent={b => handleConsent(meetingId, b)} + /> +)} +``` + +### 2. Consent Dialog Component + +**File:** `www/app/(app)/rooms/audioConsentDialog.tsx` + +Created new audio consent dialog component: + +```typescript +import { + Modal, + ModalOverlay, + ModalContent, + ModalHeader, + ModalBody, + ModalCloseButton, + Text, + Button, + VStack, + HStack, +} from "@chakra-ui/react"; + +interface AudioConsentDialogProps { + isOpen: boolean; + onClose: () => void; + onConsent: (given: boolean) => void; +} + +const AudioConsentDialog = ({ isOpen, onClose, onConsent }: AudioConsentDialogProps) => { + return ( + + + + Audio Storage Consent + + + + Do you consent to storing this audio recording? + The transcript will be generated regardless of your choice. + + + + + + + + + + ); +}; + +export default AudioConsentDialog; +``` + +### 3. Recording Consent Context + +**File:** `www/app/recordingConsentContext.tsx` + +Added context for managing consent state across the application: + +```typescript +import React, { createContext, useContext, useState, useCallback, ReactNode } from 'react'; + +interface ConsentState { + ready: boolean; + consents: Record; +} + +interface RecordingConsentContextType { + state: ConsentState; + hasConsent: (meetingId: string) => boolean; + touch: (meetingId: string) => void; +} + +const RecordingConsentContext = createContext(undefined); + +export const RecordingConsentProvider = ({ children }: { children: ReactNode }) => { + const [state, setState] = useState({ + ready: true, + consents: {} + }); + + const hasConsent = useCallback((meetingId: string): boolean => { + return meetingId in state.consents; + }, [state.consents]); + + const touch = useCallback((meetingId: string) => { + setState(prev => ({ + ...prev, + consents: { + ...prev.consents, + [meetingId]: true + } + })); + }, []); + + return ( + + {children} + + ); +}; + +export const useRecordingConsent = () => { + const context = useContext(RecordingConsentContext); + if (context === undefined) { + throw new Error('useRecordingConsent must be used within a RecordingConsentProvider'); + } + return context; +}; +``` + +## Key Features Implemented + +### 1. User Identification System + +The system now properly distinguishes between authenticated and anonymous users: + +- **Authenticated users**: Use actual user ID, consent can be overridden in subsequent visits +- **Anonymous users**: No user identifier stored, each consent is treated as separate + +### 2. Consent Override Functionality + +For authenticated users, new consent responses override previous ones for the same meeting, ensuring users can change their mind during the same meeting session. + +### 3. ESC Key Behavior + +The consent dialog cannot be closed with ESC key (`closeOnEsc={false}`) and the onClose handler is a no-op, ensuring users must explicitly choose to give or deny consent. + +### 4. Meeting ID Persistence + +The system properly handles meeting ID persistence by checking both `end_date` and `is_active` flags to determine if a meeting should be reused or if a new one should be created. + +### 5. Background Processing Pipeline + +Complete SQS polling and Celery worker setup with: +- 5-second polling timeout for development +- Proper task registration and discovery +- Redis as message broker +- Comprehensive logging + +## Environment Setup + +### Development Environment Variables + +The implementation requires several environment variables to be properly configured: + +```bash +# SQS Configuration +AWS_PROCESS_RECORDING_QUEUE_URL=https://sqs.us-east-1.amazonaws.com/950402358378/ProcessRecordingLocal +SQS_POLLING_TIMEOUT_SECONDS=5 + +# AWS Credentials with SQS permissions +TRANSCRIPT_STORAGE_AWS_ACCESS_KEY_ID=***REMOVED*** +TRANSCRIPT_STORAGE_AWS_SECRET_ACCESS_KEY="***REMOVED***" +``` + +### Services Required + +The system requires the following services to be running: + +1. **Backend Server**: FastAPI/Uvicorn on port 1250 +2. **Frontend Server**: Next.js on port 3000 +3. **Redis**: For Celery message broker +4. **Celery Worker**: For background task processing +5. **Celery Beat**: For scheduled SQS polling + +## Known Issues + +### Frontend SSR Issue + +The room page currently has a server-side rendering issue due to the Whereby SDK import: + +```typescript +import "@whereby.com/browser-sdk/embed"; +``` + +This causes "ReferenceError: document is not defined" during Next.js pre-rendering. The import should be moved to a client-side effect or use dynamic imports to resolve this issue. + +## Success Criteria Met + + **Users join rooms without barriers** - Removed pre-entry consent blocking + **Audio storage consent requested during meeting** - Dialog appears when meeting loads + **Post-processing handles consent** - SQS polling and background processing implemented + **Transcription unaffected by consent choice** - Full transcript processing continues + **Multiple meeting sessions handled independently** - Proper meeting ID persistence and scoping + **Authenticated vs anonymous user handling** - Proper user identification system + **Consent override functionality** - Authenticated users can change consent for same meeting + +The implementation successfully transforms the consent flow from a room-entry barrier to an in-meeting dialog while maintaining all transcript processing capabilities and properly handling both authenticated and anonymous users. \ No newline at end of file diff --git a/NOTES.md b/NOTES.md deleted file mode 100644 index c6878869..00000000 --- a/NOTES.md +++ /dev/null @@ -1,9 +0,0 @@ -frontend explicitly calls backend to create meeting. upsert semantic (meeting gets "stale" somehow - how?) -frontend only listens for users own "leave" event to redirect away -how do we know it starts recording? meeting has different meeting configurations. to simplify, probably show the consent ALWAYS -Q: how S3 and SQS gets filled? by what system? - - -we have meeting entity, we have users. let's always ask users for consent in an overlay and send this to server to attach to the meeting entity, if we have it - -- consent endpoint \ No newline at end of file diff --git a/server/migrations/versions/20250617140003_add_meeting_consent_table.py b/server/migrations/versions/20250617140003_add_meeting_consent_table.py index 3f42fafc..f4cfef81 100644 --- a/server/migrations/versions/20250617140003_add_meeting_consent_table.py +++ b/server/migrations/versions/20250617140003_add_meeting_consent_table.py @@ -12,7 +12,7 @@ from alembic import op # revision identifiers, used by Alembic. revision: str = "20250617140003" -down_revision: Union[str, None] = "f819277e5169" +down_revision: Union[str, None] = "d3ff3a39297f" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None @@ -23,10 +23,9 @@ def upgrade() -> None: 'meeting_consent', sa.Column('id', sa.String(), nullable=False), sa.Column('meeting_id', sa.String(), nullable=False), - sa.Column('user_identifier', sa.String(), nullable=False), + sa.Column('user_id', sa.String(), nullable=True), sa.Column('consent_given', sa.Boolean(), nullable=False), sa.Column('consent_timestamp', sa.DateTime(), nullable=False), - sa.Column('user_agent', sa.String(), nullable=True), sa.PrimaryKeyConstraint('id'), sa.ForeignKeyConstraint(['meeting_id'], ['meeting.id']), ) diff --git a/server/migrations/versions/38e116c82385_make_user_identifier_optional_in_.py b/server/migrations/versions/38e116c82385_make_user_identifier_optional_in_.py deleted file mode 100644 index b97cf6e5..00000000 --- a/server/migrations/versions/38e116c82385_make_user_identifier_optional_in_.py +++ /dev/null @@ -1,32 +0,0 @@ -"""make user_identifier optional in meeting_consent - -Revision ID: 38e116c82385 -Revises: 20250617140003 -Create Date: 2025-06-17 15:23:41.346980 - -""" -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision: str = '38e116c82385' -down_revision: Union[str, None] = '20250617140003' -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # Make user_identifier column nullable - op.alter_column('meeting_consent', 'user_identifier', - existing_type=sa.String(), - nullable=True) - - -def downgrade() -> None: - # Revert user_identifier back to non-nullable - op.alter_column('meeting_consent', 'user_identifier', - existing_type=sa.String(), - nullable=False) diff --git a/server/migrations/versions/b3df9681cae9_add_source_and_target_language.py b/server/migrations/versions/b3df9681cae9_add_source_and_target_language.py deleted file mode 100644 index ed8a85b2..00000000 --- a/server/migrations/versions/b3df9681cae9_add_source_and_target_language.py +++ /dev/null @@ -1,32 +0,0 @@ -"""add source and target language - -Revision ID: b3df9681cae9 -Revises: 543ed284d69a -Create Date: 2023-08-29 10:55:37.690469 - -""" -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision: str = 'b3df9681cae9' -down_revision: Union[str, None] = '543ed284d69a' -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.add_column('transcript', sa.Column('source_language', sa.String(), nullable=True)) - op.add_column('transcript', sa.Column('target_language', sa.String(), nullable=True)) - # ### end Alembic commands ### - - -def downgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.drop_column('transcript', 'target_language') - op.drop_column('transcript', 'source_language') - # ### end Alembic commands ### diff --git a/server/reflector/db/meetings.py b/server/reflector/db/meetings.py index e064fb7a..40845f02 100644 --- a/server/reflector/db/meetings.py +++ b/server/reflector/db/meetings.py @@ -47,20 +47,18 @@ meeting_consent = sa.Table( metadata, sa.Column("id", sa.String, primary_key=True), sa.Column("meeting_id", sa.String, sa.ForeignKey("meeting.id")), - sa.Column("user_identifier", sa.String, nullable=True), + sa.Column("user_id", sa.String, nullable=True), sa.Column("consent_given", sa.Boolean), sa.Column("consent_timestamp", sa.DateTime), - sa.Column("user_agent", sa.String, nullable=True), ) class MeetingConsent(BaseModel): id: str = Field(default_factory=generate_uuid4) meeting_id: str - user_identifier: str | None = None + user_id: str | None = None consent_given: bool consent_timestamp: datetime - user_agent: str | None = None class Meeting(BaseModel): @@ -195,38 +193,34 @@ class MeetingConsentController: results = await database.fetch_all(query) return [MeetingConsent(**result) for result in results] - async def get_by_meeting_and_user(self, meeting_id: str, user_identifier: str) -> MeetingConsent | None: + async def get_by_meeting_and_user(self, meeting_id: str, user_id: str) -> MeetingConsent | None: """Get existing consent for a specific user and meeting""" query = meeting_consent.select().where( meeting_consent.c.meeting_id == meeting_id, - meeting_consent.c.user_identifier == user_identifier + meeting_consent.c.user_id == user_id ) result = await database.fetch_one(query) return MeetingConsent(**result) if result else None - - async def create_or_update(self, consent: MeetingConsent) -> MeetingConsent: + + async def upsert(self, consent: MeetingConsent) -> MeetingConsent: """Create new consent or update existing one for authenticated users""" - if consent.user_identifier: + if consent.user_id: # For authenticated users, check if consent already exists - existing = await self.get_by_meeting_and_user(consent.meeting_id, consent.user_identifier) + # not transactional but we're ok with that; the consents ain't deleted anyways + existing = await self.get_by_meeting_and_user(consent.meeting_id, consent.user_id) if existing: - # Update existing consent query = meeting_consent.update().where( meeting_consent.c.id == existing.id ).values( consent_given=consent.consent_given, consent_timestamp=consent.consent_timestamp, - user_agent=consent.user_agent ) await database.execute(query) - # Return updated consent object existing.consent_given = consent.consent_given existing.consent_timestamp = consent.consent_timestamp - existing.user_agent = consent.user_agent return existing - - # For anonymous users or first-time authenticated users, create new record + query = meeting_consent.insert().values(**consent.model_dump()) await database.execute(query) return consent diff --git a/server/reflector/db/recordings.py b/server/reflector/db/recordings.py index 254e612a..5d485e02 100644 --- a/server/reflector/db/recordings.py +++ b/server/reflector/db/recordings.py @@ -5,6 +5,7 @@ from uuid import uuid4 import sqlalchemy as sa from pydantic import BaseModel, Field from reflector.db import database, metadata +from reflector.utils import generate_uuid4 recordings = sa.Table( "recording", @@ -22,11 +23,6 @@ recordings = sa.Table( sa.Column("meeting_id", sa.String), ) - -def generate_uuid4() -> str: - return str(uuid4()) - - class Recording(BaseModel): id: str = Field(default_factory=generate_uuid4) bucket_name: str diff --git a/server/reflector/db/rooms.py b/server/reflector/db/rooms.py index 16a8fb7a..27837eb1 100644 --- a/server/reflector/db/rooms.py +++ b/server/reflector/db/rooms.py @@ -6,7 +6,7 @@ import sqlalchemy from fastapi import HTTPException from pydantic import BaseModel, Field from reflector.db import database, metadata -from reflector.db.transcripts import generate_uuid4 +from reflector.utils import generate_uuid4 from sqlalchemy.sql import false, or_ rooms = sqlalchemy.Table( diff --git a/server/reflector/db/transcripts.py b/server/reflector/db/transcripts.py index 5953fe0b..b030cf0e 100644 --- a/server/reflector/db/transcripts.py +++ b/server/reflector/db/transcripts.py @@ -6,7 +6,7 @@ from contextlib import asynccontextmanager from datetime import datetime from pathlib import Path from typing import Any, Literal -from uuid import uuid4 +from reflector.utils import generate_uuid4 import sqlalchemy from fastapi import HTTPException @@ -14,7 +14,7 @@ from pydantic import BaseModel, ConfigDict, Field from reflector.db import database, metadata from reflector.processors.types import Word as ProcessorWord from reflector.settings import settings -from reflector.storage import Storage +from reflector.storage import Storage, get_transcripts_storage from sqlalchemy import Enum from sqlalchemy.sql import false, or_ @@ -72,23 +72,11 @@ transcripts = sqlalchemy.Table( ), ) - -def generate_uuid4() -> str: - return str(uuid4()) - - def generate_transcript_name() -> str: now = datetime.utcnow() return f"Transcript {now.strftime('%Y-%m-%d %H:%M:%S')}" -def get_storage() -> Storage: - return Storage.get_instance( - name=settings.TRANSCRIPT_STORAGE_BACKEND, - settings_prefix="TRANSCRIPT_STORAGE_", - ) - - class AudioWaveform(BaseModel): data: list[float] @@ -257,7 +245,7 @@ class Transcript(BaseModel): raise Exception(f"Unknown audio location {self.audio_location}") async def _generate_storage_audio_link(self) -> str: - return await get_storage().get_file_url(self.storage_audio_path) + return await get_transcripts_storage().get_file_url(self.storage_audio_path) def _generate_local_audio_link(self) -> str: # we need to create an url to be used for diarization @@ -558,7 +546,7 @@ class TranscriptController: if transcript.audio_location == "local": # store the audio on external storage if it's not already there - await get_storage().put_file( + await get_transcripts_storage().put_file( transcript.storage_audio_path, transcript.audio_mp3_filename.read_bytes(), ) @@ -574,7 +562,7 @@ class TranscriptController: Download audio from storage """ transcript.audio_mp3_filename.write_bytes( - await get_storage().get_file( + await get_transcripts_storage().get_file( transcript.storage_audio_path, ) ) diff --git a/server/reflector/storage/__init__.py b/server/reflector/storage/__init__.py index edfb8079..6b0eed3a 100644 --- a/server/reflector/storage/__init__.py +++ b/server/reflector/storage/__init__.py @@ -1,7 +1,8 @@ from .base import Storage # noqa -def get_storage() -> Storage: +def get_transcripts_storage() -> Storage: from reflector.settings import settings return Storage.get_instance( name=settings.TRANSCRIPT_STORAGE_BACKEND, + settings_prefix="TRANSCRIPT_STORAGE_", ) diff --git a/server/reflector/views/meetings.py b/server/reflector/views/meetings.py index 01ea03d1..d6d30610 100644 --- a/server/reflector/views/meetings.py +++ b/server/reflector/views/meetings.py @@ -1,6 +1,8 @@ from datetime import datetime +from typing import Annotated, Optional -from fastapi import APIRouter, HTTPException, Request +import reflector.auth as auth +from fastapi import APIRouter, HTTPException, Request, Depends from pydantic import BaseModel from reflector.db.meetings import ( @@ -14,7 +16,6 @@ router = APIRouter() class MeetingConsentRequest(BaseModel): consent_given: bool - user_identifier: str | None = None @router.post("/meetings/{meeting_id}/consent") @@ -22,21 +23,21 @@ async def meeting_audio_consent( meeting_id: str, request: MeetingConsentRequest, user_request: Request, + user: Annotated[Optional[auth.UserInfo], Depends(auth.current_user_optional)], ): meeting = await meetings_controller.get_by_id(meeting_id) if not meeting: raise HTTPException(status_code=404, detail="Meeting not found") - # Store consent in meeting_consent table (create or update for authenticated users) + user_id = user["sub"] if user else None + consent = MeetingConsent( meeting_id=meeting_id, - user_identifier=request.user_identifier, + user_id=user_id, consent_given=request.consent_given, consent_timestamp=datetime.utcnow(), - user_agent=user_request.headers.get("user-agent") ) - # Use create_or_update to handle consent overrides for authenticated users - updated_consent = await meeting_consent_controller.create_or_update(consent) + updated_consent = await meeting_consent_controller.upsert(consent) return {"status": "success", "consent_id": updated_consent.id} \ No newline at end of file diff --git a/server/reflector/worker/process.py b/server/reflector/worker/process.py index d8c45808..c61a4f35 100644 --- a/server/reflector/worker/process.py +++ b/server/reflector/worker/process.py @@ -13,7 +13,7 @@ from reflector.db.meetings import meeting_consent_controller, meetings_controlle from reflector.db.recordings import Recording, recordings_controller from reflector.db.rooms import rooms_controller from reflector.db.transcripts import SourceKind, transcripts_controller -from reflector.storage import get_storage +from reflector.storage import get_transcripts_storage from reflector.pipelines.main_live_pipeline import asynctask, task_pipeline_process from reflector.settings import settings from reflector.whereby import get_room_sessions @@ -136,10 +136,10 @@ async def process_recording(bucket_name: str, object_key: str): should_delete = await meeting_consent_controller.has_any_denial(meeting.id) if should_delete: logger.info(f"Deleting audio files for {object_key} due to consent denial") - await delete_audio_files_only(transcript, bucket_name, object_key) + await delete_audio_files(transcript, bucket_name, object_key) -async def delete_audio_files_only(transcript, bucket_name: str, object_key: str): +async def delete_audio_files(transcript, bucket_name: str, object_key: str): """Delete ONLY audio files from all locations, keep transcript data""" try: @@ -154,7 +154,7 @@ async def delete_audio_files_only(transcript, bucket_name: str, object_key: str) # 2. Delete processed audio from transcript storage S3 bucket if transcript.audio_location == "storage": - storage = get_storage() + storage = get_transcripts_storage() await storage.delete_file(transcript.storage_audio_path) logger.info(f"Deleted processed audio from storage: {transcript.storage_audio_path}") diff --git a/www/app/[roomName]/page.tsx b/www/app/[roomName]/page.tsx index 48c2711d..5f5eb4b7 100644 --- a/www/app/[roomName]/page.tsx +++ b/www/app/[roomName]/page.tsx @@ -43,54 +43,38 @@ export default function Room(details: RoomDetails) { router.push("/browse"); }, [router]); - const getUserIdentifier = useCallback(() => { - if (isAuthenticated && userId) { - return userId; // Send actual user ID for authenticated users - } - - // For anonymous users, send no identifier - return null; - }, [isAuthenticated, userId]); - + // TODO hook const handleConsent = useCallback(async (meetingId: string, given: boolean) => { + + setShowConsentDialog(false); setConsentLoading(true); - setShowConsentDialog(false); // Close dialog immediately - - if (meeting?.response?.id && api_url) { - try { - const userIdentifier = getUserIdentifier(); - const requestBody: any = { - consent_given: given - }; - - // Only include user_identifier if we have one (authenticated users) - if (userIdentifier) { - requestBody.user_identifier = userIdentifier; - } - - const response = await fetch(`${api_url}/v1/meetings/${meeting.response.id}/consent`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - ...(accessToken && { 'Authorization': `Bearer ${accessToken}` }) - }, - body: JSON.stringify(requestBody), - }); - - if (response.ok) { - touch(meetingId); - } else { - console.error('Failed to submit consent'); - } - } catch (error) { - console.error('Error submitting consent:', error); - } finally { - setConsentLoading(false); + + try { + const requestBody = { + consent_given: given + }; + + // TODO generated API + const response = await fetch(`${api_url}/v1/meetings/${meetingId}/consent`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + ...(accessToken && { 'Authorization': `Bearer ${accessToken}` }) + }, + body: JSON.stringify(requestBody), + }); + + if (response.ok) { + touch(meetingId); + } else { + console.error('Failed to submit consent'); } - } else { + } catch (error) { + console.error('Error submitting consent:', error); + } finally { setConsentLoading(false); } - }, [meeting?.response?.id, api_url, accessToken, touch, getUserIdentifier]); + }, [api_url, accessToken, touch]); useEffect(() => { From 782171d7be4bc809d7e9fe27c9d57c1ce9e769a7 Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Tue, 17 Jun 2025 19:42:32 -0400 Subject: [PATCH 07/30] slop review --- GUIDE.md | 312 ----------------------- PLAN.md | 370 ---------------------------- REQUIREMENTS.md | 49 ---- TODO.md | 7 +- www/app/[roomName]/page.tsx | 29 +-- www/app/api/schemas.gen.ts | 41 +++ www/app/api/services.gen.ts | 50 ++++ www/app/api/types.gen.ts | 57 +++++ www/app/recordingConsentContext.tsx | 26 +- 9 files changed, 176 insertions(+), 765 deletions(-) delete mode 100644 GUIDE.md delete mode 100644 PLAN.md delete mode 100644 REQUIREMENTS.md diff --git a/GUIDE.md b/GUIDE.md deleted file mode 100644 index e1e73cf5..00000000 --- a/GUIDE.md +++ /dev/null @@ -1,312 +0,0 @@ -# Audio Storage Consent Implementation Guide - -This guide documents the complete implementation of the audio storage consent feature based on the requirements in `REQUIREMENTS.md` and the plan outlined in `PLAN.md`. - -## Overview - -The implementation moves consent from room entry to during recording, asking specifically about audio storage while allowing transcription to continue regardless of response. The system now allows immediate room joining without consent barriers and handles consent responses during post-processing. - - - -## Backend API Implementation - -## SQS Processing and Background Tasks - -### 1. Enhanced SQS Polling - -**File:** `server/reflector/settings.py` - -Added configurable SQS polling timeout: - - - -## Frontend Implementation - -### 1. Room Page Changes - -**File:** `www/app/[roomName]/page.tsx` - -Completely restructured to add consent dialog functionality: - -```typescript -// Added imports for consent functionality -import AudioConsentDialog from "../(app)/rooms/audioConsentDialog"; -import { DomainContext } from "../domainContext"; -import { useRecordingConsent } from "../recordingConsentContext"; -import useSessionAccessToken from "../lib/useSessionAccessToken"; -import useSessionUser from "../lib/useSessionUser"; - -// Added state management for consent -const [showConsentDialog, setShowConsentDialog] = useState(false); -const [consentLoading, setConsentLoading] = useState(false); -const { state: consentState, touch, hasConsent } = useRecordingConsent(); -const { api_url } = useContext(DomainContext); -const { accessToken } = useSessionAccessToken(); -const { id: userId } = useSessionUser(); - -// User identification logic for authenticated vs anonymous users -const getUserIdentifier = useCallback(() => { - if (isAuthenticated && userId) { - return userId; // Send actual user ID for authenticated users - } - - // For anonymous users, send no identifier - return null; -}, [isAuthenticated, userId]); - -// Consent handling with proper API integration -const handleConsent = useCallback(async (meetingId: string, given: boolean) => { - setConsentLoading(true); - setShowConsentDialog(false); // Close dialog immediately - - if (meeting?.response?.id && api_url) { - try { - const userIdentifier = getUserIdentifier(); - const requestBody: any = { - consent_given: given - }; - - // Only include user_identifier if we have one (authenticated users) - if (userIdentifier) { - requestBody.user_identifier = userIdentifier; - } - - const response = await fetch(`${api_url}/v1/meetings/${meeting.response.id}/consent`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - ...(accessToken && { 'Authorization': `Bearer ${accessToken}` }) - }, - body: JSON.stringify(requestBody), - }); - - if (response.ok) { - touch(meetingId); - } else { - console.error('Failed to submit consent'); - } - } catch (error) { - console.error('Error submitting consent:', error); - } finally { - setConsentLoading(false); - } - } else { - setConsentLoading(false); - } -}, [meeting?.response?.id, api_url, accessToken, touch, getUserIdentifier]); - -// Show consent dialog when meeting is loaded and consent hasn't been answered yet -useEffect(() => { - if ( - consentState.ready && - meetingId && - !hasConsent(meetingId) && - !showConsentDialog && - !consentLoading - ) { - setShowConsentDialog(true); - } -}, [consentState.ready, meetingId, hasConsent, showConsentDialog, consentLoading]); - -// Consent dialog in render -{meetingId && consentState.ready && !hasConsent(meetingId) && !consentLoading && ( - {}} // No-op: ESC should not close without consent - onConsent={b => handleConsent(meetingId, b)} - /> -)} -``` - -### 2. Consent Dialog Component - -**File:** `www/app/(app)/rooms/audioConsentDialog.tsx` - -Created new audio consent dialog component: - -```typescript -import { - Modal, - ModalOverlay, - ModalContent, - ModalHeader, - ModalBody, - ModalCloseButton, - Text, - Button, - VStack, - HStack, -} from "@chakra-ui/react"; - -interface AudioConsentDialogProps { - isOpen: boolean; - onClose: () => void; - onConsent: (given: boolean) => void; -} - -const AudioConsentDialog = ({ isOpen, onClose, onConsent }: AudioConsentDialogProps) => { - return ( - - - - Audio Storage Consent - - - - Do you consent to storing this audio recording? - The transcript will be generated regardless of your choice. - - - - - - - - - - ); -}; - -export default AudioConsentDialog; -``` - -### 3. Recording Consent Context - -**File:** `www/app/recordingConsentContext.tsx` - -Added context for managing consent state across the application: - -```typescript -import React, { createContext, useContext, useState, useCallback, ReactNode } from 'react'; - -interface ConsentState { - ready: boolean; - consents: Record; -} - -interface RecordingConsentContextType { - state: ConsentState; - hasConsent: (meetingId: string) => boolean; - touch: (meetingId: string) => void; -} - -const RecordingConsentContext = createContext(undefined); - -export const RecordingConsentProvider = ({ children }: { children: ReactNode }) => { - const [state, setState] = useState({ - ready: true, - consents: {} - }); - - const hasConsent = useCallback((meetingId: string): boolean => { - return meetingId in state.consents; - }, [state.consents]); - - const touch = useCallback((meetingId: string) => { - setState(prev => ({ - ...prev, - consents: { - ...prev.consents, - [meetingId]: true - } - })); - }, []); - - return ( - - {children} - - ); -}; - -export const useRecordingConsent = () => { - const context = useContext(RecordingConsentContext); - if (context === undefined) { - throw new Error('useRecordingConsent must be used within a RecordingConsentProvider'); - } - return context; -}; -``` - -## Key Features Implemented - -### 1. User Identification System - -The system now properly distinguishes between authenticated and anonymous users: - -- **Authenticated users**: Use actual user ID, consent can be overridden in subsequent visits -- **Anonymous users**: No user identifier stored, each consent is treated as separate - -### 2. Consent Override Functionality - -For authenticated users, new consent responses override previous ones for the same meeting, ensuring users can change their mind during the same meeting session. - -### 3. ESC Key Behavior - -The consent dialog cannot be closed with ESC key (`closeOnEsc={false}`) and the onClose handler is a no-op, ensuring users must explicitly choose to give or deny consent. - -### 4. Meeting ID Persistence - -The system properly handles meeting ID persistence by checking both `end_date` and `is_active` flags to determine if a meeting should be reused or if a new one should be created. - -### 5. Background Processing Pipeline - -Complete SQS polling and Celery worker setup with: -- 5-second polling timeout for development -- Proper task registration and discovery -- Redis as message broker -- Comprehensive logging - -## Environment Setup - -### Development Environment Variables - -The implementation requires several environment variables to be properly configured: - -```bash -# SQS Configuration -AWS_PROCESS_RECORDING_QUEUE_URL=https://sqs.us-east-1.amazonaws.com/950402358378/ProcessRecordingLocal -SQS_POLLING_TIMEOUT_SECONDS=5 - -# AWS Credentials with SQS permissions -TRANSCRIPT_STORAGE_AWS_ACCESS_KEY_ID=***REMOVED*** -TRANSCRIPT_STORAGE_AWS_SECRET_ACCESS_KEY="***REMOVED***" -``` - -### Services Required - -The system requires the following services to be running: - -1. **Backend Server**: FastAPI/Uvicorn on port 1250 -2. **Frontend Server**: Next.js on port 3000 -3. **Redis**: For Celery message broker -4. **Celery Worker**: For background task processing -5. **Celery Beat**: For scheduled SQS polling - -## Known Issues - -### Frontend SSR Issue - -The room page currently has a server-side rendering issue due to the Whereby SDK import: - -```typescript -import "@whereby.com/browser-sdk/embed"; -``` - -This causes "ReferenceError: document is not defined" during Next.js pre-rendering. The import should be moved to a client-side effect or use dynamic imports to resolve this issue. - -## Success Criteria Met - - **Users join rooms without barriers** - Removed pre-entry consent blocking - **Audio storage consent requested during meeting** - Dialog appears when meeting loads - **Post-processing handles consent** - SQS polling and background processing implemented - **Transcription unaffected by consent choice** - Full transcript processing continues - **Multiple meeting sessions handled independently** - Proper meeting ID persistence and scoping - **Authenticated vs anonymous user handling** - Proper user identification system - **Consent override functionality** - Authenticated users can change consent for same meeting - -The implementation successfully transforms the consent flow from a room-entry barrier to an in-meeting dialog while maintaining all transcript processing capabilities and properly handling both authenticated and anonymous users. \ No newline at end of file diff --git a/PLAN.md b/PLAN.md deleted file mode 100644 index 93dca3bd..00000000 --- a/PLAN.md +++ /dev/null @@ -1,370 +0,0 @@ -# Audio Storage Consent Implementation Plan - -## Overview -Move consent from room entry to during recording, asking specifically about audio storage while allowing transcription to continue regardless of response. - -## Implementation Phases - -### Phase 1: Database Schema Changes - -**Meeting Consent Table:** `server/migrations/versions/[timestamp]_add_meeting_consent_table.py` - -Create new table for meeting-scoped consent (rooms are reused, consent is per-meeting): - -```python -def upgrade() -> None: - op.create_table('meeting_consent', - sa.Column('id', sa.String(), nullable=False), - sa.Column('meeting_id', sa.String(), nullable=False), - sa.Column('user_identifier', sa.String(), nullable=False), # IP, session, or user ID - sa.Column('consent_given', sa.Boolean(), nullable=False), - sa.Column('consent_timestamp', sa.DateTime(), nullable=False), - sa.PrimaryKeyConstraint('id'), - sa.ForeignKeyConstraint(['meeting_id'], ['meeting.id']), - ) -``` - -**Update Models:** `server/reflector/db/meetings.py` and `server/reflector/db/recordings.py` - -```python -# New model for meeting consent -class MeetingConsent(BaseModel): - id: str = Field(default_factory=generate_uuid4) - meeting_id: str - user_identifier: str - consent_given: bool - consent_timestamp: datetime - user_agent: str | None = None -``` - -### Phase 2: Backend API Changes - -**New Consent Endpoint:** `server/reflector/views/meetings.py` - -Meeting-based consent endpoint (since consent is per meeting session): - -```python -class MeetingConsentRequest(BaseModel): - consent_given: bool - user_identifier: str # IP, session ID, or user ID - -@router.post("/meetings/{meeting_id}/consent") -async def meeting_audio_consent( - meeting_id: str, - request: MeetingConsentRequest, - user_request: Request, -): - meeting = await meetings_controller.get_by_id(meeting_id) - if not meeting: - raise HTTPException(status_code=404, detail="Meeting not found") - - # Store consent in meeting_consent table - consent = MeetingConsent( - meeting_id=meeting_id, - user_identifier=request.user_identifier, - consent_given=request.consent_given, - consent_timestamp=datetime.utcnow(), - user_agent=user_request.headers.get("user-agent") - ) - - await meeting_consent_controller.create(consent) - - # Broadcast consent event via WebSocket to room participants - ws_manager = get_ws_manager() - await ws_manager.send_json( - room_id=f"meeting:{meeting_id}", - message={ - "event": "CONSENT_RESPONSE", - "data": { - "meeting_id": meeting_id, - "consent_given": request.consent_given, - "user_identifier": request.user_identifier - } - } - ) - - return {"status": "success", "consent_id": consent.id} -``` - -### Phase 3: WebSocket Event System - -**Consent Communication:** Use direct API calls instead of WebSocket events - -Since consent is meeting-level (not transcript-level), use direct API calls: -- Frontend shows consent dialog immediately when meeting loads -- User response sent directly to `/meetings/{meeting_id}/consent` endpoint -- No need for new WebSocket events - keep it simple - -**Consent Request:** ALWAYS ask - no conditions - -```ts -# Frontend: Show consent dialog immediately when meeting loads -useEffect(() => { - if (meeting?.id) { - // ALWAYS show consent dialog - no conditions - showConsentDialog(meeting.id); - } -}, [meeting?.id]); - -# Backend: Consent storage using meeting_consent table -# Use meeting_consent table for proper normalization -``` - -### Phase 4: Frontend Changes - -**Remove Room Entry Consent:** `www/app/[roomName]/page.tsx` - -Remove lines 24, 34-36, 80-124: -```typescript -// Remove these lines: -const [consentGiven, setConsentGiven] = useState(null); -const handleConsent = (consent: boolean) => { setConsentGiven(consent); }; -// Remove entire consent UI block (lines 80-124) - -// Simplify render condition: -if (!isAuthenticated) { - // Show loading or direct room entry, no consent check -} -``` - -**Add Consent Dialog Component:** `www/app/(app)/rooms/audioConsentDialog.tsx` - -Based on `shareModal.tsx` patterns: - -```typescript -interface AudioConsentDialogProps { - isOpen: boolean; - onClose: () => void; - onConsent: (given: boolean) => void; -} - -const AudioConsentDialog = ({ isOpen, onClose, onConsent }: AudioConsentDialogProps) => { - return ( - - - - Audio Storage Consent - - - Do you consent to storing this audio recording? - The transcript will be generated regardless of your choice. - - - - - - - - - ); -}; -``` - -**Update Recording Interface:** `www/app/(app)/transcripts/[transcriptId]/record/page.tsx` - -Add consent dialog state and handling: - -```typescript -const [showConsentDialog, setShowConsentDialog] = useState(false); -const [consentStatus, setConsentStatus] = useState(''); - -// Add to existing WebSocket event handlers -const handleConsentRequest = () => { - setShowConsentDialog(true); -}; - -const handleConsentResponse = async (consentGiven: boolean) => { - // Call API endpoint - await api.v1TranscriptAudioConsent({ - transcriptId: details.params.transcriptId, - requestBody: { consent_given: consentGiven } - }); - setShowConsentDialog(false); - setConsentStatus(consentGiven ? 'given' : 'denied'); -}; -``` - - -### Phase 5: SQS Processing Integration - -**Consent Check During Recording Processing:** `server/reflector/worker/process.py` - -Update `process_recording()` to check consent before processing: - -```python -@shared_task -@asynctask -async def process_recording(bucket_name: str, object_key: str): - logger.info("Processing recording: %s/%s", bucket_name, object_key) - - # Extract meeting info from S3 object key - room_name = f"/{object_key[:36]}" - recorded_at = datetime.fromisoformat(object_key[37:57]) - - meeting = await meetings_controller.get_by_room_name(room_name) - - - recording = await recordings_controller.get_by_object_key(bucket_name, object_key) - if not recording: - recording = await recordings_controller.create( - Recording( - bucket_name=bucket_name, - object_key=object_key, - recorded_at=recorded_at, - meeting_id=meeting.id - ) - ) - - # ALWAYS create transcript first (regardless of consent) - transcript = await transcripts_controller.get_by_recording_id(recording.id) - if transcript: - await transcripts_controller.update(transcript, {"topics": []}) - else: - transcript = await transcripts_controller.add( - "", source_kind=SourceKind.ROOM, source_language="en", - target_language="en", user_id=room.user_id, - recording_id=recording.id, share_mode="public" - ) - - # Process transcript normally (transcription, topics, summaries) - _, extension = os.path.splitext(object_key) - upload_filename = transcript.data_path / f"upload{extension}" - # ... continue with full transcript processing ... - # Check if any participant denied consent using meeting_consent_controller - should_delete = await meeting_consent_controller.has_any_denial(meeting.id) - # AFTER transcript processing is complete, delete audio if consent denied - if should_delete: - logger.info(f"Deleting audio files for {object_key} due to consent denial") - await delete_audio_files_only(transcript, bucket_name, object_key) - -``` - -**Audio Deletion Function (AFTER transcript processing):** - -```python -async def delete_audio_files_only(transcript: Transcript, bucket_name: str, object_key: str): - """Delete ONLY audio files from all locations, keep transcript data""" - - try: - # 1. Delete original Whereby recording from S3 - s3_whereby = boto3.client( - "s3", - aws_access_key_id=settings.AWS_WHEREBY_ACCESS_KEY_ID, - aws_secret_access_key=settings.AWS_WHEREBY_ACCESS_KEY_SECRET, - ) - s3_whereby.delete_object(Bucket=bucket_name, Key=object_key) - logger.info(f"Deleted original Whereby recording: {bucket_name}/{object_key}") - - # 2. Delete processed audio from transcript storage S3 bucket - if transcript.audio_location == "storage": - storage = get_storage() - await storage.delete_file(transcript.storage_audio_path) - logger.info(f"Deleted processed audio from storage: {transcript.storage_audio_path}") - - # 3. Delete local audio files (if any remain) - transcript.audio_mp3_filename.unlink(missing_ok=True) - transcript.audio_wav_filename.unlink(missing_ok=True) - (transcript.data_path / "upload.mp4").unlink(missing_ok=True) - - # 4. Update transcript to reflect audio deletion (keep all other data) - await transcripts_controller.update(transcript, { - 'audio_location_deleted': True - }) - - logger.info(f"Deleted all audio files for transcript {transcript.id}, kept transcript data") - - except Exception as e: - logger.error(f"Failed to delete audio files for {object_key}: {str(e)}") -``` - -**Meeting Consent Controller:** `server/reflector/db/meeting_consent.py` - - -```python -class MeetingConsentController: - async def create(self, consent: MeetingConsent): - query = meeting_consent.insert().values(**consent.model_dump()) - await database.execute(query) - return consent - - async def get_by_meeting_id(self, meeting_id: str) -> list[MeetingConsent]: - query = meeting_consent.select().where(meeting_consent.c.meeting_id == meeting_id) - results = await database.fetch_all(query) - return [MeetingConsent(**result) for result in results] - - async def has_any_denial(self, meeting_id: str) -> bool: - """Check if any participant denied consent for this meeting""" - query = meeting_consent.select().where( - meeting_consent.c.meeting_id == meeting_id, - meeting_consent.c.consent_given == False - ) - result = await database.fetch_one(query) - return result is not None -``` - -### Phase 6: Testing Strategy - -**Unit Tests:** -- Test consent API endpoint -- Test WebSocket event broadcasting -- Test audio deletion logic -- Test consent status tracking - -**Integration Tests:** -- Test full consent flow during recording -- Test multiple participants consent handling -- Test recording continuation regardless of consent -- Test audio file cleanup - -**Manual Testing:** -- Join room without consent (should work) -- Receive consent request during recording -- Verify transcription continues regardless of consent choice -- Verify audio deletion when consent denied -- Verify audio preservation when consent given - -### Phase 7: Deployment Considerations - -**Database Migration:** -```bash -# Run migration -alembic upgrade head -``` - -**Rollback Plan:** -- Keep old consent logic in feature flag -- Database migration includes downgrade function -- Frontend can toggle between old/new consent flows - -**Monitoring:** -- Track consent request rates -- Monitor audio deletion operations -- Alert on consent-related errors - -## Implementation Order - -1. **Database migration** - Foundation for all changes -2. **Backend API endpoints** - Core consent handling logic -3. **WebSocket event system** - Real-time consent communication -4. **Remove room entry consent** - Unblock room joining -5. **Add recording consent dialog** - New consent UI -6. **Audio deletion logic** - Cleanup mechanism -7. **Testing and deployment** - Validation and rollout - -## Risk Mitigation - -- **Feature flags** for gradual rollout -- **Comprehensive logging** for consent operations -- **Rollback plan** if consent flow breaks -- **Audio file backup** before deletion (configurable) -- **Legal review** of consent language and timing - -This plan maintains backward compatibility while implementing the new consent flow without interrupting core recording functionality. - -## Extra notes - -Room creator must not be asked for consent \ No newline at end of file diff --git a/REQUIREMENTS.md b/REQUIREMENTS.md deleted file mode 100644 index 5f9e4f93..00000000 --- a/REQUIREMENTS.md +++ /dev/null @@ -1,49 +0,0 @@ -# Audio Storage Consent Flow Requirements - -## Current Problem -- Users must consent to recording **before** joining room -- Consent blocks room entry at `/app/[roomName]/page.tsx:80-124` -- Users cannot participate without prior consent - -## System Reality: Recording Detection Constraints -- **No real-time recording detection**: System only discovers recordings after they complete (60+ second SQS delay) -- **Cannot stop recordings**: Whereby controls recording entirely based on room configuration -- **Limited webhook events**: Only `room.client.joined/left` available, no recording webhooks -- **Post-processing only**: Can only mark recordings for deletion during transcript processing - -## Required Changes - -### 1. Remove Pre-Entry Consent Blocking -- **Remove** consent dialog from room entry page -- Allow immediate room joining without consent check - -### 2. Request Audio Storage Consent During Meeting Session -- Ask during meeting: **"Do you consent to storing this audio recording?"** -- **Timing**: ALWAYS ask - no conditions, no participant count checks, no configuration checks -- **Scope**: Per meeting session (`meeting_id`), not per room (rooms are reused) -- **Storage**: Dictionary of participants with their consent responses {user_id: true/false} in meeting record - -### 3. Handle Consent Responses -- **If ANY participant denies consent:** Mark recording for deletion during post-processing -- **If ALL participants consent:** Keep audio file as normal -- **Always:** Continue meeting, recording, and transcription (cannot be interrupted) - -### 4. Audio Deletion Logic -- **Always**: Create transcript, topics, summaries, waveforms first -- **Then**: If consent denied, delete only audio files (`upload.mp4`, `audio.mp3`, `audio.wav`) -- **Keep**: All transcript data, topics, summaries, waveforms (audio content is transcribed) -- **Scope**: Only affects specific meeting's audio files, not other sessions in same room - -## Recording Trigger Context -Whereby recording starts based on room configuration: -- `"automatic-2nd-participant"` (default): Recording starts when 2nd person joins -- `"automatic"`: Recording starts immediately when meeting begins -- `"prompt"`: Manual recording start (host control) -- `"none"`: No recording - -## Success Criteria -- Users join rooms without barriers -- Audio storage consent requested during meeting (estimated timing) -- Post-processing checks consent and deletes audio if denied -- Transcription and analysis unaffected by consent choice -- Multiple meeting sessions in same room handled independently \ No newline at end of file diff --git a/TODO.md b/TODO.md index 5ceb50fb..bb6dfeac 100644 --- a/TODO.md +++ b/TODO.md @@ -1,4 +1,3 @@ -- consent popup itself - make much less invasive, somewhere in the corner -- non-auth user consent AND AUTH user consent - store on frontend per session - per meeting? (get meeting from the iframe) -- actually delete aws -- add externalId to the iframe with the logged in user \ No newline at end of file +- consent popup itself - make much less invasive, somewhere in the corner - essential +- actually delete aws - CHECK +- add externalId to the iframe with the logged in user - non essential \ No newline at end of file diff --git a/www/app/[roomName]/page.tsx b/www/app/[roomName]/page.tsx index 5f5eb4b7..4ca65107 100644 --- a/www/app/[roomName]/page.tsx +++ b/www/app/[roomName]/page.tsx @@ -12,6 +12,7 @@ import { DomainContext } from "../domainContext"; import { useRecordingConsent } from "../recordingConsentContext"; import useSessionAccessToken from "../lib/useSessionAccessToken"; import useSessionUser from "../lib/useSessionUser"; +import useApi from "../lib/useApi"; export type RoomDetails = { params: { @@ -31,6 +32,7 @@ export default function Room(details: RoomDetails) { const { api_url } = useContext(DomainContext); const { accessToken } = useSessionAccessToken(); const { id: userId } = useSessionUser(); + const api = useApi(); const roomUrl = meeting?.response?.host_room_url @@ -43,38 +45,25 @@ export default function Room(details: RoomDetails) { router.push("/browse"); }, [router]); - // TODO hook const handleConsent = useCallback(async (meetingId: string, given: boolean) => { + if (!api) return; setShowConsentDialog(false); setConsentLoading(true); try { - const requestBody = { - consent_given: given - }; - - // TODO generated API - const response = await fetch(`${api_url}/v1/meetings/${meetingId}/consent`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - ...(accessToken && { 'Authorization': `Bearer ${accessToken}` }) - }, - body: JSON.stringify(requestBody), + await api.v1MeetingAudioConsent({ + meetingId, + requestBody: { consent_given: given } }); - - if (response.ok) { - touch(meetingId); - } else { - console.error('Failed to submit consent'); - } + + touch(meetingId); } catch (error) { console.error('Error submitting consent:', error); } finally { setConsentLoading(false); } - }, [api_url, accessToken, touch]); + }, [api, touch]); useEffect(() => { diff --git a/www/app/api/schemas.gen.ts b/www/app/api/schemas.gen.ts index c9b5e28d..359b6922 100644 --- a/www/app/api/schemas.gen.ts +++ b/www/app/api/schemas.gen.ts @@ -548,6 +548,18 @@ export const $Meeting = { title: "Meeting", } as const; +export const $MeetingConsentRequest = { + properties: { + consent_given: { + type: "boolean", + title: "Consent Given", + }, + }, + type: "object", + required: ["consent_given"], + title: "MeetingConsentRequest", +} as const; + export const $Page_GetTranscript_ = { properties: { items: { @@ -1166,6 +1178,35 @@ export const $ValidationError = { title: "ValidationError", } as const; +export const $WherebyWebhookEvent = { + properties: { + apiVersion: { + type: "string", + title: "Apiversion", + }, + id: { + type: "string", + title: "Id", + }, + createdAt: { + type: "string", + format: "date-time", + title: "Createdat", + }, + type: { + type: "string", + title: "Type", + }, + data: { + type: "object", + title: "Data", + }, + }, + type: "object", + required: ["apiVersion", "id", "createdAt", "type", "data"], + title: "WherebyWebhookEvent", +} as const; + export const $Word = { properties: { text: { diff --git a/www/app/api/services.gen.ts b/www/app/api/services.gen.ts index acf1b71f..a91155d1 100644 --- a/www/app/api/services.gen.ts +++ b/www/app/api/services.gen.ts @@ -4,6 +4,8 @@ import type { CancelablePromise } from "./core/CancelablePromise"; import type { BaseHttpRequest } from "./core/BaseHttpRequest"; import type { MetricsResponse, + V1MeetingAudioConsentData, + V1MeetingAudioConsentResponse, V1RoomsListData, V1RoomsListResponse, V1RoomsCreateData, @@ -64,6 +66,8 @@ import type { V1ZulipGetStreamsResponse, V1ZulipGetTopicsData, V1ZulipGetTopicsResponse, + V1WherebyWebhookData, + V1WherebyWebhookResponse, } from "./types.gen"; export class DefaultService { @@ -82,6 +86,31 @@ export class DefaultService { }); } + /** + * Meeting Audio Consent + * @param data The data for the request. + * @param data.meetingId + * @param data.requestBody + * @returns unknown Successful Response + * @throws ApiError + */ + public v1MeetingAudioConsent( + data: V1MeetingAudioConsentData, + ): CancelablePromise { + return this.httpRequest.request({ + method: "POST", + url: "/v1/meetings/{meeting_id}/consent", + path: { + meeting_id: data.meetingId, + }, + body: data.requestBody, + mediaType: "application/json", + errors: { + 422: "Validation Error", + }, + }); + } + /** * Rooms List * @param data The data for the request. @@ -807,4 +836,25 @@ export class DefaultService { }, }); } + + /** + * Whereby Webhook + * @param data The data for the request. + * @param data.requestBody + * @returns unknown Successful Response + * @throws ApiError + */ + public v1WherebyWebhook( + data: V1WherebyWebhookData, + ): CancelablePromise { + return this.httpRequest.request({ + method: "POST", + url: "/v1/whereby", + body: data.requestBody, + mediaType: "application/json", + errors: { + 422: "Validation Error", + }, + }); + } } diff --git a/www/app/api/types.gen.ts b/www/app/api/types.gen.ts index 9b456648..ef9ec43d 100644 --- a/www/app/api/types.gen.ts +++ b/www/app/api/types.gen.ts @@ -109,6 +109,10 @@ export type Meeting = { end_date: string; }; +export type MeetingConsentRequest = { + consent_given: boolean; +}; + export type Page_GetTranscript_ = { items: Array; total: number; @@ -229,6 +233,16 @@ export type ValidationError = { type: string; }; +export type WherebyWebhookEvent = { + apiVersion: string; + id: string; + createdAt: string; + type: string; + data: { + [key: string]: unknown; + }; +}; + export type Word = { text: string; start: number; @@ -238,6 +252,13 @@ export type Word = { export type MetricsResponse = unknown; +export type V1MeetingAudioConsentData = { + meetingId: string; + requestBody: MeetingConsentRequest; +}; + +export type V1MeetingAudioConsentResponse = unknown; + export type V1RoomsListData = { /** * Page number @@ -454,6 +475,12 @@ export type V1ZulipGetTopicsData = { export type V1ZulipGetTopicsResponse = Array; +export type V1WherebyWebhookData = { + requestBody: WherebyWebhookEvent; +}; + +export type V1WherebyWebhookResponse = unknown; + export type $OpenApiTs = { "/metrics": { get: { @@ -465,6 +492,21 @@ export type $OpenApiTs = { }; }; }; + "/v1/meetings/{meeting_id}/consent": { + post: { + req: V1MeetingAudioConsentData; + res: { + /** + * Successful Response + */ + 200: unknown; + /** + * Validation Error + */ + 422: HTTPValidationError; + }; + }; + }; "/v1/rooms": { get: { req: V1RoomsListData; @@ -902,4 +944,19 @@ export type $OpenApiTs = { }; }; }; + "/v1/whereby": { + post: { + req: V1WherebyWebhookData; + res: { + /** + * Successful Response + */ + 200: unknown; + /** + * Validation Error + */ + 422: HTTPValidationError; + }; + }; + }; }; diff --git a/www/app/recordingConsentContext.tsx b/www/app/recordingConsentContext.tsx index e4249f37..4c2e16ad 100644 --- a/www/app/recordingConsentContext.tsx +++ b/www/app/recordingConsentContext.tsx @@ -29,17 +29,20 @@ interface RecordingConsentProviderProps { children: React.ReactNode; } +const LOCAL_STORAGE_KEY = "recording_consent_meetings"; + export const RecordingConsentProvider: React.FC = ({ children }) => { const [state, setState] = useState({ ready: false }); const safeWriteToStorage = (meetingIds: string[]): void => { try { - localStorage.setItem("recording_consent_meetings", JSON.stringify(meetingIds)); + localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(meetingIds)); } catch (error) { console.error("Failed to save consent data to localStorage:", error); } }; + // writes to local storage and to the state of context both const touch = (meetingId: string): void => { if (!state.ready) { @@ -47,13 +50,14 @@ export const RecordingConsentProvider: React.FC = return; } - // Update context state (always works) - const newSet = new Set([...state.consentAnsweredForMeetings, meetingId]); - + // has success regardless local storage write success: we don't handle that + // and don't want to crash anything with just consent functionality + const newSet = state.consentAnsweredForMeetings.has(meetingId) ? + state.consentAnsweredForMeetings : + new Set([...state.consentAnsweredForMeetings, meetingId]); + // note: preserves the set insertion order const array = Array.from(newSet).slice(-5); // Keep latest 5 safeWriteToStorage(array); - - // Update state regardless of storage success setState({ ready: true, consentAnsweredForMeetings: newSet }); }; @@ -62,10 +66,10 @@ export const RecordingConsentProvider: React.FC = return state.consentAnsweredForMeetings.has(meetingId); }; - // Initialize from localStorage on mount (client-side only) + // initialize on mount useEffect(() => { try { - const stored = localStorage.getItem("recording_consent_meetings"); + const stored = localStorage.getItem(LOCAL_STORAGE_KEY); if (!stored) { setState({ ready: true, consentAnsweredForMeetings: new Set() }); return; @@ -77,10 +81,12 @@ export const RecordingConsentProvider: React.FC = setState({ ready: true, consentAnsweredForMeetings: new Set() }); return; } - - const consentAnsweredForMeetings = new Set(parsed.filter(id => typeof id === 'string')); + + // pre-historic way of parsing! + const consentAnsweredForMeetings = new Set(parsed.filter(id => !!id && typeof id === 'string')); setState({ ready: true, consentAnsweredForMeetings }); } catch (error) { + // we don't want to fail the page here; the component is not essential. console.error("Failed to parse consent data from localStorage:", error); setState({ ready: true, consentAnsweredForMeetings: new Set() }); } From fdf42cf60b381cc0606bbd0511ca0a633188e1ec Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Tue, 17 Jun 2025 19:48:46 -0400 Subject: [PATCH 08/30] slop removal --- ...0250617140003_add_meeting_consent_table.py | 2 - .../[transcriptId]/record/page.tsx | 66 ++----------------- 2 files changed, 7 insertions(+), 61 deletions(-) diff --git a/server/migrations/versions/20250617140003_add_meeting_consent_table.py b/server/migrations/versions/20250617140003_add_meeting_consent_table.py index f4cfef81..ae85219c 100644 --- a/server/migrations/versions/20250617140003_add_meeting_consent_table.py +++ b/server/migrations/versions/20250617140003_add_meeting_consent_table.py @@ -18,7 +18,6 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: - # Create meeting_consent table op.create_table( 'meeting_consent', sa.Column('id', sa.String(), nullable=False), @@ -32,5 +31,4 @@ def upgrade() -> None: def downgrade() -> None: - # Drop meeting_consent table op.drop_table('meeting_consent') \ No newline at end of file diff --git a/www/app/(app)/transcripts/[transcriptId]/record/page.tsx b/www/app/(app)/transcripts/[transcriptId]/record/page.tsx index 009fc519..2d227f57 100644 --- a/www/app/(app)/transcripts/[transcriptId]/record/page.tsx +++ b/www/app/(app)/transcripts/[transcriptId]/record/page.tsx @@ -13,8 +13,6 @@ import useMp3 from "../../useMp3"; import WaveformLoading from "../../waveformLoading"; import { Box, Text, Grid, Heading, VStack, Flex } from "@chakra-ui/react"; import LiveTrancription from "../../liveTranscription"; -import AudioConsentDialog from "../../../rooms/audioConsentDialog"; -import useApi from "../../../../lib/useApi"; type TranscriptDetails = { params: { @@ -26,9 +24,6 @@ const TranscriptRecord = (details: TranscriptDetails) => { const transcript = useTranscript(details.params.transcriptId); const [transcriptStarted, setTranscriptStarted] = useState(false); const useActiveTopic = useState(null); - const [showConsentDialog, setShowConsentDialog] = useState(false); - const [consentStatus, setConsentStatus] = useState(''); - const api = useApi(); const webSockets = useWebSockets(details.params.transcriptId); @@ -69,60 +64,14 @@ const TranscriptRecord = (details: TranscriptDetails) => { }; }, []); - // Show consent dialog when recording starts and meeting_id is available - useEffect(() => { - if (status === "recording" && transcript.response?.meeting_id && !consentStatus) { - setShowConsentDialog(true); - } - }, [status, transcript.response?.meeting_id, consentStatus]); - - const handleConsentResponse = async (consentGiven: boolean) => { - const meetingId = transcript.response?.meeting_id; - if (!meetingId || !api) { - console.error('No meeting_id available or API not initialized'); - return; - } - - try { - // Use a simple user identifier - could be improved with actual user ID - const userIdentifier = `user_${Date.now()}`; - - const response = await fetch(`/v1/meetings/${meetingId}/consent`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - consent_given: consentGiven, - user_identifier: userIdentifier - }) - }); - - if (response.ok) { - setConsentStatus(consentGiven ? 'given' : 'denied'); - console.log('Consent recorded successfully'); - } else { - console.error('Failed to record consent'); - } - } catch (error) { - console.error('Error recording consent:', error); - } - }; - return ( - <> - setShowConsentDialog(false)} - onConsent={handleConsentResponse} - /> - + {status == "processing" ? ( ) : ( @@ -175,7 +124,6 @@ const TranscriptRecord = (details: TranscriptDetails) => { - ); }; From 1876ed7579ab48a73cea8e1959cf72661b268fe0 Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Tue, 17 Jun 2025 19:59:44 -0400 Subject: [PATCH 09/30] remove some slop --- www/app/(app)/transcripts/new/page.tsx | 16 +++++++++++----- www/app/(app)/transcripts/useAudioDevice.ts | 12 ++---------- www/app/webinars/[title]/page.tsx | 2 +- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/www/app/(app)/transcripts/new/page.tsx b/www/app/(app)/transcripts/new/page.tsx index 6a325f4a..a99af7be 100644 --- a/www/app/(app)/transcripts/new/page.tsx +++ b/www/app/(app)/transcripts/new/page.tsx @@ -43,6 +43,12 @@ import { Input, } from "@chakra-ui/react"; const TranscriptCreate = () => { + + const [isClient, setIsClient] = useState(false); + useEffect(() => { + // next SSR + setIsClient(true); + }, []); const router = useRouter(); const { isLoading, isAuthenticated } = useSessionStatus(); const requireLogin = featureEnabled("requireLogin"); @@ -68,13 +74,13 @@ const TranscriptCreate = () => { }; const send = () => { - if (!isClient || loadingRecord || createTranscript.loading || permissionDenied) return; + if (loadingRecord || createTranscript.loading || permissionDenied) return; setLoadingRecord(true); createTranscript.create({ name, target_language: getTargetLanguage() }); }; const uploadFile = () => { - if (!isClient || loadingUpload || createTranscript.loading || permissionDenied) return; + if (loadingUpload || createTranscript.loading || permissionDenied) return; setLoadingUpload(true); createTranscript.create({ name, target_language: getTargetLanguage() }); }; @@ -91,7 +97,7 @@ const TranscriptCreate = () => { if (createTranscript.error) setLoadingRecord(false); }, [createTranscript.error]); - const { loading, permissionOk, permissionDenied, requestPermission, isClient } = + const { loading, permissionOk, permissionDenied, requestPermission } = useAudioDevice(); return ( @@ -124,7 +130,7 @@ const TranscriptCreate = () => { Reflector is a transcription and summarization pipeline that transforms audio into knowledge. - {" "}The output is meeting minutes and topic summaries enabling + The output is meeting minutes and topic summaries enabling topic-specific analyses stored in your systems of record. This is accomplished on your infrastructure – without 3rd parties – keeping your data private, secure, and organized. @@ -205,7 +211,7 @@ const TranscriptCreate = () => { + + + + + ), + }); + + return () => { + toast.close(toastId); + }; } - }, [consentState.ready, meetingId, hasConsent, showConsentDialog, consentLoading]); + }, [consentState.ready, meetingId, hasConsent, consentLoading, toast, handleConsent]); useEffect(() => { if (isLoading || !isAuthenticated || !roomUrl) return; @@ -131,13 +161,6 @@ export default function Room(details: RoomDetails) { style={{ width: "100vw", height: "100vh" }} /> )} - {meetingId && consentState.ready && !hasConsent(meetingId) && !consentLoading && ( - {}} // No-op: ESC should not close without consent - onConsent={b => handleConsent(meetingId, b)} - /> - )} ); } diff --git a/www/app/api/schemas.gen.ts b/www/app/api/schemas.gen.ts index 359b6922..fb0e65a3 100644 --- a/www/app/api/schemas.gen.ts +++ b/www/app/api/schemas.gen.ts @@ -293,6 +293,17 @@ export const $GetTranscript = { ], title: "Room Name", }, + audio_deleted: { + anyOf: [ + { + type: "boolean", + }, + { + type: "null", + }, + ], + title: "Audio Deleted", + }, }, type: "object", required: [ @@ -1109,6 +1120,17 @@ export const $UpdateTranscript = { ], title: "Reviewed", }, + audio_deleted: { + anyOf: [ + { + type: "boolean", + }, + { + type: "null", + }, + ], + title: "Audio Deleted", + }, }, type: "object", title: "UpdateTranscript", diff --git a/www/app/api/types.gen.ts b/www/app/api/types.gen.ts index ef9ec43d..c47eef74 100644 --- a/www/app/api/types.gen.ts +++ b/www/app/api/types.gen.ts @@ -56,6 +56,7 @@ export type GetTranscript = { source_kind: SourceKind; room_id?: string | null; room_name?: string | null; + audio_deleted?: boolean | null; }; export type GetTranscriptSegmentTopic = { @@ -219,6 +220,7 @@ export type UpdateTranscript = { share_mode?: "public" | "semi-private" | "private" | null; participants?: Array | null; reviewed?: boolean | null; + audio_deleted?: boolean | null; }; export type UserInfo = { From 58f51697b0f4aa1930dd301b85fc02ac77b4e74b Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Wed, 18 Jun 2025 15:55:16 -0400 Subject: [PATCH 13/30] consent dialog api cleanup --- www/app/(app)/rooms/audioConsentDialog.tsx | 48 --------- www/app/[roomName]/page.tsx | 111 +++++++++++---------- 2 files changed, 59 insertions(+), 100 deletions(-) delete mode 100644 www/app/(app)/rooms/audioConsentDialog.tsx diff --git a/www/app/(app)/rooms/audioConsentDialog.tsx b/www/app/(app)/rooms/audioConsentDialog.tsx deleted file mode 100644 index e3d568f3..00000000 --- a/www/app/(app)/rooms/audioConsentDialog.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import React from "react"; -import { - Modal, - ModalOverlay, - ModalContent, - ModalHeader, - ModalBody, - Button, - Text, - HStack, -} from "@chakra-ui/react"; - -interface AudioConsentDialogProps { - isOpen: boolean; - onClose: () => void; - onConsent: (given: boolean) => void; -} - -const AudioConsentDialog = ({ isOpen, onClose, onConsent }: AudioConsentDialogProps) => { - const handleConsent = (given: boolean) => { - onConsent(given); - onClose(); - }; - - return ( - - - - Audio Storage Consent - - - Can we have your permission to store this meeting's audio recording on our servers? - - - - - - - - - ); -}; - -export default AudioConsentDialog; \ No newline at end of file diff --git a/www/app/[roomName]/page.tsx b/www/app/[roomName]/page.tsx index 30b4138c..6e182d10 100644 --- a/www/app/[roomName]/page.tsx +++ b/www/app/[roomName]/page.tsx @@ -7,10 +7,7 @@ import useRoomMeeting from "./useRoomMeeting"; import { useRouter } from "next/navigation"; import { notFound } from "next/navigation"; import useSessionStatus from "../lib/useSessionStatus"; -import { DomainContext } from "../domainContext"; import { useRecordingConsent } from "../recordingConsentContext"; -import useSessionAccessToken from "../lib/useSessionAccessToken"; -import useSessionUser from "../lib/useSessionUser"; import useApi from "../lib/useApi"; export type RoomDetails = { @@ -19,35 +16,14 @@ export type RoomDetails = { }; }; -export default function Room(details: RoomDetails) { - const wherebyRef = useRef(null); - const roomName = details.params.roomName; - const meeting = useRoomMeeting(roomName); - const router = useRouter(); - const { isLoading, isAuthenticated } = useSessionStatus(); - const [consentLoading, setConsentLoading] = useState(false); +const useConsentDialog = (meetingId: string) => { const { state: consentState, touch, hasConsent } = useRecordingConsent(); - const { api_url } = useContext(DomainContext); - const { accessToken } = useSessionAccessToken(); - const { id: userId } = useSessionUser(); + const [consentLoading, setConsentLoading] = useState(false); const api = useApi(); const toast = useToast(); - - - const roomUrl = meeting?.response?.host_room_url - ? meeting?.response?.host_room_url - : meeting?.response?.room_url; - - const meetingId = meeting?.response?.id; - - const handleLeave = useCallback(() => { - router.push("/browse"); - }, [router]); - - const handleConsent = useCallback(async (meetingId: string, given: boolean, onClose?: () => void) => { + const handleConsent = useCallback(async (meetingId: string, given: boolean) => { if (!api) return; - if (onClose) onClose(); setConsentLoading(true); try { @@ -55,7 +31,7 @@ export default function Room(details: RoomDetails) { meetingId, requestBody: { consent_given: given } }); - + touch(meetingId); } catch (error) { console.error('Error submitting consent:', error); @@ -64,18 +40,6 @@ export default function Room(details: RoomDetails) { } }, [api, touch]); - - useEffect(() => { - if ( - !isLoading && - meeting?.error && - "status" in meeting.error && - meeting.error.status === 404 - ) { - notFound(); - } - }, [isLoading, meeting?.error]); - // Show consent toast when meeting is loaded and consent hasn't been answered yet useEffect(() => { if ( @@ -94,17 +58,23 @@ export default function Room(details: RoomDetails) { Can we have your permission to store this meeting's audio recording on our servers?
- - @@ -119,6 +89,40 @@ export default function Room(details: RoomDetails) { }; } }, [consentState.ready, meetingId, hasConsent, consentLoading, toast, handleConsent]); +} + +function ConsentDialog({ meetingId }: { meetingId: string }) { + useConsentDialog(meetingId); + return <> +} + +export default function Room(details: RoomDetails) { + const wherebyRef = useRef(null); + const roomName = details.params.roomName; + const meeting = useRoomMeeting(roomName); + const router = useRouter(); + const { isLoading, isAuthenticated } = useSessionStatus(); + + const roomUrl = meeting?.response?.host_room_url + ? meeting?.response?.host_room_url + : meeting?.response?.room_url; + + const meetingId = meeting?.response?.id; + + const handleLeave = useCallback(() => { + router.push("/browse"); + }, [router]); + + useEffect(() => { + if ( + !isLoading && + meeting?.error && + "status" in meeting.error && + meeting.error.status === 404 + ) { + notFound(); + } + }, [isLoading, meeting?.error]); useEffect(() => { if (isLoading || !isAuthenticated || !roomUrl) return; @@ -154,12 +158,15 @@ export default function Room(details: RoomDetails) { return ( <> - {roomUrl && ( - + {roomUrl && meetingId && ( + <> + + + )} ); From 3acbcd9952e16af114ff439feba6e4ecaac5141a Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Wed, 18 Jun 2025 16:26:06 -0400 Subject: [PATCH 14/30] fix compose --- compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/compose.yml b/compose.yml index c9c59927..0f1526a0 100644 --- a/compose.yml +++ b/compose.yml @@ -38,11 +38,11 @@ services: web: image: node:18 ports: - - "3001:3000" + - "3000:3000" command: sh -c "yarn install && yarn dev" restart: unless-stopped working_dir: /app volumes: - ./www:/app/ env_file: - - ./www/.env.development.local + - ./www/.env.local From 9c20e8b9f66c515d1a316f81ae21a344d85d6998 Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Wed, 18 Jun 2025 17:32:13 -0400 Subject: [PATCH 15/30] self-review --- server/reflector/db/transcripts.py | 3 +++ server/reflector/pipelines/main_live_pipeline.py | 9 ++++----- www/app/(app)/transcripts/useMp3.ts | 1 - 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/server/reflector/db/transcripts.py b/server/reflector/db/transcripts.py index 9157a742..c865a409 100644 --- a/server/reflector/db/transcripts.py +++ b/server/reflector/db/transcripts.py @@ -70,6 +70,9 @@ transcripts = sqlalchemy.Table( Enum(SourceKind, values_callable=lambda obj: [e.value for e in obj]), nullable=False, ), + # indicative field: whether associated audio is deleted + # the main "audio deleted" is the presence of the audio itself / consents not-given + # same field could've been in recording/meeting, and it's maybe even ok to dupe it at need sqlalchemy.Column("audio_deleted", sqlalchemy.Boolean, nullable=True), ) diff --git a/server/reflector/pipelines/main_live_pipeline.py b/server/reflector/pipelines/main_live_pipeline.py index 1896e199..62ea7a33 100644 --- a/server/reflector/pipelines/main_live_pipeline.py +++ b/server/reflector/pipelines/main_live_pipeline.py @@ -529,7 +529,7 @@ async def pipeline_upload_mp3(transcript: Transcript, logger: Logger): return if transcript.audio_deleted: - logger.info("Skipping MP3 upload - audio marked as deleted") + logger.info("Skipping mp3 upload - audio marked as deleted") return logger.info("Starting upload mp3") @@ -593,8 +593,7 @@ async def cleanup_consent(transcript: Transcript, logger: Logger): logger.info("Consent denied, cleaning up all related audio files") - # 1. Delete original Whereby recording from S3 - if recording and recording.s3_bucket and recording.s3_key: + if recording and recording.bucket_name and recording.object_key: s3_whereby = boto3.client( "s3", @@ -602,8 +601,8 @@ async def cleanup_consent(transcript: Transcript, logger: Logger): aws_secret_access_key=settings.AWS_WHEREBY_ACCESS_KEY_SECRET, ) try: - s3_whereby.delete_object(Bucket=recording.s3_bucket, Key=recording.s3_key) - logger.info(f"Deleted original Whereby recording: {recording.s3_bucket}/{recording.s3_key}") + s3_whereby.delete_object(Bucket=recording.bucket_name, Key=recording.object_key) + logger.info(f"Deleted original Whereby recording: {recording.bucket_name}/{recording.object_key}") except Exception as e: logger.error(f"Failed to delete Whereby recording: {e}") diff --git a/www/app/(app)/transcripts/useMp3.ts b/www/app/(app)/transcripts/useMp3.ts index 2a6a8faa..e41e9362 100644 --- a/www/app/(app)/transcripts/useMp3.ts +++ b/www/app/(app)/transcripts/useMp3.ts @@ -95,7 +95,6 @@ const useMp3 = (transcriptId: string, waiting?: boolean): Mp3Response => { setTranscriptMetadataLoading(false); }) - // Cleanup return () => { stopped = true; audioElement.removeEventListener('canplay', handleCanPlay); From 20d1d9fc0d4abaa5d4b6bc62e81c31f17aed64ad Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Wed, 18 Jun 2025 17:34:48 -0400 Subject: [PATCH 16/30] isClient hack removal and type adjustment for "older" lib --- www/app/(app)/transcripts/[transcriptId]/shareModal.tsx | 4 ---- www/app/(app)/transcripts/new/page.tsx | 8 +------- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/www/app/(app)/transcripts/[transcriptId]/shareModal.tsx b/www/app/(app)/transcripts/[transcriptId]/shareModal.tsx index 88851690..2e8e5ece 100644 --- a/www/app/(app)/transcripts/[transcriptId]/shareModal.tsx +++ b/www/app/(app)/transcripts/[transcriptId]/shareModal.tsx @@ -133,8 +133,6 @@ const ShareModal = (props: ShareModalProps) => { setStream(val.toString()); }} placeholder="Pick a stream" - onBlur={() => {}} - onFocus={() => {}} /> @@ -147,8 +145,6 @@ const ShareModal = (props: ShareModalProps) => { value={topic} onChange={(val) => setTopic(val.toString())} placeholder="Pick a topic" - onBlur={() => {}} - onFocus={() => {}} /> )} diff --git a/www/app/(app)/transcripts/new/page.tsx b/www/app/(app)/transcripts/new/page.tsx index a99af7be..07a3be93 100644 --- a/www/app/(app)/transcripts/new/page.tsx +++ b/www/app/(app)/transcripts/new/page.tsx @@ -44,11 +44,7 @@ import { } from "@chakra-ui/react"; const TranscriptCreate = () => { - const [isClient, setIsClient] = useState(false); - useEffect(() => { - // next SSR - setIsClient(true); - }, []); + const isClient = typeof window === 'undefined'; const router = useRouter(); const { isLoading, isAuthenticated } = useSessionStatus(); const requireLogin = featureEnabled("requireLogin"); @@ -183,8 +179,6 @@ const TranscriptCreate = () => { value={targetLanguage} onChange={onLanguageChange} placeholder="Choose your language" - onBlur={() => {}} - onFocus={() => {}} /> {isClient && !loading ? ( From 49f4b65f47d1baad39223667751edf2ad4e00bcb Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Wed, 18 Jun 2025 19:47:08 -0400 Subject: [PATCH 17/30] lint --- server/reflector/db/meetings.py | 4 ++-- server/reflector/db/recordings.py | 1 - server/reflector/db/transcripts.py | 2 +- server/reflector/pipelines/main_live_pipeline.py | 3 +-- server/reflector/worker/process.py | 1 - 5 files changed, 4 insertions(+), 7 deletions(-) diff --git a/server/reflector/db/meetings.py b/server/reflector/db/meetings.py index 40845f02..9e2f89bd 100644 --- a/server/reflector/db/meetings.py +++ b/server/reflector/db/meetings.py @@ -144,7 +144,7 @@ class MeetingController: sa.and_( meetings.c.room_id == room.id, meetings.c.end_date > current_time, - meetings.c.is_active == True, + meetings.c.is_active, ) ) .order_by(end_date.desc()) @@ -229,7 +229,7 @@ class MeetingConsentController: """Check if any participant denied consent for this meeting""" query = meeting_consent.select().where( meeting_consent.c.meeting_id == meeting_id, - meeting_consent.c.consent_given == False + meeting_consent.c.consent_given.is_(False) ) result = await database.fetch_one(query) return result is not None diff --git a/server/reflector/db/recordings.py b/server/reflector/db/recordings.py index 5d485e02..4b517754 100644 --- a/server/reflector/db/recordings.py +++ b/server/reflector/db/recordings.py @@ -1,6 +1,5 @@ from datetime import datetime from typing import Literal -from uuid import uuid4 import sqlalchemy as sa from pydantic import BaseModel, Field diff --git a/server/reflector/db/transcripts.py b/server/reflector/db/transcripts.py index c865a409..524de3ed 100644 --- a/server/reflector/db/transcripts.py +++ b/server/reflector/db/transcripts.py @@ -14,7 +14,7 @@ from pydantic import BaseModel, ConfigDict, Field from reflector.db import database, metadata from reflector.processors.types import Word as ProcessorWord from reflector.settings import settings -from reflector.storage import Storage, get_transcripts_storage +from reflector.storage import get_transcripts_storage from sqlalchemy import Enum from sqlalchemy.sql import false, or_ diff --git a/server/reflector/pipelines/main_live_pipeline.py b/server/reflector/pipelines/main_live_pipeline.py index 62ea7a33..8b00b9eb 100644 --- a/server/reflector/pipelines/main_live_pipeline.py +++ b/server/reflector/pipelines/main_live_pipeline.py @@ -60,8 +60,7 @@ from reflector.zulip import ( update_zulip_message, ) -from reflector.db.meetings import meetings_controller, meeting_consent_controller -from reflector.db.recordings import recordings_controller +from reflector.db.meetings import meeting_consent_controller from reflector.storage import get_transcripts_storage import boto3 diff --git a/server/reflector/worker/process.py b/server/reflector/worker/process.py index 5697f075..706396bb 100644 --- a/server/reflector/worker/process.py +++ b/server/reflector/worker/process.py @@ -13,7 +13,6 @@ from reflector.db.meetings import meetings_controller from reflector.db.recordings import Recording, recordings_controller from reflector.db.rooms import rooms_controller from reflector.db.transcripts import SourceKind, transcripts_controller -from reflector.storage import get_transcripts_storage from reflector.pipelines.main_live_pipeline import asynctask, task_pipeline_process from reflector.settings import settings from reflector.whereby import get_room_sessions From 98acf298d66beb3bc7b251ba4de3be8f699d570e Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Wed, 18 Jun 2025 23:40:22 -0400 Subject: [PATCH 18/30] better mp3 absense handling on transcription page --- .../(app)/transcripts/[transcriptId]/page.tsx | 13 +++---------- .../transcripts/[transcriptId]/record/page.tsx | 1 - www/app/(app)/transcripts/useMp3.ts | 18 +++++++++++++++++- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/www/app/(app)/transcripts/[transcriptId]/page.tsx b/www/app/(app)/transcripts/[transcriptId]/page.tsx index 7940068e..f40beec7 100644 --- a/www/app/(app)/transcripts/[transcriptId]/page.tsx +++ b/www/app/(app)/transcripts/[transcriptId]/page.tsx @@ -54,15 +54,6 @@ export default function TranscriptDetails(details: TranscriptDetails) { ); } - if (mp3.audioDeleted) { - return ( - - ); - } - if (transcript?.loading || topics?.loading) { return ; } @@ -87,7 +78,7 @@ export default function TranscriptDetails(details: TranscriptDetails) { mt={4} mb={4} > - {waveform.waveform && mp3.media && topics.topics ? ( + {waveform.waveform && mp3.media && !mp3.audioDeleted && topics.topics ? ( ) : waveform.error ? (
"error loading this recording"
+ ) : mp3.audioDeleted ? ( +
Audio was deleted
) : ( )} diff --git a/www/app/(app)/transcripts/[transcriptId]/record/page.tsx b/www/app/(app)/transcripts/[transcriptId]/record/page.tsx index e9ca63e4..52072938 100644 --- a/www/app/(app)/transcripts/[transcriptId]/record/page.tsx +++ b/www/app/(app)/transcripts/[transcriptId]/record/page.tsx @@ -8,7 +8,6 @@ import "../../../../styles/button.css"; import { Topic } from "../../webSocketTypes"; import { lockWakeState, releaseWakeState } from "../../../../lib/wakeLock"; import { useRouter } from "next/navigation"; -import Player from "../../player"; import useMp3 from "../../useMp3"; import WaveformLoading from "../../waveformLoading"; import { Box, Text, Grid, Heading, VStack, Flex } from "@chakra-ui/react"; diff --git a/www/app/(app)/transcripts/useMp3.ts b/www/app/(app)/transcripts/useMp3.ts index e41e9362..7b687f1d 100644 --- a/www/app/(app)/transcripts/useMp3.ts +++ b/www/app/(app)/transcripts/useMp3.ts @@ -47,9 +47,11 @@ const useMp3 = (transcriptId: string, waiting?: boolean): Mp3Response => { }); }, [navigator.serviceWorker, !serviceWorker, accessTokenInfo]); + useEffect(() => { if (!transcriptId || !api || later) return; + let deleted: boolean | null = null; setTranscriptMetadataLoading(true); @@ -59,12 +61,20 @@ const useMp3 = (transcriptId: string, waiting?: boolean): Mp3Response => { audioElement.preload = "auto"; const handleCanPlay = () => { + if (deleted) { + console.error('Illegal state: audio supposed to be deleted, but was loaded'); + return; + } setAudioLoading(false); setAudioLoadingError(null); }; const handleError = () => { setAudioLoading(false); + if (deleted) { + // we arrived here earlier, ignore + return; + } setAudioLoadingError("Failed to load audio"); }; @@ -81,8 +91,14 @@ const useMp3 = (transcriptId: string, waiting?: boolean): Mp3Response => { api.v1TranscriptGet({ transcriptId }) .then((transcript) => { if (stopped) return; - setAudioDeleted(transcript.audio_deleted || false); + deleted = transcript.audio_deleted || false; + setAudioDeleted(deleted); setTranscriptMetadataLoadingError(null); + if (deleted) { + setMedia(null); + setAudioLoadingError(null); + } + // if deleted, media will or already returned error }) .catch((error) => { if (stopped) return; From 6cb46dc64f2ff70c35663304e8b95c1f5f8ffd41 Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Thu, 19 Jun 2025 10:13:57 -0400 Subject: [PATCH 19/30] format --- server/reflector/db/meetings.py | 34 ++++++++++++------- server/reflector/db/recordings.py | 1 + server/reflector/db/transcripts.py | 11 ++++-- .../reflector/pipelines/main_live_pipeline.py | 22 ++++++++---- server/reflector/storage/__init__.py | 2 ++ server/reflector/utils/__init__.py | 2 +- .../views/_range_requests_response.py | 1 + server/reflector/views/meetings.py | 10 +++--- server/reflector/views/transcripts_audio.py | 6 ++-- server/reflector/worker/process.py | 1 + 10 files changed, 59 insertions(+), 31 deletions(-) diff --git a/server/reflector/db/meetings.py b/server/reflector/db/meetings.py index 9e2f89bd..ec9ad70b 100644 --- a/server/reflector/db/meetings.py +++ b/server/reflector/db/meetings.py @@ -189,15 +189,19 @@ class MeetingController: class MeetingConsentController: async def get_by_meeting_id(self, meeting_id: str) -> list[MeetingConsent]: - query = meeting_consent.select().where(meeting_consent.c.meeting_id == meeting_id) + query = meeting_consent.select().where( + meeting_consent.c.meeting_id == meeting_id + ) results = await database.fetch_all(query) return [MeetingConsent(**result) for result in results] - - async def get_by_meeting_and_user(self, meeting_id: str, user_id: str) -> MeetingConsent | None: + + async def get_by_meeting_and_user( + self, meeting_id: str, user_id: str + ) -> MeetingConsent | None: """Get existing consent for a specific user and meeting""" query = meeting_consent.select().where( meeting_consent.c.meeting_id == meeting_id, - meeting_consent.c.user_id == user_id + meeting_consent.c.user_id == user_id, ) result = await database.fetch_one(query) return MeetingConsent(**result) if result else None @@ -207,16 +211,20 @@ class MeetingConsentController: if consent.user_id: # For authenticated users, check if consent already exists # not transactional but we're ok with that; the consents ain't deleted anyways - existing = await self.get_by_meeting_and_user(consent.meeting_id, consent.user_id) + existing = await self.get_by_meeting_and_user( + consent.meeting_id, consent.user_id + ) if existing: - query = meeting_consent.update().where( - meeting_consent.c.id == existing.id - ).values( - consent_given=consent.consent_given, - consent_timestamp=consent.consent_timestamp, + query = ( + meeting_consent.update() + .where(meeting_consent.c.id == existing.id) + .values( + consent_given=consent.consent_given, + consent_timestamp=consent.consent_timestamp, + ) ) await database.execute(query) - + existing.consent_given = consent.consent_given existing.consent_timestamp = consent.consent_timestamp return existing @@ -224,12 +232,12 @@ class MeetingConsentController: query = meeting_consent.insert().values(**consent.model_dump()) await database.execute(query) return consent - + async def has_any_denial(self, meeting_id: str) -> bool: """Check if any participant denied consent for this meeting""" query = meeting_consent.select().where( meeting_consent.c.meeting_id == meeting_id, - meeting_consent.c.consent_given.is_(False) + meeting_consent.c.consent_given.is_(False), ) result = await database.fetch_one(query) return result is not None diff --git a/server/reflector/db/recordings.py b/server/reflector/db/recordings.py index 4b517754..31670609 100644 --- a/server/reflector/db/recordings.py +++ b/server/reflector/db/recordings.py @@ -22,6 +22,7 @@ recordings = sa.Table( sa.Column("meeting_id", sa.String), ) + class Recording(BaseModel): id: str = Field(default_factory=generate_uuid4) bucket_name: str diff --git a/server/reflector/db/transcripts.py b/server/reflector/db/transcripts.py index 524de3ed..67f66aac 100644 --- a/server/reflector/db/transcripts.py +++ b/server/reflector/db/transcripts.py @@ -76,6 +76,7 @@ transcripts = sqlalchemy.Table( sqlalchemy.Column("audio_deleted", sqlalchemy.Boolean, nullable=True), ) + def generate_transcript_name() -> str: now = datetime.utcnow() return f"Transcript {now.strftime('%Y-%m-%d %H:%M:%S')}" @@ -550,13 +551,17 @@ class TranscriptController: """ if transcript.audio_deleted: - raise FileNotFoundError(f"Invalid state of transcript {transcript.id}: audio_deleted mark is set true") + raise FileNotFoundError( + f"Invalid state of transcript {transcript.id}: audio_deleted mark is set true" + ) if transcript.audio_location == "local": # store the audio on external storage if it's not already there if not transcript.audio_mp3_filename.exists(): - raise FileNotFoundError(f"Audio file not found: {transcript.audio_mp3_filename}") - + raise FileNotFoundError( + f"Audio file not found: {transcript.audio_mp3_filename}" + ) + await get_transcripts_storage().put_file( transcript.storage_audio_path, transcript.audio_mp3_filename.read_bytes(), diff --git a/server/reflector/pipelines/main_live_pipeline.py b/server/reflector/pipelines/main_live_pipeline.py index 8b00b9eb..aca28586 100644 --- a/server/reflector/pipelines/main_live_pipeline.py +++ b/server/reflector/pipelines/main_live_pipeline.py @@ -581,7 +581,9 @@ async def cleanup_consent(transcript: Transcript, logger: Logger): if recording and recording.meeting_id: meeting = await meetings_controller.get_by_id(recording.meeting_id) if meeting: - consent_denied = await meeting_consent_controller.has_any_denial(meeting.id) + consent_denied = await meeting_consent_controller.has_any_denial( + meeting.id + ) except Exception as e: logger.error(f"Failed to get fetch consent: {e}") consent_denied = True @@ -600,8 +602,12 @@ async def cleanup_consent(transcript: Transcript, logger: Logger): aws_secret_access_key=settings.AWS_WHEREBY_ACCESS_KEY_SECRET, ) try: - s3_whereby.delete_object(Bucket=recording.bucket_name, Key=recording.object_key) - logger.info(f"Deleted original Whereby recording: {recording.bucket_name}/{recording.object_key}") + s3_whereby.delete_object( + Bucket=recording.bucket_name, Key=recording.object_key + ) + logger.info( + f"Deleted original Whereby recording: {recording.bucket_name}/{recording.object_key}" + ) except Exception as e: logger.error(f"Failed to delete Whereby recording: {e}") @@ -613,19 +619,21 @@ async def cleanup_consent(transcript: Transcript, logger: Logger): storage = get_transcripts_storage() try: await storage.delete_file(transcript.storage_audio_path) - logger.info(f"Deleted processed audio from storage: {transcript.storage_audio_path}") + logger.info( + f"Deleted processed audio from storage: {transcript.storage_audio_path}" + ) except Exception as e: logger.error(f"Failed to delete processed audio: {e}") # 3. Delete local audio files try: - if hasattr(transcript, 'audio_mp3_filename') and transcript.audio_mp3_filename: + if hasattr(transcript, "audio_mp3_filename") and transcript.audio_mp3_filename: transcript.audio_mp3_filename.unlink(missing_ok=True) - if hasattr(transcript, 'audio_wav_filename') and transcript.audio_wav_filename: + if hasattr(transcript, "audio_wav_filename") and transcript.audio_wav_filename: transcript.audio_wav_filename.unlink(missing_ok=True) except Exception as e: logger.error(f"Failed to delete local audio files: {e}") - + logger.info("Consent cleanup done") diff --git a/server/reflector/storage/__init__.py b/server/reflector/storage/__init__.py index 6b0eed3a..ee6c7318 100644 --- a/server/reflector/storage/__init__.py +++ b/server/reflector/storage/__init__.py @@ -1,7 +1,9 @@ from .base import Storage # noqa + def get_transcripts_storage() -> Storage: from reflector.settings import settings + return Storage.get_instance( name=settings.TRANSCRIPT_STORAGE_BACKEND, settings_prefix="TRANSCRIPT_STORAGE_", diff --git a/server/reflector/utils/__init__.py b/server/reflector/utils/__init__.py index 254ce4b6..909f735b 100644 --- a/server/reflector/utils/__init__.py +++ b/server/reflector/utils/__init__.py @@ -2,4 +2,4 @@ from uuid import uuid4 def generate_uuid4() -> str: - return str(uuid4()) \ No newline at end of file + return str(uuid4()) diff --git a/server/reflector/views/_range_requests_response.py b/server/reflector/views/_range_requests_response.py index f74529a0..8e3770ae 100644 --- a/server/reflector/views/_range_requests_response.py +++ b/server/reflector/views/_range_requests_response.py @@ -45,6 +45,7 @@ def range_requests_response( if not os.path.exists(file_path): from fastapi import HTTPException + raise HTTPException(status_code=404, detail="File not found") file_size = os.stat(file_path).st_size diff --git a/server/reflector/views/meetings.py b/server/reflector/views/meetings.py index d6d30610..832b7c29 100644 --- a/server/reflector/views/meetings.py +++ b/server/reflector/views/meetings.py @@ -28,16 +28,16 @@ async def meeting_audio_consent( meeting = await meetings_controller.get_by_id(meeting_id) if not meeting: raise HTTPException(status_code=404, detail="Meeting not found") - + user_id = user["sub"] if user else None - + consent = MeetingConsent( meeting_id=meeting_id, user_id=user_id, consent_given=request.consent_given, consent_timestamp=datetime.utcnow(), ) - + updated_consent = await meeting_consent_controller.upsert(consent) - - return {"status": "success", "consent_id": updated_consent.id} \ No newline at end of file + + return {"status": "success", "consent_id": updated_consent.id} diff --git a/server/reflector/views/transcripts_audio.py b/server/reflector/views/transcripts_audio.py index 0c177163..baf6772a 100644 --- a/server/reflector/views/transcripts_audio.py +++ b/server/reflector/views/transcripts_audio.py @@ -87,8 +87,10 @@ async def transcript_get_audio_mp3( ) if transcript.audio_deleted: - raise HTTPException(status_code=404, detail="Audio unavailable due to privacy settings") - + raise HTTPException( + status_code=404, detail="Audio unavailable due to privacy settings" + ) + if not transcript.audio_mp3_filename.exists(): raise HTTPException(status_code=404, detail="Audio file not found") diff --git a/server/reflector/worker/process.py b/server/reflector/worker/process.py index 706396bb..85e249e5 100644 --- a/server/reflector/worker/process.py +++ b/server/reflector/worker/process.py @@ -131,6 +131,7 @@ async def process_recording(bucket_name: str, object_key: str): task_pipeline_process.delay(transcript_id=transcript.id) + @shared_task @asynctask async def process_meetings(): From 92a08653aad340949b83102e46504fedd54992ec Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Thu, 19 Jun 2025 10:54:27 -0400 Subject: [PATCH 20/30] only recordings that are *recorded* require consent --- server/reflector/views/rooms.py | 3 ++- www/app/[roomName]/page.tsx | 9 ++++++++- www/app/api/schemas.gen.ts | 6 ++++++ www/app/api/types.gen.ts | 3 +++ 4 files changed, 19 insertions(+), 2 deletions(-) diff --git a/server/reflector/views/rooms.py b/server/reflector/views/rooms.py index f9f7f4eb..9592fa31 100644 --- a/server/reflector/views/rooms.py +++ b/server/reflector/views/rooms.py @@ -1,5 +1,5 @@ from datetime import datetime, timedelta -from typing import Annotated, Optional +from typing import Annotated, Optional, Literal import reflector.auth as auth from fastapi import APIRouter, Depends, HTTPException @@ -37,6 +37,7 @@ class Meeting(BaseModel): host_room_url: str start_date: datetime end_date: datetime + recording_type: Literal["none", "local", "cloud"] = "cloud" class CreateRoom(BaseModel): diff --git a/www/app/[roomName]/page.tsx b/www/app/[roomName]/page.tsx index 6e182d10..04e225b0 100644 --- a/www/app/[roomName]/page.tsx +++ b/www/app/[roomName]/page.tsx @@ -9,6 +9,7 @@ import { notFound } from "next/navigation"; import useSessionStatus from "../lib/useSessionStatus"; import { useRecordingConsent } from "../recordingConsentContext"; import useApi from "../lib/useApi"; +import { Meeting } from '../api'; export type RoomDetails = { params: { @@ -96,6 +97,10 @@ function ConsentDialog({ meetingId }: { meetingId: string }) { return <> } +const recordingTypeRequiresConsent = (recordingType: NonNullable) => { + return recordingType === 'cloud'; +} + export default function Room(details: RoomDetails) { const wherebyRef = useRef(null); const roomName = details.params.roomName; @@ -109,6 +114,8 @@ export default function Room(details: RoomDetails) { const meetingId = meeting?.response?.id; + const recordingType = meeting?.response?.recording_type; + const handleLeave = useCallback(() => { router.push("/browse"); }, [router]); @@ -165,7 +172,7 @@ export default function Room(details: RoomDetails) { room={roomUrl} style={{ width: "100vw", height: "100vh" }} /> - + {recordingType && recordingTypeRequiresConsent(recordingType) && } )} diff --git a/www/app/api/schemas.gen.ts b/www/app/api/schemas.gen.ts index fb0e65a3..8b42c8a7 100644 --- a/www/app/api/schemas.gen.ts +++ b/www/app/api/schemas.gen.ts @@ -546,6 +546,12 @@ export const $Meeting = { format: "date-time", title: "End Date", }, + recording_type: { + type: "string", + enum: ["none", "local", "cloud"], + title: "Recording Type", + default: "cloud", + }, }, type: "object", required: [ diff --git a/www/app/api/types.gen.ts b/www/app/api/types.gen.ts index c47eef74..38b77c69 100644 --- a/www/app/api/types.gen.ts +++ b/www/app/api/types.gen.ts @@ -108,8 +108,11 @@ export type Meeting = { host_room_url: string; start_date: string; end_date: string; + recording_type?: "none" | "local" | "cloud"; }; +export type recording_type = "none" | "local" | "cloud"; + export type MeetingConsentRequest = { consent_given: boolean; }; From 66baf51ccb0c7cddb20aa1fc8272ea2911bbbdb2 Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Thu, 19 Jun 2025 11:36:05 -0400 Subject: [PATCH 21/30] whereby <-> consent accessibility --- www/app/[roomName]/page.tsx | 133 ++++++++++++++++++++++++++---------- 1 file changed, 96 insertions(+), 37 deletions(-) diff --git a/www/app/[roomName]/page.tsx b/www/app/[roomName]/page.tsx index 04e225b0..b6d5cf40 100644 --- a/www/app/[roomName]/page.tsx +++ b/www/app/[roomName]/page.tsx @@ -1,7 +1,7 @@ "use client"; import "@whereby.com/browser-sdk/embed"; -import { useCallback, useEffect, useRef, useState, useContext } from "react"; +import { useCallback, useEffect, useRef, useState, useContext, RefObject } from "react"; import { Box, Button, Text, VStack, HStack, Spinner, useToast } from "@chakra-ui/react"; import useRoomMeeting from "./useRoomMeeting"; import { useRouter } from "next/navigation"; @@ -17,7 +17,38 @@ export type RoomDetails = { }; }; -const useConsentDialog = (meetingId: string) => { +// stages: we focus on the consent, then whereby steals focus, then we focus on the consent again, then return focus to whoever stole it initially +const useConsentWherebyFocusManagement = (acceptButtonRef: RefObject, wherebyRef: RefObject) => { + const currentFocusRef = useRef(null); + useEffect(() => { + if (acceptButtonRef.current) { + acceptButtonRef.current.focus(); + } else { + console.error("accept button ref not available yet for focus management - seems to be illegal state"); + } + + const handleWherebyReady = () => { + console.log("whereby ready - refocusing consent button"); + currentFocusRef.current = document.activeElement as HTMLElement; + if (acceptButtonRef.current) { + acceptButtonRef.current.focus(); + } + }; + + if (wherebyRef.current) { + wherebyRef.current.addEventListener("ready", handleWherebyReady); + } else { + console.warn("whereby ref not available yet for focus management - seems to be illegal state. not waiting, focus management off."); + } + + return () => { + wherebyRef.current?.removeEventListener("ready", handleWherebyReady); + currentFocusRef.current?.focus(); + }; + }, []); +} + +const useConsentDialog = (meetingId: string, wherebyRef: RefObject/*accessibility*/) => { const { state: consentState, touch, hasConsent } = useRecordingConsent(); const [consentLoading, setConsentLoading] = useState(false); const api = useApi(); @@ -41,7 +72,6 @@ const useConsentDialog = (meetingId: string) => { } }, [api, touch]); - // Show consent toast when meeting is loaded and consent hasn't been answered yet useEffect(() => { if ( consentState.ready && @@ -49,51 +79,73 @@ const useConsentDialog = (meetingId: string) => { !hasConsent(meetingId) && !consentLoading ) { + const toastId = toast({ position: "top", duration: null, - render: ({ onClose }) => ( - - - - Can we have your permission to store this meeting's audio recording on our servers? - - - - - - - - ), + render: ({ onClose }) => { + const AcceptButton = () => { + const buttonRef = useRef(null); + useConsentWherebyFocusManagement(buttonRef, wherebyRef); + return ( + + ); + }; + + return ( + + + + Can we have your permission to store this meeting's audio recording on our servers? + + + + + + + + ); + }, }); + // Handle escape key to close the toast + const handleKeyDown = (event: KeyboardEvent) => { + if (event.key === 'Escape') { + toast.close(toastId); + } + }; + + document.addEventListener('keydown', handleKeyDown); + return () => { toast.close(toastId); + document.removeEventListener('keydown', handleKeyDown); }; } }, [consentState.ready, meetingId, hasConsent, consentLoading, toast, handleConsent]); } -function ConsentDialog({ meetingId }: { meetingId: string }) { - useConsentDialog(meetingId); +function ConsentDialog({ meetingId, wherebyRef }: { meetingId: string; wherebyRef: React.RefObject }) { + useConsentDialog(meetingId, wherebyRef); return <> } @@ -134,10 +186,17 @@ export default function Room(details: RoomDetails) { useEffect(() => { if (isLoading || !isAuthenticated || !roomUrl) return; + // accessibility: whereby grabs focus after its interface is loaded => we lose "esc" and keyboard control over the consent popup + const handleReady = (event: any) => { + console.log("whereby-embed ready event:", event); + }; + wherebyRef.current?.addEventListener("leave", handleLeave); + wherebyRef.current?.addEventListener("ready", handleReady); return () => { wherebyRef.current?.removeEventListener("leave", handleLeave); + wherebyRef.current?.removeEventListener("ready", handleReady); }; }, [handleLeave, roomUrl, isLoading, isAuthenticated]); @@ -172,7 +231,7 @@ export default function Room(details: RoomDetails) { room={roomUrl} style={{ width: "100vw", height: "100vh" }} /> - {recordingType && recordingTypeRequiresConsent(recordingType) && } + {recordingType && recordingTypeRequiresConsent(recordingType) && } )} From ff291a3ec862e8c5b87a8ce686c358f9f488df65 Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Thu, 19 Jun 2025 12:10:08 -0400 Subject: [PATCH 22/30] ssr errors mitigation --- www/app/[roomName]/page.tsx | 24 +++++++++++++++--------- www/app/[roomName]/useRoomMeeting.tsx | 1 - www/app/recordingConsentContext.tsx | 9 ++++++++- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/www/app/[roomName]/page.tsx b/www/app/[roomName]/page.tsx index b6d5cf40..d8386834 100644 --- a/www/app/[roomName]/page.tsx +++ b/www/app/[roomName]/page.tsx @@ -1,6 +1,5 @@ "use client"; -import "@whereby.com/browser-sdk/embed"; import { useCallback, useEffect, useRef, useState, useContext, RefObject } from "react"; import { Box, Button, Text, VStack, HStack, Spinner, useToast } from "@chakra-ui/react"; import useRoomMeeting from "./useRoomMeeting"; @@ -153,7 +152,21 @@ const recordingTypeRequiresConsent = (recordingType: NonNullable { + const [wherebyLoaded, setWherebyLoaded] = useState(false); + useEffect(() => { + if (typeof window !== 'undefined') { + import("@whereby.com/browser-sdk/embed").then(() => { + setWherebyLoaded(true); + }).catch(console.error.bind(console)); + } + }, []); + return wherebyLoaded; +} + export default function Room(details: RoomDetails) { + const wherebyLoaded = useWhereby(); const wherebyRef = useRef(null); const roomName = details.params.roomName; const meeting = useRoomMeeting(roomName); @@ -186,17 +199,10 @@ export default function Room(details: RoomDetails) { useEffect(() => { if (isLoading || !isAuthenticated || !roomUrl) return; - // accessibility: whereby grabs focus after its interface is loaded => we lose "esc" and keyboard control over the consent popup - const handleReady = (event: any) => { - console.log("whereby-embed ready event:", event); - }; - wherebyRef.current?.addEventListener("leave", handleLeave); - wherebyRef.current?.addEventListener("ready", handleReady); return () => { wherebyRef.current?.removeEventListener("leave", handleLeave); - wherebyRef.current?.removeEventListener("ready", handleReady); }; }, [handleLeave, roomUrl, isLoading, isAuthenticated]); @@ -224,7 +230,7 @@ export default function Room(details: RoomDetails) { return ( <> - {roomUrl && meetingId && ( + {roomUrl && meetingId && wherebyLoaded && ( <> { setResponse(result); setLoading(false); - console.debug("Meeting Loaded:", result); }) .catch((error) => { const shouldShowHuman = shouldShowError(error); diff --git a/www/app/recordingConsentContext.tsx b/www/app/recordingConsentContext.tsx index 4c2e16ad..80cf042a 100644 --- a/www/app/recordingConsentContext.tsx +++ b/www/app/recordingConsentContext.tsx @@ -36,7 +36,9 @@ export const RecordingConsentProvider: React.FC = const safeWriteToStorage = (meetingIds: string[]): void => { try { - localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(meetingIds)); + if (typeof window !== 'undefined' && window.localStorage) { + localStorage.setItem(LOCAL_STORAGE_KEY, JSON.stringify(meetingIds)); + } } catch (error) { console.error("Failed to save consent data to localStorage:", error); } @@ -69,6 +71,11 @@ export const RecordingConsentProvider: React.FC = // initialize on mount useEffect(() => { try { + if (typeof window === 'undefined' || !window.localStorage) { + setState({ ready: true, consentAnsweredForMeetings: new Set() }); + return; + } + const stored = localStorage.getItem(LOCAL_STORAGE_KEY); if (!stored) { setState({ ready: true, consentAnsweredForMeetings: new Set() }); From ebcb0fcc7e1bb811e810744ace4352e456a6d5d3 Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Thu, 19 Jun 2025 12:23:41 -0400 Subject: [PATCH 23/30] fix leaving the room redirect afte whereby client-side fix --- www/app/[roomName]/page.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/www/app/[roomName]/page.tsx b/www/app/[roomName]/page.tsx index d8386834..821c7a52 100644 --- a/www/app/[roomName]/page.tsx +++ b/www/app/[roomName]/page.tsx @@ -197,14 +197,14 @@ export default function Room(details: RoomDetails) { }, [isLoading, meeting?.error]); useEffect(() => { - if (isLoading || !isAuthenticated || !roomUrl) return; + if (isLoading || !isAuthenticated || !roomUrl || !wherebyLoaded) return; wherebyRef.current?.addEventListener("leave", handleLeave); return () => { wherebyRef.current?.removeEventListener("leave", handleLeave); }; - }, [handleLeave, roomUrl, isLoading, isAuthenticated]); + }, [handleLeave, roomUrl, isLoading, isAuthenticated, wherebyLoaded]); if (isLoading) { return ( From a8d3f5fcf52476accea2d1bc200854e90311172b Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Thu, 19 Jun 2025 12:46:07 -0400 Subject: [PATCH 24/30] Update www/app/(app)/transcripts/new/page.tsx Co-authored-by: pr-agent-monadical[bot] <198624643+pr-agent-monadical[bot]@users.noreply.github.com> --- www/app/(app)/transcripts/new/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/app/(app)/transcripts/new/page.tsx b/www/app/(app)/transcripts/new/page.tsx index 07a3be93..2571edbf 100644 --- a/www/app/(app)/transcripts/new/page.tsx +++ b/www/app/(app)/transcripts/new/page.tsx @@ -44,7 +44,7 @@ import { } from "@chakra-ui/react"; const TranscriptCreate = () => { - const isClient = typeof window === 'undefined'; + const isClient = typeof window !== 'undefined'; const router = useRouter(); const { isLoading, isAuthenticated } = useSessionStatus(); const requireLogin = featureEnabled("requireLogin"); From dc2924cafafa7c65ad3ce2afa10ae322a082bb77 Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Thu, 19 Jun 2025 12:46:38 -0400 Subject: [PATCH 25/30] ai review partial fix --- .../(app)/transcripts/[transcriptId]/correct/topicPlayer.tsx | 2 +- www/app/(app)/transcripts/[transcriptId]/page.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/www/app/(app)/transcripts/[transcriptId]/correct/topicPlayer.tsx b/www/app/(app)/transcripts/[transcriptId]/correct/topicPlayer.tsx index 830a7c69..3d07e3d9 100644 --- a/www/app/(app)/transcripts/[transcriptId]/correct/topicPlayer.tsx +++ b/www/app/(app)/transcripts/[transcriptId]/correct/topicPlayer.tsx @@ -183,7 +183,7 @@ const TopicPlayer = ({ setIsPlaying(false); }; - const isLoaded = !!(mp3.loading && topicTime); + const isLoaded = !mp3.loading && !!topicTime const error = mp3.error; if (error !== null) { return diff --git a/www/app/(app)/transcripts/[transcriptId]/page.tsx b/www/app/(app)/transcripts/[transcriptId]/page.tsx index f40beec7..dde9eb6e 100644 --- a/www/app/(app)/transcripts/[transcriptId]/page.tsx +++ b/www/app/(app)/transcripts/[transcriptId]/page.tsx @@ -87,7 +87,7 @@ export default function TranscriptDetails(details: TranscriptDetails) { mediaDuration={transcript.response.duration} /> ) : waveform.error ? ( -
"error loading this recording"
+
error loading this recording
) : mp3.audioDeleted ? (
Audio was deleted
) : ( From 351fb54f250ad788b575f0305d3c64615bd23e28 Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Thu, 19 Jun 2025 12:49:23 -0400 Subject: [PATCH 26/30] ai review partial fix --- server/reflector/db/meetings.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/reflector/db/meetings.py b/server/reflector/db/meetings.py index ec9ad70b..e6830460 100644 --- a/server/reflector/db/meetings.py +++ b/server/reflector/db/meetings.py @@ -204,6 +204,8 @@ class MeetingConsentController: meeting_consent.c.user_id == user_id, ) result = await database.fetch_one(query) + if result is None: + return None return MeetingConsent(**result) if result else None async def upsert(self, consent: MeetingConsent) -> MeetingConsent: From da901dc566818ddc46f31c80f4bdc6321f4fa64e Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Thu, 19 Jun 2025 12:51:23 -0400 Subject: [PATCH 27/30] ai review partial fix --- server/reflector/views/transcripts_audio.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/reflector/views/transcripts_audio.py b/server/reflector/views/transcripts_audio.py index baf6772a..9ea65ced 100644 --- a/server/reflector/views/transcripts_audio.py +++ b/server/reflector/views/transcripts_audio.py @@ -91,7 +91,7 @@ async def transcript_get_audio_mp3( status_code=404, detail="Audio unavailable due to privacy settings" ) - if not transcript.audio_mp3_filename.exists(): + if not hasattr(transcript, 'audio_mp3_filename') or not transcript.audio_mp3_filename or not transcript.audio_mp3_filename.exists(): raise HTTPException(status_code=404, detail="Audio file not found") truncated_id = str(transcript.id).split("-")[0] From 8f0bd31c758719afc9f48dbf23d4ed921108cff7 Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Thu, 19 Jun 2025 13:00:05 -0400 Subject: [PATCH 28/30] format --- server/reflector/views/transcripts_audio.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/reflector/views/transcripts_audio.py b/server/reflector/views/transcripts_audio.py index 9ea65ced..c457f472 100644 --- a/server/reflector/views/transcripts_audio.py +++ b/server/reflector/views/transcripts_audio.py @@ -91,7 +91,11 @@ async def transcript_get_audio_mp3( status_code=404, detail="Audio unavailable due to privacy settings" ) - if not hasattr(transcript, 'audio_mp3_filename') or not transcript.audio_mp3_filename or not transcript.audio_mp3_filename.exists(): + if ( + not hasattr(transcript, "audio_mp3_filename") + or not transcript.audio_mp3_filename + or not transcript.audio_mp3_filename.exists() + ): raise HTTPException(status_code=404, detail="Audio file not found") truncated_id = str(transcript.id).split("-")[0] From 1c60c809ebd1890ecf2362e161959efff3cdfe13 Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Fri, 20 Jun 2025 10:57:38 -0400 Subject: [PATCH 29/30] consent dialog button --- www/app/[roomName]/page.tsx | 158 +++++++++++++++++++++--------------- 1 file changed, 91 insertions(+), 67 deletions(-) diff --git a/www/app/[roomName]/page.tsx b/www/app/[roomName]/page.tsx index 821c7a52..ac033d6a 100644 --- a/www/app/[roomName]/page.tsx +++ b/www/app/[roomName]/page.tsx @@ -50,8 +50,11 @@ const useConsentWherebyFocusManagement = (acceptButtonRef: RefObject/*accessibility*/) => { const { state: consentState, touch, hasConsent } = useRecordingConsent(); const [consentLoading, setConsentLoading] = useState(false); + // toast would open duplicates, even with using "id=" prop + const [modalOpen, setModalOpen] = useState(false); const api = useApi(); const toast = useToast(); + const handleConsent = useCallback(async (meetingId: string, given: boolean) => { if (!api) return; @@ -71,81 +74,102 @@ const useConsentDialog = (meetingId: string, wherebyRef: RefObject/ } }, [api, touch]); - useEffect(() => { - if ( - consentState.ready && - meetingId && - !hasConsent(meetingId) && - !consentLoading - ) { + const showConsentModal = useCallback(() => { + if (modalOpen) return; - const toastId = toast({ - position: "top", - duration: null, - render: ({ onClose }) => { - const AcceptButton = () => { - const buttonRef = useRef(null); - useConsentWherebyFocusManagement(buttonRef, wherebyRef); - return ( - - ); - }; + setModalOpen(true); + const TOAST_NEVER_DISMISS_VALUE = null; + const toastId = toast({ + position: "top", + duration: TOAST_NEVER_DISMISS_VALUE, + render: ({ onClose }) => { + const AcceptButton = () => { + const buttonRef = useRef(null); + useConsentWherebyFocusManagement(buttonRef, wherebyRef); return ( - - - - Can we have your permission to store this meeting's audio recording on our servers? - - - - - - - + ); - }, - }); + }; - // Handle escape key to close the toast - const handleKeyDown = (event: KeyboardEvent) => { - if (event.key === 'Escape') { - toast.close(toastId); - } - }; + return ( + + + + Can we have your permission to store this meeting's audio recording on our servers? + + + + + + + + ); + }, + onCloseComplete: () => { + setModalOpen(false); + } + }); - document.addEventListener('keydown', handleKeyDown); - - return () => { + // Handle escape key to close the toast + const handleKeyDown = (event: KeyboardEvent) => { + if (event.key === 'Escape') { toast.close(toastId); - document.removeEventListener('keydown', handleKeyDown); - }; - } - }, [consentState.ready, meetingId, hasConsent, consentLoading, toast, handleConsent]); + } + }; + + document.addEventListener('keydown', handleKeyDown); + + const cleanup = () => { + toast.close(toastId); + document.removeEventListener('keydown', handleKeyDown); + }; + + return cleanup; + }, [meetingId, toast, handleConsent, wherebyRef, modalOpen]); + + return { showConsentModal, consentState, hasConsent, consentLoading }; } -function ConsentDialog({ meetingId, wherebyRef }: { meetingId: string; wherebyRef: React.RefObject }) { - useConsentDialog(meetingId, wherebyRef); - return <> +function ConsentDialogButton({ meetingId, wherebyRef }: { meetingId: string; wherebyRef: React.RefObject }) { + const { showConsentModal, consentState, hasConsent, consentLoading } = useConsentDialog(meetingId, wherebyRef); + + if (!consentState.ready || hasConsent(meetingId) || consentLoading) { + return null; + } + + return ( + + ); } const recordingTypeRequiresConsent = (recordingType: NonNullable) => { @@ -237,7 +261,7 @@ export default function Room(details: RoomDetails) { room={roomUrl} style={{ width: "100vw", height: "100vh" }} /> - {recordingType && recordingTypeRequiresConsent(recordingType) && } + {recordingType && recordingTypeRequiresConsent(recordingType) && } )} From f781461019c4a34ed4d948bc5f54fb4a6c97d3a8 Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Wed, 25 Jun 2025 11:34:37 -0400 Subject: [PATCH 30/30] meeting is being recorded button - grammar --- www/app/[roomName]/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/www/app/[roomName]/page.tsx b/www/app/[roomName]/page.tsx index ac033d6a..d59be5f4 100644 --- a/www/app/[roomName]/page.tsx +++ b/www/app/[roomName]/page.tsx @@ -167,7 +167,7 @@ function ConsentDialogButton({ meetingId, wherebyRef }: { meetingId: string; whe size="sm" onClick={showConsentModal} > - Meeting is recording + Meeting is being recorded ); }