=== Eye Viewer Log Cleared at 2025-12-08 11:59:48 +0000 ===
[12:59:48] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[12:59:48] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[12:59:48] [GIPHY] SDK not available - using REST API fallback
[12:59:48] [BACKGROUND] Background fetch enabled
[12:59:49] [PRELOAD] ⚡ Starting message pre-load during authentication...
[12:59:49] [SECURITY] Initial launch - within timeout (2.255800247192383s < 300.0s)
[12:59:49] [AUTH] Starting PIN authentication
[12:59:49] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[12:59:49] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[12:59:49] [LIFECYCLE] ViewController deallocated
[12:59:49] [PUSH] APNs token: 6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c
[12:59:49] [CLIENT_SIG] WebSocket opened
[12:59:49] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[12:59:49] [CLIENT_SIG] Connected! clientId=XzqtL0FpDC_bWy-4
[12:59:49] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[12:59:49] [CLIENT_SIG] - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[12:59:49] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[12:59:49] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[12:59:49] [SECURITY] ⚠️ Skipping timeout check - conditions not met
[12:59:49] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[12:59:49] [PRELOAD] Fetched 3151 messages
[12:59:50] [PRELOAD] ⚡ Cached 3151 messages for instant display
[12:59:50] [PIN_AUTH] Correct PIN
[12:59:50] [SECURITY] Restored real session: ILUIWU
[12:59:50] [SECURITY] Restored real session: ILUIWU
[12:59:50] [SECURITY] Saved real session: ILUIWU
[12:59:50] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[12:59:50] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[12:59:50] Documents Directory: /var/mobile/Containers/Data/Application/F8866E91-168D-46E0-AA5C-7749C8F69188/Documents
[12:59:50] [THEME] Applying current theme
[12:59:50] [CHAT] Applied day theme (mode: day)
[12:59:50] [SECURITY] Saved real session: ILUIWU
[12:59:50] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[12:59:50] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[12:59:50] [SUMMARY] Already triggered summary today (2025-12-08)
[12:59:50] Did transition
[12:59:50] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[12:59:50] [VIEWER] Screen lock enabled - normal idle behavior
[12:59:50] [QUERY] 🔍 Creating query connection for iOS slave: iosILUIWU
[12:59:50] [DATA AUDIO] ========== setupWebRTC() START ==========
[12:59:50] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[12:59:50] [DATA AUDIO] Creating encoder/decoder factories...
[12:59:50] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[12:59:50] [CODEC] Viewer selected encoder: AV1 (best quality)
[12:59:50] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[12:59:50] [DATA AUDIO] ✅ Factory created
[12:59:50] [DATA AUDIO] RTCAudioSession locked
[12:59:50] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[12:59:50] [DATA AUDIO] RTCAudioSession unlocked
[12:59:50] [DATA AUDIO] Setting AVAudioSession to .playback for data channel with mixWithOthers...
[12:59:50] [DATA AUDIO] ✅ AVAudioSession set to .playback with .mixWithOthers
[12:59:50] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[12:59:50] [WS] Opening session at ws://crivello.dyndns.org:8081/
[12:59:50] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[12:59:50] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[12:59:50] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[12:59:50] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[12:59:51] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[12:59:51] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[12:59:51] [SUMMARY] Already triggered summary today (2025-12-08)
[12:59:51] Did transition
[12:59:51] [CELL_UPLOAD] configure: msgId=4253, file=10dabda8d04dc725.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, uploadStatus=0
[12:59:51] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[12:59:51] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[12:59:51] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[12:59:51] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[12:59:51] [CHUNK] Merged 383 reactions synchronously
[12:59:51] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[12:59:51] [CELL_UPLOAD] configure: msgId=4253, file=10dabda8d04dc725.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, uploadStatus=0
[12:59:51] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[12:59:51] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[12:59:51] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[12:59:51] [MIGRATION] No messages need sender_name backfill
[12:59:51] [GALLERY_DB] Raw datesent for msg 4253: '2025-12-08 11:59:28'
[12:59:51] [GALLERY_DB] Raw datesent for msg 4227: '2025-12-08 08:35:52'
[12:59:51] [GALLERY_DB] Raw datesent for msg 4225: '2025-12-08 06:51:17'
[12:59:51] [GALLERY_DB] ✅ Loaded 205 media messages
[12:59:51] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 4253
[12:59:51] [GALLERY] Filtered 205 -> 168 (only with local thumbnails)
[12:59:51] [GALLERY] First 5 after sort (newest first):
[12:59:51] [GALLERY] 0: id=4253, date=2025-12-08 11:59:28, file=10dabda8d04dc725.jpg
[12:59:51] [GALLERY] 1: id=4227, date=2025-12-08 08:35:52, file=5abfa51ac84672ca.jpg
[12:59:51] [GALLERY] 2: id=4225, date=2025-12-08 06:51:17, file=a59f6ea5b913297d.jpg
[12:59:51] [GALLERY] 3: id=4187, date=2025-12-07 14:31:41, file=8e8e62ba6f7fd7ed.jpg
[12:59:51] [GALLERY] 4: id=4140, date=2025-12-07 13:49:09, file=9dca2c72076394b7.jpg
[12:59:51] [USER] ✅ User registered successfully
[12:59:51] [USER] User registration successful
[12:59:51] [SERVER] Starting reconnect polling (5s interval)
[12:59:51] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[12:59:51] [ICONS] Offset applied: -14.6
[12:59:51] [ICONS] New left margin: 11.2, New right margin: 11.3
[12:59:51] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[12:59:51] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[12:59:51] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[12:59:51] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[12:59:51] [INCREMENTAL_SYNC] ✅ No new messages
[12:59:51] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[12:59:51] [UPLOAD_RECOVERY] Checking for missing uploads...
[12:59:51] [UPLOAD_RECOVERY] Checking 15 media files on server...
[12:59:51] new_session POST ok: token len=157
[12:59:51] HELLO → sent (fetched token, role=query)
[12:59:51] [ICONS] Chat center: (31.2, 87.0)
[12:59:51] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[12:59:51] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[12:59:51] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[12:59:51] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[12:59:51] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[12:59:51] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[12:59:51] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[12:59:51] [ICONS] Screen width: 440.0
[12:59:51] [SIG] hello_ok received for query connection - ready to query agents
[12:59:51] [SIG] get_agents request sent for sessionId=ILUIWU
[12:59:51] [SIG] get_agents request sent for sessionId=iosILUIWU
[12:59:51] [SERVER] Stopped reconnect polling
[12:59:51] [SIG] agents_list received: []
[12:59:51] [SIG] agents_list received: []
[12:59:51] [UPLOAD_RECOVERY] ✅ All media files verified on server
[12:59:51] [COMBINED_FETCH] Loaded 3151 read receipts, 378 messages with reactions
[12:59:51] [READBY_ENRICH] Enriched 50 messages with readBy data
[12:59:51] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[12:59:51] [CELL_UPLOAD] configure: msgId=4253, file=10dabda8d04dc725.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, uploadStatus=0
[12:59:51] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[12:59:51] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[12:59:52] [MENU] 🔍 dismissAnyExistingMenu called
[12:59:52] [MENU] ℹ️ No menu with tag 9999 found
[12:59:52] [MENU] ✅ dismissAnyExistingMenu completed
[12:59:52] [SEARCH] scrollViewWillBeginDragging - isSearchBarVisible=false, tab=0
[12:59:53] [SEARCH] scrollViewDidEndDragging - scrollView=messagesTable, tab=0
[12:59:53] [SEARCH] contentOffset.y=23.333333333333332, topInset=0.0, pullDistance=-23.333333333333332
[12:59:53] [SEARCH] threshold=80.0, isSearchBarVisible=false
[12:59:53] [SEARCH] topRefresh.isRefreshing=false
[12:59:53] [SEARCH] ❌ Pull distance -23.333333333333332 < threshold 80.0
[12:59:53] [MENU] 🔍 dismissAnyExistingMenu called
[12:59:53] [MENU] ℹ️ No menu with tag 9999 found
[12:59:53] [MENU] ✅ dismissAnyExistingMenu completed
[12:59:53] [SEARCH] scrollViewWillBeginDragging - isSearchBarVisible=false, tab=0
[12:59:53] [SEARCH] scrollViewDidEndDragging - scrollView=messagesTable, tab=0
[12:59:53] [SEARCH] contentOffset.y=108.0, topInset=0.0, pullDistance=-108.0
[12:59:53] [SEARCH] threshold=80.0, isSearchBarVisible=false
[12:59:53] [SEARCH] topRefresh.isRefreshing=false
[12:59:53] [SEARCH] ❌ Pull distance -108.0 < threshold 80.0
[12:59:53] [MENU] 🔍 dismissAnyExistingMenu called
[12:59:53] [MENU] ℹ️ No menu with tag 9999 found
[12:59:53] [MENU] ✅ dismissAnyExistingMenu completed
[12:59:53] [SEARCH] scrollViewWillBeginDragging - isSearchBarVisible=false, tab=0
[12:59:54] [SEARCH] scrollViewDidEndDragging - scrollView=messagesTable, tab=0
[12:59:54] [SEARCH] contentOffset.y=37.333333333333336, topInset=0.0, pullDistance=-37.333333333333336
[12:59:54] [SEARCH] threshold=80.0, isSearchBarVisible=false
[12:59:54] [SEARCH] topRefresh.isRefreshing=false
[12:59:54] [SEARCH] ❌ Pull distance -37.333333333333336 < threshold 80.0
[12:59:58] [MENU] 🔍 dismissAnyExistingMenu called
[12:59:58] [MENU] ℹ️ No menu with tag 9999 found
[12:59:58] [MENU] ✅ dismissAnyExistingMenu completed
[12:59:58] [SEARCH] scrollViewWillBeginDragging - isSearchBarVisible=false, tab=0
[12:59:58] [SEARCH] scrollViewDidEndDragging - scrollView=messagesTable, tab=0
[12:59:58] [SEARCH] contentOffset.y=37.333333333333336, topInset=0.0, pullDistance=-37.333333333333336
[12:59:58] [SEARCH] threshold=80.0, isSearchBarVisible=false
[12:59:58] [SEARCH] topRefresh.isRefreshing=false
[12:59:58] [SEARCH] ❌ Pull distance -37.333333333333336 < threshold 80.0
[12:59:59] [MENU] 🔍 dismissAnyExistingMenu called
[12:59:59] [MENU] ℹ️ No menu with tag 9999 found
[12:59:59] [MENU] ✅ dismissAnyExistingMenu completed
[12:59:59] [SEARCH] scrollViewWillBeginDragging - isSearchBarVisible=false, tab=0
[12:59:59] [SEARCH] scrollViewDidEndDragging - scrollView=messagesTable, tab=0
[12:59:59] [SEARCH] contentOffset.y=105.33333333333333, topInset=0.0, pullDistance=-105.33333333333333
[12:59:59] [SEARCH] threshold=80.0, isSearchBarVisible=false
[12:59:59] [SEARCH] topRefresh.isRefreshing=false
[12:59:59] [SEARCH] ❌ Pull distance -105.33333333333333 < threshold 80.0
[12:59:59] [MENU] 🔍 dismissAnyExistingMenu called
[12:59:59] [MENU] ℹ️ No menu with tag 9999 found
[12:59:59] [MENU] ✅ dismissAnyExistingMenu completed
[12:59:59] [SEARCH] scrollViewWillBeginDragging - isSearchBarVisible=false, tab=0
[12:59:59] [SEARCH] scrollViewDidEndDragging - scrollView=messagesTable, tab=0
[12:59:59] [SEARCH] contentOffset.y=45.0, topInset=0.0, pullDistance=-45.0
[12:59:59] [SEARCH] threshold=80.0, isSearchBarVisible=false
[12:59:59] [SEARCH] topRefresh.isRefreshing=false
[12:59:59] [SEARCH] ❌ Pull distance -45.0 < threshold 80.0
[13:00:19] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[13:00:19] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[13:00:57] [MENU] 🔍 dismissAnyExistingMenu called
[13:00:57] [MENU] ℹ️ No menu with tag 9999 found
[13:00:57] [MENU] ✅ dismissAnyExistingMenu completed
[13:00:57] [SEARCH] scrollViewWillBeginDragging - isSearchBarVisible=false, tab=0
[13:00:57] [SEARCH] scrollViewDidEndDragging - scrollView=messagesTable, tab=0
[13:00:57] [SEARCH] contentOffset.y=195.0, topInset=0.0, pullDistance=-195.0
[13:00:57] [SEARCH] threshold=80.0, isSearchBarVisible=false
[13:00:57] [SEARCH] topRefresh.isRefreshing=false
[13:00:57] [SEARCH] ❌ Pull distance -195.0 < threshold 80.0
[13:00:57] [SCROLL_BTN] Showing button - scrolled 386pt > half 379pt
[13:00:58] [CLIENT_SIG] Client connected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[13:00:58] [MENU] 🔍 dismissAnyExistingMenu called
[13:00:58] [MENU] ℹ️ No menu with tag 9999 found
[13:00:58] [MENU] ✅ dismissAnyExistingMenu completed
[13:00:58] [SEARCH] scrollViewWillBeginDragging - isSearchBarVisible=false, tab=0
[13:00:58] [SEARCH] scrollViewDidEndDragging - scrollView=messagesTable, tab=0
[13:00:58] [SEARCH] contentOffset.y=1405.0, topInset=0.0, pullDistance=-1405.0
[13:00:58] [SEARCH] threshold=80.0, isSearchBarVisible=false
[13:00:58] [SEARCH] topRefresh.isRefreshing=false
[13:00:58] [SEARCH] ❌ Pull distance -1405.0 < threshold 80.0
[13:00:59] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:00:59] [CELL_UPLOAD] configure: msgId=4227, file=5abfa51ac84672ca.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, uploadStatus=0
[13:00:59] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[13:00:59] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=5abfa51ac84672ca.jpg, overlayExists=true
[13:00:59] [CELL_UPLOAD] configure: msgId=4225, file=a59f6ea5b913297d.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, uploadStatus=0
[13:00:59] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[13:00:59] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=a59f6ea5b913297d.jpg, overlayExists=true
[13:00:59] [COMBINED_FETCH] Loaded 3151 read receipts, 378 messages with reactions
[13:00:59] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=a59f6ea5b913297d.jpg, overlayExists=true
[13:00:59] [CELL_UPLOAD] configure: msgId=4227, file=5abfa51ac84672ca.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, uploadStatus=0
[13:00:59] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[13:00:59] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=5abfa51ac84672ca.jpg, overlayExists=true
[13:00:59] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=5abfa51ac84672ca.jpg, overlayExists=true
[13:00:59] [CELL_UPLOAD] configure: msgId=4225, file=a59f6ea5b913297d.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, uploadStatus=0
[13:00:59] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[13:00:59] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=a59f6ea5b913297d.jpg, overlayExists=true
[13:00:59] [PAGINATION] Scrolled to message 4232 at new row 22
[13:00:59] [MENU] 🔍 dismissAnyExistingMenu called
[13:00:59] [MENU] ℹ️ No menu with tag 9999 found
[13:00:59] [MENU] ✅ dismissAnyExistingMenu completed
[13:00:59] [SEARCH] scrollViewWillBeginDragging - isSearchBarVisible=false, tab=0
[13:01:00] [SEARCH] scrollViewDidEndDragging - scrollView=messagesTable, tab=0
[13:01:00] [SEARCH] contentOffset.y=2164.3333333333335, topInset=0.0, pullDistance=-2164.3333333333335
[13:01:00] [SEARCH] threshold=80.0, isSearchBarVisible=false
[13:01:00] [SEARCH] topRefresh.isRefreshing=false
[13:01:00] [SEARCH] ❌ Pull distance -2164.3333333333335 < threshold 80.0
[13:01:00] [MENU] 🔍 dismissAnyExistingMenu called
[13:01:00] [MENU] ℹ️ No menu with tag 9999 found
[13:01:00] [MENU] ✅ dismissAnyExistingMenu completed
[13:01:00] [SEARCH] scrollViewWillBeginDragging - isSearchBarVisible=false, tab=0
[13:01:01] [SEARCH] scrollViewDidEndDragging - scrollView=messagesTable, tab=0
[13:01:01] [SEARCH] contentOffset.y=2677.3333333333335, topInset=0.0, pullDistance=-2677.3333333333335
[13:01:01] [SEARCH] threshold=80.0, isSearchBarVisible=false
[13:01:01] [SEARCH] topRefresh.isRefreshing=false
[13:01:01] [SEARCH] ❌ Pull distance -2677.3333333333335 < threshold 80.0
[13:01:01] [MENU] 🔍 dismissAnyExistingMenu called
[13:01:01] [MENU] ℹ️ No menu with tag 9999 found
[13:01:01] [MENU] ✅ dismissAnyExistingMenu completed
[13:01:01] [SEARCH] scrollViewWillBeginDragging - isSearchBarVisible=false, tab=0
[13:01:01] [SEARCH] scrollViewDidEndDragging - scrollView=messagesTable, tab=0
[13:01:01] [SEARCH] contentOffset.y=2511.3333333333335, topInset=0.0, pullDistance=-2511.3333333333335
[13:01:01] [SEARCH] threshold=80.0, isSearchBarVisible=false
[13:01:01] [SEARCH] topRefresh.isRefreshing=false
[13:01:01] [SEARCH] ❌ Pull distance -2511.3333333333335 < threshold 80.0
[13:01:08] [MENU] 🔍 dismissAnyExistingMenu called
[13:01:08] [MENU] ℹ️ No menu with tag 9999 found
[13:01:08] [MENU] ✅ dismissAnyExistingMenu completed
[13:01:08] [SEARCH] scrollViewWillBeginDragging - isSearchBarVisible=false, tab=0
[13:01:08] [SEARCH] scrollViewDidEndDragging - scrollView=messagesTable, tab=0
[13:01:08] [SEARCH] contentOffset.y=2449.6666666666665, topInset=0.0, pullDistance=-2449.6666666666665
[13:01:08] [SEARCH] threshold=80.0, isSearchBarVisible=false
[13:01:08] [SEARCH] topRefresh.isRefreshing=false
[13:01:08] [SEARCH] ❌ Pull distance -2449.6666666666665 < threshold 80.0
[13:01:08] [MENU] 🔍 dismissAnyExistingMenu called
[13:01:08] [MENU] ℹ️ No menu with tag 9999 found
[13:01:08] [MENU] ✅ dismissAnyExistingMenu completed
[13:01:08] [SEARCH] scrollViewWillBeginDragging - isSearchBarVisible=false, tab=0
[13:01:08] [SEARCH] scrollViewDidEndDragging - scrollView=messagesTable, tab=0
[13:01:08] [SEARCH] contentOffset.y=2228.0, topInset=0.0, pullDistance=-2228.0
[13:01:08] [SEARCH] threshold=80.0, isSearchBarVisible=false
[13:01:08] [SEARCH] topRefresh.isRefreshing=false
[13:01:08] [SEARCH] ❌ Pull distance -2228.0 < threshold 80.0
[13:01:09] [CLIENT_SIG] Typing start from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[13:01:12] [MENU] 🔍 dismissAnyExistingMenu called
[13:01:12] [MENU] ℹ️ No menu with tag 9999 found
[13:01:12] [MENU] ✅ dismissAnyExistingMenu completed
[13:01:12] [SEARCH] scrollViewWillBeginDragging - isSearchBarVisible=false, tab=0
[13:01:12] [SEARCH] scrollViewDidEndDragging - scrollView=messagesTable, tab=0
[13:01:12] [SEARCH] contentOffset.y=2111.0, topInset=0.0, pullDistance=-2111.0
[13:01:12] [SEARCH] threshold=80.0, isSearchBarVisible=false
[13:01:12] [SEARCH] topRefresh.isRefreshing=false
[13:01:12] [SEARCH] ❌ Pull distance -2111.0 < threshold 80.0
[13:01:13] [MENU] 🔍 dismissAnyExistingMenu called
[13:01:13] [MENU] ℹ️ No menu with tag 9999 found
[13:01:13] [MENU] ✅ dismissAnyExistingMenu completed
[13:01:13] [SEARCH] scrollViewWillBeginDragging - isSearchBarVisible=false, tab=0
[13:01:13] [SEARCH] scrollViewDidEndDragging - scrollView=messagesTable, tab=0
[13:01:13] [SEARCH] contentOffset.y=659.0, topInset=0.0, pullDistance=-659.0
[13:01:13] [SEARCH] threshold=80.0, isSearchBarVisible=false
[13:01:13] [SEARCH] topRefresh.isRefreshing=false
[13:01:13] [SEARCH] ❌ Pull distance -659.0 < threshold 80.0
[13:01:13] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=5abfa51ac84672ca.jpg, overlayExists=true
[13:01:13] [CELL_UPLOAD] configure: msgId=4253, file=10dabda8d04dc725.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, uploadStatus=0
[13:01:13] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[13:01:13] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:01:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:01:14] [CELL_UPLOAD] configure: msgId=4253, file=10dabda8d04dc725.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, uploadStatus=0
[13:01:14] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[13:01:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:01:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:01:14] [CELL_UPLOAD] configure: msgId=4253, file=10dabda8d04dc725.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, uploadStatus=0
[13:01:14] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[13:01:14] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:01:27] [CLIENT_SIG] Typing stop from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[13:01:28] [CLIENT_SIG] Typing start from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[13:01:46] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[13:01:46] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[13:01:52] [CLIENT_SIG] Client connected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[13:01:56] [CLIENT_SIG] Typing start from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[13:02:00] [CLIENT_SIG] Typing stop from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[13:02:06] [MENU] 🔍 dismissAnyExistingMenu called
[13:02:06] [MENU] ℹ️ No menu with tag 9999 found
[13:02:06] [MENU] ✅ dismissAnyExistingMenu completed
[13:02:06] [SEARCH] scrollViewWillBeginDragging - isSearchBarVisible=false, tab=0
[13:02:06] [SEARCH] handleTopRefresh called - tab=0, isSearchBarVisible=false
[13:02:06] [SEARCH] 🔍 First pull on Tab 0 - showing search bar instead of refresh
[13:02:06] [SEARCH] showSearchBar() called - animated=true, isSearchBarVisible=false
[13:02:06] [SEARCH] ✅ Setting isSearchBarVisible = true
[13:02:06] [SEARCH] chatSearchBar is nil? false
[13:02:06] [SEARCH] Applied theme: day
[13:02:06] [SEARCH] Adjusting table contentInset.top by +56.0
[13:02:06] [SEARCH] Table contentInset.top: 0.0 -> 56.0
[13:02:06] [SEARCH] Focusing search field
[13:02:06] [SEARCH] scrollViewDidEndDragging - scrollView=messagesTable, tab=0
[13:02:06] [SEARCH] contentOffset.y=33.333333333333336, topInset=56.0, pullDistance=-89.33333333333334
[13:02:06] [SEARCH] threshold=80.0, isSearchBarVisible=true
[13:02:06] [SEARCH] topRefresh.isRefreshing=false
[13:02:06] [SEARCH] ❌ Pull distance -89.33333333333334 < threshold 80.0
[13:02:07] [MENU] 🔍 dismissAnyExistingMenu called
[13:02:07] [MENU] ℹ️ No menu with tag 9999 found
[13:02:07] [MENU] ✅ dismissAnyExistingMenu completed
[13:02:07] [SEARCH] scrollViewWillBeginDragging - isSearchBarVisible=true, tab=0
[13:02:07] [SEARCH] 🔽 Hiding search bar (user started scrolling)
[13:02:07] [SEARCH] hideSearchBar() called - animated=true, isSearchBarVisible=true
[13:02:07] [SEARCH] ✅ Setting isSearchBarVisible = false
[13:02:07] [SEARCH] Adjusting table contentInset.top by -56.0
[13:02:07] [SEARCH] scrollViewDidEndDragging - scrollView=messagesTable, tab=0
[13:02:07] [SEARCH] contentOffset.y=104.66666666666667, topInset=0.0, pullDistance=-104.66666666666667
[13:02:07] [SEARCH] threshold=80.0, isSearchBarVisible=false
[13:02:07] [SEARCH] topRefresh.isRefreshing=false
[13:02:07] [SEARCH] ❌ Pull distance -104.66666666666667 < threshold 80.0
[13:02:09] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[13:02:09] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[13:02:10] [LIFECYCLE] App resigning active - cleared crash flag
[13:02:10] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[13:02:10] [SECURITY] Saved background timestamp
[13:02:10] [LIFECYCLE] App entering background - cleared crash flag
[13:02:10] [CLIENT_SIG] Disconnecting
[13:02:10] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[13:02:10] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[13:02:10] [WS] Canceling WebSocket for query connection to iosILUIWU
[13:02:10] In cleanupPeer
[13:02:10] In cleanupPeer
[13:02:10] [LIFECYCLE] WebRTC audio disabled
[13:02:10] [LIFECYCLE] AVAudioSession deactivated
[13:02:10] [LIFECYCLE] All connections stopped
[13:02:11] [CLIENT_SIG] WebSocket closed with code 1001
[13:02:11] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[13:02:11] [SERVER] Stopped reconnect polling
[13:02:11] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[13:02:11] [WS] Query connection error - cleaning up all agent connections and views
[13:02:11] Will request stop of video 0
[13:02:11] Will request stop of video 0
[13:02:11] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[13:02:11] [WS] Query connection failed - cleaning up all agent connections and views
[13:02:11] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[13:02:11] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[13:02:11] [CLEANUP] ========================================
[13:02:11] [CLEANUP] Cleaning up all agent connections and views
[13:02:11] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[13:02:11] [CLEANUP] Stopped and removed 0 video connections
[13:02:11] [CLEANUP] Removed 0 video views
[13:02:11] [CLEANUP] Removed 0 feed scroll views
[13:02:11] [CLEANUP] Removed 0 status labels
[13:02:11] [CLEANUP] Reset agent query state
[13:02:11] [CLEANUP] Updated page indicator
[13:02:11] [CLEANUP] Rebuilt video layout
[13:02:11] [CLEANUP] ✅ All agent connections and views cleaned up
[13:02:11] [CLEANUP] ========================================
[13:02:11] [SERVER] Skipping reconnect polling - app is in background
[13:02:11] [WS] URLSession invalidated successfully
[13:02:11] [PIP] Removing 0 tracks from PiP for connection 0
[13:02:11] [PIP] ✅ All tracks removed for connection 0
[13:02:11] [PIP] Removing 0 tracks from PiP for connection 0
[13:02:11] [PIP] ✅ All tracks removed for connection 0
[13:02:11] [CLEANUP] ========================================
[13:02:11] [CLEANUP] Cleaning up all agent connections and views
[13:02:11] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[13:02:11] [CLEANUP] Stopped and removed 0 video connections
[13:02:11] [CLEANUP] Removed 0 video views
[13:02:11] [CLEANUP] Removed 0 feed scroll views
[13:02:11] [CLEANUP] Removed 0 status labels
[13:02:11] [CLEANUP] Reset agent query state
[13:02:11] [CLEANUP] Updated page indicator
[13:02:11] [CLEANUP] Rebuilt video layout
[13:02:11] [CLEANUP] ✅ All agent connections and views cleaned up
[13:02:11] [CLEANUP] ========================================
[13:02:11] [SERVER] Skipping reconnect polling - app is in background
[13:02:56] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[13:02:56] [WS] Opening session at ws://crivello.dyndns.org:8081/
[13:02:56] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[13:02:56] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[13:02:56] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[13:02:56] [LIFECYCLE] App entering foreground - restoring connections
[13:02:56] [UPLOAD_RETRY] No pending uploads to retry
[13:02:56] [LIFECYCLE] Merged 383 reactions from local DB
[13:02:56] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:02:56] [CELL_UPLOAD] configure: msgId=4253, file=10dabda8d04dc725.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, uploadStatus=0
[13:02:56] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[13:02:56] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:02:56] [LIFECYCLE] WebRTC audio re-enabled
[13:02:56] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[13:02:56] [VIEWER] Reconnecting after background - querying agents
[13:02:56] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[13:02:56] HELLO → sent (cached token, role=query)
[13:02:56] [CLIENT_SIG] WebSocket opened
[13:02:56] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[13:02:56] [SIG] hello_ok received for query connection - ready to query agents
[13:02:56] [SIG] get_agents request sent for sessionId=ILUIWU
[13:02:56] [SIG] get_agents request sent for sessionId=iosILUIWU
[13:02:56] [SERVER] Stopped reconnect polling
[13:02:56] [CLIENT_SIG] Connected! clientId=Dhl3544BdrKAQwum
[13:02:56] [SIG] agents_list received: []
[13:02:56] [SIG] agents_list received: []
[13:02:56] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[13:02:56] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[13:02:56] [SECURITY] sceneDidBecomeActive - isAuthenticated=true, didEnterBackground=true
[13:02:56] [SECURITY] Timeout check: elapsed=45.587445974349976s, timeout=300.0s
[13:02:56] [SECURITY] Within timeout - no re-auth needed
[13:02:56] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[13:02:56] [PUSH] handlePollEventsNotification userInfo: [:]
[13:02:56] [PUSH] No message_id in userInfo
[13:02:56] [PUSH] No operation_type in userInfo
[13:02:56] [FAST_REFRESH] Evolution disabled - performing incremental sync
[13:02:56] [FAST_REFRESH] Already have 50 messages - skipping local DB load
[13:02:56] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[13:02:56] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:02:56] [CELL_UPLOAD] configure: msgId=4253, file=10dabda8d04dc725.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, uploadStatus=0
[13:02:56] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[13:02:56] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:02:56] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[13:02:56] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 4253
[13:02:56] [INCREMENTAL_SYNC] ✅ No new messages
[13:02:56] [FAST_REFRESH] Incremental sync complete - 50 messages
[13:02:57] [COMBINED_FETCH] Loaded 3151 read receipts, 378 messages with reactions
[13:02:57] [FAST_REFRESH] Enriched 50 messages with readBy data
[13:02:57] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:02:57] [CELL_UPLOAD] configure: msgId=4253, file=10dabda8d04dc725.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, uploadStatus=0
[13:02:57] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[13:02:57] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:02:57] [MENU] 🔍 dismissAnyExistingMenu called
[13:02:57] [MENU] ℹ️ No menu with tag 9999 found
[13:02:57] [MENU] ✅ dismissAnyExistingMenu completed
[13:02:57] [SEARCH] scrollViewWillBeginDragging - isSearchBarVisible=false, tab=0
[13:02:58] [SEARCH] scrollViewDidEndDragging - scrollView=messagesTable, tab=0
[13:02:58] [SEARCH] contentOffset.y=40.333333333333336, topInset=0.0, pullDistance=-40.333333333333336
[13:02:58] [SEARCH] threshold=80.0, isSearchBarVisible=false
[13:02:58] [SEARCH] topRefresh.isRefreshing=false
[13:02:58] [SEARCH] ❌ Pull distance -40.333333333333336 < threshold 80.0
[13:03:06] [WS] WebSocket task completed with error - isQueryOnly=true: The request timed out.
[13:03:06] [WS] Query connection error - cleaning up all agent connections and views
[13:03:06] [CLEANUP] ========================================
[13:03:06] [CLEANUP] Cleaning up all agent connections and views
[13:03:06] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[13:03:06] [CLEANUP] Stopped and removed 0 video connections
[13:03:06] [CLEANUP] Removed 0 video views
[13:03:06] [CLEANUP] Removed 0 feed scroll views
[13:03:06] [CLEANUP] Removed 0 status labels
[13:03:06] [CLEANUP] Reset agent query state
[13:03:06] [CLEANUP] Updated page indicator
[13:03:06] [CLEANUP] Rebuilt video layout
[13:03:06] [CLEANUP] ✅ All agent connections and views cleaned up
[13:03:06] [CLEANUP] ========================================
[13:03:06] [SERVER] Starting reconnect polling (5s interval)
[13:03:08] [LIFECYCLE] App resigning active - cleared crash flag
[13:03:09] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[13:03:09] [SECURITY] Saved background timestamp
[13:03:09] [LIFECYCLE] App entering background - cleared crash flag
[13:03:09] [CLIENT_SIG] Disconnecting
[13:03:09] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[13:03:09] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=3
[13:03:09] [WS] Canceling WebSocket for query connection to iosILUIWU
[13:03:09] In cleanupPeer
[13:03:09] In cleanupPeer
[13:03:09] [LIFECYCLE] WebRTC audio disabled
[13:03:09] [LIFECYCLE] AVAudioSession deactivated
[13:03:09] [LIFECYCLE] All connections stopped
[13:03:10] [CLIENT_SIG] WebSocket closed with code 1001
[13:03:10] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[13:03:10] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/}
[13:03:10] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[13:03:10] [SERVER] Stopped reconnect polling
[13:03:10] Will request stop of video 0
[13:03:10] Will request stop of video 0
[13:03:10] [WS] URLSession invalidated successfully
[13:03:10] [PIP] Removing 0 tracks from PiP for connection 0
[13:03:10] [PIP] ✅ All tracks removed for connection 0
[13:03:10] [PIP] Removing 0 tracks from PiP for connection 0
[13:03:10] [PIP] ✅ All tracks removed for connection 0
[13:05:06] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[13:05:06] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[13:05:06] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[13:05:06] [LIFECYCLE] App entering foreground - restoring connections
[13:05:06] [UPLOAD_RETRY] No pending uploads to retry
[13:05:06] [LIFECYCLE] Merged 383 reactions from local DB
[13:05:06] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:05:06] [CELL_UPLOAD] configure: msgId=4253, file=10dabda8d04dc725.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, uploadStatus=0
[13:05:06] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[13:05:06] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:05:06] [LIFECYCLE] WebRTC audio re-enabled
[13:05:06] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[13:05:06] [VIEWER] Reconnecting after background - querying agents
[13:05:06] [CLIENT_SIG] WebSocket opened
[13:05:06] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[13:05:07] [CLIENT_SIG] Connected! clientId=gkSij74UM9AipCgq
[13:05:07] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[13:05:07] [CLIENT_SIG] - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[13:05:07] [CLIENT_SIG] - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[13:05:07] [SECURITY] sceneDidBecomeActive - isAuthenticated=true, didEnterBackground=true
[13:05:07] [SECURITY] Timeout check: elapsed=117.2283878326416s, timeout=300.0s
[13:05:07] [SECURITY] Within timeout - no re-auth needed
[13:05:07] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[13:05:07] [PUSH] handlePollEventsNotification userInfo: [:]
[13:05:07] [PUSH] No message_id in userInfo
[13:05:07] [PUSH] No operation_type in userInfo
[13:05:07] [FAST_REFRESH] Evolution disabled - performing incremental sync
[13:05:07] [FAST_REFRESH] Already have 50 messages - skipping local DB load
[13:05:07] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[13:05:07] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:05:07] [CELL_UPLOAD] configure: msgId=4253, file=10dabda8d04dc725.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, uploadStatus=0
[13:05:07] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[13:05:07] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:05:07] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[13:05:07] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 4253
[13:05:07] [INCREMENTAL_SYNC] ✅ No new messages
[13:05:07] [FAST_REFRESH] Incremental sync complete - 50 messages
[13:05:07] [LIFECYCLE] App resigning active - cleared crash flag
[13:05:07] [COMBINED_FETCH] Loaded 3151 read receipts, 378 messages with reactions
[13:05:07] [FAST_REFRESH] Enriched 50 messages with readBy data
[13:05:07] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:05:07] [CELL_UPLOAD] configure: msgId=4253, file=10dabda8d04dc725.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, uploadStatus=0
[13:05:07] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[13:05:07] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:05:08] [SECURITY] sceneDidBecomeActive - isAuthenticated=true, didEnterBackground=false
[13:05:08] [SECURITY] ⚠️ Skipping timeout check - conditions not met
[13:05:08] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[13:05:08] [PUSH] handlePollEventsNotification userInfo: [:]
[13:05:08] [PUSH] No message_id in userInfo
[13:05:08] [PUSH] No operation_type in userInfo
[13:05:08] [FAST_REFRESH] Evolution disabled - performing incremental sync
[13:05:08] [FAST_REFRESH] Already have 50 messages - skipping local DB load
[13:05:08] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[13:05:08] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:05:08] [CELL_UPLOAD] configure: msgId=4253, file=10dabda8d04dc725.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, uploadStatus=0
[13:05:08] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[13:05:08] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:05:08] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[13:05:08] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 4253
[13:05:08] [INCREMENTAL_SYNC] ✅ No new messages
[13:05:08] [FAST_REFRESH] Incremental sync complete - 50 messages
[13:05:09] [PUSH] Silent push received
[13:05:09] [PUSH_EMBED] No embedded message_data in notification
[13:05:09] [PUSH] No embedded data, pre-loading messages from server
[13:05:09] [PUSH_PRELOAD] Fetching messages for instant display cache
[13:05:09] [COMBINED_FETCH] Loaded 3151 read receipts, 378 messages with reactions
[13:05:09] [FAST_REFRESH] Enriched 50 messages with readBy data
[13:05:09] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:05:09] [CELL_UPLOAD] configure: msgId=4253, file=10dabda8d04dc725.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, uploadStatus=0
[13:05:09] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[13:05:09] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=10dabda8d04dc725.jpg, overlayExists=true
[13:05:09] [PUSH_PRELOAD] Fetched 3151 messages - caching for instant display
[13:05:10] [PUSH_PRELOAD] ⚡ Pre-cached 3151 messages for instant display
[13:05:10] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[13:05:10] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("message_id"): 4252, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
"content-available" = 1;
}]
[13:05:10] [PUSH] Parsed message_id: 4252
[13:05:10] [PUSH] Parsed operation_type: 3
[13:05:10] [PUSH] Taking direct action: opType=3, messageId=4252
[13:05:10] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=4252