← Back to list | Download | 2026-04-23-10-33-notification-received-Laurent.log (1,354,234 bytes)
=== Eye Viewer Log Rotated at 2026-04-22 08:19:38 +0000 ===
        <UITapGestureRecognizer: 0x13f0ea800; id = 11686; state = Possible; view = <Eye.PhotoCropOverlayView: 0x143388000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e3700>)>>
    }>, <UITapGestureRecognizer: 0x13f0ea800; id = 11686; state = Possible; view = <Eye.PhotoCropOverlayView: 0x143388000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e3700>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13553d800; id = 11685; state = Possible; view = <Eye.PhotoCropOverlayView: 0x143388000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x143388000>)>>
    }>])
        <UITapGestureRecognizer: 0x13f0ea800; id = 11686; state = Possible; view = <Eye.PhotoCropOverlayView: 0x143388000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e3700>)>>
    }>, <UITapGestureRecognizer: 0x13f0ea800; id = 11686; state = Possible; view = <Eye.PhotoCropOverlayView: 0x143388000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e3700>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13553d800; id = 11685; state = Possible; view = <Eye.PhotoCropOverlayView: 0x143388000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x143388000>)>>
    }>])
        <UITapGestureRecognizer: 0x13f0ea800; id = 11686; state = Possible; view = <Eye.PhotoCropOverlayView: 0x143388000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e3700>)>>
    }>, <UITapGestureRecognizer: 0x13f0ea800; id = 11686; state = Possible; view = <Eye.PhotoCropOverlayView: 0x143388000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e3700>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13553d800; id = 11685; state = Possible; view = <Eye.PhotoCropOverlayView: 0x143388000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x143388000>)>>
    }>])
        <UITapGestureRecognizer: 0x13f0ea800; id = 11686; state = Possible; view = <Eye.PhotoCropOverlayView: 0x143388000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e3700>)>>
    }>, <UITapGestureRecognizer: 0x13f0ea800; id = 11686; state = Possible; view = <Eye.PhotoCropOverlayView: 0x143388000>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e3700>)>; must-fail = {
        <UIPanGestureRecognizer: 0x13553d800; id = 11685; state = Possible; view = <Eye.PhotoCropOverlayView: 0x143388000>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x143388000>)>>
    }>])
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28699, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28699]
    "content-available" = 1;
}, AnyHashable("message_id"): 28699, AnyHashable("operation_type"): 3]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_id"): 28700, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 08:19:45";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Theeeen\Ud83d\Ude0f";
    "message_id" = 28700;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28699;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_id"): 28700, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 08:19:45";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Theeeen\Ud83d\Ude0f";
    "message_id" = 28700;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28699;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU]
    "crypto_version" = 0;
    datesent = "2026-04-22 08:19:45";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Theeeen\Ud83d\Ude0f";
    "message_id" = 28700;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28699;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28700, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28700, AnyHashable("session_id"): ILUIWU]
    "crypto_version" = 0;
    datesent = "2026-04-22 08:19:50";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Right one pls";
    "message_id" = 28701;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28700;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28701, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}]
    "crypto_version" = 0;
    datesent = "2026-04-22 08:19:50";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Right one pls";
    "message_id" = 28701;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28700;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28701, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}]
    "crypto_version" = 0;
    datesent = "2026-04-22 08:19:50";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Right one pls";
    "message_id" = 28701;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28700;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}]
    "LocalWebSocketTask <A15BFFC6-DF44-4AC5-8D6B-47B4D394EAF8>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <A15BFFC6-DF44-4AC5-8D6B-47B4D394EAF8>.<1>}
    "LocalWebSocketTask <3B6B0404-DF3D-4A29-A157-882743D93244>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <3B6B0404-DF3D-4A29-A157-882743D93244>.<1>}
    "crypto_version" = 0;
    datesent = "2026-04-22 08:35:43";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Mmm thank you babyy\Ud83e\Udee6\Ud83e\Udee6\Ud83e\Udee6";
    "message_id" = 28703;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28702;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28703]
    "crypto_version" = 0;
    datesent = "2026-04-22 08:35:43";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Mmm thank you babyy\Ud83e\Udee6\Ud83e\Udee6\Ud83e\Udee6";
    "message_id" = 28703;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28702;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28703, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "LocalWebSocketTask <8FD5321D-B177-4A7A-B1B8-75F3C40B1FC3>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <8FD5321D-B177-4A7A-B1B8-75F3C40B1FC3>.<1>}
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 08:54:56";
    "file_name" = "";
    "is_encrypted" = 0;
    message = INU;
    "message_id" = 28704;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28703;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28704]
    "LocalWebSocketTask <B8D44AA8-1C3B-4937-AB76-44A494C77C25>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <B8D44AA8-1C3B-4937-AB76-44A494C77C25>.<1>}
    "crypto_version" = 0;
    datesent = "2026-04-22 08:54:56";
    "file_name" = "";
    "is_encrypted" = 0;
    message = INU;
    "message_id" = 28704;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28703;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28704]
    "content-available" = 1;
}, AnyHashable("message_id"): 28704, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "LocalWebSocketTask <4EBCBE73-8AFD-4DE2-A636-D71E25703C09>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <4EBCBE73-8AFD-4DE2-A636-D71E25703C09>.<1>}
    "LocalWebSocketTask <16C76FAB-266B-43AC-B511-191F7B8E019D>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <16C76FAB-266B-43AC-B511-191F7B8E019D>.<1>, NSLocalizedDescription=The network connection was lost.}
    "crypto_version" = 0;
    datesent = "2026-04-22 10:07:35";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Baby, I want you to change position of hairpin";
    "message_id" = 28707;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28706;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_id"): 28707, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("message_id"): 28707, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "crypto_version" = 0;
    datesent = "2026-04-22 10:07:56";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "And one more  1-0 \Ud83d\Ude0f";
    "message_id" = 28708;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28707;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_id"): 28708, AnyHashable("session_id"): ILUIWU]
    "crypto_version" = 0;
    datesent = "2026-04-22 10:07:56";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "And one more  1-0 \Ud83d\Ude0f";
    "message_id" = 28708;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28707;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_id"): 28708, AnyHashable("session_id"): ILUIWU]
    "crypto_version" = 0;
    datesent = "2026-04-22 10:07:56";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "And one more  1-0 \Ud83d\Ude0f";
    "message_id" = 28708;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28707;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28708, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("message_id"): 28708, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("message_id"): 28709, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28711]
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>>
    }>, <UITapGestureRecognizer: 0x140e85cc0; id = 13449; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x1327e0500>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1337e7400; id = 13448; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12cc16f80>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12cc16f80>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
        <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>>
    }>, <UITapGestureRecognizer: 0x1299fe440; id = 652; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x12f4b5e00>)>; must-fail = {
        <UIPanGestureRecognizer: 0x12f55e800; id = 651; state = Possible; view = <Eye.PhotoCropOverlayView: 0x12f599180>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x12f599180>)>>
    }>])
    "LocalWebSocketTask <A0DF7AB1-91A7-4C69-8C5C-1CFCC24AB090>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <A0DF7AB1-91A7-4C69-8C5C-1CFCC24AB090>.<1>}
    "LocalWebSocketTask <E100119B-551C-4D92-956C-C7DB25EB7E9C>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <E100119B-551C-4D92-956C-C7DB25EB7E9C>.<1>}
    "LocalWebSocketTask <34CA19E1-F133-41FB-AA7A-8800A53D7FA0>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <34CA19E1-F133-41FB-AA7A-8800A53D7FA0>.<1>}
    "LocalWebSocketTask <43EB88E3-6560-488B-8314-105D393B4D4F>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <43EB88E3-6560-488B-8314-105D393B4D4F>.<1>}
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("message_id"): 28716, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
0   Eye.debug.dylib                     0x00000001052b9130 $s3Eye21MediaViewerControllerC7dismiss8animated10completionySb_yycSgtF + 136
1   Eye.debug.dylib                     0x00000001052c6730 $s3Eye21MediaViewerControllerC9handlePan33_791426CB2E96A6BD5D22046DA17161F6LLyySo22UIPanGestureRecognizerCF + 2084
2   Eye.debug.dylib                     0x00000001052c6a20 $s3Eye21MediaViewerControllerC9handlePan33_791426CB2E96A6BD5D22046DA17161F6LLyySo22UIPanGestureRecognizerCFTo + 68
3   UIKitCore                           0x00000001966d1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x00000001966d1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x00000001966d11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000196215a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x00000001961da310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000019bdcb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000019be09c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
    "LocalWebSocketTask <2DC3F5B8-E139-49FD-B0F0-44BD95884CA7>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <2DC3F5B8-E139-49FD-B0F0-44BD95884CA7>.<1>}
        <UITapGestureRecognizer: 0x15edc4000; id = 610; state = Possible; view = <Eye.PhotoCropOverlayView: 0x15ff22080>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x160442800>)>>
    }>, <UITapGestureRecognizer: 0x15edc4000; id = 610; state = Possible; view = <Eye.PhotoCropOverlayView: 0x15ff22080>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x160442800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1604c7200; id = 609; state = Possible; view = <Eye.PhotoCropOverlayView: 0x15ff22080>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x15ff22080>)>>
    }>])
        <UITapGestureRecognizer: 0x15edc4000; id = 610; state = Possible; view = <Eye.PhotoCropOverlayView: 0x15ff22080>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x160442800>)>>
    }>, <UITapGestureRecognizer: 0x15edc4000; id = 610; state = Possible; view = <Eye.PhotoCropOverlayView: 0x15ff22080>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x160442800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1604c7200; id = 609; state = Possible; view = <Eye.PhotoCropOverlayView: 0x15ff22080>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x15ff22080>)>>
    }>])
        <UITapGestureRecognizer: 0x15edc4000; id = 610; state = Possible; view = <Eye.PhotoCropOverlayView: 0x15ff22080>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x160442800>)>>
    }>, <UITapGestureRecognizer: 0x15edc4000; id = 610; state = Possible; view = <Eye.PhotoCropOverlayView: 0x15ff22080>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x160442800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1604c7200; id = 609; state = Possible; view = <Eye.PhotoCropOverlayView: 0x15ff22080>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x15ff22080>)>>
    }>])
        <UITapGestureRecognizer: 0x15edc4000; id = 610; state = Possible; view = <Eye.PhotoCropOverlayView: 0x15ff22080>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x160442800>)>>
    }>, <UITapGestureRecognizer: 0x15edc4000; id = 610; state = Possible; view = <Eye.PhotoCropOverlayView: 0x15ff22080>; target= <(action=mediaTapped, target=<Eye.MediaComposeViewController 0x160442800>)>; must-fail = {
        <UIPanGestureRecognizer: 0x1604c7200; id = 609; state = Possible; view = <Eye.PhotoCropOverlayView: 0x15ff22080>; target= <(action=handlePan:, target=<Eye.PhotoCropOverlayView 0x15ff22080>)>>
    }>])
    "LocalWebSocketTask <AC0DB4C2-80F2-42FE-AAB9-9C06D6640446>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <AC0DB4C2-80F2-42FE-AAB9-9C06D6640446>.<1>}
    "LocalWebSocketTask <3776F086-E0A8-462E-854C-1255763ADB86>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <3776F086-E0A8-462E-854C-1255763ADB86>.<1>}
    "LocalWebSocketTask <525074C4-3C7E-46D1-BC22-802752D636A8>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <525074C4-3C7E-46D1-BC22-802752D636A8>.<1>}
    "LocalWebSocketTask <2EE4683A-D6FD-486D-8977-ACFDCC580121>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <2EE4683A-D6FD-486D-8977-ACFDCC580121>.<1>}
    "LocalWebSocketTask <8F633790-D415-4035-B718-2C722416CEBE>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <8F633790-D415-4035-B718-2C722416CEBE>.<1>}
    "content-available" = 1;
}, AnyHashable("message_id"): 28717]
    "crypto_version" = 0;
    datesent = "2026-04-22 14:19:34";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Hello baby";
    "message_id" = 28719;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28718;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28719, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28719]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_id"): 28720, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 14:19:45";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Leaving the office now";
    "message_id" = 28720;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28719;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28720, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "LocalWebSocketTask <C6BD8233-8ED7-4B0A-88C5-E51A648BEA52>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <C6BD8233-8ED7-4B0A-88C5-E51A648BEA52>.<1>, NSLocalizedDescription=The network connection was lost.}
    "LocalWebSocketTask <A31200F4-7111-4C1B-AEE1-3539F5E9892D>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <A31200F4-7111-4C1B-AEE1-3539F5E9892D>.<1>}
    "crypto_version" = 0;
    datesent = "2026-04-22 14:19:45";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Leaving the office now";
    "message_id" = 28720;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28719;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}]
    "LocalWebSocketTask <6B8A2B01-EDB0-4C8D-A8A4-F7A9C216A049>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <6B8A2B01-EDB0-4C8D-A8A4-F7A9C216A049>.<1>}
    "LocalWebSocketTask <3777E47F-5AEA-421D-BCB9-AAF4EC3D9E90>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <3777E47F-5AEA-421D-BCB9-AAF4EC3D9E90>.<1>}
    "LocalWebSocketTask <128D33B7-BBDA-4BD8-BC8F-897DD80D7FDD>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <128D33B7-BBDA-4BD8-BC8F-897DD80D7FDD>.<1>}
    "content-available" = 1;
}]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 15:46:10";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Came to play padel baby";
    "message_id" = 28722;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28721;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28722]
    "content-available" = 1;
}, AnyHashable("message_id"): 28722, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "LocalWebSocketTask <F148A72E-DAE5-4FAC-9B0E-5A225EF3F221>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <F148A72E-DAE5-4FAC-9B0E-5A225EF3F221>.<1>}
    "LocalWebSocketTask <D6E697A3-B556-4285-B7B3-090F30057255>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <D6E697A3-B556-4285-B7B3-090F30057255>.<1>, NSLocalizedDescription=The network connection was lost.}
    "crypto_version" = 0;
    datesent = "2026-04-22 15:46:10";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Came to play padel baby";
    "message_id" = 28722;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28721;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_id"): 28722]
    "LocalWebSocketTask <743197AD-9CFF-4750-9587-CB00229B7770>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <743197AD-9CFF-4750-9587-CB00229B7770>.<1>}
    "content-available" = 1;
}, AnyHashable("message_id"): 28723]
    "content-available" = 1;
}, AnyHashable("message_id"): 28724, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:13:32";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Between 7-8";
    "message_id" = 28725;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28724;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0]
    "LocalWebSocketTask <68414D02-CCA2-406A-B17D-4ACBAC1C99D8>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <68414D02-CCA2-406A-B17D-4ACBAC1C99D8>.<1>}
    "content-available" = 1;
}, AnyHashable("message_id"): 28725, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:13:32";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Between 7-8";
    "message_id" = 28725;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28724;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:13:51";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "But Im not playing now, my neck is hurting";
    "message_id" = 28726;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28725;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:13:51";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "But Im not playing now, my neck is hurting";
    "message_id" = 28726;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28725;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:13:51";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "But Im not playing now, my neck is hurting";
    "message_id" = 28726;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28725;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28726, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28727, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28728]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28729, AnyHashable("operation_type"): 3]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:14:09";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "What are you doing babyyy";
    "message_id" = 28730;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28729;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28730, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:14:09";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "What are you doing babyyy";
    "message_id" = 28730;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28729;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28730, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:14:09";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "What are you doing babyyy";
    "message_id" = 28730;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28729;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28730]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:14:29";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "I\U2019ll baby\U2665\Ufe0f";
    "message_id" = 28732;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28731;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:14:29";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "I\U2019ll baby\U2665\Ufe0f";
    "message_id" = 28732;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28731;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:14:29";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "I\U2019ll baby\U2665\Ufe0f";
    "message_id" = 28732;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28731;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28732, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
    "crypto_version" = 1;
    datesent = "2026-04-22 16:14:41";
    "file_name" = "653beabd4db198ba.jpg";
    "is_encrypted" = 1;
    message = "";
    "message_id" = 28734;
    "message_type" = 1;
    "mime_type" = "image/jpeg";
    "plaintext_size" = 7312580;
    "prev_session_message_id" = 28733;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "t_653beabd4db198ba.jpg";
    timer = 0;
    "upload_status" = 1;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_id"): 28734, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0]
    "crypto_version" = 1;
    datesent = "2026-04-22 16:14:41";
    "file_name" = "653beabd4db198ba.jpg";
    "is_encrypted" = 1;
    message = "";
    "message_id" = 28734;
    "message_type" = 1;
    "mime_type" = "image/jpeg";
    "plaintext_size" = 7312580;
    "prev_session_message_id" = 28733;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "t_653beabd4db198ba.jpg";
    timer = 0;
    "upload_status" = 1;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_id"): 28734, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0]
    "crypto_version" = 1;
    datesent = "2026-04-22 16:14:41";
    "file_name" = "653beabd4db198ba.jpg";
    "is_encrypted" = 1;
    message = "";
    "message_id" = 28734;
    "message_type" = 1;
    "mime_type" = "image/jpeg";
    "plaintext_size" = 7312580;
    "prev_session_message_id" = 28733;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "t_653beabd4db198ba.jpg";
    timer = 0;
    "upload_status" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28734]
    "content-available" = 1;
}, AnyHashable("message_id"): 28734, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28733]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28734]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28734]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28734]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
0   Eye.debug.dylib                     0x00000001033b9130 $s3Eye21MediaViewerControllerC7dismiss8animated10completionySb_yycSgtF + 136
1   Eye.debug.dylib                     0x00000001033c6730 $s3Eye21MediaViewerControllerC9handlePan33_791426CB2E96A6BD5D22046DA17161F6LLyySo22UIPanGestureRecognizerCF + 2084
2   Eye.debug.dylib                     0x00000001033c6a20 $s3Eye21MediaViewerControllerC9handlePan33_791426CB2E96A6BD5D22046DA17161F6LLyySo22UIPanGestureRecognizerCFTo + 68
3   UIKitCore                           0x00000001966d1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x00000001966d1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x00000001966d11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000196215a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x00000001961da310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000019bdcb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000019be09c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
    "crypto_version" = 0;
    datesent = "2026-04-22 16:14:53";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Happy for you my looove";
    "message_id" = 28735;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28734;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:14:53";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Happy for you my looove";
    "message_id" = 28735;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28734;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:14:53";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Happy for you my looove";
    "message_id" = 28735;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28734;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28736]
    "content-available" = 1;
}]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:14:55";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "\U2665\Ufe0f";
    "message_id" = 28737;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28736;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:14:55";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "\U2665\Ufe0f";
    "message_id" = 28737;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28736;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:14:55";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "\U2665\Ufe0f";
    "message_id" = 28737;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28736;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28737, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28737, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28738]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28740, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 1;
    datesent = "2026-04-22 16:15:17";
    "file_name" = "adbb72082c79fd33.jpg";
    "is_encrypted" = 1;
    message = "";
    "message_id" = 28740;
    "message_type" = 1;
    "mime_type" = "image/jpeg";
    "plaintext_size" = 643550;
    "prev_session_message_id" = 28739;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "t_adbb72082c79fd33.jpg";
    timer = 0;
    "upload_status" = 1;
}]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28740, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 1;
    datesent = "2026-04-22 16:15:17";
    "file_name" = "adbb72082c79fd33.jpg";
    "is_encrypted" = 1;
    message = "";
    "message_id" = 28740;
    "message_type" = 1;
    "mime_type" = "image/jpeg";
    "plaintext_size" = 643550;
    "prev_session_message_id" = 28739;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "t_adbb72082c79fd33.jpg";
    timer = 0;
    "upload_status" = 1;
}]
    "content-available" = 1;
}]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28740, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 1;
    datesent = "2026-04-22 16:15:17";
    "file_name" = "adbb72082c79fd33.jpg";
    "is_encrypted" = 1;
    message = "";
    "message_id" = 28740;
    "message_type" = 1;
    "mime_type" = "image/jpeg";
    "plaintext_size" = 643550;
    "prev_session_message_id" = 28739;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "t_adbb72082c79fd33.jpg";
    timer = 0;
    "upload_status" = 1;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28740, AnyHashable("session_id"): ILUIWU]
0   Eye.debug.dylib                     0x00000001033b9130 $s3Eye21MediaViewerControllerC7dismiss8animated10completionySb_yycSgtF + 136
1   Eye.debug.dylib                     0x00000001033c6730 $s3Eye21MediaViewerControllerC9handlePan33_791426CB2E96A6BD5D22046DA17161F6LLyySo22UIPanGestureRecognizerCF + 2084
2   Eye.debug.dylib                     0x00000001033c6a20 $s3Eye21MediaViewerControllerC9handlePan33_791426CB2E96A6BD5D22046DA17161F6LLyySo22UIPanGestureRecognizerCFTo + 68
3   UIKitCore                           0x00000001966d1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x00000001966d1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x00000001966d11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000196215a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x00000001961da310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000019bdcb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000019be09c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:15:21";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "\Ud83e\Udee0";
    "message_id" = 28741;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28740;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28741, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:15:21";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "\Ud83e\Udee0";
    "message_id" = 28741;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28740;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28741, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:15:21";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "\Ud83e\Udee0";
    "message_id" = 28741;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28740;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28741, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28742]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28743, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:15:29";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "They need you!";
    "message_id" = 28743;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28742;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28743, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:15:29";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "They need you!";
    "message_id" = 28743;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28742;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28743, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:15:29";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "They need you!";
    "message_id" = 28743;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28742;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU]
0   Eye.debug.dylib                     0x00000001033b9130 $s3Eye21MediaViewerControllerC7dismiss8animated10completionySb_yycSgtF + 136
1   Eye.debug.dylib                     0x00000001033c6730 $s3Eye21MediaViewerControllerC9handlePan33_791426CB2E96A6BD5D22046DA17161F6LLyySo22UIPanGestureRecognizerCF + 2084
2   Eye.debug.dylib                     0x00000001033c6a20 $s3Eye21MediaViewerControllerC9handlePan33_791426CB2E96A6BD5D22046DA17161F6LLyySo22UIPanGestureRecognizerCFTo + 68
3   UIKitCore                           0x00000001966d1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x00000001966d1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x00000001966d11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000196215a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x00000001961da310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000019bdcb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000019be09c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28743, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:16:05";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Nooo;
    "message_id" = 28745;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28744;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28745]
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:16:05";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Nooo;
    "message_id" = 28745;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28744;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28745]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:16:05";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Nooo;
    "message_id" = 28745;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28744;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_id"): 28745]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28745, AnyHashable("session_id"): ILUIWU]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:16:08";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Always!!!!";
    "message_id" = 28746;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28745;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28746, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:16:08";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Always!!!!";
    "message_id" = 28746;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28745;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28746, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:16:08";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Always!!!!";
    "message_id" = 28746;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28745;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}]
    "content-available" = 1;
}]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:16:15";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Even more!";
    "message_id" = 28747;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28746;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_id"): 28747, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:16:15";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Even more!";
    "message_id" = 28747;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28746;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}, AnyHashable("message_id"): 28747, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:16:15";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Even more!";
    "message_id" = 28747;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28746;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "New message received";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    sound = default;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28747]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 3;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:24:40";
    "file_name" = "";
    "is_encrypted" = 0;
    message = IWU;
    "message_id" = 28751;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28750;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28751, AnyHashable("sender_name"): Esra, AnyHashable("datesent"): 2026-04-22 16:24:40, AnyHashable("timer"): 0, AnyHashable("file_name"): , AnyHashable("thumb_file_name"): ]
    "LocalWebSocketTask <9C42EE0A-DBB9-437E-8233-B618D5905881>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <9C42EE0A-DBB9-437E-8233-B618D5905881>.<1>}
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 3;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("timer"): 0, AnyHashable("thumb_file_name"): , AnyHashable("message"): IWU, AnyHashable("datesent"): 2026-04-22 16:24:40, AnyHashable("file_name"): , AnyHashable("operation_type"): 0, AnyHashable("sender_name"): Esra, AnyHashable("message_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:24:40";
    "file_name" = "";
    "is_encrypted" = 0;
    message = IWU;
    "message_id" = 28751;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28750;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("sender_name"): LOLO, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:32:37";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Hello;
    "message_id" = 28753;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 27407;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU2, AnyHashable("datesent"): 2026-04-22 16:32:37]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU2, AnyHashable("message_id"): 28753, AnyHashable("operation_type"): 3]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message"): Coucou, AnyHashable("message_id"): 28754, AnyHashable("sender_name"): LOLO, AnyHashable("session_id"): ILUIWU2, AnyHashable("thumb_file_name"): , AnyHashable("file_name"): , AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:35:19";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Coucou;
    "message_id" = 28754;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28753;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("datesent"): 2026-04-22 16:35:19, AnyHashable("message_type"): 0]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU2]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_type"): 0, AnyHashable("datesent"): 2026-04-22 16:36:28, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:36:28";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Mutes;
    "message_id" = 28755;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28754;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("file_name"): , AnyHashable("sender_name"): LOLO, AnyHashable("timer"): 0, AnyHashable("message_id"): 28755]
    "content-available" = 1;
}, AnyHashable("message_id"): 28755, AnyHashable("session_id"): ILUIWU2, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:38:40";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Muted #2";
    "message_id" = 28757;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28755;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28757, AnyHashable("datesent"): 2026-04-22 16:38:40, AnyHashable("session_id"): ILUIWU2, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("thumb_file_name"): , AnyHashable("file_name"): , AnyHashable("sender_name"): LOLO, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("timer"): 0, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU2, AnyHashable("message_id"): 28757]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:41:42";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Muted #3";
    "message_id" = 28758;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28757;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message"): Muted #3, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("message_id"): 28758, AnyHashable("sender_name"): LOLO, AnyHashable("message_type"): 0, AnyHashable("file_name"): , AnyHashable("timer"): 0, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("thumb_file_name"): ]
    "content-available" = 1;
}, AnyHashable("message_id"): 28758]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:45:30";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Encore;
    "message_id" = 28759;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28758;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message"): Encore, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("message_id"): 28759, AnyHashable("sender_name"): LOLO, AnyHashable("message_type"): 0, AnyHashable("file_name"): , AnyHashable("timer"): 0, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("thumb_file_name"): ]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28759, AnyHashable("session_id"): ILUIWU2]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_id"): 28760, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:50:51";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Deux;
    "message_id" = 28760;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28759;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("timer"): 0, AnyHashable("file_name"): , AnyHashable("datesent"): 2026-04-22 16:50:51, AnyHashable("message"): Deux, AnyHashable("sender_name"): LOLO]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_id"): 28760, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:50:51";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Deux;
    "message_id" = 28760;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28759;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("timer"): 0, AnyHashable("file_name"): , AnyHashable("datesent"): 2026-04-22 16:50:51, AnyHashable("message"): Deux, AnyHashable("sender_name"): LOLO]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_id"): 28760, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:50:51";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Deux;
    "message_id" = 28760;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28759;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("timer"): 0, AnyHashable("file_name"): , AnyHashable("datesent"): 2026-04-22 16:50:51, AnyHashable("message"): Deux, AnyHashable("sender_name"): LOLO]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU2, AnyHashable("message_id"): 28760]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_id"): 28761, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:51:08";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Trois;
    "message_id" = 28761;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28760;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("timer"): 0, AnyHashable("file_name"): , AnyHashable("datesent"): 2026-04-22 16:51:08, AnyHashable("message"): Trois, AnyHashable("sender_name"): LOLO]
    "content-available" = 1;
}, AnyHashable("message_id"): 28761, AnyHashable("session_id"): ILUIWU2]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_type"): 0, AnyHashable("operation_type"): 0, AnyHashable("thumb_file_name"): , AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:51:25";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Quatre;
    "message_id" = 28762;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28761;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("datesent"): 2026-04-22 16:51:25]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU2]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_id"): 28763, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:51:37";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Cinq;
    "message_id" = 28763;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28762;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("timer"): 0, AnyHashable("file_name"): , AnyHashable("datesent"): 2026-04-22 16:51:37, AnyHashable("message"): Cinq, AnyHashable("sender_name"): LOLO]
    "content-available" = 1;
}]
    "LocalWebSocketTask <D0BDF32F-3CE3-4FA2-AEED-86DF74947120>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <D0BDF32F-3CE3-4FA2-AEED-86DF74947120>.<1>}
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 14673]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU2, AnyHashable("message_id"): 14674]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("thumb_file_name"): , AnyHashable("sender_name"): LOLO, AnyHashable("message_type"): 0, AnyHashable("timer"): 0, AnyHashable("operation_type"): 0, AnyHashable("datesent"): 2026-04-22 16:59:24, AnyHashable("message"): Test message, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:59:24";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Test message";
    "message_id" = 28764;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28763;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28764]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU2]
    "crypto_version" = 0;
    datesent = "2026-04-22 16:59:44";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Again another";
    "message_id" = 28765;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28764;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("datesent"): 2026-04-22 16:59:44, AnyHashable("session_id"): ILUIWU2, AnyHashable("file_name"): , AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("timer"): 0, AnyHashable("message_id"): 28765, AnyHashable("message_type"): 0, AnyHashable("message"): Again another, AnyHashable("thumb_file_name"): , AnyHashable("sender_name"): LOLO, AnyHashable("operation_type"): 0]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_id"): 28766, AnyHashable("message_type"): 0, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:59:47";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "And another";
    "message_id" = 28766;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28765;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU2, AnyHashable("message"): And another]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28765, AnyHashable("session_id"): ILUIWU2]
    "content-available" = 1;
}, AnyHashable("message_id"): 28766]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_id"): 28767, AnyHashable("message_type"): 0, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 16:59:49";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "And again";
    "message_id" = 28767;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28766;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU2, AnyHashable("message"): And again]
    "content-available" = 1;
}]
    "content-available" = 1;
}]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message"): !, AnyHashable("datesent"): 2026-04-22 17:02:44, AnyHashable("file_name"): , AnyHashable("session_id"): ILUIWU2, AnyHashable("message_id"): 28768, AnyHashable("sender_name"): LOLO, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:02:44";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "!";
    "message_id" = 28768;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28767;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    "content-available" = 1;
}]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:03:00";
    "file_name" = "";
    "is_encrypted" = 0;
    message = 2;
    "message_id" = 28769;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28768;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message"): Msg1, AnyHashable("file_name"): , AnyHashable("datesent"): 2026-04-22 17:09:21, AnyHashable("operation_type"): 0, AnyHashable("thumb_file_name"): , AnyHashable("message_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:09:21";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Msg1;
    "message_id" = 28770;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28769;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("session_id"): ILUIWU2, AnyHashable("sender_name"): LOLO]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU2]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("sender_name"): LOLO, AnyHashable("message"): Msg2, AnyHashable("datesent"): 2026-04-22 17:09:29, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:09:29";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Msg2;
    "message_id" = 28771;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28770;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU2, AnyHashable("thumb_file_name"): , AnyHashable("message_type"): 0, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message"): Msg3, AnyHashable("sender_name"): LOLO, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:09:59";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Msg3;
    "message_id" = 28772;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28771;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("file_name"): , AnyHashable("thumb_file_name"): , AnyHashable("datesent"): 2026-04-22 17:09:59, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("session_id"): ILUIWU2]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU2]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU2]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:12:03";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "MSG 4";
    "message_id" = 28773;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28772;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28773, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU2]
    "crypto_version" = 0;
    datesent = "2026-04-22 17:12:10";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "MSG 5";
    "message_id" = 28774;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28773;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("sender_name"): LOLO, AnyHashable("thumb_file_name"): , AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU2, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("timer"): 0, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("datesent"): 2026-04-22 17:12:10, AnyHashable("message_id"): 28774]
    "content-available" = 1;
}]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_id"): 28775, AnyHashable("timer"): 0, AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU2, AnyHashable("datesent"): 2026-04-22 17:13:03, AnyHashable("file_name"): , AnyHashable("message"): MSG 6, AnyHashable("message_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:13:03";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "MSG 6";
    "message_id" = 28775;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28774;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("sender_name"): LOLO, AnyHashable("thumb_file_name"): , AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B]
    "content-available" = 1;
}, AnyHashable("message_id"): 28775, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU2]
    "content-available" = 1;
}, AnyHashable("message_id"): 14685, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU2]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU2, AnyHashable("message_id"): 14687, AnyHashable("operation_type"): 3]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_id"): 28776, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("file_name"): , AnyHashable("message"): MSG 7, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:13:32";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "MSG 7";
    "message_id" = 28776;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28775;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("timer"): 0, AnyHashable("operation_type"): 0, AnyHashable("sender_name"): LOLO]
    "content-available" = 1;
}, AnyHashable("message_id"): 28776, AnyHashable("session_id"): ILUIWU2, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:18:45";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "MSG 8";
    "message_id" = 28777;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28776;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("timer"): 0, AnyHashable("datesent"): 2026-04-22 17:18:45, AnyHashable("session_id"): ILUIWU2, AnyHashable("message"): MSG 8, AnyHashable("file_name"): , AnyHashable("message_id"): 28777, AnyHashable("message_type"): 0, AnyHashable("sender_name"): LOLO, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("thumb_file_name"): ]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU2, AnyHashable("operation_type"): 3]
    "content-available" = 1;
}, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:18:57";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Mesg9;
    "message_id" = 28778;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28777;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("timer"): 0, AnyHashable("datesent"): 2026-04-22 17:18:57, AnyHashable("session_id"): ILUIWU2, AnyHashable("message"): Mesg9, AnyHashable("file_name"): , AnyHashable("message_id"): 28778, AnyHashable("message_type"): 0, AnyHashable("sender_name"): LOLO, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("thumb_file_name"): ]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28778]
    "content-available" = 1;
}, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:19:24";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Message 10";
    "message_id" = 28779;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28778;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("timer"): 0, AnyHashable("datesent"): 2026-04-22 17:19:24, AnyHashable("session_id"): ILUIWU2, AnyHashable("message"): Message 10, AnyHashable("file_name"): , AnyHashable("message_id"): 28779, AnyHashable("message_type"): 0, AnyHashable("sender_name"): LOLO, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("thumb_file_name"): ]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28779]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("timer"): 0, AnyHashable("message"): Message 11, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:19:45";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Message 11";
    "message_id" = 28780;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28779;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28780, AnyHashable("file_name"): ]
    "content-available" = 1;
}, AnyHashable("message_id"): 28780, AnyHashable("session_id"): ILUIWU2]
    "content-available" = 1;
}]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:19:54";
    "file_name" = "";
    "is_encrypted" = 0;
    message = 12;
    "message_id" = 28781;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28780;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("timer"): 0, AnyHashable("datesent"): 2026-04-22 17:19:54, AnyHashable("session_id"): ILUIWU2, AnyHashable("message"): 12, AnyHashable("file_name"): , AnyHashable("message_id"): 28781, AnyHashable("message_type"): 0, AnyHashable("sender_name"): LOLO, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("thumb_file_name"): ]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:25:05";
    "file_name" = "";
    "is_encrypted" = 0;
    message = 1;
    "message_id" = 28782;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28781;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("sender_name"): LOLO, AnyHashable("file_name"): , AnyHashable("datesent"): 2026-04-22 17:25:05]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_type"): 0, AnyHashable("session_id"): ILUIWU2, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:25:05";
    "file_name" = "";
    "is_encrypted" = 0;
    message = 1;
    "message_id" = 28782;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28781;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message"): 1, AnyHashable("timer"): 0, AnyHashable("thumb_file_name"): ]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "crypto_version" = 0;
    datesent = "2026-04-22 17:25:20";
    "file_name" = "";
    "is_encrypted" = 0;
    message = 2;
    "message_id" = 28783;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28782;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("file_name"): , AnyHashable("sender_name"): LOLO, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("thumb_file_name"): , AnyHashable("datesent"): 2026-04-22 17:25:20, AnyHashable("message_type"): 0, AnyHashable("message_id"): 28783, AnyHashable("timer"): 0, AnyHashable("message"): 2, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): , AnyHashable("operation_type"): 0, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("thumb_file_name"): , AnyHashable("message"): 3, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:27:05";
    "file_name" = "";
    "is_encrypted" = 0;
    message = 3;
    "message_id" = 28784;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28783;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("timer"): 0, AnyHashable("message_type"): 0, AnyHashable("sender_name"): LOLO, AnyHashable("message_id"): 28784]
    "content-available" = 1;
}, AnyHashable("message_id"): 28784, AnyHashable("session_id"): ILUIWU2]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_id"): 28785, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:27:22";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Encore;
    "message_id" = 28785;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28784;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("timer"): 0, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28785, AnyHashable("session_id"): ILUIWU2]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("sender_name"): LOLO, AnyHashable("message_id"): 28786, AnyHashable("timer"): 0, AnyHashable("message_type"): 0, AnyHashable("datesent"): 2026-04-22 17:27:45, AnyHashable("message"): 1, AnyHashable("thumb_file_name"): , AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:27:45";
    "file_name" = "";
    "is_encrypted" = 0;
    message = 1;
    "message_id" = 28786;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28785;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}, AnyHashable("message_id"): 28786, AnyHashable("session_id"): ILUIWU2]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): , AnyHashable("operation_type"): 0, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("thumb_file_name"): , AnyHashable("message"): 2, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:27:54";
    "file_name" = "";
    "is_encrypted" = 0;
    message = 2;
    "message_id" = 28787;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28786;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("timer"): 0, AnyHashable("message_type"): 0, AnyHashable("sender_name"): LOLO, AnyHashable("message_id"): 28787]
    "content-available" = 1;
}, AnyHashable("message_id"): 28787, AnyHashable("session_id"): ILUIWU2]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): , AnyHashable("operation_type"): 0, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("thumb_file_name"): , AnyHashable("message"): 3, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-22 17:28:04";
    "file_name" = "";
    "is_encrypted" = 0;
    message = 3;
    "message_id" = 28788;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28787;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("timer"): 0, AnyHashable("message_type"): 0, AnyHashable("sender_name"): LOLO, AnyHashable("message_id"): 28788]
    "content-available" = 1;
}, AnyHashable("message_id"): 28788, AnyHashable("session_id"): ILUIWU2]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}, AnyHashable("message_id"): 28789]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): a3c7116bf5e3bbcd.heic, AnyHashable("timer"): 0, AnyHashable("message_type"): 1, AnyHashable("session_id"): ILUIWU2, AnyHashable("operation_type"): 0, AnyHashable("message"): , AnyHashable("message_data"): {
    "crypto_version" = 1;
    datesent = "2026-04-22 17:28:24";
    "file_name" = "a3c7116bf5e3bbcd.heic";
    "is_encrypted" = 1;
    message = "";
    "message_id" = 28789;
    "message_type" = 1;
    "mime_type" = "image/heic";
    "plaintext_size" = 2808983;
    "prev_session_message_id" = 28788;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "t_a3c7116bf5e3bbcd.jpg";
    timer = 0;
    "upload_status" = 1;
}, AnyHashable("thumb_file_name"): t_a3c7116bf5e3bbcd.jpg, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("sender_name"): LOLO, AnyHashable("message_id"): 28789, AnyHashable("datesent"): 2026-04-22 17:28:24]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28790]
    "crypto_version" = 1;
    datesent = "2026-04-22 17:28:45";
    "file_name" = "5dd04ec618550af0.jpeg";
    "is_encrypted" = 1;
    message = "";
    "message_id" = 28790;
    "message_type" = 1;
    "mime_type" = "image/jpeg";
    "plaintext_size" = 1484524;
    "prev_session_message_id" = 28789;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "t_5dd04ec618550af0.jpg";
    timer = 0;
    "upload_status" = 1;
}, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): 5dd04ec618550af0.jpeg, AnyHashable("operation_type"): 0, AnyHashable("sender_name"): LOLO, AnyHashable("message"): , AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("thumb_file_name"): t_5dd04ec618550af0.jpg, AnyHashable("message_type"): 1, AnyHashable("message_id"): 28790, AnyHashable("session_id"): ILUIWU2]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("session_id"): ILUIWU2, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28790]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_id"): 28790, AnyHashable("session_id"): ILUIWU2, AnyHashable("operation_type"): 0]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU2]
    "crypto_version" = 1;
    datesent = "2026-04-22 17:29:07";
    "file_name" = "b141ec241290453b.jpeg";
    "is_encrypted" = 1;
    message = "";
    "message_id" = 28791;
    "message_type" = 1;
    "mime_type" = "image/jpeg";
    "plaintext_size" = 2567402;
    "prev_session_message_id" = 28790;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "t_b141ec241290453b.jpg";
    timer = 0;
    "upload_status" = 1;
}, AnyHashable("session_id"): ILUIWU2, AnyHashable("message_type"): 1, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("thumb_file_name"): t_b141ec241290453b.jpg, AnyHashable("file_name"): b141ec241290453b.jpeg, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("sender_name"): LOLO, AnyHashable("message"): , AnyHashable("operation_type"): 0]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_id"): 28792]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "crypto_version" = 1;
    datesent = "2026-04-22 17:29:28";
    "file_name" = "b4408e3141587152.jpeg";
    "is_encrypted" = 1;
    message = "";
    "message_id" = 28792;
    "message_type" = 1;
    "mime_type" = "image/jpeg";
    "plaintext_size" = 1896240;
    "prev_session_message_id" = 28791;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "t_b4408e3141587152.jpg";
    timer = 0;
    "upload_status" = 1;
}, AnyHashable("datesent"): 2026-04-22 17:29:28, AnyHashable("thumb_file_name"): t_b4408e3141587152.jpg, AnyHashable("file_name"): b4408e3141587152.jpeg, AnyHashable("timer"): 0, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("message_type"): 1, AnyHashable("session_id"): ILUIWU2, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("sender_name"): LOLO]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
    "crypto_version" = 1;
    datesent = "2026-04-22 17:34:36";
    "file_name" = "c8613d57167974b0.heic";
    "is_encrypted" = 1;
    message = "";
    "message_id" = 28793;
    "message_type" = 1;
    "mime_type" = "image/heic";
    "plaintext_size" = 2808983;
    "prev_session_message_id" = 28792;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "t_c8613d57167974b0.jpg";
    timer = 0;
    "upload_status" = 1;
}, AnyHashable("message_type"): 1, AnyHashable("operation_type"): 0, AnyHashable("thumb_file_name"): t_c8613d57167974b0.jpg, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B, AnyHashable("timer"): 0, AnyHashable("sender_name"): LOLO, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("session_id"): ILUIWU2, AnyHashable("file_name"): c8613d57167974b0.heic]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28793]
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU2, AnyHashable("message_id"): 28794, AnyHashable("operation_type"): 3]
    "crypto_version" = 1;
    datesent = "2026-04-22 17:34:54";
    "file_name" = "91886bcecc539776.jpeg";
    "is_encrypted" = 1;
    message = "";
    "message_id" = 28794;
    "message_type" = 1;
    "mime_type" = "image/jpeg";
    "plaintext_size" = 1955253;
    "prev_session_message_id" = 28793;
    "sender_id" = "AE422AAE-41B4-415C-BF79-9DBD82F4699B";
    "sender_name" = LOLO;
    "session_id" = ILUIWU2;
    "thumb_file_name" = "t_91886bcecc539776.jpg";
    timer = 0;
    "upload_status" = 1;
}, AnyHashable("file_name"): 91886bcecc539776.jpeg, AnyHashable("message_id"): 28794, AnyHashable("timer"): 0, AnyHashable("thumb_file_name"): t_91886bcecc539776.jpg, AnyHashable("operation_type"): 0, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_type"): 1, AnyHashable("session_id"): ILUIWU2, AnyHashable("datesent"): 2026-04-22 17:34:54, AnyHashable("sender_name"): LOLO, AnyHashable("sender_id"): AE422AAE-41B4-415C-BF79-9DBD82F4699B]
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28794]
    "content-available" = 1;
}, AnyHashable("message_id"): 28756, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
    "LocalWebSocketTask <4F6D0347-EA4D-4B83-88A1-18181BA1D251>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <4F6D0347-EA4D-4B83-88A1-18181BA1D251>.<1>}
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28801]
    "content-available" = 1;
}]
    "content-available" = 1;
}, AnyHashable("message_id"): 28800, AnyHashable("session_id"): ILUIWU]
── Body ──
{"ok":true,"message":"Message updated","session_id":"ILUIWU","message_id":28805,"event_type":2}[07:27:54] [CRASH] No crash detected
[07:27:54] [LOG] Pruned 7840 entries older than 3 hours
[07:27:54] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[07:27:54] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[07:27:54] [GIPHY] SDK not available - using REST API fallback
[07:27:54] [BACKGROUND] Background fetch enabled
[07:27:54] [AUTH] Starting PIN authentication
[07:27:54] [BACKGROUND] Background fetch triggered
[07:27:54] [BACKGROUND] Fetching recent messages for pre-cache
[07:27:54] [PUSH] Silent push received
[07:27:54] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 05:27:54 +0000, appState=2, message_id=28806, type=nil
[07:27:54] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[07:27:54] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 05:27:54 +0000
[07:27:54] [PUSH_TRACE] ⬇️ Processing embedded message_id=28806
[07:27:54] [PUSH_EMBED] 📩 Received embedded message: id=28806, type=0, sender=Esra
[07:27:54] [PUSH_TRACE] ⬇️ Message details: text="Good morning my love ♥️...", datesent=2026-04-23 05:06:01
[07:27:54] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[07:27:54] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28806
[07:27:54] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28806
[07:27:54] [CLEANUP] No old timer messages to delete
[07:27:54] [PUSH_EMBED] ✅ Saved message 28806 to local DB (sync)
[07:27:54] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28806
[07:27:54] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28806
[07:27:54] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28806
[07:27:54] [PUSH_TRACE] 📦 Cache state: valid=false, count=0, IDs=[]
[07:27:54] [PUSH_EMBED] Created new cache with embedded message 28806
[07:27:54] [PUSH_TRACE] 📦 ✅ Created new cache with message 28806
[07:27:54] [PUSH_TRACE] 📦 EXITING cache update queue for message 28806
[07:27:54] [PUSH_EMBED] Fetching evolution data for message 28806 in background
[07:27:54] [PUSH_EMBED] ✅ Fully processed message 28806
[07:27:54] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28806
[07:27:54] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=1, IDs=[28806], handled=true
[07:27:54] [PUSH] Embedded message handled instantly from silent push
[07:27:54] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[07:27:54] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28806
[07:27:54] [PUSH_EMBED] Got evolution data for message 28806, saving to local DB
[07:27:54] [PUSH_EMBED] Saved evolution data for message 28806
[07:27:54] [PUSH] APNs token: 6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c
[07:27:54] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":1,"removed_from_other_channels":0}
[07:27:54] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[07:27:54] [USER] ✅ User registered successfully
[07:27:54] [PUSH] User registration after token update: success
[07:27:56] [PRELOAD] Cache already valid (1 messages), skipping pre-load
[07:27:57] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[07:27:57] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[07:27:58] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[07:27:58] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28806, 28805, 28804, 28803, 28802, 28801, 28800, 28799, 28798, 28797]
[07:27:58] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=1, IDs=[28806]
[07:27:58] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[07:27:58] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28806, 28805, 28804, 28803, 28802, 28801, 28800, 28799, 28798, 28797]
[07:27:58] [BACKGROUND] Pre-cached 50 ChatMessage objects for instant display (preserved 0 from push)
[07:27:58] [BACKGROUND] Pre-downloaded 0 thumbnails
[07:27:58] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[07:28:38] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[07:28:38] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[07:28:38] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[07:28:38] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[07:28:38] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[07:28:38] [CLIENT_SIG] WebSocket opened
[07:28:38] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[07:28:38] [CLIENT_SIG] Connected! clientId=TYFzDLmYH7n7UmPH
[07:28:38] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[07:28:38] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[07:28:39] [PIN_AUTH] Correct PIN
[07:28:40] [SECURITY] Restored real session: ILUIWU
[07:28:40] [SECURITY] Restored real session: ILUIWU
[07:28:40] [SECURITY] Saved real session: ILUIWU
[07:28:40] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[07:28:40] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[07:28:40] [UPLOAD_QUEUE] ✅ Database integrity check passed
[07:28:40] [UPLOAD_QUEUE] Active background session tasks: 0 (standard uploads now use foreground session, so this should be 0 after the fix)
[07:28:40] Documents Directory: /var/mobile/Containers/Data/Application/F022C66D-1F7D-4B3B-8B5B-832C2ABFA889/Documents
[07:28:40] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[07:28:40] [CAPTURE_HOST] live-feed moved hosted view to plain container
[07:28:40] [THEME] Applying current theme
[07:28:40] [CHAT] Applied day theme (mode: day)
[07:28:40] [SECURITY] Saved real session: ILUIWU
[07:28:40] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[07:28:40] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[07:28:40] [NETWORK] Network monitor started
[07:28:40] [NETWORK] Status changed: connected
[07:28:40] Did transition
[07:28:40] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[07:28:40] [VIEWER] Screen lock enabled - normal idle behavior
[07:28:40] [QUERY] 🔍 Creating query connection for iOS broadcast: iosILUIWU
[07:28:40] [VCC] ========== VideoConnectionClass INIT ==========
[07:28:40] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[07:28:40] [DATA AUDIO] ========== setupWebRTC() START ==========
[07:28:40] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[07:28:40] [DATA AUDIO] Creating encoder/decoder factories...
[07:28:40] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[07:28:40] [CODEC] Viewer selected encoder: AV1 (best quality)
[07:28:40] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[07:28:40] [DATA AUDIO] ✅ Factory created
[07:28:40] [DATA AUDIO] RTCAudioSession locked
[07:28:40] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[07:28:40] [DATA AUDIO] RTCAudioSession unlocked
[07:28:40] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[07:28:40] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[07:28:40] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[07:28:40] [WS] Opening session at ws://crivello.dyndns.org:8081/
[07:28:40] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[07:28:40] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[07:28:40] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[07:28:40] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[07:28:40] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[07:28:40] Did transition
[07:28:40] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[07:28:40] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[07:28:40] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[07:28:40] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[07:28:40] [CAPTURE] Live-feed protection [view-will-appear] - fullscreen=false, isCaptured=false, secureReady=true
[07:28:40] [READBY_OPT] No message IDs to fetch - skipping server call
[07:28:40] [MIGRATION] No messages need sender_name backfill
[07:28:40] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[07:28:40] [CAPTURE] Refresh overlay [view-will-appear] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[07:28:40] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[07:28:40] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28808, maxMemoryId=28806
[07:28:40] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28808
[07:28:40] [GALLERY_DB] Raw datesent for msg 28740: '2026-04-22 16:15:17'
[07:28:40] [GALLERY_DB] Raw datesent for msg 28734: '2026-04-22 16:14:41'
[07:28:40] [GALLERY_DB] Raw datesent for msg 28718: '2026-04-22 12:02:50'
[07:28:40] [USER] ✅ User registered successfully
[07:28:40] [USER] User registration successful
[07:28:40] [INCREMENTAL_SYNC] ✅ No new messages
[07:28:40] [GALLERY_DB] ✅ Loaded 1255 media messages
[07:28:40] [GALLERY] Filtered 1255 -> 1212 (only with local thumbnails)
[07:28:40] [GALLERY] First 5 after sort (newest first):
[07:28:40] [GALLERY]   0: id=28740, date=2026-04-22 16:15:17, file=adbb72082c79fd33.jpg
[07:28:40] [GALLERY]   1: id=28734, date=2026-04-22 16:14:41, file=653beabd4db198ba.jpg
[07:28:40] [GALLERY]   2: id=28718, date=2026-04-22 12:02:50, file=5a447861140baa5d.jpg
[07:28:40] [GALLERY]   3: id=28714, date=2026-04-22 10:16:33, file=e76ecd0d17b4f8dc.jpg
[07:28:40] [GALLERY]   4: id=28713, date=2026-04-22 10:12:56, file=55cec5a39e78220e.jpg
[07:28:40] [SCROLL] 💓 alive, visible=0...0, rows=0, estHeight=0.0, heightCalls=0
[07:28:40] [SCROLL_BTN] Showing button - 32pt from bottom > half 22pt
[07:28:40] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[07:28:40] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28806, 28805, 28804, 28803, 28802]
[07:28:40] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[07:28:40] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28806, 28805, 28804, 28803, 28802, 28801, 28800, 28799, 28798, 28797]
[07:28:40] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[07:28:40] [SCROLL] wasNearBottom=true, threshold=758, offset=0, contentH=64, boundsH=758, forceScroll=true
[07:28:40] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[07:28:40] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[07:28:40] [CELL_UPLOAD] configure: msgId=28718, file=5a447861140baa5d.jpg, senderId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=true, hasFilename=true, isGiphy=false, uploadStatus=0
[07:28:40] [CELL_UPLOAD] → no active progress, using msg.uploadStatus=0 → complete
[07:28:40] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=5a447861140baa5d.jpg, overlayExists=true
[07:28:40] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[07:28:40] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28805 → 28806
[07:28:40] [SERVER] Starting reconnect polling (5s interval)
[07:28:40] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[07:28:40] [ICONS] Offset applied: -14.6
[07:28:40] [ICONS] New left margin: 11.2, New right margin: 11.3
[07:28:40] [READBY_ENRICH] Enriched 0/0 unsettled messages with readBy data
[07:28:40] [ICONS] Chat center: (31.2, 87.0)
[07:28:40] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[07:28:40] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[07:28:40] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[07:28:40] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[07:28:40] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[07:28:40] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[07:28:40] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[07:28:40] [ICONS] Screen width: 440.0
[07:28:40] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[07:28:40] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[07:28:40] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[07:28:40] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[07:28:40] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3886, currentOffset=3886
[07:28:40] [SCROLL] Scrolling to 3886, animated=false
[07:28:40] [PUSH] Silent push received
[07:28:40] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 05:28:40 +0000, appState=0, message_id=28808, type=nil
[07:28:40] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[07:28:40] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 05:28:40 +0000
[07:28:40] [PUSH_TRACE] ⬇️ Processing embedded message_id=28808
[07:28:40] [PUSH_EMBED] 📩 Received embedded message: id=28808, type=0, sender=Esra
[07:28:40] [PUSH_TRACE] ⬇️ Message details: text="🤭...", datesent=2026-04-23 05:28:06
[07:28:40] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[07:28:40] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28808
[07:28:40] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28808
[07:28:40] [PUSH_EMBED] ✅ Saved message 28808 to local DB (sync)
[07:28:40] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28808
[07:28:40] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28808
[07:28:40] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28808
[07:28:40] [PUSH_TRACE] 📦 Cache state: valid=false, count=0, IDs=[]
[07:28:40] [PUSH_EMBED] Created new cache with embedded message 28808
[07:28:40] [PUSH_TRACE] 📦 ✅ Created new cache with message 28808
[07:28:40] [PUSH_TRACE] 📦 EXITING cache update queue for message 28808
[07:28:40] [PUSH_EMBED] Fetching evolution data for message 28808 in background
[07:28:40] [PUSH_EMBED] ✅ Fully processed message 28808
[07:28:40] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28808
[07:28:40] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=1, IDs=[28808], handled=true
[07:28:40] [PUSH] Embedded message handled instantly from silent push
[07:28:40] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[07:28:40] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28808
[07:28:40] [PUSH_EMBED] Got evolution data for message 28808, saving to local DB
[07:28:40] [PUSH_EMBED] Saved evolution data for message 28808
[07:28:40] new_session POST ok: token len=157
[07:28:40] HELLO → sent (fetched token, role=query)
[07:28:40] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[07:28:40] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[07:28:40] [UNSENT_RETRY] Checking for unsent messages...
[07:28:40] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[07:28:40] [UPLOAD_RECOVERY] User ID: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF
[07:28:40] [UPLOAD_RECOVERY] Session: ILUIWU
[07:28:40] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[07:28:40] [UPLOAD_RECOVERY] Checking recent media messages on server...
[07:28:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28718, file=5a447861140baa5d.jpg, upload_status=complete
[07:28:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28714, file=e76ecd0d17b4f8dc.jpg, upload_status=complete
[07:28:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28713, file=55cec5a39e78220e.jpg, upload_status=complete
[07:28:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28702, file=7035e780531e78e1.mp4, upload_status=complete
[07:28:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28699, file=2f5ae78d2850faab.jpg, upload_status=complete
[07:28:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28640, file=f2317109ac17cc77.jpg, upload_status=complete
[07:28:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28628, file=0d1b02a5c4f3382f.mp4, upload_status=complete
[07:28:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28626, file=4d9299b5e3f3a7b2.mp4, upload_status=complete
[07:28:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28623, file=b68d406973c2b694.jpg, upload_status=complete
[07:28:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28617, file=4804eb8220be9527.jpg, upload_status=complete
[07:28:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28518, file=3d48ecdbf17858a0.jpg, upload_status=complete
[07:28:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28504, file=df692a622eff9fa3.jpg, upload_status=complete
[07:28:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28361, file=172491b1e798c2e9.jpg, upload_status=complete
[07:28:40] [UPLOAD_RECOVERY] Verifying 13 media files exist on server...
[07:28:40] [PENDING_UPLOAD] Total pending upload messages: 0
[07:28:40] [UNSENT_RETRY] No unsent messages found
[07:28:40] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[07:28:40] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[07:28:40] [PUSH_TRACE] 👁️ Received message id=28808, text="🤭..."
[07:28:40] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[07:28:40] [PUSH_TRACE] 👁️ BEFORE insert: 50 messages, first 5 IDs: [28806, 28805, 28804, 28803, 28802]
[07:28:40] [PUSH_TRACE] 👁️ Inserted message 28808 at index 0
[07:28:40] [PUSH_UI] Inserted message 28808 into UI (now 51 messages)
[07:28:40] [PUSH_TRACE] 👁️ AFTER insert: 51 messages, first 5 IDs: [28808, 28806, 28805, 28804, 28803]
[07:28:40] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[07:28:40] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[07:28:40] [PUSH_TRACE] 👁️ handlePushMessageReceived END - success
[07:28:40] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28808, 28806, 28805, 28804, 28803, 28802, 28801, 28800, 28799, 28798]
[07:28:40] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[07:28:40] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28808
[07:28:40] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 0, AnyHashable("thumb_file_name"): , AnyHashable("session_id"): ILUIWU, AnyHashable("message"): 🤭, AnyHashable("timer"): 0, AnyHashable("message_type"): 0, AnyHashable("file_name"): , AnyHashable("sender_name"): Esra, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 05:28:06";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "\Ud83e\Udd2d";
    "message_id" = 28808;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28807;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message_id"): 28808, AnyHashable("datesent"): 2026-04-23 05:28:06, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 3;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}]
[07:28:40] [PUSH_EMBED_VC] Message 28808 already in memory - skipping
[07:28:40] [PUSH] ⚡ Embedded message handled directly in ViewController
[07:28:40] [PUSH] Parsed message_id: 28808
[07:28:40] [PUSH] Parsed operation_type: 0
[07:28:40] [PUSH] Taking direct action: opType=0, messageId=28808
[07:28:40] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28808
[07:28:40] [PUSH] ⚡ Message 28808 already in memory - skipping duplicate notification entirely
[07:28:40] [WS] 💓 Started ping heartbeat (20s) — isQueryOnly=true, connectionStr=iosILUIWU
[07:28:40] [CAM_CONN] ✅ hello_ok — conn=iosILUIWU role=query serverSid=iosILUIWU query=true agentOnlineFlag=false
[07:28:40] [SIG] hello_ok received for query connection - ready to query agents
[07:28:40] [CAM_CONN] 🔎 onQueryHelloOk — sending get_agents for base=ILUIWU and iOS=iosILUIWU via conn=iosILUIWU
[07:28:40] [SIG] get_agents request sent for sessionId=ILUIWU
[07:28:40] [SIG] get_agents request sent for sessionId=iosILUIWU
[07:28:40] [SERVER] Stopped reconnect polling
[07:28:40] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[07:28:40] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=2 accumulated=0 tab=0
[07:28:40] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=1
[07:28:40] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[07:28:40] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=1 accumulated=0 tab=0
[07:28:40] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=0
[07:28:40] [CAM_CONN] 🧮 handleAgentsList processing 0 accumulated agents
[07:28:40] [SERVER] Starting reconnect polling (5s interval)
[07:28:41] [UPLOAD_RECOVERY] ✅ All media files verified on server
[07:28:41] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=70
[07:28:41] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28808, 28806, 28805, 28804, 28803]
[07:28:41] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[07:28:41] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28808, 28806, 28805, 28804, 28803, 28802, 28801, 28800, 28799, 28798]
[07:28:41] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[07:28:41] [SCROLL] wasNearBottom=true, threshold=758, offset=3886, contentH=4644, boundsH=758, forceScroll=true
[07:28:41] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[07:28:41] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28806 → 28808
[07:28:41] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=64
[07:28:41] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4066, currentOffset=4066
[07:28:41] [SCROLL] Scrolling to 4066, animated=false
[07:28:41] [SCROLL] 💓 alive, visible=43...49, rows=53, estHeight=0.0, heightCalls=64
[07:28:41] [SCROLL_BTN] Showing button - 305pt from bottom > half 223pt
[07:28:42] [SCROLL_END_DECEL] messagesTable offsetY=4377, insetTop=0, pendingVelocityY=0.0
[07:28:42] [PUSH] Silent push received
[07:28:42] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 05:28:42 +0000, appState=0, message_id=nil, type=nil
[07:28:42] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=1, IDs=[28808]
[07:28:42] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 05:28:42 +0000
[07:28:42] [PUSH_EMBED] No embedded message_data in notification
[07:28:42] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[07:28:42] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=1, IDs=[28808], handled=false
[07:28:42] [PUSH] No embedded data, pre-loading messages from server
[07:28:42] [PUSH_PRELOAD] Fetching messages for instant display cache
[07:28:42] [PUSH] Silent push received
[07:28:42] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 05:28:42 +0000, appState=0, message_id=nil, type=nil
[07:28:42] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=1, IDs=[28808]
[07:28:42] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 05:28:42 +0000
[07:28:42] [PUSH_EMBED] No embedded message_data in notification
[07:28:42] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[07:28:42] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=1, IDs=[28808], handled=false
[07:28:42] [PUSH] No embedded data, pre-loading messages from server
[07:28:42] [PUSH_PRELOAD] Fetching messages for instant display cache
[07:28:42] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[07:28:42] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[07:28:42] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[07:28:42] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28808, 28807, 28806, 28805, 28804, 28803, 28802, 28801, 28800, 28799]
[07:28:42] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=1, IDs=[28808]
[07:28:42] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[07:28:42] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28808, 28807, 28806, 28805, 28804, 28803, 28802, 28801, 28800, 28799]
[07:28:42] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[07:28:42] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[07:28:42] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28808, 28806, 28805, 28804, 28803, 28802, 28801, 28800, 28799, 28798]
[07:28:42] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[07:28:42] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28808
[07:28:42] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28806, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}]
[07:28:42] [PUSH] Parsed message_id: 28806
[07:28:42] [PUSH] Parsed operation_type: 3
[07:28:42] [PUSH] Taking direct action: opType=3, messageId=28806
[07:28:42] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28806
[07:28:42] [CLIENT_SIG] Event received: type=3 messageId=28806
[07:28:42] [WS_EVENT] Received event: type=3, messageId=28806
[07:28:42] [WS_EVENT] Read receipt for message 28806 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[07:28:42] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[07:28:42] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[07:28:42] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[07:28:42] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28808, 28807, 28806, 28805, 28804, 28803, 28802, 28801, 28800, 28799]
[07:28:42] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28808, 28807, 28806, 28805, 28804, 28803, 28802, 28801, 28800, 28799]
[07:28:42] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[07:28:42] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28808, 28807, 28806, 28805, 28804, 28803, 28802, 28801, 28800, 28799]
[07:28:42] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[07:28:42] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[07:28:42] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28808, 28806, 28805, 28804, 28803, 28802, 28801, 28800, 28799, 28798]
[07:28:42] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[07:28:42] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28808
[07:28:42] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28808]
[07:28:42] [PUSH] Parsed message_id: 28808
[07:28:42] [PUSH] Parsed operation_type: 3
[07:28:42] [PUSH] Taking direct action: opType=3, messageId=28808
[07:28:42] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28808
[07:28:42] [CLIENT_SIG] Event received: type=3 messageId=28808
[07:28:42] [WS_EVENT] Received event: type=3, messageId=28808
[07:28:42] [WS_EVENT] Read receipt for message 28808 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[07:28:45] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[07:28:45] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=51, isReloading=false
[07:28:45] [SEND_MESSAGE] ✅ Added optimistic message id=-1 to arrays, newMsgCount=52
[07:28:45] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=5
[07:28:45] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[-1, 28808, 28806, 28805, 28804]
[07:28:45] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[07:28:45] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-1, 28808, 28806, 28805, 28804, 28803, 28802, 28801, 28800, 28799]
[07:28:45] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[07:28:45] [SCROLL] wasNearBottom=true, threshold=447, offset=4377, contentH=4824, boundsH=447, forceScroll=false
[07:28:45] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[07:28:45] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[07:28:45] [SCROLL] 💓 alive, visible=48...53, rows=54, estHeight=0.0, heightCalls=115
[07:28:45] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[07:28:45] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[07:28:45] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4454, currentOffset=4454
[07:28:45] [SCROLL] Scrolling to 4454, animated=true
[07:28:45] [CLIENT_SIG] Event received: type=0 messageId=28809
[07:28:45] [WS_EVENT] Received event: type=0, messageId=28809
[07:28:45] [WS_EVENT] 📨 New message notification (msgId=28809) - triggering incremental refresh, currentMsgCount=52
[07:28:45] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[07:28:45] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28808, maxMemoryId=28808
[07:28:45] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28808
[07:28:45] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28809,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 05:28:45"}
[07:28:45] [CHAT] receive_message.php JSON: ["message_type": 0, "session_id": ILUIWU, "file_name": , "ok": 1, "message_id": 28809, "datesent_utc": 2026-04-23 05:28:45]
[07:28:45] [DB_UPGRADE] Upgrading message ID: -1 → 28809, preserveOriginalDate=false
[07:28:45] [DB_UPGRADE] ✅ Upgraded -1 → 28809 with send_status=0, 1 row(s) affected
[07:28:45] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -1 → 28809
[07:28:45] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -1 → 28809
[07:28:45] ReloadData 9
[07:28:45] [SERVER] Polling - attempting to reconnect...
[07:28:45] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[07:28:45] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[07:28:46] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[07:28:46] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28809]
[07:28:46] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 52 msgs, first 10 IDs=[28809, 28808, 28806, 28805, 28804, 28803, 28802, 28801, 28800, 28799]
[07:28:46] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 52, first 10 IDs=[28809, 28808, 28806, 28805, 28804, 28803, 28802, 28801, 28800, 28799]
[07:28:46] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[07:28:46] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[07:28:46] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=52
[07:28:46] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=59
[07:28:46] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28809, 28808, 28806, 28805, 28804]
[07:28:46] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[07:28:46] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28809, 28808, 28806, 28805, 28804, 28803, 28802, 28801, 28800, 28799]
[07:28:46] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[07:28:46] [SCROLL] wasNearBottom=true, threshold=447, offset=4454, contentH=4901, boundsH=447, forceScroll=true
[07:28:46] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[07:28:46] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=59
[07:28:46] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4454, currentOffset=4454
[07:28:46] [SCROLL] Scrolling to 4454, animated=false
[07:28:47] [MENU] dismissAnyExistingMenu called
[07:28:47] [MENU] dismissAnyExistingMenu completed
[07:28:47] [EMOJI_PICKER] Starting emoji picker for message 28808
[07:28:47] [MENU] Created button 'Reply' at index 0
[07:28:47] [MENU] Created button 'Copy' at index 1
[07:28:47] [MENU] Created button 'Delete' at index 2
[07:28:47] [MENU] Menu added at y=558.0
[07:28:47] [EMOJI_PICKER] ✅ Fetched 6 recent emojis
[07:28:47] [EMOJI_PICKER] ✅ Creating picker with 6 recent emojis
[07:28:47] [EMOJI_PICKER] ✅ Picker shown at y=318.0
[07:28:47] [LOG-KB] textViewShouldEndEditing: isInputField=true, allowKeyboardDismiss=true, returning=true, textView=<Eye.PastingTextView: 0x11b050000; baseClass = UITextView; frame = (44 8; 320 36
[07:28:47] [SCROLL] 💓 alive, visible=44...53, rows=54, estHeight=0.0, heightCalls=59
[07:28:47] [LOG-KB] textViewDidEndEditing: isInputField=true, resetting allowKeyboardDismiss to false
[07:28:48] [MENU] menuButtonTouchDown - button title: Reply, tag: 0
[07:28:48] [MENU] menuButtonTapped - button title: Reply, tag: 0
[07:28:48] [MENU] Button frame: (0.0, 0.0, 120.0, 44.0), superview: true
[07:28:48] [MENU] Found action closure, dismissing menu first
[07:28:48] [MENU] dismissAnyExistingMenu called
[07:28:48] [MENU] Found menu with tag 9999, removing
[07:28:48] [MENU] Removing blur effect
[07:28:48] [MENU] Removing floating message snapshot
[07:28:48] [MENU] Dismissing emoji picker
[07:28:48] [MENU] Recorded dismissal time for debounce
[07:28:48] [MENU] dismissAnyExistingMenu completed
[07:28:48] [MENU] Menu dismissed, executing action
[07:28:48] [REPLY_DEBUG] ✅ startReplyTo called - set messageToReplyTo to message 28808
[07:28:48] [MENU] Action executed
[07:28:48] [SCROLL_BTN] Showing button - 377pt from bottom > half 223pt
[07:28:48] [SCROLL_END_DECEL] messagesTable offsetY=4149, insetTop=0, pendingVelocityY=0.0
[07:28:48] [SCROLL_END_DECEL] messagesTable offsetY=4527, insetTop=0, pendingVelocityY=0.0
[07:28:50] [SERVER] Polling - attempting to reconnect...
[07:28:50] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[07:28:50] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[07:28:56] [SERVER] Polling - attempting to reconnect...
[07:28:56] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[07:28:56] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[07:29:00] [REPLY_DEBUG] 📤 didTapSend - Sending message WITH reply to message 28808
[07:29:00] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=52, isReloading=false
[07:29:00] [REPLY_DEBUG] 🔗 sendMessage START - Captured reply to message 28808
[07:29:00] [SEND_MESSAGE] ✅ Added optimistic message id=-2 to arrays, newMsgCount=53
[07:29:00] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=9
[07:29:00] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[-2, 28809, 28808, 28806, 28805]
[07:29:00] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 53 messages
[07:29:00] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-2, 28809, 28808, 28806, 28805, 28804, 28803, 28802, 28801, 28800]
[07:29:00] [RELOAD_TAB] 📊 Building chatRows from 53 messages
[07:29:00] [SCROLL] wasNearBottom=true, threshold=447, offset=4527, contentH=4901, boundsH=447, forceScroll=false
[07:29:00] [RELOAD_TAB] 📊 Built 55 chatRows, estHeight=0.0
[07:29:00] [SCROLL] 💓 alive, visible=49...54, rows=55, estHeight=0.0, heightCalls=60
[07:29:00] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=0
[07:29:00] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[07:29:00] [REPLY_DEBUG] 🔗 sendMessage HTTP BODY - Added reply_to_id=28808 to request body
[07:29:00] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4550, currentOffset=4550
[07:29:00] [SCROLL] Scrolling to 4550, animated=true
[07:29:00] [SCROLL_END_DECEL] messagesTable offsetY=4550, insetTop=0, pendingVelocityY=0.0
[07:29:00] [CLIENT_SIG] Event received: type=0 messageId=28810
[07:29:00] [WS_EVENT] Received event: type=0, messageId=28810
[07:29:00] [WS_EVENT] 📨 New message notification (msgId=28810) - triggering incremental refresh, currentMsgCount=53
[07:29:00] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=53
[07:29:00] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28809, maxMemoryId=28809
[07:29:00] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28809
[07:29:00] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28810,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 05:29:00"}
[07:29:00] [CHAT] receive_message.php JSON: ["datesent_utc": 2026-04-23 05:29:00, "message_type": 0, "message_id": 28810, "file_name": , "ok": 1, "session_id": ILUIWU]
[07:29:00] [DB_UPGRADE] Upgrading message ID: -2 → 28810, preserveOriginalDate=false
[07:29:00] [DB_UPGRADE] ✅ Upgraded -2 → 28810 with send_status=0, 1 row(s) affected
[07:29:00] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -2 → 28810
[07:29:00] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -2 → 28810
[07:29:00] ReloadData 9
[07:29:00] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[07:29:00] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28810]
[07:29:00] [REPLY_LOAD] ViewController+Database mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[07:29:00] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 53 msgs, first 10 IDs=[28810, 28809, 28808, 28806, 28805, 28804, 28803, 28802, 28801, 28800]
[07:29:00] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 53, first 10 IDs=[28810, 28809, 28808, 28806, 28805, 28804, 28803, 28802, 28801, 28800]
[07:29:00] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[07:29:00] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=53
[07:29:00] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=53
[07:29:00] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=117
[07:29:00] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[28810, 28809, 28808, 28806, 28805]
[07:29:00] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 53 messages
[07:29:00] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28810, 28809, 28808, 28806, 28805, 28804, 28803, 28802, 28801, 28800]
[07:29:00] [RELOAD_TAB] 📊 Building chatRows from 53 messages
[07:29:00] [SCROLL] wasNearBottom=true, threshold=447, offset=4550, contentH=4997, boundsH=447, forceScroll=true
[07:29:00] [RELOAD_TAB] 📊 Built 55 chatRows, estHeight=0.0
[07:29:00] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[07:29:00] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4550, currentOffset=4550
[07:29:00] [SCROLL] Scrolling to 4550, animated=false
[07:29:00] [CAM_CONN] 💓 PING #1 sent — conn=iosILUIWU query=true secsSinceLastPong=-1
[07:29:00] [SERVER] Polling - attempting to reconnect...
[07:29:00] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[07:29:00] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[07:29:01] [CAM_CONN] 💓 PONG #1 received — conn=iosILUIWU query=true rtt=14ms
[07:29:02] [LOG-KB] textViewShouldEndEditing: isInputField=true, allowKeyboardDismiss=true, returning=true, textView=<Eye.PastingTextView: 0x11b050000; baseClass = UITextView; frame = (44 8; 320 36
[07:29:02] [SCROLL] 💓 alive, visible=46...54, rows=55, estHeight=0.0, heightCalls=60
[07:29:02] [LOG-KB] textViewDidEndEditing: isInputField=true, resetting allowKeyboardDismiss to false
[07:29:04] [LOCK] Lock button tapped - locking app immediately
[07:29:04] [LOCK] Received lock app notification
[07:29:04] [LIFECYCLE] App resigning active - cleared crash flag
[07:29:05] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[07:29:05] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[07:29:05] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[07:29:05] [LIFECYCLE] App entering background - cleared crash flag
[07:29:05] [CLIENT_SIG] Disconnecting
[07:29:05] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[07:29:05] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[07:29:05] [PUSH_TRACE] 💤 BACKGROUND: memory has 53 messages, first 10 IDs=[28810, 28809, 28808, 28806, 28805, 28804, 28803, 28802, 28801, 28800]
[07:29:05] [LIFECYCLE] Background snapshot: count=53, maxId=28810
[07:29:05] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[07:29:05] [WS] Canceling WebSocket for query connection to iosILUIWU
[07:29:05] In cleanupPeer
[07:29:05] In cleanupPeer
[07:29:05] [LIFECYCLE] WebRTC audio disabled
[07:29:05] [LIFECYCLE] AVAudioSession deactivated
[07:29:05] [LIFECYCLE] All connections stopped
[07:29:05] [CLIENT_SIG] WebSocket closed with code 1001
[07:29:05] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[07:29:05] [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/}
[07:29:05] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[07:29:05] [SERVER] Stopped reconnect polling
[07:29:05] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[07:29:05] [WS] Query connection error - cleaning up all agent connections and views
[07:29:05] Will request stop of video 0
[07:29:05] Will request stop of video 0
[07:29:05] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[07:29:05] [WS] Query connection failed - cleaning up all agent connections and views
[07:29:05] [APP_DISCONNECT] Scene disconnecting - logging pending uploads...
[07:29:05] [APP_TERMINATE] ✅ No pending uploads in DB queue
[07:29:05] [LIFECYCLE] ViewController deallocated
[07:30:55] [CRASH] No crash detected
[07:30:55] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[07:30:55] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[07:30:55] [GIPHY] SDK not available - using REST API fallback
[07:30:55] [BACKGROUND] Background fetch enabled
[07:30:55] [AUTH] Starting PIN authentication
[07:30:55] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[07:30:55] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[07:30:55] [PUSH] APNs token: 6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c
[07:30:55] [CLEANUP] No old timer messages to delete
[07:30:55] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":1,"removed_from_other_channels":0}
[07:30:55] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[07:30:55] [USER] ✅ User registered successfully
[07:30:55] [PUSH] User registration after token update: success
[07:30:55] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[07:30:55] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[07:30:55] [CLIENT_SIG] WebSocket opened
[07:30:55] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[07:30:55] [CLIENT_SIG] Connected! clientId=BixHQEG5VYy_fAIb
[07:30:55] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[07:30:55] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[07:30:55] [PRELOAD] ⚡ Starting message pre-load during authentication (since_id=28752)...
[07:30:55] [PRELOAD] Fetched 18 messages
[07:30:55] [PRELOAD] ✅ Saved 18 messages to local DB
[07:30:55] [REPLY_LOAD] SceneDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[07:30:55] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=18, sessionId=ILUIWU
[07:30:55] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804, 28803, 28802]
[07:30:55] [PUSH_TRACE] 🔀 mergeMessages: Different session (nil vs ILUIWU), replacing cache
[07:30:55] [PRELOAD] ⚡ Cached 18 messages for instant display (preserved 0 from push)
[07:30:56] [PIN_AUTH] Correct PIN
[07:30:56] [SECURITY] Restored real session: ILUIWU
[07:30:56] [SECURITY] Restored real session: ILUIWU
[07:30:56] [SECURITY] Saved real session: ILUIWU
[07:30:56] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[07:30:56] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[07:30:56] [UPLOAD_QUEUE] ✅ Database integrity check passed
[07:30:56] [UPLOAD_QUEUE] Active background session tasks: 0 (standard uploads now use foreground session, so this should be 0 after the fix)
[07:30:56] Documents Directory: /var/mobile/Containers/Data/Application/F022C66D-1F7D-4B3B-8B5B-832C2ABFA889/Documents
[07:30:56] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[07:30:56] [CAPTURE_HOST] live-feed moved hosted view to plain container
[07:30:56] [THEME] Applying current theme
[07:30:56] [CHAT] Applied day theme (mode: day)
[07:30:56] [SECURITY] Saved real session: ILUIWU
[07:30:56] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[07:30:56] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[07:30:56] [NETWORK] Network monitor started
[07:30:56] [NETWORK] Status changed: connected
[07:30:56] Did transition
[07:30:56] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[07:30:56] [VIEWER] Screen lock enabled - normal idle behavior
[07:30:56] [QUERY] 🔍 Creating query connection for iOS broadcast: iosILUIWU
[07:30:56] [VCC] ========== VideoConnectionClass INIT ==========
[07:30:56] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[07:30:56] [DATA AUDIO] ========== setupWebRTC() START ==========
[07:30:56] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[07:30:56] [DATA AUDIO] Creating encoder/decoder factories...
[07:30:56] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[07:30:56] [CODEC] Viewer selected encoder: AV1 (best quality)
[07:30:56] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[07:30:56] [DATA AUDIO] ✅ Factory created
[07:30:56] [DATA AUDIO] RTCAudioSession locked
[07:30:56] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[07:30:56] [DATA AUDIO] RTCAudioSession unlocked
[07:30:56] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[07:30:56] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[07:30:56] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[07:30:56] [WS] Opening session at ws://crivello.dyndns.org:8081/
[07:30:56] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[07:30:56] [VIEWER_INIT] Already have 18 messages - just filtering for tab
[07:30:56] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=18
[07:30:56] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[07:30:56] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[07:30:56] Did transition
[07:30:56] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[07:30:56] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[07:30:56] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=18
[07:30:56] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[07:30:56] [CAPTURE] Live-feed protection [view-will-appear] - fullscreen=false, isCaptured=false, secureReady=true
[07:30:56] [READBY_OPT] No message IDs to fetch - skipping server call
[07:30:56] [MIGRATION] No messages need sender_name backfill
[07:30:56] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=18
[07:30:56] [CAPTURE] Refresh overlay [view-will-appear] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[07:30:56] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[07:30:56] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28811, maxMemoryId=28811
[07:30:56] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28811
[07:30:56] [GALLERY_DB] Raw datesent for msg 28740: '2026-04-22 16:15:17'
[07:30:56] [GALLERY_DB] Raw datesent for msg 28734: '2026-04-22 16:14:41'
[07:30:56] [GALLERY_DB] Raw datesent for msg 28718: '2026-04-22 12:02:50'
[07:30:56] [USER] ✅ User registered successfully
[07:30:56] [USER] User registration successful
[07:30:56] [INCREMENTAL_SYNC] ✅ No new messages
[07:30:56] [GALLERY_DB] ✅ Loaded 1255 media messages
[07:30:57] [GALLERY] Filtered 1255 -> 1212 (only with local thumbnails)
[07:30:57] [GALLERY] First 5 after sort (newest first):
[07:30:57] [GALLERY]   0: id=28740, date=2026-04-22 16:15:17, file=adbb72082c79fd33.jpg
[07:30:57] [GALLERY]   1: id=28734, date=2026-04-22 16:14:41, file=653beabd4db198ba.jpg
[07:30:57] [GALLERY]   2: id=28718, date=2026-04-22 12:02:50, file=5a447861140baa5d.jpg
[07:30:57] [GALLERY]   3: id=28714, date=2026-04-22 10:16:33, file=e76ecd0d17b4f8dc.jpg
[07:30:57] [GALLERY]   4: id=28713, date=2026-04-22 10:12:56, file=55cec5a39e78220e.jpg
[07:30:57] [SCROLL] 💓 alive, visible=0...0, rows=0, estHeight=0.0, heightCalls=0
[07:30:57] [SCROLL_BTN] Showing button - 32pt from bottom > half 22pt
[07:30:57] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[07:30:57] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=18, first5Ids=[28811, 28810, 28809, 28808, 28807]
[07:30:57] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 18 messages
[07:30:57] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804, 28803, 28802]
[07:30:57] [RELOAD_TAB] 📊 Building chatRows from 18 messages
[07:30:57] [SCROLL] wasNearBottom=true, threshold=758, offset=0, contentH=64, boundsH=758, forceScroll=true
[07:30:57] [RELOAD_TAB] 📊 Built 20 chatRows, estHeight=0.0
[07:30:57] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[07:30:57] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=32
[07:30:57] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28810 → 28811
[07:30:57] [SERVER] Starting reconnect polling (5s interval)
[07:30:57] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[07:30:57] [ICONS] Offset applied: -14.6
[07:30:57] [ICONS] New left margin: 11.2, New right margin: 11.3
[07:30:57] [READBY_ENRICH] Enriched 0/0 unsettled messages with readBy data
[07:30:57] [ICONS] Chat center: (31.2, 87.0)
[07:30:57] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[07:30:57] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[07:30:57] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[07:30:57] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[07:30:57] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[07:30:57] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[07:30:57] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[07:30:57] [ICONS] Screen width: 440.0
[07:30:57] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[07:30:57] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[07:30:57] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[07:30:57] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[07:30:57] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=793, currentOffset=793
[07:30:57] [SCROLL] Scrolling to 793, animated=false
[07:30:57] [PUSH] Silent push received
[07:30:57] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 05:30:57 +0000, appState=0, message_id=28811, type=nil
[07:30:57] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[07:30:57] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 05:30:57 +0000
[07:30:57] [PUSH_TRACE] ⬇️ Processing embedded message_id=28811
[07:30:57] [PUSH_EMBED] 📩 Received embedded message: id=28811, type=0, sender=Esra
[07:30:57] [PUSH_TRACE] ⬇️ Message details: text="Noo babyy...", datesent=2026-04-23 05:30:40
[07:30:57] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[07:30:57] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28811
[07:30:57] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28811
[07:30:57] [PUSH_EMBED] ✅ Saved message 28811 to local DB (sync)
[07:30:57] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28811
[07:30:57] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28811
[07:30:57] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28811
[07:30:57] [PUSH_TRACE] 📦 Cache state: valid=false, count=0, IDs=[]
[07:30:57] [PUSH_EMBED] Created new cache with embedded message 28811
[07:30:57] [PUSH_TRACE] 📦 ✅ Created new cache with message 28811
[07:30:57] [PUSH_TRACE] 📦 EXITING cache update queue for message 28811
[07:30:57] [PUSH_EMBED] Fetching evolution data for message 28811 in background
[07:30:57] [PUSH_EMBED] ✅ Fully processed message 28811
[07:30:57] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28811
[07:30:57] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=1, IDs=[28811], handled=true
[07:30:57] [PUSH] Embedded message handled instantly from silent push
[07:30:57] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[07:30:57] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28811
[07:30:57] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=18
[07:30:57] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[07:30:57] [UNSENT_RETRY] Checking for unsent messages...
[07:30:57] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[07:30:57] [UPLOAD_RECOVERY] User ID: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF
[07:30:57] [UPLOAD_RECOVERY] Session: ILUIWU
[07:30:57] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[07:30:57] [UPLOAD_RECOVERY] Checking recent media messages on server...
[07:30:57] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28718, file=5a447861140baa5d.jpg, upload_status=complete
[07:30:57] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28714, file=e76ecd0d17b4f8dc.jpg, upload_status=complete
[07:30:57] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28713, file=55cec5a39e78220e.jpg, upload_status=complete
[07:30:57] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28702, file=7035e780531e78e1.mp4, upload_status=complete
[07:30:57] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28699, file=2f5ae78d2850faab.jpg, upload_status=complete
[07:30:57] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28640, file=f2317109ac17cc77.jpg, upload_status=complete
[07:30:57] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28628, file=0d1b02a5c4f3382f.mp4, upload_status=complete
[07:30:57] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28626, file=4d9299b5e3f3a7b2.mp4, upload_status=complete
[07:30:57] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28623, file=b68d406973c2b694.jpg, upload_status=complete
[07:30:57] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28617, file=4804eb8220be9527.jpg, upload_status=complete
[07:30:57] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28518, file=3d48ecdbf17858a0.jpg, upload_status=complete
[07:30:57] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28504, file=df692a622eff9fa3.jpg, upload_status=complete
[07:30:57] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28361, file=172491b1e798c2e9.jpg, upload_status=complete
[07:30:57] [UPLOAD_RECOVERY] Verifying 13 media files exist on server...
[07:30:57] [PENDING_UPLOAD] Total pending upload messages: 0
[07:30:57] [UNSENT_RETRY] No unsent messages found
[07:30:57] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[07:30:57] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[07:30:57] [PUSH_TRACE] 👁️ Received message id=28811, text="Noo babyy..."
[07:30:57] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[07:30:57] [PUSH_UI] Message 28811 already in memory - skipping insert
[07:30:57] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[07:30:57] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 18 msgs, IDs=[28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804, 28803, 28802]
[07:30:57] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[07:30:57] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28811
[07:30:57] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 0, AnyHashable("file_name"): , AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 05:30:40";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Noo babyy";
    "message_id" = 28811;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28810;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message"): Noo babyy, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("sender_name"): Esra, AnyHashable("session_id"): ILUIWU, AnyHashable("timer"): 0, AnyHashable("message_type"): 0, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("datesent"): 2026-04-23 05:30:40, AnyHashable("message_id"): 28811, AnyHashable("thumb_file_name"): ]
[07:30:57] [PUSH_EMBED_VC] Message 28811 already in memory - skipping
[07:30:57] [PUSH] ⚡ Embedded message handled directly in ViewController
[07:30:57] [PUSH] Parsed message_id: 28811
[07:30:57] [PUSH] Parsed operation_type: 0
[07:30:57] [PUSH] Taking direct action: opType=0, messageId=28811
[07:30:57] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28811
[07:30:57] [PUSH] ⚡ Message 28811 already in memory - skipping duplicate notification entirely
[07:30:57] new_session POST ok: token len=157
[07:30:57] HELLO → sent (fetched token, role=query)
[07:30:57] [PUSH_EMBED] Got evolution data for message 28811, saving to local DB
[07:30:57] [PUSH_EMBED] Saved evolution data for message 28811
[07:30:57] [WS] 💓 Started ping heartbeat (20s) — isQueryOnly=true, connectionStr=iosILUIWU
[07:30:57] [CAM_CONN] ✅ hello_ok — conn=iosILUIWU role=query serverSid=iosILUIWU query=true agentOnlineFlag=false
[07:30:57] [SIG] hello_ok received for query connection - ready to query agents
[07:30:57] [CAM_CONN] 🔎 onQueryHelloOk — sending get_agents for base=ILUIWU and iOS=iosILUIWU via conn=iosILUIWU
[07:30:57] [SIG] get_agents request sent for sessionId=ILUIWU
[07:30:57] [SIG] get_agents request sent for sessionId=iosILUIWU
[07:30:57] [SERVER] Stopped reconnect polling
[07:30:57] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[07:30:57] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=2 accumulated=0 tab=0
[07:30:57] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=1
[07:30:57] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[07:30:57] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=1 accumulated=0 tab=0
[07:30:57] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=0
[07:30:57] [CAM_CONN] 🧮 handleAgentsList processing 0 accumulated agents
[07:30:57] [SERVER] Starting reconnect polling (5s interval)
[07:30:57] [UPLOAD_RECOVERY] ✅ All media files verified on server
[07:30:57] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=40
[07:30:57] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=18, first5Ids=[28811, 28810, 28809, 28808, 28807]
[07:30:57] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 18 messages
[07:30:57] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804, 28803, 28802]
[07:30:57] [RELOAD_TAB] 📊 Building chatRows from 18 messages
[07:30:57] [SCROLL] wasNearBottom=true, threshold=758, offset=793, contentH=1551, boundsH=758, forceScroll=true
[07:30:57] [RELOAD_TAB] 📊 Built 20 chatRows, estHeight=0.0
[07:30:57] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=29
[07:30:57] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=793, currentOffset=793
[07:30:57] [SCROLL] Scrolling to 793, animated=false
[07:30:58] [MUTE] Status sent to server: muted=0, response code=200
[07:30:58] [MUTE] Status sent to server: muted=0, response code=200
[07:30:59] [SCROLL] 💓 alive, visible=11...16, rows=20, estHeight=0.0, heightCalls=29
[07:30:59] [SCROLL_BTN] Showing button - 296pt from bottom > half 223pt
[07:30:59] [SCROLL_END_DECEL] messagesTable offsetY=1104, insetTop=0, pendingVelocityY=0.0
[07:30:59] [PUSH] Silent push received
[07:30:59] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 05:30:59 +0000, appState=0, message_id=nil, type=nil
[07:30:59] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=1, IDs=[28811]
[07:30:59] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 05:30:59 +0000
[07:30:59] [PUSH_EMBED] No embedded message_data in notification
[07:30:59] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[07:30:59] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=1, IDs=[28811], handled=false
[07:30:59] [PUSH] No embedded data, pre-loading messages from server
[07:30:59] [PUSH_PRELOAD] Fetching messages for instant display cache
[07:30:59] [PUSH] Silent push received
[07:30:59] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 05:30:59 +0000, appState=0, message_id=nil, type=nil
[07:30:59] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=1, IDs=[28811]
[07:30:59] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 05:30:59 +0000
[07:30:59] [PUSH_EMBED] No embedded message_data in notification
[07:30:59] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[07:30:59] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=1, IDs=[28811], handled=false
[07:30:59] [PUSH] No embedded data, pre-loading messages from server
[07:30:59] [PUSH_PRELOAD] Fetching messages for instant display cache
[07:30:59] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[07:30:59] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[07:30:59] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[07:30:59] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[07:30:59] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804, 28803, 28802]
[07:30:59] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=1, IDs=[28811]
[07:30:59] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[07:30:59] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804, 28803, 28802]
[07:30:59] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[07:30:59] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[07:30:59] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 18 msgs, IDs=[28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804, 28803, 28802]
[07:30:59] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[07:30:59] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28811
[07:30:59] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28807, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}]
[07:30:59] [PUSH] Parsed message_id: 28807
[07:30:59] [PUSH] Parsed operation_type: 3
[07:30:59] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[07:30:59] [PUSH] Taking direct action: opType=3, messageId=28807
[07:30:59] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28807
[07:30:59] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[07:30:59] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[07:30:59] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[07:30:59] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804, 28803, 28802]
[07:30:59] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804, 28803, 28802]
[07:30:59] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[07:30:59] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804, 28803, 28802]
[07:30:59] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[07:30:59] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[07:30:59] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 18 msgs, IDs=[28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804, 28803, 28802]
[07:30:59] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[07:30:59] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28811
[07:30:59] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28811, AnyHashable("operation_type"): 3]
[07:30:59] [PUSH] Parsed message_id: 28811
[07:30:59] [PUSH] Parsed operation_type: 3
[07:30:59] [PUSH] Taking direct action: opType=3, messageId=28811
[07:30:59] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28811
[07:31:00] [CLIENT_SIG] Event received: type=3 messageId=28807
[07:31:00] [WS_EVENT] Received event: type=3, messageId=28807
[07:31:00] [WS_EVENT] Read receipt for message 28807 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[07:31:00] [CLIENT_SIG] Event received: type=3 messageId=28811
[07:31:00] [WS_EVENT] Received event: type=3, messageId=28811
[07:31:00] [WS_EVENT] Read receipt for message 28811 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[07:31:01] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[07:31:01] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=18, isReloading=false
[07:31:01] [SEND_MESSAGE] ✅ Added optimistic message id=-1 to arrays, newMsgCount=19
[07:31:01] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=5
[07:31:01] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=19, first5Ids=[-1, 28811, 28810, 28809, 28808]
[07:31:01] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 19 messages
[07:31:01] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-1, 28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804, 28803]
[07:31:01] [RELOAD_TAB] 📊 Building chatRows from 19 messages
[07:31:01] [SCROLL] wasNearBottom=true, threshold=447, offset=1104, contentH=1551, boundsH=447, forceScroll=true
[07:31:01] [RELOAD_TAB] 📊 Built 21 chatRows, estHeight=0.0
[07:31:01] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=27
[07:31:01] [SCROLL] 💓 alive, visible=15...20, rows=21, estHeight=0.0, heightCalls=49
[07:31:01] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[07:31:01] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[07:31:01] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=true, nearBottom=true), maxY=1181, currentOffset=1181
[07:31:01] [SCROLL] Scrolling to 1181, animated=false
[07:31:01] [CLIENT_SIG] Event received: type=0 messageId=28812
[07:31:01] [WS_EVENT] Received event: type=0, messageId=28812
[07:31:01] [WS_EVENT] 📨 New message notification (msgId=28812) - triggering incremental refresh, currentMsgCount=19
[07:31:01] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=19
[07:31:01] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28811, maxMemoryId=28811
[07:31:01] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28811
[07:31:01] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28812,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 05:31:01"}
[07:31:01] [CHAT] receive_message.php JSON: ["datesent_utc": 2026-04-23 05:31:01, "message_id": 28812, "ok": 1, "file_name": , "message_type": 0, "session_id": ILUIWU]
[07:31:01] [DB_UPGRADE] Upgrading message ID: -1 → 28812, preserveOriginalDate=false
[07:31:01] [DB_UPGRADE] ✅ Upgraded -1 → 28812 with send_status=0, 1 row(s) affected
[07:31:01] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -1 → 28812
[07:31:01] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -1 → 28812
[07:31:01] ReloadData 9
[07:31:02] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[07:31:02] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28812]
[07:31:02] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 19 msgs, first 10 IDs=[28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804, 28803]
[07:31:02] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 19, first 10 IDs=[28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804, 28803]
[07:31:02] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[07:31:02] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=19
[07:31:02] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=19
[07:31:02] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=26
[07:31:02] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=19, first5Ids=[28812, 28811, 28810, 28809, 28808]
[07:31:02] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 19 messages
[07:31:02] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804, 28803]
[07:31:02] [RELOAD_TAB] 📊 Building chatRows from 19 messages
[07:31:02] [SCROLL] wasNearBottom=true, threshold=447, offset=1181, contentH=1628, boundsH=447, forceScroll=true
[07:31:02] [RELOAD_TAB] 📊 Built 21 chatRows, estHeight=0.0
[07:31:02] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=26
[07:31:02] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=1181, currentOffset=1181
[07:31:02] [SCROLL] Scrolling to 1181, animated=false
[07:31:02] [SERVER] Polling - attempting to reconnect...
[07:31:02] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[07:31:02] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[07:31:06] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[07:31:06] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=19, isReloading=false
[07:31:06] [SEND_MESSAGE] ✅ Added optimistic message id=-2 to arrays, newMsgCount=20
[07:31:06] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=26
[07:31:06] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=20, first5Ids=[-2, 28812, 28811, 28810, 28809]
[07:31:06] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 20 messages
[07:31:06] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-2, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804]
[07:31:06] [RELOAD_TAB] 📊 Building chatRows from 20 messages
[07:31:06] [SCROLL] wasNearBottom=true, threshold=447, offset=1181, contentH=1628, boundsH=447, forceScroll=false
[07:31:06] [RELOAD_TAB] 📊 Built 22 chatRows, estHeight=0.0
[07:31:06] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=28
[07:31:06] [SCROLL] 💓 alive, visible=16...21, rows=22, estHeight=0.0, heightCalls=51
[07:31:06] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[07:31:06] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[07:31:06] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=1233, currentOffset=1233
[07:31:06] [SCROLL] Scrolling to 1233, animated=true
[07:31:06] [CLIENT_SIG] Event received: type=0 messageId=28813
[07:31:06] [WS_EVENT] Received event: type=0, messageId=28813
[07:31:06] [WS_EVENT] 📨 New message notification (msgId=28813) - triggering incremental refresh, currentMsgCount=20
[07:31:06] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=20
[07:31:06] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28812, maxMemoryId=28812
[07:31:06] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28812
[07:31:06] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28813,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 05:31:06"}
[07:31:06] [CHAT] receive_message.php JSON: ["message_id": 28813, "session_id": ILUIWU, "ok": 1, "file_name": , "message_type": 0, "datesent_utc": 2026-04-23 05:31:06]
[07:31:06] [DB_UPGRADE] Upgrading message ID: -2 → 28813, preserveOriginalDate=false
[07:31:06] [DB_UPGRADE] ✅ Upgraded -2 → 28813 with send_status=0, 1 row(s) affected
[07:31:06] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -2 → 28813
[07:31:06] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -2 → 28813
[07:31:06] ReloadData 9
[07:31:06] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[07:31:06] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28813]
[07:31:06] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 20 msgs, first 10 IDs=[28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804]
[07:31:06] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 20, first 10 IDs=[28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804]
[07:31:06] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[07:31:06] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=20
[07:31:06] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=20
[07:31:06] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=28
[07:31:06] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=20, first5Ids=[28813, 28812, 28811, 28810, 28809]
[07:31:06] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 20 messages
[07:31:06] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804]
[07:31:06] [RELOAD_TAB] 📊 Building chatRows from 20 messages
[07:31:06] [SCROLL] wasNearBottom=true, threshold=447, offset=1233, contentH=1680, boundsH=447, forceScroll=true
[07:31:06] [RELOAD_TAB] 📊 Built 22 chatRows, estHeight=0.0
[07:31:06] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=28
[07:31:06] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=1233, currentOffset=1233
[07:31:06] [SCROLL] Scrolling to 1233, animated=false
[07:31:07] [SERVER] Polling - attempting to reconnect...
[07:31:07] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[07:31:07] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[07:31:12] [SERVER] Polling - attempting to reconnect...
[07:31:12] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[07:31:12] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[07:31:16] [NETWORK] Status changed: connected
[07:31:17] [CAM_CONN] 💓 PING #1 sent — conn=iosILUIWU query=true secsSinceLastPong=-1
[07:31:17] [SERVER] Polling - attempting to reconnect...
[07:31:17] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[07:31:17] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[07:31:17] [CAM_CONN] 💓 PONG #1 received — conn=iosILUIWU query=true rtt=6ms
[07:31:22] [SERVER] Polling - attempting to reconnect...
[07:31:22] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[07:31:22] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[07:31:23] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[07:31:23] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=20, isReloading=false
[07:31:23] [SEND_MESSAGE] ✅ Added optimistic message id=-3 to arrays, newMsgCount=21
[07:31:23] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=28
[07:31:23] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=21, first5Ids=[-3, 28813, 28812, 28811, 28810]
[07:31:23] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 21 messages
[07:31:23] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-3, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[07:31:23] [RELOAD_TAB] 📊 Building chatRows from 21 messages
[07:31:23] [SCROLL] wasNearBottom=true, threshold=429, offset=1233, contentH=1680, boundsH=429, forceScroll=false
[07:31:23] [RELOAD_TAB] 📊 Built 23 chatRows, estHeight=0.0
[07:31:23] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=29
[07:31:23] [SCROLL] 💓 alive, visible=16...22, rows=23, estHeight=0.0, heightCalls=52
[07:31:23] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[07:31:23] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[07:31:23] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=1306, currentOffset=1306
[07:31:23] [SCROLL] Scrolling to 1306, animated=true
[07:31:23] [CLIENT_SIG] Event received: type=0 messageId=28814
[07:31:23] [WS_EVENT] Received event: type=0, messageId=28814
[07:31:23] [WS_EVENT] 📨 New message notification (msgId=28814) - triggering incremental refresh, currentMsgCount=21
[07:31:23] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=21
[07:31:23] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28813, maxMemoryId=28813
[07:31:23] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28813
[07:31:23] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28814,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 05:31:23"}
[07:31:23] [CHAT] receive_message.php JSON: ["session_id": ILUIWU, "datesent_utc": 2026-04-23 05:31:23, "ok": 1, "file_name": , "message_id": 28814, "message_type": 0]
[07:31:23] [DB_UPGRADE] Upgrading message ID: -3 → 28814, preserveOriginalDate=false
[07:31:23] [DB_UPGRADE] ✅ Upgraded -3 → 28814 with send_status=0, 1 row(s) affected
[07:31:23] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -3 → 28814
[07:31:23] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -3 → 28814
[07:31:23] ReloadData 9
[07:31:23] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[07:31:23] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28814]
[07:31:23] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 21 msgs, first 10 IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[07:31:23] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 21, first 10 IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[07:31:23] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[07:31:23] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=21
[07:31:23] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=21
[07:31:23] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=30
[07:31:23] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=21, first5Ids=[28814, 28813, 28812, 28811, 28810]
[07:31:23] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 21 messages
[07:31:23] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[07:31:23] [RELOAD_TAB] 📊 Building chatRows from 21 messages
[07:31:23] [SCROLL] wasNearBottom=true, threshold=447, offset=1306, contentH=1753, boundsH=447, forceScroll=true
[07:31:23] [RELOAD_TAB] 📊 Built 23 chatRows, estHeight=0.0
[07:31:23] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=29
[07:31:23] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=1306, currentOffset=1306
[07:31:23] [SCROLL] Scrolling to 1306, animated=false
[07:31:24] [LOG-KB] textViewShouldEndEditing: isInputField=true, allowKeyboardDismiss=true, returning=true, textView=<Eye.PastingTextView: 0x11ac70000; baseClass = UITextView; frame = (44 8; 320 36
[07:31:24] [SCROLL] 💓 alive, visible=14...22, rows=23, estHeight=0.0, heightCalls=29
[07:31:24] [LOG-KB] textViewDidEndEditing: isInputField=true, resetting allowKeyboardDismiss to false
[07:31:24] [LOCK] Lock button tapped - locking app immediately
[07:31:24] [LOCK] Received lock app notification
[07:31:24] [LIFECYCLE] App resigning active - cleared crash flag
[07:31:25] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[07:31:25] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[07:31:25] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[07:31:25] [LIFECYCLE] App entering background - cleared crash flag
[07:31:25] [CLIENT_SIG] Disconnecting
[07:31:25] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[07:31:25] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[07:31:25] [PUSH_TRACE] 💤 BACKGROUND: memory has 21 messages, first 10 IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[07:31:25] [LIFECYCLE] Background snapshot: count=21, maxId=28814
[07:31:25] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[07:31:25] [WS] Canceling WebSocket for query connection to iosILUIWU
[07:31:25] In cleanupPeer
[07:31:25] In cleanupPeer
[07:31:25] [LIFECYCLE] WebRTC audio disabled
[07:31:25] [LIFECYCLE] AVAudioSession deactivated
[07:31:25] [LIFECYCLE] All connections stopped
[07:31:25] [CLIENT_SIG] WebSocket closed with code 1001
[07:31:25] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[07:31:25] [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/}
[07:31:25] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[07:31:25] [SERVER] Stopped reconnect polling
[07:31:25] Will request stop of video 0
[07:31:25] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[07:31:25] [WS] Query connection error - cleaning up all agent connections and views
[07:31:25] Will request stop of video 0
[07:31:25] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[07:31:25] [WS] Query connection failed - cleaning up all agent connections and views
[07:31:25] [PIP] Removing 0 tracks from PiP for connection 0
[07:31:25] [PIP] ✅ All tracks removed for connection 0
[07:31:25] [CLEANUP] ========================================
[07:31:25] [CLEANUP] Cleaning up all agent connections and views
[07:31:25] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[07:31:25] [CLEANUP] Stopped and removed 0 video connections
[07:31:25] [CLEANUP] Removed 0 video views
[07:31:25] [CLEANUP] Removed 0 feed scroll views
[07:31:25] [CLEANUP] Removed 0 status labels
[07:31:25] [CLEANUP] Reset agent query state
[07:31:25] [CLEANUP] Updated page indicator
[07:31:25] [CLEANUP] Rebuilt video layout
[07:31:25] [CLEANUP] ✅ All agent connections and views cleaned up
[07:31:25] [CLEANUP] ========================================
[07:31:25] [SERVER] Skipping reconnect polling - app is in background
[07:31:25] [WS] URLSession invalidated successfully
[07:31:25] [PIP] Removing 0 tracks from PiP for connection 0
[07:31:25] [PIP] ✅ All tracks removed for connection 0
[07:31:25] [CLEANUP] ========================================
[07:31:25] [CLEANUP] Cleaning up all agent connections and views
[07:31:25] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[07:31:25] [CLEANUP] Stopped and removed 0 video connections
[07:31:25] [CLEANUP] Removed 0 video views
[07:31:25] [CLEANUP] Removed 0 feed scroll views
[07:31:25] [CLEANUP] Removed 0 status labels
[07:31:25] [CLEANUP] Reset agent query state
[07:31:25] [CLEANUP] Updated page indicator
[07:31:25] [CLEANUP] Rebuilt video layout
[07:31:25] [CLEANUP] ✅ All agent connections and views cleaned up
[07:31:25] [CLEANUP] ========================================
[07:31:25] [SERVER] Skipping reconnect polling - app is in background
[07:34:03] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[07:34:03] [WS] Opening session at ws://crivello.dyndns.org:8081/
[07:34:03] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[07:34:03] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[07:34:03] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[07:34:03] [LIFECYCLE] App entering foreground - restoring connections
[07:34:03] [CAPTURE] Live-feed protection [app-will-enter-foreground] - fullscreen=false, isCaptured=false, secureReady=true
[07:34:03] [CAPTURE] Refresh overlay [app-will-enter-foreground] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[07:34:03] [PUSH_TRACE] 🔄 FOREGROUND: memory has 21 msgs, IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[07:34:03] [PUSH_TRACE] 🔄 FOREGROUND: cache has 50 msgs, valid=true, IDs=[28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804, 28803, 28802]
[07:34:03] [LIFECYCLE] Away > 2 minutes (157s) - will scroll to bottom
[07:34:03] [NETWORK] Status changed: connected
[07:34:03] [UPLOAD_RETRY] No pending uploads to retry
[07:34:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=21
[07:34:03] [READBY_OPT] Fetching readBy for 3 unsettled messages (targeted)
[07:34:03] [LIFECYCLE] WebRTC audio re-enabled
[07:34:03] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[07:34:03] [CLIENT_SIG] Skipping connect - app in background (state=2)
[07:34:03] [VIEWER] Reconnecting after background - querying agents
[07:34:03] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=running
[07:34:03] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[07:34:03] [UNSENT_RETRY] Checking for unsent messages...
[07:34:03] [PENDING_UPLOAD] Total pending upload messages: 0
[07:34:03] [UNSENT_RETRY] No unsent messages found
[07:34:03] [COMBINED_FETCH] Loaded 3 read receipts, 0 messages with reactions
[07:34:03] [FOREGROUND] Enriched 0/3 unsettled messages with readBy data
[07:34:03] [LIFECYCLE] scrollToBottomIfNeeded time=true, count=21>21=false, maxId=28814>28814=false, shouldScroll=true
[07:34:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=21
[07:34:03] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[07:34:03] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[07:34:03] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[07:34:03] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 21 msgs, IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[07:34:03] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=166 vccs=0
[07:34:03] [GAP_FIX] maxMessageIdAtBackground=28814, currentMaxLocalId=28814
[07:34:03] [PUSH] handlePollEventsNotification userInfo: [:]
[07:34:03] [PUSH] No message_id in userInfo
[07:34:03] [PUSH] No operation_type in userInfo
[07:34:03] [FAST_REFRESH] Evolution disabled - performing incremental sync
[07:34:03] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=50, IDs=[28811, 28810, 28809, 28808, 28807, 28806, 28805, 28804, 28803, 28802]
[07:34:03] [PUSH_TRACE] 📬 POLL: memory state: count=21, first 10 IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[07:34:03] [FAST_REFRESH] Already have 21 messages in memory
[07:34:03] [FAST_REFRESH] maxMemoryId=28814, maxLocalId=28814
[07:34:03] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[07:34:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=21
[07:34:03] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[07:34:03] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[07:34:03] [READBY_OPT] Fetching readBy for 3 unsettled messages (targeted)
[07:34:03] [GAP_FIX] Incremental sync will use since_id=28814 (background max=28814, current DB max=28814)
[07:34:03] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=21
[07:34:03] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28814, maxMemoryId=28814
[07:34:03] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28814
[07:34:03] [COMBINED_FETCH] Loaded 3 read receipts, 0 messages with reactions
[07:34:03] [FAST_REFRESH] Enriched 3/3 unsettled messages with readBy data
[07:34:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=21
[07:34:03] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[07:34:03] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[07:34:03] HELLO → sent (cached token, role=query)
[07:34:03] [CLIENT_SIG] WebSocket opened
[07:34:03] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[07:34:03] [WS] 💓 Started ping heartbeat (20s) — isQueryOnly=true, connectionStr=iosILUIWU
[07:34:03] [CAM_CONN] ✅ hello_ok — conn=iosILUIWU role=query serverSid=iosILUIWU query=true agentOnlineFlag=false
[07:34:03] [SIG] hello_ok received for query connection - ready to query agents
[07:34:03] [CAM_CONN] 🔎 onQueryHelloOk — sending get_agents for base=ILUIWU and iOS=iosILUIWU via conn=iosILUIWU
[07:34:03] [SIG] get_agents request sent for sessionId=ILUIWU
[07:34:03] [SIG] get_agents request sent for sessionId=iosILUIWU
[07:34:03] [SERVER] Stopped reconnect polling
[07:34:03] [CLIENT_SIG] Connected! clientId=h7xmwdjD-mp2dsiI
[07:34:03] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[07:34:03] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=2 accumulated=0 tab=0
[07:34:03] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[07:34:03] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[07:34:03] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=1
[07:34:03] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[07:34:03] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=1 accumulated=0 tab=0
[07:34:03] [INCREMENTAL_SYNC] ✅ No new messages
[07:34:03] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=0
[07:34:03] [CAM_CONN] 🧮 handleAgentsList processing 0 accumulated agents
[07:34:03] [SERVER] Starting reconnect polling (5s interval)
[07:34:03] [FAST_REFRESH] Incremental sync complete - 21 messages
[07:34:03] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=3
[07:34:03] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=21, first5Ids=[28814, 28813, 28812, 28811, 28810]
[07:34:03] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 21 messages
[07:34:03] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[07:34:03] [RELOAD_TAB] 📊 Building chatRows from 21 messages
[07:34:03] [SCROLL] wasNearBottom=true, threshold=758, offset=995, contentH=1753, boundsH=758, forceScroll=true
[07:34:03] [RELOAD_TAB] 📊 Built 23 chatRows, estHeight=0.0
[07:34:03] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=32
[07:34:03] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=995, currentOffset=995
[07:34:03] [SCROLL] Scrolling to 995, animated=false
[07:34:04] [PIN_AUTH] Correct PIN
[07:34:04] [SECURITY] Restored real session: ILUIWU
[07:34:04] [SECURITY] Restored real session: ILUIWU
[07:34:04] [LOCK] ✅ PIN auth callback - setting isAuthenticated = true
[07:34:04] [FAKE_AI] cancel() called, wasRunning=false
[07:34:04] [FAKE MODE] Exiting fake mode, restoring real session
[07:34:04] [SECURITY] Restored real session: ILUIWU
[07:34:04] [SECURITY] Saved real session: ILUIWU
[07:34:04] [FAKE MODE] ✅ Restored real session: ILUIWU
[07:34:04] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[07:34:04] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[07:34:04] [USER] ✅ User registered successfully
[07:34:04] [PUSH] User registration after token update: success
[07:34:04] [FAKE MODE] Loaded 50 messages (limited to page size)
[07:34:04] [READBY_OPT] Fetching readBy for 11 unsettled messages (targeted)
[07:34:04] [AUTH] Authentication completed - updating UI only (data already fetched in foreground handler)
[07:34:04] [AUTH] Cache had 50 messages, maxExistingId=28814, inserted 0 truly new
[07:34:04] [LIFECYCLE] scrollToBottomIfNeeded time=false, count=50>21=true, maxId=28814>28814=false, shouldScroll=true
[07:34:04] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[07:34:04] [AUTH] UI update complete
[07:34:04] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[07:34:04] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[07:34:04] [CELL_UPLOAD] configure: msgId=28734, file=653beabd4db198ba.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[07:34:04] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=653beabd4db198ba.jpg, overlayExists=true
[07:34:04] [CELL_UPLOAD] configure: msgId=28740, file=adbb72082c79fd33.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[07:34:04] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=adbb72082c79fd33.jpg, overlayExists=true
[07:34:04] [COMBINED_FETCH] Loaded 11 read receipts, 2 messages with reactions
[07:34:04] [FAKE MODE] Enriched 11/11 unsettled messages with readBy data
[07:34:04] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[07:34:04] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[07:34:05] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=91
[07:34:05] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28814, 28813, 28812, 28811, 28810]
[07:34:05] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[07:34:05] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[07:34:05] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[07:34:05] [SCROLL] wasNearBottom=false, threshold=758, offset=995, contentH=4608, boundsH=758, forceScroll=true
[07:34:05] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[07:34:05] [SCROLL] 💓 alive, visible=43...51, rows=52, estHeight=0.0, heightCalls=0
[07:34:05] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=62
[07:34:05] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=false), maxY=3890, currentOffset=3890
[07:34:05] [SCROLL] Scrolling to 3890, animated=false
[07:34:07] [LOCK] Lock button tapped - locking app immediately
[07:34:07] [LOCK] Received lock app notification
[07:34:08] [LIFECYCLE] App resigning active - cleared crash flag
[07:34:08] [SERVER] Polling - attempting to reconnect...
[07:34:08] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=true hasQueryConn=true wsState=running
[07:34:08] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[07:34:09] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[07:34:09] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[07:34:09] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[07:34:09] [LIFECYCLE] App entering background - cleared crash flag
[07:34:09] [CLIENT_SIG] Disconnecting
[07:34:09] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[07:34:09] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[07:34:09] [PUSH_TRACE] 💤 BACKGROUND: memory has 50 messages, first 10 IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[07:34:09] [LIFECYCLE] Background snapshot: count=50, maxId=28814
[07:34:09] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[07:34:09] [WS] Canceling WebSocket for query connection to iosILUIWU
[07:34:09] In cleanupPeer
[07:34:09] In cleanupPeer
[07:34:09] [LIFECYCLE] WebRTC audio disabled
[07:34:09] [LIFECYCLE] AVAudioSession deactivated
[07:34:09] [LIFECYCLE] All connections stopped
[07:34:09] [CLIENT_SIG] WebSocket closed with code 1001
[07:34:09] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[07:34:09] [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/}
[07:34:09] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[07:34:09] [SERVER] Stopped reconnect polling
[07:34:09] Will request stop of video 0
[07:34:09] Will request stop of video 0
[07:34:09] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[07:34:09] [WS] Query connection error - cleaning up all agent connections and views
[07:34:09] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[07:34:09] [WS] Query connection failed - cleaning up all agent connections and views
[07:34:09] [PIP] Removing 0 tracks from PiP for connection 0
[07:34:09] [PIP] ✅ All tracks removed for connection 0
[07:34:09] [PIP] Removing 0 tracks from PiP for connection 0
[07:34:09] [PIP] ✅ All tracks removed for connection 0
[07:34:09] [CLEANUP] ========================================
[07:34:09] [CLEANUP] Cleaning up all agent connections and views
[07:34:09] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[07:34:09] [CLEANUP] Stopped and removed 0 video connections
[07:34:09] [CLEANUP] Removed 0 video views
[07:34:09] [CLEANUP] Removed 0 feed scroll views
[07:34:09] [CLEANUP] Removed 0 status labels
[07:34:09] [CLEANUP] Reset agent query state
[07:34:09] [CLEANUP] Updated page indicator
[07:34:09] [CLEANUP] Rebuilt video layout
[07:34:09] [CLEANUP] ✅ All agent connections and views cleaned up
[07:34:09] [CLEANUP] ========================================
[07:34:09] [SERVER] Skipping reconnect polling - app is in background
[07:34:09] [WS] URLSession invalidated successfully
[07:34:09] [CLEANUP] ========================================
[07:34:09] [CLEANUP] Cleaning up all agent connections and views
[07:34:09] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[07:34:09] [CLEANUP] Stopped and removed 0 video connections
[07:34:09] [CLEANUP] Removed 0 video views
[07:34:09] [CLEANUP] Removed 0 feed scroll views
[07:34:09] [CLEANUP] Removed 0 status labels
[07:34:09] [CLEANUP] Reset agent query state
[07:34:09] [CLEANUP] Updated page indicator
[07:34:09] [CLEANUP] Rebuilt video layout
[07:34:09] [CLEANUP] ✅ All agent connections and views cleaned up
[07:34:09] [CLEANUP] ========================================
[07:34:09] [SERVER] Skipping reconnect polling - app is in background
[07:41:18] [BACKGROUND] Background fetch triggered
[07:41:18] [BACKGROUND] Fetching recent messages for pre-cache
[07:41:18] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[07:41:18] [WS] Opening session at ws://crivello.dyndns.org:8081/
[07:41:18] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[07:41:18] [NETWORK] Status changed: connected
[07:41:18] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[07:41:18] HELLO → sent (cached token, role=query)
[07:41:18] [CLIENT_SIG] WebSocket opened
[07:41:18] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[07:41:18] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[07:41:18] [WS] Query connection failed - cleaning up all agent connections and views
[07:41:18] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[07:41:18] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[07:41:18] [CLEANUP] ========================================
[07:41:18] [CLEANUP] Cleaning up all agent connections and views
[07:41:18] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[07:41:18] [CLEANUP] Stopped and removed 0 video connections
[07:41:18] [CLEANUP] Removed 0 video views
[07:41:18] [CLEANUP] Removed 0 feed scroll views
[07:41:18] [CLEANUP] Removed 0 status labels
[07:41:18] [CLEANUP] Reset agent query state
[07:41:18] [CLEANUP] Updated page indicator
[07:41:18] [CLEANUP] Rebuilt video layout
[07:41:18] [CLEANUP] ✅ All agent connections and views cleaned up
[07:41:18] [CLEANUP] ========================================
[07:41:18] [SERVER] Skipping reconnect polling - app is in background
[07:41:18] [CLEANUP] ========================================
[07:41:18] [CLEANUP] Cleaning up all agent connections and views
[07:41:18] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[07:41:18] [CLEANUP] Stopped and removed 0 video connections
[07:41:18] [CLEANUP] Removed 0 video views
[07:41:18] [CLEANUP] Removed 0 feed scroll views
[07:41:18] [CLEANUP] Removed 0 status labels
[07:41:18] [CLEANUP] Reset agent query state
[07:41:18] [CLEANUP] Updated page indicator
[07:41:18] [CLEANUP] Rebuilt video layout
[07:41:18] [CLEANUP] ✅ All agent connections and views cleaned up
[07:41:18] [CLEANUP] ========================================
[07:41:18] [SERVER] Skipping reconnect polling - app is in background
[07:41:18] [CLIENT_SIG] Connected! clientId=NYziXi94EQfA9Pl5
[07:41:18] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[07:41:18] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[07:41:18] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[07:41:18] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[07:41:18] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[07:41:18] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[07:41:18] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[07:41:18] [PUSH_TRACE] 🔀 mergeMessages: Different session (nil vs ILUIWU), replacing cache
[07:41:18] [BACKGROUND] Pre-cached 50 ChatMessage objects for instant display (preserved 0 from push)
[07:41:18] [BACKGROUND] Pre-downloaded 0 thumbnails
[07:41:18] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[07:49:37] [BACKGROUND] Background fetch triggered
[07:49:37] [BACKGROUND] Fetching recent messages for pre-cache
[07:49:37] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[07:49:37] [WS] Opening session at ws://crivello.dyndns.org:8081/
[07:49:37] [NETWORK] Status changed: connected
[07:49:37] [CLIENT_SIG] Task completed with error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <50671E32-5452-44FC-9FAD-52668ACB9A73>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <50671E32-5452-44FC-9FAD-52668ACB9A73>.<1>, NSLocalizedDescription=The network connection was lost.}
[07:49:37] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[07:49:37] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort}
[07:49:37] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[07:49:39] [NETWORK] Status changed: connected
[07:49:41] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[07:49:42] [WS] Connection failed: The request timed out.
[07:49:42] [WS] Query connection failed - cleaning up all agent connections and views
[07:49:42] [WS] WebSocket task completed with error - isQueryOnly=true: The request timed out.
[07:49:42] [WS] Query connection error - cleaning up all agent connections and views
[07:49:42] [CLEANUP] ========================================
[07:49:42] [CLEANUP] Cleaning up all agent connections and views
[07:49:42] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[07:49:42] [CLEANUP] Stopped and removed 0 video connections
[07:49:42] [CLEANUP] Removed 0 video views
[07:49:42] [CLEANUP] Removed 0 feed scroll views
[07:49:42] [CLEANUP] Removed 0 status labels
[07:49:42] [CLEANUP] Reset agent query state
[07:49:42] [CLEANUP] Updated page indicator
[07:49:42] [CLEANUP] Rebuilt video layout
[07:49:42] [CLEANUP] ✅ All agent connections and views cleaned up
[07:49:42] [CLEANUP] ========================================
[07:49:42] [SERVER] Skipping reconnect polling - app is in background
[07:49:42] [CLEANUP] ========================================
[07:49:42] [CLEANUP] Cleaning up all agent connections and views
[07:49:42] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[07:49:42] [CLEANUP] Stopped and removed 0 video connections
[07:49:42] [CLEANUP] Removed 0 video views
[07:49:42] [CLEANUP] Removed 0 feed scroll views
[07:49:42] [CLEANUP] Removed 0 status labels
[07:49:42] [CLEANUP] Reset agent query state
[07:49:42] [CLEANUP] Updated page indicator
[07:49:42] [CLEANUP] Rebuilt video layout
[07:49:42] [CLEANUP] ✅ All agent connections and views cleaned up
[07:49:42] [CLEANUP] ========================================
[07:49:42] [SERVER] Skipping reconnect polling - app is in background
[07:49:44] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[07:49:44] [WS] Opening session at ws://crivello.dyndns.org:8081/
[07:49:45] [CLIENT_SIG] WebSocket opened
[07:49:45] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[07:49:45] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[07:49:45] HELLO → sent (cached token, role=query)
[07:49:45] [CLIENT_SIG] Connected! clientId=wsRCwfHpktINl8ON
[07:49:45] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[07:49:45] [WS] Query connection failed - cleaning up all agent connections and views
[07:49:45] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[07:49:45] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[07:49:45] [CLEANUP] ========================================
[07:49:45] [CLEANUP] Cleaning up all agent connections and views
[07:49:45] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[07:49:45] [CLEANUP] Stopped and removed 0 video connections
[07:49:45] [CLEANUP] Removed 0 video views
[07:49:45] [CLEANUP] Removed 0 feed scroll views
[07:49:45] [CLEANUP] Removed 0 status labels
[07:49:45] [CLEANUP] Reset agent query state
[07:49:45] [CLEANUP] Updated page indicator
[07:49:45] [CLEANUP] Rebuilt video layout
[07:49:45] [CLEANUP] ✅ All agent connections and views cleaned up
[07:49:45] [CLEANUP] ========================================
[07:49:45] [SERVER] Skipping reconnect polling - app is in background
[07:49:45] [CLEANUP] ========================================
[07:49:45] [CLEANUP] Cleaning up all agent connections and views
[07:49:45] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[07:49:45] [CLEANUP] Stopped and removed 0 video connections
[07:49:45] [CLEANUP] Removed 0 video views
[07:49:45] [CLEANUP] Removed 0 feed scroll views
[07:49:45] [CLEANUP] Removed 0 status labels
[07:49:45] [CLEANUP] Reset agent query state
[07:49:45] [CLEANUP] Updated page indicator
[07:49:45] [CLEANUP] Rebuilt video layout
[07:49:45] [CLEANUP] ✅ All agent connections and views cleaned up
[07:49:45] [CLEANUP] ========================================
[07:49:45] [SERVER] Skipping reconnect polling - app is in background
[07:49:46] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[07:49:46] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[07:49:46] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[07:49:46] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[07:49:46] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[07:49:46] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[07:49:46] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[07:49:46] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[07:49:46] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[07:49:46] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[07:49:46] [BACKGROUND] Pre-cached 50 ChatMessage objects for instant display (preserved 0 from push)
[07:49:46] [BACKGROUND] Pre-downloaded 0 thumbnails
[07:49:46] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[07:49:47] [NETWORK] Status changed: connected
[07:49:47] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[07:49:47] [WS] Opening session at ws://crivello.dyndns.org:8081/
[07:57:41] [BACKGROUND] Background fetch triggered
[07:57:41] [BACKGROUND] Fetching recent messages for pre-cache
[07:57:41] [WS] Connection failed: The request timed out.
[07:57:41] [WS] Query connection failed - cleaning up all agent connections and views
[07:57:41] [WS] WebSocket task completed with error - isQueryOnly=true: The request timed out.
[07:57:41] [WS] Query connection error - cleaning up all agent connections and views
[07:57:41] [NETWORK] Status changed: connected
[07:57:41] [CLEANUP] ========================================
[07:57:41] [CLEANUP] Cleaning up all agent connections and views
[07:57:41] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[07:57:41] [CLEANUP] Stopped and removed 0 video connections
[07:57:41] [CLEANUP] Removed 0 video views
[07:57:41] [CLEANUP] Removed 0 feed scroll views
[07:57:41] [CLEANUP] Removed 0 status labels
[07:57:41] [CLEANUP] Reset agent query state
[07:57:41] [CLEANUP] Updated page indicator
[07:57:41] [CLEANUP] Rebuilt video layout
[07:57:41] [CLEANUP] ✅ All agent connections and views cleaned up
[07:57:41] [CLEANUP] ========================================
[07:57:41] [SERVER] Skipping reconnect polling - app is in background
[07:57:41] [CLIENT_SIG] Task completed with error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <BA0223ED-30C3-4233-82DB-5C681793994A>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <BA0223ED-30C3-4233-82DB-5C681793994A>.<1>, NSLocalizedDescription=The network connection was lost.}
[07:57:41] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[07:57:41] [CLEANUP] ========================================
[07:57:41] [CLEANUP] Cleaning up all agent connections and views
[07:57:41] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[07:57:41] [CLEANUP] Stopped and removed 0 video connections
[07:57:41] [CLEANUP] Removed 0 video views
[07:57:41] [CLEANUP] Removed 0 feed scroll views
[07:57:41] [CLEANUP] Removed 0 status labels
[07:57:41] [CLEANUP] Reset agent query state
[07:57:41] [CLEANUP] Updated page indicator
[07:57:41] [CLEANUP] Rebuilt video layout
[07:57:41] [CLEANUP] ✅ All agent connections and views cleaned up
[07:57:41] [CLEANUP] ========================================
[07:57:41] [SERVER] Skipping reconnect polling - app is in background
[07:57:41] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort}
[07:57:41] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[07:57:41] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[07:57:41] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[07:57:41] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[07:57:41] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[07:57:41] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[07:57:41] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[07:57:41] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[07:57:41] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[07:57:41] [BACKGROUND] Pre-cached 50 ChatMessage objects for instant display (preserved 0 from push)
[07:57:41] [BACKGROUND] Pre-downloaded 0 thumbnails
[07:57:41] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[07:57:42] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[07:57:42] [WS] Opening session at ws://crivello.dyndns.org:8081/
[07:57:42] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[07:57:42] HELLO → sent (cached token, role=query)
[07:57:42] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[07:57:42] [WS] Query connection failed - cleaning up all agent connections and views
[07:57:42] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[07:57:42] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[07:57:42] [CLEANUP] ========================================
[07:57:42] [CLEANUP] Cleaning up all agent connections and views
[07:57:42] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[07:57:42] [CLEANUP] Stopped and removed 0 video connections
[07:57:42] [CLEANUP] Removed 0 video views
[07:57:42] [CLEANUP] Removed 0 feed scroll views
[07:57:42] [CLEANUP] Removed 0 status labels
[07:57:42] [CLEANUP] Reset agent query state
[07:57:42] [CLEANUP] Updated page indicator
[07:57:42] [CLEANUP] Rebuilt video layout
[07:57:42] [CLEANUP] ✅ All agent connections and views cleaned up
[07:57:42] [CLEANUP] ========================================
[07:57:42] [SERVER] Skipping reconnect polling - app is in background
[07:57:42] [CLEANUP] ========================================
[07:57:42] [CLEANUP] Cleaning up all agent connections and views
[07:57:42] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[07:57:42] [CLEANUP] Stopped and removed 0 video connections
[07:57:42] [CLEANUP] Removed 0 video views
[07:57:42] [CLEANUP] Removed 0 feed scroll views
[07:57:42] [CLEANUP] Removed 0 status labels
[07:57:42] [CLEANUP] Reset agent query state
[07:57:42] [CLEANUP] Updated page indicator
[07:57:42] [CLEANUP] Rebuilt video layout
[07:57:42] [CLEANUP] ✅ All agent connections and views cleaned up
[07:57:42] [CLEANUP] ========================================
[07:57:42] [SERVER] Skipping reconnect polling - app is in background
[08:05:22] [NETWORK] Status changed: connected
[08:05:22] [BACKGROUND] Background fetch triggered
[08:05:22] [BACKGROUND] Fetching recent messages for pre-cache
[08:05:22] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:05:22] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:05:22] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[08:05:22] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[08:05:22] [CLIENT_SIG] WebSocket opened
[08:05:22] HELLO → sent (cached token, role=query)
[08:05:22] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[08:05:22] [CLIENT_SIG] Connected! clientId=QqPWAJOQJbA6qOyc
[08:05:22] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[08:05:22] [WS] Query connection failed - cleaning up all agent connections and views
[08:05:22] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[08:05:22] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[08:05:22] [CLEANUP] ========================================
[08:05:22] [CLEANUP] Cleaning up all agent connections and views
[08:05:22] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:05:22] [CLEANUP] Stopped and removed 0 video connections
[08:05:22] [CLEANUP] Removed 0 video views
[08:05:22] [CLEANUP] Removed 0 feed scroll views
[08:05:22] [CLEANUP] Removed 0 status labels
[08:05:22] [CLEANUP] Reset agent query state
[08:05:22] [CLEANUP] Updated page indicator
[08:05:22] [CLEANUP] Rebuilt video layout
[08:05:22] [CLEANUP] ✅ All agent connections and views cleaned up
[08:05:22] [CLEANUP] ========================================
[08:05:22] [SERVER] Skipping reconnect polling - app is in background
[08:05:22] [CLEANUP] ========================================
[08:05:22] [CLEANUP] Cleaning up all agent connections and views
[08:05:22] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:05:22] [CLEANUP] Stopped and removed 0 video connections
[08:05:22] [CLEANUP] Removed 0 video views
[08:05:22] [CLEANUP] Removed 0 feed scroll views
[08:05:22] [CLEANUP] Removed 0 status labels
[08:05:22] [CLEANUP] Reset agent query state
[08:05:22] [CLEANUP] Updated page indicator
[08:05:22] [CLEANUP] Rebuilt video layout
[08:05:22] [CLEANUP] ✅ All agent connections and views cleaned up
[08:05:22] [CLEANUP] ========================================
[08:05:22] [SERVER] Skipping reconnect polling - app is in background
[08:05:22] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[08:05:22] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[08:05:22] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[08:05:22] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[08:05:23] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[08:05:23] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[08:05:23] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:05:23] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:05:23] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[08:05:23] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:05:23] [BACKGROUND] Pre-cached 50 ChatMessage objects for instant display (preserved 0 from push)
[08:05:23] [BACKGROUND] Pre-downloaded 0 thumbnails
[08:05:23] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[08:14:15] [BACKGROUND] Background fetch triggered
[08:14:15] [BACKGROUND] Fetching recent messages for pre-cache
[08:14:15] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:14:15] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:14:15] [NETWORK] Status changed: connected
[08:14:15] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort}
[08:14:15] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[08:14:15] [CLIENT_SIG] Task completed with error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <94A3005B-D9C2-42EF-89D9-284CDACBC5BC>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <94A3005B-D9C2-42EF-89D9-284CDACBC5BC>.<1>}
[08:14:15] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[08:14:15] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[08:14:15] HELLO → sent (cached token, role=query)
[08:14:15] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[08:14:15] [WS] Query connection failed - cleaning up all agent connections and views
[08:14:15] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[08:14:15] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[08:14:15] [CLEANUP] ========================================
[08:14:15] [CLEANUP] Cleaning up all agent connections and views
[08:14:15] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:14:15] [CLEANUP] Stopped and removed 0 video connections
[08:14:15] [CLEANUP] Removed 0 video views
[08:14:15] [CLEANUP] Removed 0 feed scroll views
[08:14:15] [CLEANUP] Removed 0 status labels
[08:14:15] [CLEANUP] Reset agent query state
[08:14:15] [CLEANUP] Updated page indicator
[08:14:15] [CLEANUP] Rebuilt video layout
[08:14:15] [CLEANUP] ✅ All agent connections and views cleaned up
[08:14:15] [CLEANUP] ========================================
[08:14:15] [SERVER] Skipping reconnect polling - app is in background
[08:14:15] [CLEANUP] ========================================
[08:14:15] [CLEANUP] Cleaning up all agent connections and views
[08:14:15] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:14:15] [CLEANUP] Stopped and removed 0 video connections
[08:14:15] [CLEANUP] Removed 0 video views
[08:14:15] [CLEANUP] Removed 0 feed scroll views
[08:14:15] [CLEANUP] Removed 0 status labels
[08:14:15] [CLEANUP] Reset agent query state
[08:14:15] [CLEANUP] Updated page indicator
[08:14:15] [CLEANUP] Rebuilt video layout
[08:14:15] [CLEANUP] ✅ All agent connections and views cleaned up
[08:14:15] [CLEANUP] ========================================
[08:14:15] [SERVER] Skipping reconnect polling - app is in background
[08:14:15] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[08:14:15] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[08:14:15] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[08:14:15] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[08:14:15] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:14:15] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:14:15] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[08:14:15] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:14:15] [BACKGROUND] Pre-cached 50 ChatMessage objects for instant display (preserved 0 from push)
[08:14:15] [BACKGROUND] Pre-downloaded 0 thumbnails
[08:14:15] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[08:14:15] [NETWORK] Status changed: connected
[08:14:16] [NETWORK] Status changed: connected
[08:14:16] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:14:16] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:14:17] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[08:14:17] HELLO → sent (cached token, role=query)
[08:14:17] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[08:14:17] [WS] Query connection failed - cleaning up all agent connections and views
[08:14:17] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[08:14:17] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[08:14:17] [CLEANUP] ========================================
[08:14:17] [CLEANUP] Cleaning up all agent connections and views
[08:14:17] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:14:17] [CLEANUP] Stopped and removed 0 video connections
[08:14:17] [CLEANUP] Removed 0 video views
[08:14:17] [CLEANUP] Removed 0 feed scroll views
[08:14:17] [CLEANUP] Removed 0 status labels
[08:14:17] [CLEANUP] Reset agent query state
[08:14:17] [CLEANUP] Updated page indicator
[08:14:17] [CLEANUP] Rebuilt video layout
[08:14:17] [CLEANUP] ✅ All agent connections and views cleaned up
[08:14:17] [CLEANUP] ========================================
[08:14:17] [SERVER] Skipping reconnect polling - app is in background
[08:14:17] [CLEANUP] ========================================
[08:14:17] [CLEANUP] Cleaning up all agent connections and views
[08:14:17] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:14:17] [CLEANUP] Stopped and removed 0 video connections
[08:14:17] [CLEANUP] Removed 0 video views
[08:14:17] [CLEANUP] Removed 0 feed scroll views
[08:14:17] [CLEANUP] Removed 0 status labels
[08:14:17] [CLEANUP] Reset agent query state
[08:14:17] [CLEANUP] Updated page indicator
[08:14:17] [CLEANUP] Rebuilt video layout
[08:14:17] [CLEANUP] ✅ All agent connections and views cleaned up
[08:14:17] [CLEANUP] ========================================
[08:14:17] [SERVER] Skipping reconnect polling - app is in background
[08:16:48] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:16:48] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:16:48] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[08:16:48] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[08:16:48] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[08:16:48] [LIFECYCLE] App entering foreground - restoring connections
[08:16:48] [CAPTURE] Live-feed protection [app-will-enter-foreground] - fullscreen=false, isCaptured=false, secureReady=true
[08:16:48] [CAPTURE] Refresh overlay [app-will-enter-foreground] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[08:16:48] [PUSH_TRACE] 🔄 FOREGROUND: memory has 50 msgs, IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:16:48] [PUSH_TRACE] 🔄 FOREGROUND: cache has 50 msgs, valid=true, IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:16:48] [LIFECYCLE] Away > 2 minutes (2559s) - will scroll to bottom
[08:16:48] [NETWORK] Status changed: connected
[08:16:48] [UPLOAD_RETRY] No pending uploads to retry
[08:16:48] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[08:16:48] [READBY_OPT] Fetching readBy for 3 unsettled messages (targeted)
[08:16:48] [LIFECYCLE] WebRTC audio re-enabled
[08:16:48] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[08:16:48] [CLIENT_SIG] Skipping connect - app in background (state=2)
[08:16:48] [VIEWER] Reconnecting after background - querying agents
[08:16:48] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=running
[08:16:48] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[08:16:48] [UNSENT_RETRY] Checking for unsent messages...
[08:16:48] [PENDING_UPLOAD] Total pending upload messages: 0
[08:16:48] [UNSENT_RETRY] No unsent messages found
[08:16:48] [CLIENT_SIG] WebSocket opened
[08:16:48] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[08:16:48] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[08:16:48] HELLO → sent (cached token, role=query)
[08:16:48] [CLIENT_SIG] Connected! clientId=z6AmYdC7gpjQoGNB
[08:16:48] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[08:16:48] [WS] Query connection failed - cleaning up all agent connections and views
[08:16:48] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[08:16:48] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[08:16:48] [CLEANUP] ========================================
[08:16:48] [CLEANUP] Cleaning up all agent connections and views
[08:16:48] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:16:48] [CLEANUP] Stopped and removed 0 video connections
[08:16:48] [CLEANUP] Removed 0 video views
[08:16:48] [CLEANUP] Removed 0 feed scroll views
[08:16:48] [CLEANUP] Removed 0 status labels
[08:16:48] [CLEANUP] Reset agent query state
[08:16:48] [CLEANUP] Updated page indicator
[08:16:48] [CLEANUP] Rebuilt video layout
[08:16:48] [CLEANUP] ✅ All agent connections and views cleaned up
[08:16:48] [CLEANUP] ========================================
[08:16:48] [SERVER] Starting reconnect polling (5s interval)
[08:16:48] [CLEANUP] ========================================
[08:16:48] [CLEANUP] Cleaning up all agent connections and views
[08:16:48] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:16:48] [CLEANUP] Stopped and removed 0 video connections
[08:16:48] [CLEANUP] Removed 0 video views
[08:16:48] [CLEANUP] Removed 0 feed scroll views
[08:16:48] [CLEANUP] Removed 0 status labels
[08:16:48] [CLEANUP] Reset agent query state
[08:16:48] [CLEANUP] Updated page indicator
[08:16:48] [CLEANUP] Rebuilt video layout
[08:16:48] [CLEANUP] ✅ All agent connections and views cleaned up
[08:16:48] [CLEANUP] ========================================
[08:16:48] [SERVER] Starting reconnect polling (5s interval)
[08:16:48] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[08:16:48] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[08:16:48] [COMBINED_FETCH] Loaded 3 read receipts, 0 messages with reactions
[08:16:48] [FOREGROUND] Enriched 0/3 unsettled messages with readBy data
[08:16:48] [LIFECYCLE] scrollToBottomIfNeeded time=true, count=50>50=false, maxId=28814>28814=false, shouldScroll=true
[08:16:48] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[08:16:48] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[08:16:48] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[08:16:48] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[08:16:48] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:16:48] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=2731 vccs=0
[08:16:48] [GAP_FIX] maxMessageIdAtBackground=28814, currentMaxLocalId=28814
[08:16:48] [PUSH] handlePollEventsNotification userInfo: [:]
[08:16:48] [PUSH] No message_id in userInfo
[08:16:48] [PUSH] No operation_type in userInfo
[08:16:48] [FAST_REFRESH] Evolution disabled - performing incremental sync
[08:16:48] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=50, IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:16:48] [PUSH_TRACE] 📬 POLL: memory state: count=50, first 10 IDs=[28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:16:48] [FAST_REFRESH] Already have 50 messages in memory
[08:16:48] [FAST_REFRESH] maxMemoryId=28814, maxLocalId=28814
[08:16:48] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[08:16:48] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[08:16:48] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[08:16:48] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[08:16:48] [READBY_OPT] Fetching readBy for 3 unsettled messages (targeted)
[08:16:48] [GAP_FIX] Incremental sync will use since_id=28814 (background max=28814, current DB max=28814)
[08:16:48] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[08:16:48] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28814, maxMemoryId=28814
[08:16:48] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28814
[08:16:49] [COMBINED_FETCH] Loaded 3 read receipts, 0 messages with reactions
[08:16:49] [FAST_REFRESH] Enriched 3/3 unsettled messages with readBy data
[08:16:49] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[08:16:49] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[08:16:49] [INCREMENTAL_SYNC] ✅ No new messages
[08:16:49] [FAST_REFRESH] Incremental sync complete - 50 messages
[08:16:49] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=62
[08:16:49] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28814, 28813, 28812, 28811, 28810]
[08:16:49] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[08:16:49] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:16:49] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[08:16:49] [SCROLL] wasNearBottom=true, threshold=758, offset=3890, contentH=4648, boundsH=758, forceScroll=true
[08:16:49] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[08:16:49] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[08:16:49] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3890, currentOffset=3890
[08:16:49] [SCROLL] Scrolling to 3890, animated=false
[08:16:50] [PIN_AUTH] Correct PIN
[08:16:50] [SECURITY] Restored real session: ILUIWU
[08:16:50] [SECURITY] Restored real session: ILUIWU
[08:16:50] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:16:50] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:16:50] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[08:16:50] HELLO → sent (cached token, role=query)
[08:16:50] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[08:16:50] [WS] Query connection failed - cleaning up all agent connections and views
[08:16:50] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[08:16:50] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[08:16:50] [CLEANUP] ========================================
[08:16:50] [CLEANUP] Cleaning up all agent connections and views
[08:16:50] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:16:50] [CLEANUP] Stopped and removed 0 video connections
[08:16:50] [CLEANUP] Removed 0 video views
[08:16:50] [CLEANUP] Removed 0 feed scroll views
[08:16:50] [CLEANUP] Removed 0 status labels
[08:16:50] [CLEANUP] Reset agent query state
[08:16:50] [CLEANUP] Updated page indicator
[08:16:50] [CLEANUP] Rebuilt video layout
[08:16:50] [CLEANUP] ✅ All agent connections and views cleaned up
[08:16:50] [CLEANUP] ========================================
[08:16:50] [SERVER] Starting reconnect polling (5s interval)
[08:16:50] [CLEANUP] ========================================
[08:16:50] [CLEANUP] Cleaning up all agent connections and views
[08:16:50] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:16:50] [CLEANUP] Stopped and removed 0 video connections
[08:16:50] [CLEANUP] Removed 0 video views
[08:16:50] [CLEANUP] Removed 0 feed scroll views
[08:16:50] [CLEANUP] Removed 0 status labels
[08:16:50] [CLEANUP] Reset agent query state
[08:16:50] [CLEANUP] Updated page indicator
[08:16:50] [CLEANUP] Rebuilt video layout
[08:16:50] [CLEANUP] ✅ All agent connections and views cleaned up
[08:16:50] [CLEANUP] ========================================
[08:16:50] [SERVER] Starting reconnect polling (5s interval)
[08:16:50] [LOCK] ✅ PIN auth callback - setting isAuthenticated = true
[08:16:50] [FAKE_AI] cancel() called, wasRunning=false
[08:16:50] [FAKE MODE] Exiting fake mode, restoring real session
[08:16:50] [SECURITY] Restored real session: ILUIWU
[08:16:50] [SECURITY] Saved real session: ILUIWU
[08:16:50] [FAKE MODE] ✅ Restored real session: ILUIWU
[08:16:50] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[08:16:50] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[08:16:50] [FAKE MODE] Loaded 50 messages (limited to page size)
[08:16:50] [READBY_OPT] Fetching readBy for 3 unsettled messages (targeted)
[08:16:50] [AUTH] Authentication completed - updating UI only (data already fetched in foreground handler)
[08:16:50] [AUTH] Cache had 50 messages, maxExistingId=28814, inserted 0 truly new
[08:16:50] [LIFECYCLE] scrollToBottomIfNeeded time=false, count=50>50=false, maxId=28814>28814=false, shouldScroll=false
[08:16:50] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[08:16:50] [AUTH] UI update complete
[08:16:50] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=completed
[08:16:50] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[08:16:50] [USER] ✅ User registered successfully
[08:16:50] [PUSH] User registration after token update: success
[08:16:50] [COMBINED_FETCH] Loaded 3 read receipts, 0 messages with reactions
[08:16:50] [FAKE MODE] Enriched 3/3 unsettled messages with readBy data
[08:16:50] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[08:16:50] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[08:16:50] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=122
[08:16:50] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28814, 28813, 28812, 28811, 28810]
[08:16:50] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[08:16:50] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806, 28805]
[08:16:50] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[08:16:50] [SCROLL] wasNearBottom=true, threshold=758, offset=3890, contentH=4648, boundsH=758, forceScroll=true
[08:16:50] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[08:16:50] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[08:16:50] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3890, currentOffset=3890
[08:16:50] [SCROLL] Scrolling to 3890, animated=false
[08:16:51] [NETWORK] Status changed: connected
[08:16:51] [SCROLL] 💓 alive, visible=43...51, rows=52, estHeight=0.0, heightCalls=61
[08:16:51] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:16:51] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:16:52] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[08:16:52] HELLO → sent (cached token, role=query)
[08:16:52] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[08:16:52] [WS] Query connection failed - cleaning up all agent connections and views
[08:16:52] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[08:16:52] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[08:16:52] [CLEANUP] ========================================
[08:16:52] [CLEANUP] Cleaning up all agent connections and views
[08:16:52] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:16:52] [CLEANUP] Stopped and removed 0 video connections
[08:16:52] [CLEANUP] Removed 0 video views
[08:16:52] [CLEANUP] Removed 0 feed scroll views
[08:16:52] [CLEANUP] Removed 0 status labels
[08:16:52] [CLEANUP] Reset agent query state
[08:16:52] [CLEANUP] Updated page indicator
[08:16:52] [CLEANUP] Rebuilt video layout
[08:16:52] [CLEANUP] ✅ All agent connections and views cleaned up
[08:16:52] [CLEANUP] ========================================
[08:16:52] [SERVER] Starting reconnect polling (5s interval)
[08:16:52] [CLEANUP] ========================================
[08:16:52] [CLEANUP] Cleaning up all agent connections and views
[08:16:52] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:16:52] [CLEANUP] Stopped and removed 0 video connections
[08:16:52] [CLEANUP] Removed 0 video views
[08:16:52] [CLEANUP] Removed 0 feed scroll views
[08:16:52] [CLEANUP] Removed 0 status labels
[08:16:52] [CLEANUP] Reset agent query state
[08:16:52] [CLEANUP] Updated page indicator
[08:16:52] [CLEANUP] Rebuilt video layout
[08:16:52] [CLEANUP] ✅ All agent connections and views cleaned up
[08:16:52] [CLEANUP] ========================================
[08:16:52] [SERVER] Starting reconnect polling (5s interval)
[08:16:53] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:16:53] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:16:53] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[08:16:53] HELLO → sent (cached token, role=query)
[08:16:53] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[08:16:53] [WS] Query connection failed - cleaning up all agent connections and views
[08:16:53] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[08:16:53] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[08:16:53] [CLEANUP] ========================================
[08:16:53] [CLEANUP] Cleaning up all agent connections and views
[08:16:53] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:16:53] [CLEANUP] Stopped and removed 0 video connections
[08:16:53] [CLEANUP] Removed 0 video views
[08:16:53] [CLEANUP] Removed 0 feed scroll views
[08:16:53] [CLEANUP] Removed 0 status labels
[08:16:53] [CLEANUP] Reset agent query state
[08:16:53] [CLEANUP] Updated page indicator
[08:16:53] [CLEANUP] Rebuilt video layout
[08:16:53] [CLEANUP] ✅ All agent connections and views cleaned up
[08:16:53] [CLEANUP] ========================================
[08:16:53] [SERVER] Starting reconnect polling (5s interval)
[08:16:53] [CLEANUP] ========================================
[08:16:53] [CLEANUP] Cleaning up all agent connections and views
[08:16:53] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:16:53] [CLEANUP] Stopped and removed 0 video connections
[08:16:53] [CLEANUP] Removed 0 video views
[08:16:53] [CLEANUP] Removed 0 feed scroll views
[08:16:53] [CLEANUP] Removed 0 status labels
[08:16:53] [CLEANUP] Reset agent query state
[08:16:53] [CLEANUP] Updated page indicator
[08:16:53] [CLEANUP] Rebuilt video layout
[08:16:53] [CLEANUP] ✅ All agent connections and views cleaned up
[08:16:53] [CLEANUP] ========================================
[08:16:53] [SERVER] Starting reconnect polling (5s interval)
[08:16:54] [NETWORK] Status changed: connected
[08:16:55] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:16:55] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:16:55] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[08:16:55] HELLO → sent (cached token, role=query)
[08:16:55] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[08:16:55] [WS] Query connection failed - cleaning up all agent connections and views
[08:16:55] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[08:16:55] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[08:16:55] [CLEANUP] ========================================
[08:16:55] [CLEANUP] Cleaning up all agent connections and views
[08:16:55] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:16:55] [CLEANUP] Stopped and removed 0 video connections
[08:16:55] [CLEANUP] Removed 0 video views
[08:16:55] [CLEANUP] Removed 0 feed scroll views
[08:16:55] [CLEANUP] Removed 0 status labels
[08:16:55] [CLEANUP] Reset agent query state
[08:16:55] [CLEANUP] Updated page indicator
[08:16:55] [CLEANUP] Rebuilt video layout
[08:16:55] [CLEANUP] ✅ All agent connections and views cleaned up
[08:16:55] [CLEANUP] ========================================
[08:16:55] [SERVER] Starting reconnect polling (5s interval)
[08:16:55] [CLEANUP] ========================================
[08:16:55] [CLEANUP] Cleaning up all agent connections and views
[08:16:55] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:16:55] [CLEANUP] Stopped and removed 0 video connections
[08:16:55] [CLEANUP] Removed 0 video views
[08:16:55] [CLEANUP] Removed 0 feed scroll views
[08:16:55] [CLEANUP] Removed 0 status labels
[08:16:55] [CLEANUP] Reset agent query state
[08:16:55] [CLEANUP] Updated page indicator
[08:16:55] [CLEANUP] Rebuilt video layout
[08:16:55] [CLEANUP] ✅ All agent connections and views cleaned up
[08:16:55] [CLEANUP] ========================================
[08:16:55] [SERVER] Starting reconnect polling (5s interval)
[08:16:56] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[08:16:56] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=50, isReloading=false
[08:16:56] [SEND_MESSAGE] ✅ Added optimistic message id=-4 to arrays, newMsgCount=51
[08:16:56] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[08:16:56] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[-4, 28814, 28813, 28812, 28811]
[08:16:56] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[08:16:56] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-4, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[08:16:56] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[08:16:56] [SCROLL] wasNearBottom=true, threshold=447, offset=4201, contentH=4648, boundsH=447, forceScroll=false
[08:16:56] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[08:16:56] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[08:16:56] [SCROLL] 💓 alive, visible=46...52, rows=53, estHeight=0.0, heightCalls=114
[08:16:56] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[08:16:56] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[08:16:56] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4253, currentOffset=4253
[08:16:56] [SCROLL] Scrolling to 4253, animated=true
[08:16:56] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:16:56] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:16:56] [CLIENT_SIG] Event received: type=0 messageId=28815
[08:16:56] [WS_EVENT] Received event: type=0, messageId=28815
[08:16:56] [WS_EVENT] 📨 New message notification (msgId=28815) - triggering incremental refresh, currentMsgCount=51
[08:16:56] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[08:16:56] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28814, maxMemoryId=28814
[08:16:56] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28814
[08:16:56] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[08:16:56] HELLO → sent (cached token, role=query)
[08:16:56] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28815,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 06:16:56"}
[08:16:56] [CHAT] receive_message.php JSON: ["datesent_utc": 2026-04-23 06:16:56, "session_id": ILUIWU, "file_name": , "message_id": 28815, "message_type": 0, "ok": 1]
[08:16:56] [DB_UPGRADE] Upgrading message ID: -4 → 28815, preserveOriginalDate=false
[08:16:56] [DB_UPGRADE] ✅ Upgraded -4 → 28815 with send_status=0, 1 row(s) affected
[08:16:56] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -4 → 28815
[08:16:56] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -4 → 28815
[08:16:56] ReloadData 9
[08:16:56] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[08:16:56] [WS] Query connection failed - cleaning up all agent connections and views
[08:16:56] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[08:16:56] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[08:16:56] [CLEANUP] ========================================
[08:16:56] [CLEANUP] Cleaning up all agent connections and views
[08:16:56] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:16:56] [CLEANUP] Stopped and removed 0 video connections
[08:16:56] [CLEANUP] Removed 0 video views
[08:16:56] [CLEANUP] Removed 0 feed scroll views
[08:16:56] [CLEANUP] Removed 0 status labels
[08:16:56] [CLEANUP] Reset agent query state
[08:16:56] [CLEANUP] Updated page indicator
[08:16:56] [CLEANUP] Rebuilt video layout
[08:16:56] [CLEANUP] ✅ All agent connections and views cleaned up
[08:16:56] [CLEANUP] ========================================
[08:16:56] [SERVER] Starting reconnect polling (5s interval)
[08:16:56] [CLEANUP] ========================================
[08:16:56] [CLEANUP] Cleaning up all agent connections and views
[08:16:56] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:16:56] [CLEANUP] Stopped and removed 0 video connections
[08:16:56] [CLEANUP] Removed 0 video views
[08:16:56] [CLEANUP] Removed 0 feed scroll views
[08:16:56] [CLEANUP] Removed 0 status labels
[08:16:56] [CLEANUP] Reset agent query state
[08:16:56] [CLEANUP] Updated page indicator
[08:16:56] [CLEANUP] Rebuilt video layout
[08:16:56] [CLEANUP] ✅ All agent connections and views cleaned up
[08:16:56] [CLEANUP] ========================================
[08:16:56] [SERVER] Starting reconnect polling (5s interval)
[08:16:56] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[08:16:56] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28815]
[08:16:56] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[08:16:56] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[08:16:56] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[08:16:56] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[08:16:56] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[08:16:57] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=60
[08:16:57] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28815, 28814, 28813, 28812, 28811]
[08:16:57] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[08:16:57] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[08:16:57] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[08:16:57] [SCROLL] wasNearBottom=true, threshold=447, offset=4253, contentH=4700, boundsH=447, forceScroll=true
[08:16:57] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[08:16:57] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[08:16:57] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4253, currentOffset=4253
[08:16:57] [SCROLL] Scrolling to 4253, animated=false
[08:16:57] [NETWORK] Status changed: connected
[08:16:58] [LOG-KB] textViewShouldEndEditing: isInputField=true, allowKeyboardDismiss=true, returning=true, textView=<Eye.PastingTextView: 0x11ac70000; baseClass = UITextView; frame = (44 8; 320 36
[08:16:58] [SCROLL] 💓 alive, visible=43...52, rows=53, estHeight=0.0, heightCalls=60
[08:16:58] [LOG-KB] textViewDidEndEditing: isInputField=true, resetting allowKeyboardDismiss to false
[08:16:58] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:16:58] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:16:58] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[08:16:58] HELLO → sent (cached token, role=query)
[08:16:58] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[08:16:58] [WS] Query connection failed - cleaning up all agent connections and views
[08:16:58] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[08:16:58] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[08:16:58] [CLEANUP] ========================================
[08:16:58] [CLEANUP] Cleaning up all agent connections and views
[08:16:58] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:16:58] [CLEANUP] Stopped and removed 0 video connections
[08:16:58] [CLEANUP] Removed 0 video views
[08:16:58] [CLEANUP] Removed 0 feed scroll views
[08:16:58] [CLEANUP] Removed 0 status labels
[08:16:58] [CLEANUP] Reset agent query state
[08:16:58] [CLEANUP] Updated page indicator
[08:16:58] [CLEANUP] Rebuilt video layout
[08:16:58] [CLEANUP] ✅ All agent connections and views cleaned up
[08:16:58] [CLEANUP] ========================================
[08:16:58] [SERVER] Starting reconnect polling (5s interval)
[08:16:58] [CLEANUP] ========================================
[08:16:58] [CLEANUP] Cleaning up all agent connections and views
[08:16:58] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:16:58] [CLEANUP] Stopped and removed 0 video connections
[08:16:58] [CLEANUP] Removed 0 video views
[08:16:58] [CLEANUP] Removed 0 feed scroll views
[08:16:58] [CLEANUP] Removed 0 status labels
[08:16:58] [CLEANUP] Reset agent query state
[08:16:58] [CLEANUP] Updated page indicator
[08:16:58] [CLEANUP] Rebuilt video layout
[08:16:58] [CLEANUP] ✅ All agent connections and views cleaned up
[08:16:58] [CLEANUP] ========================================
[08:16:58] [SERVER] Starting reconnect polling (5s interval)
[08:16:58] [LOCK] Lock button tapped - locking app immediately
[08:16:58] [LOCK] Received lock app notification
[08:17:00] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:17:00] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:17:00] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[08:17:00] HELLO → sent (cached token, role=query)
[08:17:00] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[08:17:00] [WS] Query connection failed - cleaning up all agent connections and views
[08:17:00] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[08:17:00] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[08:17:00] [CLEANUP] ========================================
[08:17:00] [CLEANUP] Cleaning up all agent connections and views
[08:17:00] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:17:00] [CLEANUP] Stopped and removed 0 video connections
[08:17:00] [CLEANUP] Removed 0 video views
[08:17:00] [CLEANUP] Removed 0 feed scroll views
[08:17:00] [CLEANUP] Removed 0 status labels
[08:17:00] [CLEANUP] Reset agent query state
[08:17:00] [CLEANUP] Updated page indicator
[08:17:00] [CLEANUP] Rebuilt video layout
[08:17:00] [CLEANUP] ✅ All agent connections and views cleaned up
[08:17:00] [CLEANUP] ========================================
[08:17:00] [SERVER] Starting reconnect polling (5s interval)
[08:17:00] [CLEANUP] ========================================
[08:17:00] [CLEANUP] Cleaning up all agent connections and views
[08:17:00] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:17:00] [CLEANUP] Stopped and removed 0 video connections
[08:17:00] [CLEANUP] Removed 0 video views
[08:17:00] [CLEANUP] Removed 0 feed scroll views
[08:17:00] [CLEANUP] Removed 0 status labels
[08:17:00] [CLEANUP] Reset agent query state
[08:17:00] [CLEANUP] Updated page indicator
[08:17:00] [CLEANUP] Rebuilt video layout
[08:17:00] [CLEANUP] ✅ All agent connections and views cleaned up
[08:17:00] [CLEANUP] ========================================
[08:17:00] [SERVER] Starting reconnect polling (5s interval)
[08:17:00] [LIFECYCLE] App resigning active - cleared crash flag
[08:17:00] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[08:17:00] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[08:17:00] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[08:17:00] [LIFECYCLE] App entering background - cleared crash flag
[08:17:00] [CLIENT_SIG] Disconnecting
[08:17:00] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[08:17:00] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[08:17:00] [PUSH_TRACE] 💤 BACKGROUND: memory has 51 messages, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[08:17:00] [LIFECYCLE] Background snapshot: count=51, maxId=28815
[08:17:00] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=3
[08:17:00] [WS] Canceling WebSocket for query connection to iosILUIWU
[08:17:00] In cleanupPeer
[08:17:00] In cleanupPeer
[08:17:00] [LIFECYCLE] WebRTC audio disabled
[08:17:00] [LIFECYCLE] AVAudioSession deactivated
[08:17:00] [LIFECYCLE] All connections stopped
[08:17:00] [CLIENT_SIG] WebSocket closed with code 1001
[08:17:00] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[08:17:00] [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/}
[08:17:00] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[08:17:00] [SERVER] Stopped reconnect polling
[08:17:00] [WS] URLSession invalidated successfully
[08:17:00] Will request stop of video 0
[08:17:00] Will request stop of video 0
[08:17:00] [PIP] Removing 0 tracks from PiP for connection 0
[08:17:00] [PIP] ✅ All tracks removed for connection 0
[08:17:00] [PIP] Removing 0 tracks from PiP for connection 0
[08:17:00] [PIP] ✅ All tracks removed for connection 0
[08:17:00] [NETWORK] Status changed: connected
[08:33:47] [NETWORK] Status changed: connected
[08:33:47] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:33:47] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:33:47] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[08:33:47] [CLIENT_SIG] WebSocket opened
[08:33:47] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[08:33:47] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[08:33:47] HELLO → sent (cached token, role=query)
[08:33:47] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[08:33:47] [WS] Query connection failed - cleaning up all agent connections and views
[08:33:47] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[08:33:47] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[08:33:47] [CLEANUP] ========================================
[08:33:47] [CLEANUP] Cleaning up all agent connections and views
[08:33:47] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:33:47] [CLEANUP] Stopped and removed 0 video connections
[08:33:47] [CLEANUP] Removed 0 video views
[08:33:47] [CLEANUP] Removed 0 feed scroll views
[08:33:47] [CLEANUP] Removed 0 status labels
[08:33:47] [CLEANUP] Reset agent query state
[08:33:47] [CLEANUP] Updated page indicator
[08:33:47] [CLEANUP] Rebuilt video layout
[08:33:47] [CLEANUP] ✅ All agent connections and views cleaned up
[08:33:47] [CLEANUP] ========================================
[08:33:47] [SERVER] Skipping reconnect polling - app is in background
[08:33:47] [CLEANUP] ========================================
[08:33:47] [CLEANUP] Cleaning up all agent connections and views
[08:33:47] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:33:47] [CLEANUP] Stopped and removed 0 video connections
[08:33:47] [CLEANUP] Removed 0 video views
[08:33:47] [CLEANUP] Removed 0 feed scroll views
[08:33:47] [CLEANUP] Removed 0 status labels
[08:33:47] [CLEANUP] Reset agent query state
[08:33:47] [CLEANUP] Updated page indicator
[08:33:47] [CLEANUP] Rebuilt video layout
[08:33:47] [CLEANUP] ✅ All agent connections and views cleaned up
[08:33:47] [CLEANUP] ========================================
[08:33:47] [SERVER] Skipping reconnect polling - app is in background
[08:33:47] [CLIENT_SIG] Connected! clientId=QsesMT4KuANRKsTa
[08:33:47] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[08:33:47] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[08:34:28] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[08:34:28] [LAST_SEEN] Fetch error: The request timed out.
[08:34:28] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[08:34:28] [LIFECYCLE] App entering foreground - restoring connections
[08:34:28] [CAPTURE] Live-feed protection [app-will-enter-foreground] - fullscreen=false, isCaptured=false, secureReady=true
[08:34:28] [CAPTURE] Refresh overlay [app-will-enter-foreground] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[08:34:28] [PUSH_TRACE] 🔄 FOREGROUND: memory has 51 msgs, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[08:34:28] [PUSH_TRACE] 🔄 FOREGROUND: cache has 0 msgs, valid=false, IDs=[]
[08:34:28] [LIFECYCLE] Away > 2 minutes (1048s) - will scroll to bottom
[08:34:28] [NETWORK] Status changed: connected
[08:34:28] [UPLOAD_RETRY] No pending uploads to retry
[08:34:28] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[08:34:28] [READBY_OPT] Fetching readBy for 4 unsettled messages (targeted)
[08:34:28] [LIFECYCLE] WebRTC audio re-enabled
[08:34:28] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[08:34:28] [CLIENT_SIG] Skipping connect - app in background (state=2)
[08:34:28] [VIEWER] Reconnecting after background - querying agents
[08:34:28] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=completed
[08:34:28] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[08:34:28] [UNSENT_RETRY] Checking for unsent messages...
[08:34:28] [PENDING_UPLOAD] Total pending upload messages: 0
[08:34:28] [UNSENT_RETRY] No unsent messages found
[08:34:28] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:34:28] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:34:28] [CLIENT_SIG] Task completed with error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <79C1D102-77E5-4A24-A4E7-D5A9E7731CC7>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <79C1D102-77E5-4A24-A4E7-D5A9E7731CC7>.<1>, NSLocalizedDescription=The network connection was lost.}
[08:34:28] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[08:34:28] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=89 "Operation canceled" UserInfo={NSDescription=Operation canceled}
[08:34:28] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[08:34:28] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[08:34:28] HELLO → sent (cached token, role=query)
[08:34:28] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[08:34:28] [WS] Query connection failed - cleaning up all agent connections and views
[08:34:28] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[08:34:28] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[08:34:28] [CLEANUP] ========================================
[08:34:28] [CLEANUP] Cleaning up all agent connections and views
[08:34:28] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:34:28] [CLEANUP] Stopped and removed 0 video connections
[08:34:28] [CLEANUP] Removed 0 video views
[08:34:28] [CLEANUP] Removed 0 feed scroll views
[08:34:28] [CLEANUP] Removed 0 status labels
[08:34:28] [CLEANUP] Reset agent query state
[08:34:28] [CLEANUP] Updated page indicator
[08:34:28] [CLEANUP] Rebuilt video layout
[08:34:28] [CLEANUP] ✅ All agent connections and views cleaned up
[08:34:28] [CLEANUP] ========================================
[08:34:28] [SERVER] Starting reconnect polling (5s interval)
[08:34:28] [CLEANUP] ========================================
[08:34:28] [CLEANUP] Cleaning up all agent connections and views
[08:34:28] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:34:28] [CLEANUP] Stopped and removed 0 video connections
[08:34:28] [CLEANUP] Removed 0 video views
[08:34:28] [CLEANUP] Removed 0 feed scroll views
[08:34:28] [CLEANUP] Removed 0 status labels
[08:34:28] [CLEANUP] Reset agent query state
[08:34:28] [CLEANUP] Updated page indicator
[08:34:28] [CLEANUP] Rebuilt video layout
[08:34:28] [CLEANUP] ✅ All agent connections and views cleaned up
[08:34:28] [CLEANUP] ========================================
[08:34:28] [SERVER] Starting reconnect polling (5s interval)
[08:34:28] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=3
[08:34:28] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28815, 28814, 28813, 28812, 28811]
[08:34:28] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[08:34:28] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[08:34:28] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[08:34:28] [SCROLL] wasNearBottom=true, threshold=758, offset=3942, contentH=4700, boundsH=758, forceScroll=false
[08:34:28] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[08:34:28] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[08:34:28] [COMBINED_FETCH] Loaded 4 read receipts, 0 messages with reactions
[08:34:28] [FOREGROUND] Enriched 0/4 unsettled messages with readBy data
[08:34:28] [LIFECYCLE] scrollToBottomIfNeeded time=true, count=51>51=false, maxId=28815>28815=false, shouldScroll=true
[08:34:28] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[08:34:28] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[08:34:28] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28815, 28814, 28813, 28812, 28811]
[08:34:28] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[08:34:28] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[08:34:28] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[08:34:28] [SCROLL] wasNearBottom=true, threshold=758, offset=3942, contentH=4700, boundsH=758, forceScroll=true
[08:34:28] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[08:34:28] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=63
[08:34:28] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3942, currentOffset=3942
[08:34:28] [SCROLL] Scrolling to 3942, animated=false
[08:34:29] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[08:34:29] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[08:34:29] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[08:34:29] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=3791 vccs=0
[08:34:29] [GAP_FIX] maxMessageIdAtBackground=28815, currentMaxLocalId=28815
[08:34:29] [PUSH] handlePollEventsNotification userInfo: [:]
[08:34:29] [PUSH] No message_id in userInfo
[08:34:29] [PUSH] No operation_type in userInfo
[08:34:29] [FAST_REFRESH] Evolution disabled - performing incremental sync
[08:34:29] [PUSH_TRACE] 📬 POLL: cache state: valid=false, count=0, IDs=[]
[08:34:29] [PUSH_TRACE] 📬 POLL: memory state: count=51, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[08:34:29] [FAST_REFRESH] Already have 51 messages in memory
[08:34:29] [FAST_REFRESH] maxMemoryId=28815, maxLocalId=28815
[08:34:29] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[08:34:29] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[08:34:29] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[08:34:29] [READBY_OPT] Fetching readBy for 4 unsettled messages (targeted)
[08:34:29] [GAP_FIX] Incremental sync will use since_id=28815 (background max=28815, current DB max=28815)
[08:34:29] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[08:34:29] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28815, maxMemoryId=28815
[08:34:29] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28815
[08:34:29] [COMBINED_FETCH] Loaded 4 read receipts, 0 messages with reactions
[08:34:29] [FAST_REFRESH] Enriched 4/4 unsettled messages with readBy data
[08:34:29] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[08:34:29] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[08:34:29] [INCREMENTAL_SYNC] ✅ No new messages
[08:34:29] [FAST_REFRESH] Incremental sync complete - 51 messages
[08:34:29] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=63
[08:34:29] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28815, 28814, 28813, 28812, 28811]
[08:34:29] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[08:34:29] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[08:34:29] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[08:34:29] [SCROLL] wasNearBottom=true, threshold=758, offset=3942, contentH=4700, boundsH=758, forceScroll=true
[08:34:29] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[08:34:29] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=63
[08:34:29] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3942, currentOffset=3942
[08:34:29] [SCROLL] Scrolling to 3942, animated=false
[08:34:30] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:34:30] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:34:30] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[08:34:30] HELLO → sent (cached token, role=query)
[08:34:30] [PIN_AUTH] Correct PIN
[08:34:30] [SECURITY] Restored real session: ILUIWU
[08:34:30] [SECURITY] Restored real session: ILUIWU
[08:34:30] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[08:34:30] [WS] Query connection failed - cleaning up all agent connections and views
[08:34:30] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[08:34:30] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[08:34:30] [CLEANUP] ========================================
[08:34:30] [CLEANUP] Cleaning up all agent connections and views
[08:34:30] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:34:30] [CLEANUP] Stopped and removed 0 video connections
[08:34:30] [CLEANUP] Removed 0 video views
[08:34:30] [CLEANUP] Removed 0 feed scroll views
[08:34:30] [CLEANUP] Removed 0 status labels
[08:34:30] [CLEANUP] Reset agent query state
[08:34:30] [CLEANUP] Updated page indicator
[08:34:30] [CLEANUP] Rebuilt video layout
[08:34:30] [CLEANUP] ✅ All agent connections and views cleaned up
[08:34:30] [CLEANUP] ========================================
[08:34:30] [SERVER] Starting reconnect polling (5s interval)
[08:34:30] [CLEANUP] ========================================
[08:34:30] [CLEANUP] Cleaning up all agent connections and views
[08:34:30] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:34:30] [CLEANUP] Stopped and removed 0 video connections
[08:34:30] [CLEANUP] Removed 0 video views
[08:34:30] [CLEANUP] Removed 0 feed scroll views
[08:34:30] [CLEANUP] Removed 0 status labels
[08:34:30] [CLEANUP] Reset agent query state
[08:34:30] [CLEANUP] Updated page indicator
[08:34:30] [CLEANUP] Rebuilt video layout
[08:34:30] [CLEANUP] ✅ All agent connections and views cleaned up
[08:34:30] [CLEANUP] ========================================
[08:34:30] [SERVER] Starting reconnect polling (5s interval)
[08:34:30] [LOCK] ✅ PIN auth callback - setting isAuthenticated = true
[08:34:30] [FAKE_AI] cancel() called, wasRunning=false
[08:34:30] [FAKE MODE] Exiting fake mode, restoring real session
[08:34:30] [SECURITY] Restored real session: ILUIWU
[08:34:30] [SECURITY] Saved real session: ILUIWU
[08:34:30] [FAKE MODE] ✅ Restored real session: ILUIWU
[08:34:30] [FAKE MODE] Loaded 50 messages (limited to page size)
[08:34:30] [READBY_OPT] Fetching readBy for 4 unsettled messages (targeted)
[08:34:30] [AUTH] Authentication completed - updating UI only (data already fetched in foreground handler)
[08:34:30] [LIFECYCLE] scrollToBottomIfNeeded time=false, count=50>51=false, maxId=28815>28815=false, shouldScroll=false
[08:34:30] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[08:34:30] [AUTH] UI update complete
[08:34:30] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=completed
[08:34:30] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[08:34:30] [SCROLL] 💓 alive, visible=42...51, rows=52, estHeight=0.0, heightCalls=125
[08:34:30] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[08:34:30] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[08:34:30] [COMBINED_FETCH] Loaded 4 read receipts, 0 messages with reactions
[08:34:30] [FAKE MODE] Enriched 4/4 unsettled messages with readBy data
[08:34:30] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[08:34:30] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[08:34:30] [USER] ✅ User registered successfully
[08:34:30] [PUSH] User registration after token update: success
[08:34:30] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[08:34:30] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28815, 28814, 28813, 28812, 28811]
[08:34:30] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[08:34:30] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[08:34:30] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[08:34:30] [SCROLL] wasNearBottom=true, threshold=758, offset=3865, contentH=4623, boundsH=758, forceScroll=true
[08:34:30] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[08:34:30] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=62
[08:34:30] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3865, currentOffset=3865
[08:34:30] [SCROLL] Scrolling to 3865, animated=false
[08:34:31] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:34:31] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:34:31] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[08:34:31] HELLO → sent (cached token, role=query)
[08:34:31] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[08:34:31] [WS] Query connection failed - cleaning up all agent connections and views
[08:34:31] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[08:34:31] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[08:34:31] [CLEANUP] ========================================
[08:34:31] [CLEANUP] Cleaning up all agent connections and views
[08:34:31] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:34:31] [CLEANUP] Stopped and removed 0 video connections
[08:34:31] [CLEANUP] Removed 0 video views
[08:34:31] [CLEANUP] Removed 0 feed scroll views
[08:34:31] [CLEANUP] Removed 0 status labels
[08:34:31] [CLEANUP] Reset agent query state
[08:34:31] [CLEANUP] Updated page indicator
[08:34:31] [CLEANUP] Rebuilt video layout
[08:34:31] [CLEANUP] ✅ All agent connections and views cleaned up
[08:34:31] [CLEANUP] ========================================
[08:34:31] [SERVER] Starting reconnect polling (5s interval)
[08:34:31] [CLEANUP] ========================================
[08:34:31] [CLEANUP] Cleaning up all agent connections and views
[08:34:31] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:34:31] [CLEANUP] Stopped and removed 0 video connections
[08:34:31] [CLEANUP] Removed 0 video views
[08:34:31] [CLEANUP] Removed 0 feed scroll views
[08:34:31] [CLEANUP] Removed 0 status labels
[08:34:31] [CLEANUP] Reset agent query state
[08:34:31] [CLEANUP] Updated page indicator
[08:34:31] [CLEANUP] Rebuilt video layout
[08:34:31] [CLEANUP] ✅ All agent connections and views cleaned up
[08:34:31] [CLEANUP] ========================================
[08:34:31] [SERVER] Starting reconnect polling (5s interval)
[08:34:32] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[08:34:32] [CLIENT_SIG] WebSocket opened
[08:34:32] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[08:34:32] [CLIENT_SIG] Connected! clientId=p1xjFMH53px7jrRX
[08:34:32] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[08:34:32] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[08:34:33] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:34:33] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:34:33] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[08:34:33] HELLO → sent (cached token, role=query)
[08:34:33] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[08:34:33] [WS] Query connection failed - cleaning up all agent connections and views
[08:34:33] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[08:34:33] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[08:34:33] [CLEANUP] ========================================
[08:34:33] [CLEANUP] Cleaning up all agent connections and views
[08:34:33] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:34:33] [CLEANUP] Stopped and removed 0 video connections
[08:34:33] [CLEANUP] Removed 0 video views
[08:34:33] [CLEANUP] Removed 0 feed scroll views
[08:34:33] [CLEANUP] Removed 0 status labels
[08:34:33] [CLEANUP] Reset agent query state
[08:34:33] [CLEANUP] Updated page indicator
[08:34:33] [CLEANUP] Rebuilt video layout
[08:34:33] [CLEANUP] ✅ All agent connections and views cleaned up
[08:34:33] [CLEANUP] ========================================
[08:34:33] [SERVER] Starting reconnect polling (5s interval)
[08:34:33] [CLEANUP] ========================================
[08:34:33] [CLEANUP] Cleaning up all agent connections and views
[08:34:33] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:34:33] [CLEANUP] Stopped and removed 0 video connections
[08:34:33] [CLEANUP] Removed 0 video views
[08:34:33] [CLEANUP] Removed 0 feed scroll views
[08:34:33] [CLEANUP] Removed 0 status labels
[08:34:33] [CLEANUP] Reset agent query state
[08:34:33] [CLEANUP] Updated page indicator
[08:34:33] [CLEANUP] Rebuilt video layout
[08:34:33] [CLEANUP] ✅ All agent connections and views cleaned up
[08:34:33] [CLEANUP] ========================================
[08:34:33] [SERVER] Starting reconnect polling (5s interval)
[08:34:35] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:34:35] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:34:35] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[08:34:35] HELLO → sent (cached token, role=query)
[08:34:35] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[08:34:35] [WS] Query connection failed - cleaning up all agent connections and views
[08:34:35] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[08:34:35] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[08:34:35] [CLEANUP] ========================================
[08:34:35] [CLEANUP] Cleaning up all agent connections and views
[08:34:35] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:34:35] [CLEANUP] Stopped and removed 0 video connections
[08:34:35] [CLEANUP] Removed 0 video views
[08:34:35] [CLEANUP] Removed 0 feed scroll views
[08:34:35] [CLEANUP] Removed 0 status labels
[08:34:35] [CLEANUP] Reset agent query state
[08:34:35] [CLEANUP] Updated page indicator
[08:34:35] [CLEANUP] Rebuilt video layout
[08:34:35] [CLEANUP] ✅ All agent connections and views cleaned up
[08:34:35] [CLEANUP] ========================================
[08:34:35] [SERVER] Starting reconnect polling (5s interval)
[08:34:35] [CLEANUP] ========================================
[08:34:35] [CLEANUP] Cleaning up all agent connections and views
[08:34:35] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:34:35] [CLEANUP] Stopped and removed 0 video connections
[08:34:35] [CLEANUP] Removed 0 video views
[08:34:35] [CLEANUP] Removed 0 feed scroll views
[08:34:35] [CLEANUP] Removed 0 status labels
[08:34:35] [CLEANUP] Reset agent query state
[08:34:35] [CLEANUP] Updated page indicator
[08:34:35] [CLEANUP] Rebuilt video layout
[08:34:35] [CLEANUP] ✅ All agent connections and views cleaned up
[08:34:35] [CLEANUP] ========================================
[08:34:35] [SERVER] Starting reconnect polling (5s interval)
[08:34:35] [LIFECYCLE] App resigning active - cleared crash flag
[08:34:36] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[08:34:36] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[08:34:36] [SECURITY] Saved background timestamp
[08:34:36] [LIFECYCLE] App entering background - cleared crash flag
[08:34:36] [CLIENT_SIG] Disconnecting
[08:34:36] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[08:34:36] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[08:34:36] [PUSH_TRACE] 💤 BACKGROUND: memory has 50 messages, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[08:34:36] [LIFECYCLE] Background snapshot: count=50, maxId=28815
[08:34:36] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=3
[08:34:36] [WS] Canceling WebSocket for query connection to iosILUIWU
[08:34:36] In cleanupPeer
[08:34:36] In cleanupPeer
[08:34:36] [LIFECYCLE] WebRTC audio disabled
[08:34:36] [LIFECYCLE] AVAudioSession deactivated
[08:34:36] [LIFECYCLE] All connections stopped
[08:34:36] [CLIENT_SIG] WebSocket closed with code 1001
[08:34:36] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[08:34:36] [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/}
[08:34:36] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[08:34:36] [SERVER] Stopped reconnect polling
[08:34:36] [WS] URLSession invalidated successfully
[08:34:36] Will request stop of video 0
[08:34:36] Will request stop of video 0
[08:34:36] [PIP] Removing 0 tracks from PiP for connection 0
[08:34:36] [PIP] ✅ All tracks removed for connection 0
[08:34:36] [PIP] Removing 0 tracks from PiP for connection 0
[08:34:36] [PIP] ✅ All tracks removed for connection 0
[08:34:36] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:34:36] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:42:59] [BACKGROUND] Background fetch triggered
[08:42:59] [BACKGROUND] Fetching recent messages for pre-cache
[08:42:59] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[08:42:59] [WS] Connection failed: The request timed out.
[08:42:59] [WS] Query connection failed - cleaning up all agent connections and views
[08:42:59] [WS] WebSocket task completed with error - isQueryOnly=true: The request timed out.
[08:42:59] [WS] Query connection error - cleaning up all agent connections and views
[08:42:59] [CLEANUP] ========================================
[08:42:59] [CLEANUP] Cleaning up all agent connections and views
[08:42:59] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:42:59] [CLEANUP] Stopped and removed 0 video connections
[08:42:59] [CLEANUP] Removed 0 video views
[08:42:59] [CLEANUP] Removed 0 feed scroll views
[08:42:59] [CLEANUP] Removed 0 status labels
[08:42:59] [CLEANUP] Reset agent query state
[08:42:59] [CLEANUP] Updated page indicator
[08:42:59] [CLEANUP] Rebuilt video layout
[08:42:59] [CLEANUP] ✅ All agent connections and views cleaned up
[08:42:59] [NETWORK] Status changed: connected
[08:42:59] [CLEANUP] ========================================
[08:42:59] [SERVER] Skipping reconnect polling - app is in background
[08:42:59] [CLEANUP] ========================================
[08:42:59] [CLEANUP] Cleaning up all agent connections and views
[08:42:59] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:42:59] [CLEANUP] Stopped and removed 0 video connections
[08:42:59] [CLEANUP] Removed 0 video views
[08:42:59] [CLEANUP] Removed 0 feed scroll views
[08:42:59] [CLEANUP] Removed 0 status labels
[08:42:59] [CLEANUP] Reset agent query state
[08:42:59] [CLEANUP] Updated page indicator
[08:42:59] [CLEANUP] Rebuilt video layout
[08:42:59] [CLEANUP] ✅ All agent connections and views cleaned up
[08:42:59] [CLEANUP] ========================================
[08:42:59] [SERVER] Skipping reconnect polling - app is in background
[08:43:00] [CLIENT_SIG] WebSocket opened
[08:43:00] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[08:43:00] [CLIENT_SIG] Connected! clientId=2YGgkCE3aQn_6duQ
[08:43:00] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[08:43:00] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[08:43:00] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[08:43:00] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[08:43:00] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[08:43:00] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[08:43:00] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[08:43:00] [PUSH_TRACE] 🔀 mergeMessages: Different session (nil vs ILUIWU), replacing cache
[08:43:00] [BACKGROUND] Pre-cached 50 ChatMessage objects for instant display (preserved 0 from push)
[08:43:00] [BACKGROUND] Pre-downloaded 0 thumbnails
[08:43:00] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[08:43:01] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:43:01] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:43:01] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[08:43:01] HELLO → sent (cached token, role=query)
[08:43:01] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[08:43:01] [WS] Query connection failed - cleaning up all agent connections and views
[08:43:01] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[08:43:01] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[08:43:01] [CLEANUP] ========================================
[08:43:01] [CLEANUP] Cleaning up all agent connections and views
[08:43:01] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:43:01] [CLEANUP] Stopped and removed 0 video connections
[08:43:01] [CLEANUP] Removed 0 video views
[08:43:01] [CLEANUP] Removed 0 feed scroll views
[08:43:01] [CLEANUP] Removed 0 status labels
[08:43:01] [CLEANUP] Reset agent query state
[08:43:01] [CLEANUP] Updated page indicator
[08:43:01] [CLEANUP] Rebuilt video layout
[08:43:01] [CLEANUP] ✅ All agent connections and views cleaned up
[08:43:01] [CLEANUP] ========================================
[08:43:01] [SERVER] Skipping reconnect polling - app is in background
[08:43:01] [CLEANUP] ========================================
[08:43:01] [CLEANUP] Cleaning up all agent connections and views
[08:43:01] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[08:43:01] [CLEANUP] Stopped and removed 0 video connections
[08:43:01] [CLEANUP] Removed 0 video views
[08:43:01] [CLEANUP] Removed 0 feed scroll views
[08:43:01] [CLEANUP] Removed 0 status labels
[08:43:01] [CLEANUP] Reset agent query state
[08:43:01] [CLEANUP] Updated page indicator
[08:43:01] [CLEANUP] Rebuilt video layout
[08:43:01] [CLEANUP] ✅ All agent connections and views cleaned up
[08:43:01] [CLEANUP] ========================================
[08:43:01] [SERVER] Skipping reconnect polling - app is in background
[08:52:19] [BACKGROUND] Background fetch triggered
[08:52:19] [BACKGROUND] Fetching recent messages for pre-cache
[08:52:19] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[08:52:19] [WS] Opening session at ws://crivello.dyndns.org:8081/
[08:52:19] [BACKGROUND] Background fetch triggered
[08:52:19] [BACKGROUND] Fetching recent messages for pre-cache
[08:52:19] [NETWORK] Status changed: connected
[08:52:19] [CLIENT_SIG] Task completed with error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <A4E2CAD0-9630-454A-A8A8-F1A5000E5CB0>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <A4E2CAD0-9630-454A-A8A8-F1A5000E5CB0>.<1>, NSLocalizedDescription=The network connection was lost.}
[08:52:19] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[08:52:19] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=89 "Operation canceled" UserInfo={NSDescription=Operation canceled}
[08:52:19] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[09:01:39] [BACKGROUND] Background fetch triggered
[09:01:39] [BACKGROUND] Fetching recent messages for pre-cache
[09:01:39] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:01:39] [WS] Connection failed: The request timed out.
[09:01:39] [WS] Query connection failed - cleaning up all agent connections and views
[09:01:39] [WS] WebSocket task completed with error - isQueryOnly=true: The request timed out.
[09:01:39] [WS] Query connection error - cleaning up all agent connections and views
[09:01:39] [CLEANUP] ========================================
[09:01:39] [CLEANUP] Cleaning up all agent connections and views
[09:01:39] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:01:39] [CLEANUP] Stopped and removed 0 video connections
[09:01:39] [CLEANUP] Removed 0 video views
[09:01:39] [CLEANUP] Removed 0 feed scroll views
[09:01:39] [CLEANUP] Removed 0 status labels
[09:01:39] [CLEANUP] Reset agent query state
[09:01:39] [CLEANUP] Updated page indicator
[09:01:39] [CLEANUP] Rebuilt video layout
[09:01:39] [CLEANUP] ✅ All agent connections and views cleaned up
[09:01:39] [CLEANUP] ========================================
[09:01:39] [SERVER] Skipping reconnect polling - app is in background
[09:01:39] [CLEANUP] ========================================
[09:01:39] [BACKGROUND] Fetch error: The request timed out.
[09:01:39] [CLEANUP] Cleaning up all agent connections and views
[09:01:39] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:01:39] [BACKGROUND] Fetch error: The request timed out.
[09:01:39] [CLEANUP] Stopped and removed 0 video connections
[09:01:39] [CLEANUP] Removed 0 video views
[09:01:39] [CLEANUP] Removed 0 feed scroll views
[09:01:39] [CLEANUP] Removed 0 status labels
[09:01:39] [CLEANUP] Reset agent query state
[09:01:39] [CLEANUP] Updated page indicator
[09:01:39] [CLEANUP] Rebuilt video layout
[09:01:39] [CLEANUP] ✅ All agent connections and views cleaned up
[09:01:39] [CLEANUP] ========================================
[09:01:39] [SERVER] Skipping reconnect polling - app is in background
[09:01:39] [NETWORK] Status changed: connected
[09:01:39] [CLIENT_SIG] WebSocket opened
[09:01:39] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[09:01:39] [CLIENT_SIG] Connected! clientId=Si3sHHYoFXH2JlGB
[09:01:39] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[09:01:39] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:01:39] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[09:01:39] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:01:39] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:01:40] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:01:40] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:01:40] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:01:40] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[09:01:40] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:01:40] [BACKGROUND] Pre-cached 50 ChatMessage objects for instant display (preserved 0 from push)
[09:01:40] [BACKGROUND] Pre-downloaded 0 thumbnails
[09:01:40] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[09:01:41] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:01:41] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:01:41] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:01:41] HELLO → sent (cached token, role=query)
[09:01:41] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:01:41] [WS] Query connection failed - cleaning up all agent connections and views
[09:01:41] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:01:41] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:01:41] [CLEANUP] ========================================
[09:01:41] [CLEANUP] Cleaning up all agent connections and views
[09:01:41] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:01:41] [CLEANUP] Stopped and removed 0 video connections
[09:01:41] [CLEANUP] Removed 0 video views
[09:01:41] [CLEANUP] Removed 0 feed scroll views
[09:01:41] [CLEANUP] Removed 0 status labels
[09:01:41] [CLEANUP] Reset agent query state
[09:01:41] [CLEANUP] Updated page indicator
[09:01:41] [CLEANUP] Rebuilt video layout
[09:01:41] [CLEANUP] ✅ All agent connections and views cleaned up
[09:01:41] [CLEANUP] ========================================
[09:01:41] [SERVER] Skipping reconnect polling - app is in background
[09:01:41] [CLEANUP] ========================================
[09:01:41] [CLEANUP] Cleaning up all agent connections and views
[09:01:41] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:01:41] [CLEANUP] Stopped and removed 0 video connections
[09:01:41] [CLEANUP] Removed 0 video views
[09:01:41] [CLEANUP] Removed 0 feed scroll views
[09:01:41] [CLEANUP] Removed 0 status labels
[09:01:41] [CLEANUP] Reset agent query state
[09:01:41] [CLEANUP] Updated page indicator
[09:01:41] [CLEANUP] Rebuilt video layout
[09:01:41] [CLEANUP] ✅ All agent connections and views cleaned up
[09:01:41] [CLEANUP] ========================================
[09:01:41] [SERVER] Skipping reconnect polling - app is in background
[09:09:25] [BACKGROUND] Background fetch triggered
[09:09:25] [BACKGROUND] Fetching recent messages for pre-cache
[09:09:25] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:09:25] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:09:25] [NETWORK] Status changed: connected
[09:09:25] [CLIENT_SIG] Task completed with error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <72DB13B4-948D-4929-8814-29E7E393945D>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <72DB13B4-948D-4929-8814-29E7E393945D>.<1>, NSLocalizedDescription=The network connection was lost.}
[09:09:25] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[09:09:25] [CLIENT_SIG] Send error: Error Domain=NSPOSIXErrorDomain Code=57 "Socket is not connected" UserInfo={NSDescription=Socket is not connected}
[09:09:25] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=89 "Operation canceled" UserInfo={NSDescription=Operation canceled}
[09:09:25] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[09:09:26] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:09:26] HELLO → sent (cached token, role=query)
[09:09:26] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:09:26] [WS] Query connection failed - cleaning up all agent connections and views
[09:09:26] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:09:26] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:09:26] [CLEANUP] ========================================
[09:09:26] [CLEANUP] Cleaning up all agent connections and views
[09:09:26] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:09:26] [CLEANUP] Stopped and removed 0 video connections
[09:09:26] [CLEANUP] Removed 0 video views
[09:09:26] [CLEANUP] Removed 0 feed scroll views
[09:09:26] [CLEANUP] Removed 0 status labels
[09:09:26] [CLEANUP] Reset agent query state
[09:09:26] [CLEANUP] Updated page indicator
[09:09:26] [CLEANUP] Rebuilt video layout
[09:09:26] [CLEANUP] ✅ All agent connections and views cleaned up
[09:09:26] [CLEANUP] ========================================
[09:09:26] [SERVER] Skipping reconnect polling - app is in background
[09:09:26] [CLEANUP] ========================================
[09:09:26] [CLEANUP] Cleaning up all agent connections and views
[09:09:26] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:09:26] [CLEANUP] Stopped and removed 0 video connections
[09:09:26] [CLEANUP] Removed 0 video views
[09:09:26] [CLEANUP] Removed 0 feed scroll views
[09:09:26] [CLEANUP] Removed 0 status labels
[09:09:26] [CLEANUP] Reset agent query state
[09:09:26] [CLEANUP] Updated page indicator
[09:09:26] [CLEANUP] Rebuilt video layout
[09:09:26] [CLEANUP] ✅ All agent connections and views cleaned up
[09:09:26] [CLEANUP] ========================================
[09:09:26] [SERVER] Skipping reconnect polling - app is in background
[09:09:26] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[09:09:26] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:09:26] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:09:26] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:09:26] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:09:26] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:09:26] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[09:09:26] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:09:26] [BACKGROUND] Pre-cached 50 ChatMessage objects for instant display (preserved 0 from push)
[09:09:26] [BACKGROUND] Pre-downloaded 0 thumbnails
[09:09:26] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[09:09:27] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:09:27] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:09:27] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:09:27] HELLO → sent (cached token, role=query)
[09:09:27] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:09:27] [WS] Query connection failed - cleaning up all agent connections and views
[09:09:27] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:09:27] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:09:27] [CLEANUP] ========================================
[09:09:27] [CLEANUP] Cleaning up all agent connections and views
[09:09:27] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:09:27] [CLEANUP] Stopped and removed 0 video connections
[09:09:27] [CLEANUP] Removed 0 video views
[09:09:27] [CLEANUP] Removed 0 feed scroll views
[09:09:27] [CLEANUP] Removed 0 status labels
[09:09:27] [CLEANUP] Reset agent query state
[09:09:27] [CLEANUP] Updated page indicator
[09:09:27] [CLEANUP] Rebuilt video layout
[09:09:27] [CLEANUP] ✅ All agent connections and views cleaned up
[09:09:27] [CLEANUP] ========================================
[09:09:27] [SERVER] Skipping reconnect polling - app is in background
[09:09:27] [CLEANUP] ========================================
[09:09:27] [CLEANUP] Cleaning up all agent connections and views
[09:09:27] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:09:27] [CLEANUP] Stopped and removed 0 video connections
[09:09:27] [CLEANUP] Removed 0 video views
[09:09:27] [CLEANUP] Removed 0 feed scroll views
[09:09:27] [CLEANUP] Removed 0 status labels
[09:09:27] [CLEANUP] Reset agent query state
[09:09:27] [CLEANUP] Updated page indicator
[09:09:27] [CLEANUP] Rebuilt video layout
[09:09:27] [CLEANUP] ✅ All agent connections and views cleaned up
[09:09:27] [CLEANUP] ========================================
[09:09:27] [SERVER] Skipping reconnect polling - app is in background
[09:10:40] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:10:40] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:10:40] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:10:40] [PUSH] Silent push received
[09:10:40] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:10:40 +0000, appState=2, message_id=nil, type=nil
[09:10:40] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:40] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:10:40 +0000
[09:10:40] [PUSH_EMBED] No embedded message_data in notification
[09:10:40] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[09:10:40] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806], handled=false
[09:10:40] [PUSH] No embedded data, pre-loading messages from server
[09:10:40] [NETWORK] Status changed: connected
[09:10:40] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:10:40] [PUSH] Silent push received
[09:10:40] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:10:40 +0000, appState=2, message_id=nil, type=nil
[09:10:40] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:40] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:10:40 +0000
[09:10:40] [PUSH_EMBED] No embedded message_data in notification
[09:10:40] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[09:10:40] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806], handled=false
[09:10:40] [PUSH] No embedded data, pre-loading messages from server
[09:10:40] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:10:40] [PUSH] Silent push received
[09:10:40] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:10:40 +0000, appState=2, message_id=nil, type=nil
[09:10:40] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:40] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:10:40 +0000
[09:10:40] [PUSH_EMBED] No embedded message_data in notification
[09:10:40] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[09:10:40] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806], handled=false
[09:10:40] [PUSH] No embedded data, pre-loading messages from server
[09:10:40] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:10:40] [PUSH] Silent push received
[09:10:40] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:10:40 +0000, appState=2, message_id=nil, type=nil
[09:10:40] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:40] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:10:40 +0000
[09:10:40] [PUSH_EMBED] No embedded message_data in notification
[09:10:40] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[09:10:40] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806], handled=false
[09:10:40] [PUSH] No embedded data, pre-loading messages from server
[09:10:40] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:10:40] [CLIENT_SIG] WebSocket opened
[09:10:40] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:10:40] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[09:10:40] HELLO → sent (cached token, role=query)
[09:10:40] [CLIENT_SIG] Connected! clientId=My8ieg_t7-kKqsxx
[09:10:40] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:10:40] [WS] Query connection failed - cleaning up all agent connections and views
[09:10:40] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:10:40] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:10:40] [CLEANUP] ========================================
[09:10:40] [CLEANUP] Cleaning up all agent connections and views
[09:10:40] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:10:40] [CLEANUP] Stopped and removed 0 video connections
[09:10:40] [CLEANUP] Removed 0 video views
[09:10:40] [CLEANUP] Removed 0 feed scroll views
[09:10:40] [CLEANUP] Removed 0 status labels
[09:10:40] [CLEANUP] Reset agent query state
[09:10:40] [CLEANUP] Updated page indicator
[09:10:40] [CLEANUP] Rebuilt video layout
[09:10:40] [CLEANUP] ✅ All agent connections and views cleaned up
[09:10:40] [CLEANUP] ========================================
[09:10:40] [SERVER] Skipping reconnect polling - app is in background
[09:10:40] [CLEANUP] ========================================
[09:10:40] [CLEANUP] Cleaning up all agent connections and views
[09:10:40] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:10:40] [CLEANUP] Stopped and removed 0 video connections
[09:10:40] [CLEANUP] Removed 0 video views
[09:10:40] [CLEANUP] Removed 0 feed scroll views
[09:10:40] [CLEANUP] Removed 0 status labels
[09:10:40] [CLEANUP] Reset agent query state
[09:10:40] [CLEANUP] Updated page indicator
[09:10:40] [CLEANUP] Rebuilt video layout
[09:10:40] [CLEANUP] ✅ All agent connections and views cleaned up
[09:10:40] [CLEANUP] ========================================
[09:10:40] [SERVER] Skipping reconnect polling - app is in background
[09:10:40] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[09:10:40] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[09:10:40] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:10:41] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[09:10:41] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:10:41] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:41] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[09:10:41] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[09:10:41] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:41] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=5963 vccs=0
[09:10:41] [GAP_FIX] maxMessageIdAtBackground=28815, currentMaxLocalId=28815
[09:10:41] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28812, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}]
[09:10:41] [PUSH] Parsed message_id: 28812
[09:10:41] [PUSH] Parsed operation_type: 3
[09:10:41] [PUSH] Taking direct action: opType=3, messageId=28812
[09:10:41] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28812
[09:10:41] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[09:10:41] [GAP_FIX] Post-action sync: using background max 28815 to catch coalesced messages
[09:10:41] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[09:10:41] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28815, maxMemoryId=28815
[09:10:41] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28815
[09:10:41] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:10:41] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:41] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[09:10:41] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[09:10:41] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[09:10:41] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:10:41] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:41] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[09:10:41] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[09:10:41] [INCREMENTAL_SYNC] ✅ No new messages
[09:10:41] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:41] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=5963 vccs=0
[09:10:41] [GAP_FIX] maxMessageIdAtBackground=28815, currentMaxLocalId=28815
[09:10:41] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("message_id"): 28815, AnyHashable("operation_type"): 3]
[09:10:41] [PUSH] Parsed message_id: 28815
[09:10:41] [PUSH] Parsed operation_type: 3
[09:10:41] [PUSH] Taking direct action: opType=3, messageId=28815
[09:10:41] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28815
[09:10:41] [GAP_FIX] Post-action sync: using background max 28815 to catch coalesced messages
[09:10:41] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[09:10:41] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:41] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=5963 vccs=0
[09:10:41] [GAP_FIX] maxMessageIdAtBackground=28815, currentMaxLocalId=28815
[09:10:41] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28813, AnyHashable("session_id"): ILUIWU]
[09:10:41] [PUSH] Parsed message_id: 28813
[09:10:41] [PUSH] Parsed operation_type: 3
[09:10:41] [PUSH] Taking direct action: opType=3, messageId=28813
[09:10:41] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28813
[09:10:41] [GAP_FIX] Post-action sync: using background max 28815 to catch coalesced messages
[09:10:41] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[09:10:41] [INCREMENTAL_SYNC] 🔁 Processing queued retry refresh
[09:10:41] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[09:10:41] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28815, maxMemoryId=28815
[09:10:41] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28815
[09:10:41] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[09:10:41] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:10:41] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[09:10:41] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:41] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[09:10:41] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[09:10:41] [INCREMENTAL_SYNC] ✅ No new messages
[09:10:41] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:41] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=5964 vccs=0
[09:10:41] [GAP_FIX] maxMessageIdAtBackground=28815, currentMaxLocalId=28815
[09:10:41] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28814, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
[09:10:41] [PUSH] Parsed message_id: 28814
[09:10:41] [PUSH] Parsed operation_type: 3
[09:10:41] [PUSH] Taking direct action: opType=3, messageId=28814
[09:10:41] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28814
[09:10:41] [GAP_FIX] Post-action sync: using background max 28815 to catch coalesced messages
[09:10:41] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[09:10:41] [INCREMENTAL_SYNC] 🔁 Processing queued retry refresh
[09:10:41] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[09:10:41] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28815, maxMemoryId=28815
[09:10:41] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28815
[09:10:41] [INCREMENTAL_SYNC] ✅ No new messages
[09:10:42] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:10:42] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:10:42] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:10:42] HELLO → sent (cached token, role=query)
[09:10:42] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:10:42] [WS] Query connection failed - cleaning up all agent connections and views
[09:10:42] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:10:42] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:10:42] [CLEANUP] ========================================
[09:10:42] [CLEANUP] Cleaning up all agent connections and views
[09:10:42] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:10:42] [CLEANUP] Stopped and removed 0 video connections
[09:10:42] [CLEANUP] Removed 0 video views
[09:10:42] [CLEANUP] Removed 0 feed scroll views
[09:10:42] [CLEANUP] Removed 0 status labels
[09:10:42] [CLEANUP] Reset agent query state
[09:10:42] [CLEANUP] Updated page indicator
[09:10:42] [CLEANUP] Rebuilt video layout
[09:10:42] [CLEANUP] ✅ All agent connections and views cleaned up
[09:10:42] [CLEANUP] ========================================
[09:10:42] [SERVER] Skipping reconnect polling - app is in background
[09:10:42] [CLEANUP] ========================================
[09:10:42] [CLEANUP] Cleaning up all agent connections and views
[09:10:42] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:10:42] [CLEANUP] Stopped and removed 0 video connections
[09:10:42] [CLEANUP] Removed 0 video views
[09:10:42] [CLEANUP] Removed 0 feed scroll views
[09:10:42] [CLEANUP] Removed 0 status labels
[09:10:42] [CLEANUP] Reset agent query state
[09:10:42] [CLEANUP] Updated page indicator
[09:10:42] [CLEANUP] Rebuilt video layout
[09:10:42] [CLEANUP] ✅ All agent connections and views cleaned up
[09:10:42] [CLEANUP] ========================================
[09:10:42] [SERVER] Skipping reconnect polling - app is in background
[09:10:47] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:10:47] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:10:47] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[09:10:47] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:47] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=5970 vccs=0
[09:10:47] [GAP_FIX] maxMessageIdAtBackground=28815, currentMaxLocalId=28816
[09:10:47] [PUSH] handlePollEventsNotification userInfo: [:]
[09:10:47] [PUSH] No message_id in userInfo
[09:10:47] [PUSH] No operation_type in userInfo
[09:10:47] [FAST_REFRESH] Evolution disabled - performing incremental sync
[09:10:47] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:47] [PUSH_TRACE] 📬 POLL: memory state: count=50, first 10 IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:47] [FAST_REFRESH] Already have 50 messages in memory
[09:10:47] [FAST_REFRESH] maxMemoryId=28815, maxLocalId=28816
[09:10:47] [FAST_REFRESH] 🌙 Found 1 overnight messages in local DB (IDs > 28815)
[09:10:47] [FAST_REFRESH] 🌙 Merged 1 overnight messages into memory (now 51 total)
[09:10:47] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[09:10:47] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:10:47] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[09:10:47] [READBY_OPT] Fetching readBy for 4 unsettled messages (targeted)
[09:10:47] [GAP_FIX] Incremental sync will use since_id=28815 (background max=28815, current DB max=28816)
[09:10:47] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[09:10:47] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28815, maxMemoryId=28816
[09:10:47] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28815
[09:10:47] [PUSH] Silent push received
[09:10:47] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:10:47 +0000, appState=2, message_id=28816, type=nil
[09:10:47] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:47] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:10:47 +0000
[09:10:47] [PUSH_TRACE] ⬇️ Processing embedded message_id=28816
[09:10:47] [PUSH_EMBED] 📩 Received embedded message: id=28816, type=0, sender=Esra
[09:10:47] [PUSH_TRACE] ⬇️ Message details: text="Back home baby...", datesent=2026-04-23 07:10:45
[09:10:47] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[09:10:47] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28816
[09:10:47] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28816
[09:10:47] [PUSH_EMBED] ✅ Saved message 28816 to local DB (sync)
[09:10:47] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28816
[09:10:47] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28816
[09:10:47] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28816
[09:10:47] [PUSH_TRACE] 📦 Cache state: valid=true, count=50, IDs=[28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807, 28806]
[09:10:47] [PUSH_EMBED] Inserted message 28816 into existing cache (now 51 messages)
[09:10:47] [PUSH_TRACE] 📦 ✅ Inserted message 28816, cache now has IDs: [28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:10:47] [PUSH_TRACE] 📦 EXITING cache update queue for message 28816
[09:10:47] [PUSH_EMBED] Fetching evolution data for message 28816 in background
[09:10:47] [PUSH_EMBED] ✅ Fully processed message 28816
[09:10:47] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28816
[09:10:47] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807], handled=true
[09:10:47] [PUSH] Embedded message handled instantly from silent push
[09:10:47] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[09:10:47] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28816
[09:10:47] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[09:10:47] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[09:10:47] [PUSH_TRACE] 👁️ Received message id=28816, text="Back home baby..."
[09:10:47] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[09:10:47] [PUSH_UI] Message 28816 already in memory - skipping insert
[09:10:47] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[09:10:47] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:10:47] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=5970 vccs=0
[09:10:47] [GAP_FIX] maxMessageIdAtBackground=28815, currentMaxLocalId=28816
[09:10:47] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("datesent"): 2026-04-23 07:10:45, AnyHashable("session_id"): ILUIWU, AnyHashable("thumb_file_name"): , AnyHashable("operation_type"): 0, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("timer"): 0, AnyHashable("message_id"): 28816, AnyHashable("sender_name"): Esra, AnyHashable("message_type"): 0, AnyHashable("file_name"): , AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 07:10:45";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Back home baby";
    "message_id" = 28816;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28815;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message"): Back home baby]
[09:10:47] [PUSH_EMBED_VC] Message 28816 already in memory - skipping
[09:10:47] [PUSH] ⚡ Embedded message handled directly in ViewController
[09:10:47] [PUSH] Parsed message_id: 28816
[09:10:47] [PUSH] Parsed operation_type: 0
[09:10:47] [PUSH] Taking direct action: opType=0, messageId=28816
[09:10:47] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28816
[09:10:47] [PUSH] ⚡ Message 28816 already in memory - skipping duplicate notification entirely
[09:10:47] [GAP_FIX] Post-action sync: using background max 28815 to catch coalesced messages
[09:10:47] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[09:10:47] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:10:47] HELLO → sent (cached token, role=query)
[09:10:47] [CLIENT_SIG] Task completed with error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <9B835F20-77DD-4EBA-8397-F5C1B20CABD0>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <9B835F20-77DD-4EBA-8397-F5C1B20CABD0>.<1>, NSLocalizedDescription=The network connection was lost.}
[09:10:47] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[09:10:47] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=89 "Operation canceled" UserInfo={NSDescription=Operation canceled}
[09:10:47] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[09:10:47] [COMBINED_FETCH] Loaded 4 read receipts, 0 messages with reactions
[09:10:47] [FAST_REFRESH] Enriched 4/4 unsettled messages with readBy data
[09:10:47] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:10:47] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:10:47] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:10:47] [WS] Query connection failed - cleaning up all agent connections and views
[09:10:47] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:10:47] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:10:47] [CLEANUP] ========================================
[09:10:47] [CLEANUP] Cleaning up all agent connections and views
[09:10:47] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:10:47] [CLEANUP] Stopped and removed 0 video connections
[09:10:47] [CLEANUP] Removed 0 video views
[09:10:47] [CLEANUP] Removed 0 feed scroll views
[09:10:47] [CLEANUP] Removed 0 status labels
[09:10:47] [CLEANUP] Reset agent query state
[09:10:47] [CLEANUP] Updated page indicator
[09:10:47] [CLEANUP] Rebuilt video layout
[09:10:47] [CLEANUP] ✅ All agent connections and views cleaned up
[09:10:47] [CLEANUP] ========================================
[09:10:47] [SERVER] Skipping reconnect polling - app is in background
[09:10:47] [CLEANUP] ========================================
[09:10:47] [CLEANUP] Cleaning up all agent connections and views
[09:10:47] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:10:47] [CLEANUP] Stopped and removed 0 video connections
[09:10:47] [CLEANUP] Removed 0 video views
[09:10:47] [CLEANUP] Removed 0 feed scroll views
[09:10:47] [CLEANUP] Removed 0 status labels
[09:10:47] [CLEANUP] Reset agent query state
[09:10:47] [CLEANUP] Updated page indicator
[09:10:47] [CLEANUP] Rebuilt video layout
[09:10:47] [CLEANUP] ✅ All agent connections and views cleaned up
[09:10:47] [CLEANUP] ========================================
[09:10:47] [SERVER] Skipping reconnect polling - app is in background
[09:10:47] [PUSH_EMBED] Got evolution data for message 28816, saving to local DB
[09:10:47] [PUSH_EMBED] Saved evolution data for message 28816
[09:10:47] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[09:10:47] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28816]
[09:10:47] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:10:47] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:10:47] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[09:10:47] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:10:47] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:10:47] [INCREMENTAL_SYNC] 🔁 Processing queued retry refresh
[09:10:47] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[09:10:47] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28816, maxMemoryId=28816
[09:10:47] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28816
[09:10:47] [FAST_REFRESH] Incremental sync complete - 51 messages
[09:10:47] [INCREMENTAL_SYNC] ✅ No new messages
[09:10:47] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=62
[09:10:47] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28816, 28815, 28814, 28813, 28812]
[09:10:47] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[09:10:47] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:10:47] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[09:10:47] [SCROLL] wasNearBottom=true, threshold=758, offset=3865, contentH=4623, boundsH=758, forceScroll=false
[09:10:48] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[09:10:48] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28815 → 28816
[09:10:48] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=64
[09:10:48] [SCROLL] Async handler: shouldScroll=false (force=false, newMsgs=false, nearBottom=true), maxY=3942, currentOffset=3865
[09:10:49] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:10:49] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:10:49] [PUSH] Silent push received
[09:10:49] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:10:49 +0000, appState=2, message_id=nil, type=nil
[09:10:49] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=51, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:10:49] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:10:49 +0000
[09:10:49] [PUSH_EMBED] No embedded message_data in notification
[09:10:49] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[09:10:49] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807], handled=false
[09:10:49] [PUSH] No embedded data, pre-loading messages from server
[09:10:49] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:10:49] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:10:49] HELLO → sent (cached token, role=query)
[09:10:49] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:10:49] [WS] Query connection failed - cleaning up all agent connections and views
[09:10:49] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:10:49] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:10:49] [CLEANUP] ========================================
[09:10:49] [CLEANUP] Cleaning up all agent connections and views
[09:10:49] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:10:49] [CLEANUP] Stopped and removed 0 video connections
[09:10:49] [CLEANUP] Removed 0 video views
[09:10:49] [CLEANUP] Removed 0 feed scroll views
[09:10:49] [CLEANUP] Removed 0 status labels
[09:10:49] [CLEANUP] Reset agent query state
[09:10:49] [CLEANUP] Updated page indicator
[09:10:49] [CLEANUP] Rebuilt video layout
[09:10:49] [CLEANUP] ✅ All agent connections and views cleaned up
[09:10:49] [CLEANUP] ========================================
[09:10:49] [SERVER] Skipping reconnect polling - app is in background
[09:10:49] [CLEANUP] ========================================
[09:10:49] [CLEANUP] Cleaning up all agent connections and views
[09:10:49] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:10:49] [CLEANUP] Stopped and removed 0 video connections
[09:10:49] [CLEANUP] Removed 0 video views
[09:10:49] [CLEANUP] Removed 0 feed scroll views
[09:10:49] [CLEANUP] Removed 0 status labels
[09:10:49] [CLEANUP] Reset agent query state
[09:10:49] [CLEANUP] Updated page indicator
[09:10:49] [CLEANUP] Rebuilt video layout
[09:10:49] [CLEANUP] ✅ All agent connections and views cleaned up
[09:10:49] [CLEANUP] ========================================
[09:10:49] [SERVER] Skipping reconnect polling - app is in background
[09:10:50] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[09:10:50] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:10:50] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:10:50] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:10:50] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:10:50] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=51, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:10:50] [PRELOAD_CACHE] Preserving 1 push-inserted messages: [28725]
[09:10:50] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=1, IDs=[28725]
[09:10:50] [PUSH_TRACE] 🔀 mergeMessages: merged.count=51, first 10 IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:10:50] [PUSH_PRELOAD] ⚡ Pre-cached 51 messages for instant display (preserved 1 from push)
[09:10:50] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[09:10:50] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:10:50] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=5972 vccs=0
[09:10:50] [GAP_FIX] maxMessageIdAtBackground=28815, currentMaxLocalId=28816
[09:10:50] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28816, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
[09:10:50] [PUSH] Parsed message_id: 28816
[09:10:50] [PUSH] Parsed operation_type: 3
[09:10:50] [PUSH] Taking direct action: opType=3, messageId=28816
[09:10:50] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28816
[09:10:50] [GAP_FIX] Post-action sync: using background max 28815 to catch coalesced messages
[09:10:50] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[09:10:50] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28815, maxMemoryId=28816
[09:10:50] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28815
[09:10:50] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[09:10:50] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28816]
[09:10:50] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:10:50] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:10:50] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[09:10:50] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:10:50] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=64
[09:10:50] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28816, 28815, 28814, 28813, 28812]
[09:10:50] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[09:10:50] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:10:50] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[09:10:50] [SCROLL] wasNearBottom=true, threshold=758, offset=3865, contentH=4700, boundsH=758, forceScroll=false
[09:10:50] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[09:10:50] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[09:11:02] [PUSH] Notification tapped - session_id: ILUIWU
[09:11:02] [PUSH] Max message_id before tap: 28816
[09:11:02] [PUSH] Stored pending session: ILUIWU
[09:11:02] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:11:02 +0000
[09:11:02] [PUSH_TRACE] ⬇️ Processing embedded message_id=28816
[09:11:02] [PUSH_EMBED] 📩 Received embedded message: id=28816, type=0, sender=Esra
[09:11:02] [PUSH_TRACE] ⬇️ Message details: text="Back home baby...", datesent=2026-04-23 07:10:45
[09:11:02] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[09:11:02] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28816
[09:11:02] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28816
[09:11:02] [NETWORK] Status changed: connected
[09:11:02] [PUSH_EMBED] ✅ Saved message 28816 to local DB (sync)
[09:11:02] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28816
[09:11:02] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28816
[09:11:02] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28816
[09:11:02] [PUSH_TRACE] 📦 Cache state: valid=true, count=51, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:11:02] [PUSH_TRACE] 📦 ⚠️ Message 28816 already in cache, skipping insert
[09:11:02] [PUSH_TRACE] 📦 EXITING cache update queue for message 28816
[09:11:02] [PUSH_EMBED] Fetching evolution data for message 28816 in background
[09:11:02] [PUSH_EMBED] ✅ Fully processed message 28816
[09:11:02] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28816
[09:11:02] [PUSH] Embedded message handled instantly on tap
[09:11:02] [SECURITY] Timeout check: elapsed=2185.8376269340515s, timeout=300.0s
[09:11:02] [SECURITY] sceneWillEnterForeground - timeout exceeded, showing lock screen immediately
[09:11:02] [PUSH] Fetching server messages since_id=28816 to catch coalesced notifications on tap
[09:11:02] [PUSH_PRELOAD] Fetching up to 50 messages since_id=28816 to catch coalesced notifications
[09:11:02] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:11:02] [AUTH] ✅ All guards passed, showing privacy cover
[09:11:02] [LIFECYCLE] App entering foreground - restoring connections
[09:11:02] [CAPTURE] Live-feed protection [app-will-enter-foreground] - fullscreen=false, isCaptured=false, secureReady=true
[09:11:02] [CAPTURE] Refresh overlay [app-will-enter-foreground] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[09:11:02] [PUSH_TRACE] 🔄 FOREGROUND: memory has 51 msgs, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:11:02] [PUSH_TRACE] 🔄 FOREGROUND: cache has 51 msgs, valid=true, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:11:02] [LIFECYCLE] Away > 2 minutes (2185s) - will scroll to bottom
[09:11:02] [UPLOAD_RETRY] No pending uploads to retry
[09:11:02] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:11:02] [READBY_OPT] No message IDs to fetch - skipping server call
[09:11:02] [LIFECYCLE] WebRTC audio re-enabled
[09:11:02] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[09:11:02] [CLIENT_SIG] Skipping connect - app in background (state=2)
[09:11:02] [VIEWER] Reconnecting after background - querying agents
[09:11:02] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=completed
[09:11:02] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[09:11:02] [UNSENT_RETRY] Checking for unsent messages...
[09:11:02] [PENDING_UPLOAD] Total pending upload messages: 0
[09:11:02] [UNSENT_RETRY] No unsent messages found
[09:11:02] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:11:02] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:11:02] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:11:02] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[09:11:02] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[09:11:02] [PUSH_TRACE] 👁️ Received message id=28816, text="Back home baby..."
[09:11:02] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[09:11:02] [PUSH_UI] Message 28816 already in memory - skipping insert
[09:11:02] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[09:11:02] [FOREGROUND] Enriched 0/0 unsettled messages with readBy data
[09:11:02] [LIFECYCLE] scrollToBottomIfNeeded time=true, count=51>50=true, maxId=28816>28815=true, shouldScroll=true
[09:11:02] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:11:02] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:11:02] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:11:02] HELLO → sent (cached token, role=query)
[09:11:02] [CLIENT_SIG] WebSocket opened
[09:11:02] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[09:11:02] [PUSH_EMBED] Got evolution data for message 28816, saving to local DB
[09:11:02] [PUSH_EMBED] Saved evolution data for message 28816
[09:11:02] [CLIENT_SIG] Connected! clientId=s8ORg_PB0vX9WgrU
[09:11:02] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:11:02] [WS] Query connection failed - cleaning up all agent connections and views
[09:11:02] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:11:02] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:11:02] [CLEANUP] ========================================
[09:11:02] [CLEANUP] Cleaning up all agent connections and views
[09:11:02] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:11:02] [CLEANUP] Stopped and removed 0 video connections
[09:11:02] [CLEANUP] Removed 0 video views
[09:11:02] [CLEANUP] Removed 0 feed scroll views
[09:11:02] [CLEANUP] Removed 0 status labels
[09:11:02] [CLEANUP] Reset agent query state
[09:11:02] [CLEANUP] Updated page indicator
[09:11:02] [CLEANUP] Rebuilt video layout
[09:11:02] [CLEANUP] ✅ All agent connections and views cleaned up
[09:11:02] [CLEANUP] ========================================
[09:11:02] [SERVER] Starting reconnect polling (5s interval)
[09:11:02] [CLEANUP] ========================================
[09:11:02] [CLEANUP] Cleaning up all agent connections and views
[09:11:02] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:11:02] [CLEANUP] Stopped and removed 0 video connections
[09:11:02] [CLEANUP] Removed 0 video views
[09:11:02] [CLEANUP] Removed 0 feed scroll views
[09:11:02] [CLEANUP] Removed 0 status labels
[09:11:02] [CLEANUP] Reset agent query state
[09:11:02] [CLEANUP] Updated page indicator
[09:11:02] [CLEANUP] Rebuilt video layout
[09:11:02] [CLEANUP] ✅ All agent connections and views cleaned up
[09:11:02] [CLEANUP] ========================================
[09:11:02] [SERVER] Starting reconnect polling (5s interval)
[09:11:02] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[09:11:02] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[09:11:02] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:11:02] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[09:11:02] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28816, 28815, 28814, 28813, 28812]
[09:11:02] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[09:11:02] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:11:02] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[09:11:02] [SCROLL] wasNearBottom=true, threshold=758, offset=3865, contentH=4700, boundsH=758, forceScroll=true
[09:11:02] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[09:11:02] [SCROLL] 💓 alive, visible=44...52, rows=53, estHeight=0.0, heightCalls=0
[09:11:02] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=62
[09:11:02] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3942, currentOffset=3942
[09:11:02] [SCROLL] Scrolling to 3942, animated=false
[09:11:02] [PUSH_PRELOAD] No messages or parse error
[09:11:02] [PUSH] Server fetch on tap completed (success=false)
[09:11:02] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:11:02] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=5984 vccs=0
[09:11:02] [GAP_FIX] maxMessageIdAtBackground=28815, currentMaxLocalId=28816
[09:11:02] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("datesent"): 2026-04-23 07:10:45, AnyHashable("message_id"): 28816, AnyHashable("session_id"): ILUIWU, AnyHashable("thumb_file_name"): , AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("timer"): 0, AnyHashable("operation_type"): 0, AnyHashable("message_type"): 0, AnyHashable("sender_name"): Esra, AnyHashable("file_name"): , AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 07:10:45";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Back home baby";
    "message_id" = 28816;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28815;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("message"): Back home baby]
[09:11:02] [PUSH_EMBED_VC] Message 28816 already in memory - skipping
[09:11:02] [PUSH] ⚡ Embedded message handled directly in ViewController
[09:11:02] [PUSH] Parsed message_id: 28816
[09:11:02] [PUSH] Parsed operation_type: 0
[09:11:02] [PUSH] Taking direct action: opType=0, messageId=28816
[09:11:02] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28816
[09:11:02] [PUSH] ⚡ Message 28816 already in memory - skipping duplicate notification entirely
[09:11:02] [GAP_FIX] Post-action sync: using background max 28815 to catch coalesced messages
[09:11:02] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[09:11:02] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28815, maxMemoryId=28816
[09:11:02] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28815
[09:11:02] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[09:11:02] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28816]
[09:11:02] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:11:02] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:11:02] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[09:11:02] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:11:02] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=62
[09:11:02] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28816, 28815, 28814, 28813, 28812]
[09:11:02] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[09:11:02] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:11:02] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[09:11:02] [SCROLL] wasNearBottom=true, threshold=758, offset=3942, contentH=4700, boundsH=758, forceScroll=true
[09:11:02] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[09:11:02] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=62
[09:11:02] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3942, currentOffset=3942
[09:11:02] [SCROLL] Scrolling to 3942, animated=false
[09:11:02] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[09:11:02] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[09:11:02] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:11:02] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=5985 vccs=0
[09:11:02] [GAP_FIX] maxMessageIdAtBackground=28815, currentMaxLocalId=28816
[09:11:02] [PUSH] handlePollEventsNotification userInfo: [:]
[09:11:02] [PUSH] No message_id in userInfo
[09:11:02] [PUSH] No operation_type in userInfo
[09:11:02] [FAST_REFRESH] Evolution disabled - performing incremental sync
[09:11:02] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=51, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:11:02] [PUSH_TRACE] 📬 POLL: memory state: count=51, first 10 IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:11:02] [FAST_REFRESH] Already have 51 messages in memory
[09:11:02] [FAST_REFRESH] maxMemoryId=28816, maxLocalId=28816
[09:11:02] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[09:11:02] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:11:02] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[09:11:02] [READBY_OPT] No message IDs to fetch - skipping server call
[09:11:02] [GAP_FIX] Incremental sync will use since_id=28815 (background max=28815, current DB max=28816)
[09:11:02] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[09:11:02] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28815, maxMemoryId=28816
[09:11:02] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28815
[09:11:02] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[09:11:02] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:11:02] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:11:02] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[09:11:02] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28816]
[09:11:02] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:11:02] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:11:02] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[09:11:02] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:11:02] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:11:02] [FAST_REFRESH] Incremental sync complete - 51 messages
[09:11:02] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=62
[09:11:02] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28816, 28815, 28814, 28813, 28812]
[09:11:02] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[09:11:02] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:11:02] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[09:11:02] [SCROLL] wasNearBottom=true, threshold=758, offset=3942, contentH=4700, boundsH=758, forceScroll=true
[09:11:02] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[09:11:02] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=62
[09:11:02] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3942, currentOffset=3942
[09:11:02] [SCROLL] Scrolling to 3942, animated=false
[09:11:03] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:11:03] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:11:03] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:11:03] HELLO → sent (cached token, role=query)
[09:11:03] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:11:03] [WS] Query connection failed - cleaning up all agent connections and views
[09:11:03] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:11:03] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:11:03] [CLEANUP] ========================================
[09:11:03] [CLEANUP] Cleaning up all agent connections and views
[09:11:03] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:11:03] [CLEANUP] Stopped and removed 0 video connections
[09:11:03] [CLEANUP] Removed 0 video views
[09:11:03] [CLEANUP] Removed 0 feed scroll views
[09:11:03] [CLEANUP] Removed 0 status labels
[09:11:03] [CLEANUP] Reset agent query state
[09:11:03] [CLEANUP] Updated page indicator
[09:11:03] [CLEANUP] Rebuilt video layout
[09:11:03] [CLEANUP] ✅ All agent connections and views cleaned up
[09:11:03] [CLEANUP] ========================================
[09:11:03] [SERVER] Starting reconnect polling (5s interval)
[09:11:03] [CLEANUP] ========================================
[09:11:03] [CLEANUP] Cleaning up all agent connections and views
[09:11:03] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:11:03] [CLEANUP] Stopped and removed 0 video connections
[09:11:03] [CLEANUP] Removed 0 video views
[09:11:03] [CLEANUP] Removed 0 feed scroll views
[09:11:03] [CLEANUP] Removed 0 status labels
[09:11:03] [CLEANUP] Reset agent query state
[09:11:03] [CLEANUP] Updated page indicator
[09:11:03] [CLEANUP] Rebuilt video layout
[09:11:03] [CLEANUP] ✅ All agent connections and views cleaned up
[09:11:03] [CLEANUP] ========================================
[09:11:03] [SERVER] Starting reconnect polling (5s interval)
[09:11:04] [CLIENT_SIG] Typing start from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[09:11:04] [PIN_AUTH] Correct PIN
[09:11:04] [SECURITY] Restored real session: ILUIWU
[09:11:04] [SECURITY] Restored real session: ILUIWU
[09:11:05] [FAKE_AI] cancel() called, wasRunning=false
[09:11:05] [FAKE MODE] Exiting fake mode, restoring real session
[09:11:05] [SECURITY] Restored real session: ILUIWU
[09:11:05] [SECURITY] Saved real session: ILUIWU
[09:11:05] [FAKE MODE] ✅ Restored real session: ILUIWU
[09:11:05] [FAKE MODE] Loaded 50 messages (limited to page size)
[09:11:05] [READBY_OPT] No message IDs to fetch - skipping server call
[09:11:05] [AUTH] Authentication completed - updating UI only (data already fetched in foreground handler)
[09:11:05] [AUTH] Cache had 51 messages, maxExistingId=28816, inserted 0 truly new
[09:11:05] [LIFECYCLE] scrollToBottomIfNeeded time=false, count=50>50=false, maxId=28816>28815=true, shouldScroll=true
[09:11:05] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[09:11:05] [AUTH] UI update complete
[09:11:05] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[09:11:05] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[09:11:05] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=completed
[09:11:05] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[09:11:05] [FAKE MODE] Enriched 0/0 unsettled messages with readBy data
[09:11:05] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[09:11:05] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:11:05] [SCROLL] 💓 alive, visible=43...51, rows=52, estHeight=0.0, heightCalls=123
[09:11:05] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[09:11:05] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[09:11:05] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[09:11:05] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28816, 28815, 28814, 28813, 28812]
[09:11:05] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[09:11:05] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:11:05] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[09:11:05] [SCROLL] wasNearBottom=true, threshold=758, offset=3890, contentH=4648, boundsH=758, forceScroll=true
[09:11:05] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[09:11:05] [USER] ✅ User registered successfully
[09:11:05] [PUSH] User registration after token update: success
[09:11:05] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[09:11:05] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3890, currentOffset=3890
[09:11:05] [SCROLL] Scrolling to 3890, animated=false
[09:11:05] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:11:05] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:11:05] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:11:05] HELLO → sent (cached token, role=query)
[09:11:05] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:11:05] [WS] Query connection failed - cleaning up all agent connections and views
[09:11:05] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:11:05] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:11:05] [CLEANUP] ========================================
[09:11:05] [CLEANUP] Cleaning up all agent connections and views
[09:11:05] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:11:05] [CLEANUP] Stopped and removed 0 video connections
[09:11:05] [CLEANUP] Removed 0 video views
[09:11:05] [CLEANUP] Removed 0 feed scroll views
[09:11:05] [CLEANUP] Removed 0 status labels
[09:11:05] [CLEANUP] Reset agent query state
[09:11:05] [CLEANUP] Updated page indicator
[09:11:05] [CLEANUP] Rebuilt video layout
[09:11:05] [CLEANUP] ✅ All agent connections and views cleaned up
[09:11:05] [CLEANUP] ========================================
[09:11:05] [SERVER] Starting reconnect polling (5s interval)
[09:11:05] [CLEANUP] ========================================
[09:11:05] [CLEANUP] Cleaning up all agent connections and views
[09:11:05] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:11:05] [CLEANUP] Stopped and removed 0 video connections
[09:11:05] [CLEANUP] Removed 0 video views
[09:11:05] [CLEANUP] Removed 0 feed scroll views
[09:11:05] [CLEANUP] Removed 0 status labels
[09:11:05] [CLEANUP] Reset agent query state
[09:11:05] [CLEANUP] Updated page indicator
[09:11:05] [CLEANUP] Rebuilt video layout
[09:11:05] [CLEANUP] ✅ All agent connections and views cleaned up
[09:11:05] [CLEANUP] ========================================
[09:11:05] [SERVER] Starting reconnect polling (5s interval)
[09:11:07] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:11:07] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:11:07] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:11:07] HELLO → sent (cached token, role=query)
[09:11:07] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:11:07] [WS] Query connection failed - cleaning up all agent connections and views
[09:11:07] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:11:07] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:11:07] [CLEANUP] ========================================
[09:11:07] [CLEANUP] Cleaning up all agent connections and views
[09:11:07] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:11:07] [CLEANUP] Stopped and removed 0 video connections
[09:11:07] [CLEANUP] Removed 0 video views
[09:11:07] [CLEANUP] Removed 0 feed scroll views
[09:11:07] [CLEANUP] Removed 0 status labels
[09:11:07] [CLEANUP] Reset agent query state
[09:11:07] [CLEANUP] Updated page indicator
[09:11:07] [CLEANUP] Rebuilt video layout
[09:11:07] [CLEANUP] ✅ All agent connections and views cleaned up
[09:11:07] [CLEANUP] ========================================
[09:11:07] [SERVER] Starting reconnect polling (5s interval)
[09:11:07] [CLEANUP] ========================================
[09:11:07] [CLEANUP] Cleaning up all agent connections and views
[09:11:07] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:11:07] [CLEANUP] Stopped and removed 0 video connections
[09:11:07] [CLEANUP] Removed 0 video views
[09:11:07] [CLEANUP] Removed 0 feed scroll views
[09:11:07] [CLEANUP] Removed 0 status labels
[09:11:07] [CLEANUP] Reset agent query state
[09:11:07] [CLEANUP] Updated page indicator
[09:11:07] [CLEANUP] Rebuilt video layout
[09:11:07] [CLEANUP] ✅ All agent connections and views cleaned up
[09:11:07] [CLEANUP] ========================================
[09:11:07] [SERVER] Starting reconnect polling (5s interval)
[09:11:07] [DOUBLE_TAP] Adding heart reaction to message 28816
[09:11:07] [DOUBLE_TAP] Action: add (alreadyReactedWithHeart: false)
[09:11:07] [DOUBLE_TAP] Heart reaction added successfully (status: ok)
[09:11:07] [REACTION_SCROLL] =====ENTER path=heart action=add msgId=28816
[09:11:07] [REACTION_SCROLL] state offsetY=3890 bounds=758 adjTop=0 adjBot=0 contentH=4648 estH=0
[09:11:07] [REACTION_SCROLL] rows oldCount=52 newCount=52 reactedRow=51 reactedVisible=true
[09:11:07] [REACTION_SCROLL] reacted rectMinY=4559 rectH=77 cellFrameMinY=4559 cellFrameH=77
[09:11:07] [REACTION_SCROLL] anchor row=43 minY=3875 VPY=-15 visibleCount=9 visibleRows=[43, 44, 45, 46, 47, 48, 49, 50, 51]
[09:11:07] [REACTION_SCROLL] scrollState dragging=false decel=false tracking=false
[09:11:07] [REACTION_SCROLL] after reloadRows offsetΔ=0 contentHΔ=20
[09:11:07] [REACTION_SCROLL] after layoutIfNeeded offsetΔFromSave=0 contentHDelta=20
[09:11:07] [REACTION_SCROLL] reactedAfter rectMinY=4559 rectH=97 rectMinYΔ=0 rectHΔ=20
[09:11:07] [REACTION_SCROLL] reactedCellFrameAfter minY=4559 h=97
[09:11:07] [REACTION_SCROLL] anchor rectMinYAfter=3875 drift=0
[09:11:07] [REACTION_SCROLL] math rawTarget=3890 maxOffsetY=3910 clamped=3890 clampedAgainstRaw=0
[09:11:07] [REACTION_SCROLL] no offset change (within 0.5pt, current=3890)
[09:11:07] [REACTION_SCROLL] finalOffset=3890 totalΔFromSave=0
[09:11:08] [REACTION_SCROLL] =====EXIT
[09:11:08] [LOCK] Lock button tapped - locking app immediately
[09:11:08] [LOCK] Received lock app notification
[09:11:08] [LIFECYCLE] App resigning active - cleared crash flag
[09:11:08] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:11:08] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:11:08] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:11:08] HELLO → sent (cached token, role=query)
[09:11:08] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:11:08] [WS] Query connection failed - cleaning up all agent connections and views
[09:11:08] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:11:08] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:11:08] [CLEANUP] ========================================
[09:11:08] [CLEANUP] Cleaning up all agent connections and views
[09:11:08] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:11:08] [CLEANUP] Stopped and removed 0 video connections
[09:11:08] [CLEANUP] Removed 0 video views
[09:11:08] [CLEANUP] Removed 0 feed scroll views
[09:11:08] [CLEANUP] Removed 0 status labels
[09:11:08] [CLEANUP] Reset agent query state
[09:11:08] [CLEANUP] Updated page indicator
[09:11:08] [CLEANUP] Rebuilt video layout
[09:11:08] [CLEANUP] ✅ All agent connections and views cleaned up
[09:11:08] [CLEANUP] ========================================
[09:11:08] [SERVER] Starting reconnect polling (5s interval)
[09:11:08] [CLEANUP] ========================================
[09:11:08] [CLEANUP] Cleaning up all agent connections and views
[09:11:08] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:11:08] [CLEANUP] Stopped and removed 0 video connections
[09:11:08] [CLEANUP] Removed 0 video views
[09:11:08] [CLEANUP] Removed 0 feed scroll views
[09:11:08] [CLEANUP] Removed 0 status labels
[09:11:08] [CLEANUP] Reset agent query state
[09:11:08] [CLEANUP] Updated page indicator
[09:11:08] [CLEANUP] Rebuilt video layout
[09:11:08] [CLEANUP] ✅ All agent connections and views cleaned up
[09:11:08] [CLEANUP] ========================================
[09:11:08] [SERVER] Starting reconnect polling (5s interval)
[09:11:09] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[09:11:09] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[09:11:09] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[09:11:09] [LIFECYCLE] App entering background - cleared crash flag
[09:11:09] [CLIENT_SIG] Disconnecting
[09:11:09] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[09:11:09] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[09:11:09] [PUSH_TRACE] 💤 BACKGROUND: memory has 50 messages, first 10 IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:11:09] [LIFECYCLE] Background snapshot: count=50, maxId=28816
[09:11:09] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=3
[09:11:09] [WS] Canceling WebSocket for query connection to iosILUIWU
[09:11:09] In cleanupPeer
[09:11:09] In cleanupPeer
[09:11:09] [LIFECYCLE] WebRTC audio disabled
[09:11:09] [LIFECYCLE] AVAudioSession deactivated
[09:11:09] [LIFECYCLE] All connections stopped
[09:11:09] [CLIENT_SIG] WebSocket closed with code 1001
[09:11:09] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[09:11:09] [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/}
[09:11:09] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[09:11:09] [SERVER] Stopped reconnect polling
[09:11:09] [WS] URLSession invalidated successfully
[09:11:09] Will request stop of video 0
[09:11:09] Will request stop of video 0
[09:11:09] [PIP] Removing 0 tracks from PiP for connection 0
[09:11:09] [PIP] ✅ All tracks removed for connection 0
[09:11:09] [PIP] Removing 0 tracks from PiP for connection 0
[09:11:09] [PIP] ✅ All tracks removed for connection 0
[09:12:03] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:12:03] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:12:03] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:12:03] [PUSH] Notification tapped - session_id: ILUIWU
[09:12:03] [PUSH] Max message_id before tap: 28819
[09:12:03] [PUSH] Stored pending session: ILUIWU
[09:12:03] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:12:03 +0000
[09:12:03] [PUSH_TRACE] ⬇️ Processing embedded message_id=28819
[09:12:03] [PUSH_EMBED] 📩 Received embedded message: id=28819, type=0, sender=Esra
[09:12:03] [PUSH_TRACE] ⬇️ Message details: text="I have a dentist appointment at 17:30🥲...", datesent=2026-04-23 07:11:56
[09:12:03] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[09:12:03] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28819
[09:12:03] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28819
[09:12:03] [PUSH_EMBED] ✅ Saved message 28819 to local DB (sync)
[09:12:03] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28819
[09:12:03] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28819
[09:12:03] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28819
[09:12:03] [PUSH_TRACE] 📦 Cache state: valid=false, count=0, IDs=[]
[09:12:03] [PUSH_EMBED] Created new cache with embedded message 28819
[09:12:03] [PUSH_TRACE] 📦 ✅ Created new cache with message 28819
[09:12:03] [PUSH_TRACE] 📦 EXITING cache update queue for message 28819
[09:12:03] [PUSH_EMBED] Fetching evolution data for message 28819 in background
[09:12:03] [PUSH_EMBED] ✅ Fully processed message 28819
[09:12:03] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28819
[09:12:03] [PUSH] Embedded message handled instantly on tap
[09:12:03] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[09:12:03] [PUSH] Fetching server messages since_id=28819 to catch coalesced notifications on tap
[09:12:03] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[09:12:03] [PUSH_PRELOAD] Fetching up to 50 messages since_id=28819 to catch coalesced notifications
[09:12:03] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:12:03] [LIFECYCLE] App entering foreground - restoring connections
[09:12:03] [CAPTURE] Live-feed protection [app-will-enter-foreground] - fullscreen=false, isCaptured=false, secureReady=true
[09:12:03] [CAPTURE] Refresh overlay [app-will-enter-foreground] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[09:12:03] [PUSH_TRACE] 🔄 FOREGROUND: memory has 50 msgs, IDs=[28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808, 28807]
[09:12:03] [PUSH_TRACE] 🔄 FOREGROUND: cache has 1 msgs, valid=true, IDs=[28819]
[09:12:03] [UPLOAD_RETRY] No pending uploads to retry
[09:12:03] [NETWORK] Status changed: connected
[09:12:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[09:12:03] [READBY_OPT] No message IDs to fetch - skipping server call
[09:12:03] [LIFECYCLE] WebRTC audio re-enabled
[09:12:03] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[09:12:03] [CLIENT_SIG] Skipping connect - app in background (state=2)
[09:12:03] [VIEWER] Reconnecting after background - querying agents
[09:12:03] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=running
[09:12:03] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[09:12:03] [UNSENT_RETRY] Checking for unsent messages...
[09:12:03] [PENDING_UPLOAD] Total pending upload messages: 0
[09:12:03] [UNSENT_RETRY] No unsent messages found
[09:12:03] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[09:12:03] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[09:12:03] [PUSH_TRACE] 👁️ Received message id=28819, text="I have a dentist appointment a..."
[09:12:03] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[09:12:03] [PUSH_TRACE] 👁️ BEFORE insert: 50 messages, first 5 IDs: [28816, 28815, 28814, 28813, 28812]
[09:12:03] [PUSH_TRACE] 👁️ Inserted message 28819 at index 0
[09:12:03] [PUSH_UI] Inserted message 28819 into UI (now 51 messages)
[09:12:03] [PUSH_TRACE] 👁️ AFTER insert: 51 messages, first 5 IDs: [28819, 28816, 28815, 28814, 28813]
[09:12:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:12:03] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:12:03] [PUSH_TRACE] 👁️ handlePushMessageReceived END - success
[09:12:03] [FOREGROUND] Enriched 0/0 unsettled messages with readBy data
[09:12:03] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[09:12:03] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28819, 28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808]
[09:12:03] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=6046 vccs=0
[09:12:03] [GAP_FIX] maxMessageIdAtBackground=28816, currentMaxLocalId=28819
[09:12:03] [PUSH] handlePollEventsNotification userInfo: [:]
[09:12:03] [PUSH] No message_id in userInfo
[09:12:03] [PUSH] No operation_type in userInfo
[09:12:03] [FAST_REFRESH] Evolution disabled - performing incremental sync
[09:12:03] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=1, IDs=[28819]
[09:12:03] [PUSH_TRACE] 📬 POLL: memory state: count=51, first 10 IDs=[28819, 28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808]
[09:12:03] [FAST_REFRESH] Already have 51 messages in memory
[09:12:03] [FAST_REFRESH] maxMemoryId=28819, maxLocalId=28819
[09:12:03] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[09:12:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:12:03] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:12:03] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[09:12:03] [READBY_OPT] No message IDs to fetch - skipping server call
[09:12:03] [GAP_FIX] Incremental sync will use since_id=28816 (background max=28816, current DB max=28819)
[09:12:03] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[09:12:03] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28816, maxMemoryId=28819
[09:12:03] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28816
[09:12:03] [LIFECYCLE] scrollToBottomIfNeeded time=false, count=51>50=true, maxId=28819>28816=true, shouldScroll=true
[09:12:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:12:03] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:12:03] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[09:12:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:12:03] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:12:03] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:12:03] [CLIENT_SIG] WebSocket opened
[09:12:03] HELLO → sent (cached token, role=query)
[09:12:03] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[09:12:03] [CLIENT_SIG] Connected! clientId=fWurS7X4FTlC2Stl
[09:12:03] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:12:03] [WS] Query connection failed - cleaning up all agent connections and views
[09:12:03] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:12:03] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:12:03] [CLEANUP] ========================================
[09:12:03] [CLEANUP] Cleaning up all agent connections and views
[09:12:03] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:12:03] [CLEANUP] Stopped and removed 0 video connections
[09:12:03] [CLEANUP] Removed 0 video views
[09:12:03] [CLEANUP] Removed 0 feed scroll views
[09:12:03] [CLEANUP] Removed 0 status labels
[09:12:03] [CLEANUP] Reset agent query state
[09:12:03] [CLEANUP] Updated page indicator
[09:12:03] [CLEANUP] Rebuilt video layout
[09:12:03] [CLEANUP] ✅ All agent connections and views cleaned up
[09:12:03] [CLEANUP] ========================================
[09:12:03] [SERVER] Starting reconnect polling (5s interval)
[09:12:03] [CLEANUP] ========================================
[09:12:03] [CLEANUP] Cleaning up all agent connections and views
[09:12:03] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:12:03] [CLEANUP] Stopped and removed 0 video connections
[09:12:03] [CLEANUP] Removed 0 video views
[09:12:03] [CLEANUP] Removed 0 feed scroll views
[09:12:03] [CLEANUP] Removed 0 status labels
[09:12:03] [CLEANUP] Reset agent query state
[09:12:03] [CLEANUP] Updated page indicator
[09:12:03] [CLEANUP] Rebuilt video layout
[09:12:03] [CLEANUP] ✅ All agent connections and views cleaned up
[09:12:03] [CLEANUP] ========================================
[09:12:03] [SERVER] Starting reconnect polling (5s interval)
[09:12:03] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=114
[09:12:03] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28819, 28816, 28815, 28814, 28813]
[09:12:03] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[09:12:03] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28819, 28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808]
[09:12:03] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[09:12:03] [SCROLL] wasNearBottom=true, threshold=758, offset=3890, contentH=4668, boundsH=758, forceScroll=true
[09:12:03] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[09:12:03] [SCROLL] 💓 alive, visible=43...51, rows=53, estHeight=0.0, heightCalls=0
[09:12:03] [PUSH_EMBED] Got evolution data for message 28819, saving to local DB
[09:12:03] [PUSH_EMBED] Saved evolution data for message 28819
[09:12:03] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28816 → 28819
[09:12:03] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=63
[09:12:03] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3962, currentOffset=3962
[09:12:03] [SCROLL] Scrolling to 3962, animated=false
[09:12:03] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[09:12:03] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[09:12:03] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:12:04] [INCREMENTAL_SYNC] ✅ Found 3 new messages
[09:12:04] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 3 new messages, IDs=[28819, 28818, 28817]
[09:12:04] [REPLY_LOAD] ViewController+Database mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:12:04] [REPLY_LOAD] ViewController+Database mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:12:04] [PUSH_PRELOAD] No messages or parse error
[09:12:04] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28819, 28816, 28815, 28814, 28813, 28812, 28811, 28810, 28809, 28808]
[09:12:04] [PUSH] Server fetch on tap completed (success=false)
[09:12:04] [PUSH_TRACE] 📡 INCREMENTAL: Adding new message id=28818
[09:12:04] [PUSH_TRACE] 📡 INCREMENTAL: Adding new message id=28817
[09:12:04] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 2 new, total 53, first 10 IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:04] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=3
[09:12:04] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=53
[09:12:04] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 53 msgs, IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:04] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=6046 vccs=0
[09:12:04] [GAP_FIX] maxMessageIdAtBackground=28816, currentMaxLocalId=28819
[09:12:04] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28819, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 07:11:56";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "I have a dentist appointment at 17:30\Ud83e\Udd72";
    "message_id" = 28819;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28818;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("sender_name"): Esra, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("timer"): 0, AnyHashable("message"): I have a dentist appointment at 17:30🥲, AnyHashable("session_id"): ILUIWU, AnyHashable("thumb_file_name"): , AnyHashable("file_name"): , AnyHashable("operation_type"): 0, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 3;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_type"): 0, AnyHashable("datesent"): 2026-04-23 07:11:56]
[09:12:04] [PUSH_EMBED_VC] Message 28819 already in memory - skipping
[09:12:04] [PUSH] ⚡ Embedded message handled directly in ViewController
[09:12:04] [PUSH] Parsed message_id: 28819
[09:12:04] [PUSH] Parsed operation_type: 0
[09:12:04] [PUSH] Taking direct action: opType=0, messageId=28819
[09:12:04] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28819
[09:12:04] [PUSH] ⚡ Message 28819 already in memory - skipping duplicate notification entirely
[09:12:04] [GAP_FIX] Post-action sync: using background max 28816 to catch coalesced messages
[09:12:04] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=53
[09:12:04] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28816, maxMemoryId=28819
[09:12:04] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28816
[09:12:04] [FAST_REFRESH] Incremental sync complete - 53 messages
[09:12:04] [INCREMENTAL_SYNC] ✅ Found 3 new messages
[09:12:04] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 3 new messages, IDs=[28819, 28818, 28817]
[09:12:04] [REPLY_LOAD] ViewController+Database mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:12:04] [REPLY_LOAD] ViewController+Database mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:12:04] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 53 msgs, first 10 IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:04] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 53, first 10 IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:04] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=3
[09:12:04] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=53
[09:12:04] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:12:04] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=63
[09:12:04] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[28819, 28818, 28817, 28816, 28815]
[09:12:04] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 53 messages
[09:12:04] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:04] [RELOAD_TAB] 📊 Building chatRows from 53 messages
[09:12:04] [SCROLL] wasNearBottom=true, threshold=758, offset=3962, contentH=4720, boundsH=758, forceScroll=true
[09:12:04] [RELOAD_TAB] 📊 Built 55 chatRows, estHeight=0.0
[09:12:04] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=67
[09:12:04] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[09:12:04] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[09:12:04] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 53 msgs, IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:04] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=6046 vccs=0
[09:12:04] [GAP_FIX] maxMessageIdAtBackground=28816, currentMaxLocalId=28819
[09:12:04] [PUSH] handlePollEventsNotification userInfo: [:]
[09:12:04] [PUSH] No message_id in userInfo
[09:12:04] [PUSH] No operation_type in userInfo
[09:12:04] [FAST_REFRESH] Evolution disabled - performing incremental sync
[09:12:04] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=1, IDs=[28819]
[09:12:04] [PUSH_TRACE] 📬 POLL: memory state: count=53, first 10 IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:04] [FAST_REFRESH] Already have 53 messages in memory
[09:12:04] [FAST_REFRESH] maxMemoryId=28819, maxLocalId=28819
[09:12:04] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[09:12:04] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=53
[09:12:04] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[09:12:04] [READBY_OPT] No message IDs to fetch - skipping server call
[09:12:04] [GAP_FIX] Incremental sync will use since_id=28816 (background max=28816, current DB max=28819)
[09:12:04] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=53
[09:12:04] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28816, maxMemoryId=28819
[09:12:04] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28816
[09:12:04] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=true, nearBottom=true), maxY=4154, currentOffset=4154
[09:12:04] [SCROLL] Scrolling to 4154, animated=false
[09:12:04] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[09:12:04] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=53
[09:12:04] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:12:04] [INCREMENTAL_SYNC] ✅ Found 3 new messages
[09:12:04] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 3 new messages, IDs=[28819, 28818, 28817]
[09:12:04] [REPLY_LOAD] ViewController+Database mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:12:04] [REPLY_LOAD] ViewController+Database mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:12:04] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 53 msgs, first 10 IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:04] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 53, first 10 IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:04] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=3
[09:12:04] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=53
[09:12:04] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:12:04] [FAST_REFRESH] Incremental sync complete - 53 messages
[09:12:04] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=125
[09:12:04] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[28819, 28818, 28817, 28816, 28815]
[09:12:04] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 53 messages
[09:12:04] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:04] [RELOAD_TAB] 📊 Building chatRows from 53 messages
[09:12:04] [SCROLL] wasNearBottom=true, threshold=758, offset=4154, contentH=4912, boundsH=758, forceScroll=true
[09:12:04] [RELOAD_TAB] 📊 Built 55 chatRows, estHeight=0.0
[09:12:04] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=67
[09:12:04] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=true, nearBottom=true), maxY=4154, currentOffset=4154
[09:12:04] [SCROLL] Scrolling to 4154, animated=false
[09:12:05] [CLIENT_SIG] Typing start from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[09:12:05] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:12:05] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:12:05] [PIN_AUTH] Correct PIN
[09:12:05] [SECURITY] Restored real session: ILUIWU
[09:12:05] [SECURITY] Restored real session: ILUIWU
[09:12:05] [CLIENT_SIG] Event received: type=3 messageId=28819
[09:12:05] [WS_EVENT] Received event: type=3, messageId=28819
[09:12:05] [WS_EVENT] Read receipt for message 28819 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:12:05] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:12:05] HELLO → sent (cached token, role=query)
[09:12:05] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:12:05] [WS] Query connection failed - cleaning up all agent connections and views
[09:12:05] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:12:05] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:12:05] [CLEANUP] ========================================
[09:12:05] [CLEANUP] Cleaning up all agent connections and views
[09:12:05] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:12:05] [CLEANUP] Stopped and removed 0 video connections
[09:12:05] [CLEANUP] Removed 0 video views
[09:12:05] [CLEANUP] Removed 0 feed scroll views
[09:12:05] [CLEANUP] Removed 0 status labels
[09:12:05] [CLEANUP] Reset agent query state
[09:12:05] [CLEANUP] Updated page indicator
[09:12:05] [CLEANUP] Rebuilt video layout
[09:12:05] [CLEANUP] ✅ All agent connections and views cleaned up
[09:12:05] [CLEANUP] ========================================
[09:12:05] [SERVER] Starting reconnect polling (5s interval)
[09:12:05] [CLEANUP] ========================================
[09:12:05] [CLEANUP] Cleaning up all agent connections and views
[09:12:05] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:12:05] [CLEANUP] Stopped and removed 0 video connections
[09:12:05] [CLEANUP] Removed 0 video views
[09:12:05] [CLEANUP] Removed 0 feed scroll views
[09:12:05] [CLEANUP] Removed 0 status labels
[09:12:05] [CLEANUP] Reset agent query state
[09:12:05] [CLEANUP] Updated page indicator
[09:12:05] [CLEANUP] Rebuilt video layout
[09:12:05] [CLEANUP] ✅ All agent connections and views cleaned up
[09:12:05] [CLEANUP] ========================================
[09:12:05] [SERVER] Starting reconnect polling (5s interval)
[09:12:05] [LOCK] ✅ PIN auth callback - setting isAuthenticated = true
[09:12:05] [FAKE_AI] cancel() called, wasRunning=false
[09:12:05] [FAKE MODE] Exiting fake mode, restoring real session
[09:12:05] [SECURITY] Restored real session: ILUIWU
[09:12:05] [SECURITY] Saved real session: ILUIWU
[09:12:05] [FAKE MODE] ✅ Restored real session: ILUIWU
[09:12:05] [FAKE MODE] Loaded 50 messages (limited to page size)
[09:12:05] [READBY_OPT] No message IDs to fetch - skipping server call
[09:12:05] [AUTH] Authentication completed - updating UI only (data already fetched in foreground handler)
[09:12:05] [AUTH] Cache had 1 messages, maxExistingId=28819, inserted 0 truly new
[09:12:05] [LIFECYCLE] scrollToBottomIfNeeded time=false, count=50>50=false, maxId=28819>28816=true, shouldScroll=true
[09:12:05] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[09:12:05] [AUTH] UI update complete
[09:12:05] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=completed
[09:12:05] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[09:12:05] [FAKE MODE] Enriched 0/0 unsettled messages with readBy data
[09:12:05] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[09:12:05] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:12:05] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[09:12:05] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[09:12:05] [SCROLL] 💓 alive, visible=42...51, rows=52, estHeight=0.0, heightCalls=187
[09:12:05] [USER] ✅ User registered successfully
[09:12:05] [PUSH] User registration after token update: success
[09:12:05] [CLIENT_SIG] Event received: type=3 messageId=28817
[09:12:05] [WS_EVENT] Received event: type=3, messageId=28817
[09:12:05] [WS_EVENT] Read receipt for message 28817 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:12:05] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[09:12:05] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28819, 28818, 28817, 28816, 28815]
[09:12:05] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[09:12:05] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:05] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[09:12:05] [SCROLL] wasNearBottom=true, threshold=758, offset=3973, contentH=4731, boundsH=758, forceScroll=true
[09:12:05] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[09:12:05] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=62
[09:12:05] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3973, currentOffset=3973
[09:12:05] [SCROLL] Scrolling to 3973, animated=false
[09:12:05] [PUSH] Silent push received
[09:12:05] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:12:05 +0000, appState=0, message_id=nil, type=nil
[09:12:05] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[09:12:05] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:12:05 +0000
[09:12:05] [PUSH_EMBED] No embedded message_data in notification
[09:12:05] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[09:12:05] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[09:12:05] [PUSH] No embedded data, pre-loading messages from server
[09:12:05] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:12:05] [CLIENT_SIG] Event received: type=3 messageId=28818
[09:12:05] [WS_EVENT] Received event: type=3, messageId=28818
[09:12:05] [WS_EVENT] Read receipt for message 28818 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:12:06] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[09:12:06] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:12:06] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:12:06] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:12:06] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:12:06] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:12:06] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:06] [PUSH_TRACE] 🔀 mergeMessages: Different session (nil vs ILUIWU), replacing cache
[09:12:06] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[09:12:06] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[09:12:06] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:06] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=6048 vccs=0
[09:12:06] [GAP_FIX] maxMessageIdAtBackground=28816, currentMaxLocalId=28819
[09:12:06] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28818, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
[09:12:06] [PUSH] Parsed message_id: 28818
[09:12:06] [PUSH] Parsed operation_type: 3
[09:12:06] [PUSH] Taking direct action: opType=3, messageId=28818
[09:12:06] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28818
[09:12:06] [GAP_FIX] Post-action sync: using background max 28816 to catch coalesced messages
[09:12:06] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[09:12:06] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28816, maxMemoryId=28819
[09:12:06] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28816
[09:12:06] [INCREMENTAL_SYNC] ✅ Found 3 new messages
[09:12:06] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 3 new messages, IDs=[28819, 28818, 28817]
[09:12:06] [REPLY_LOAD] ViewController+Database mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:12:06] [REPLY_LOAD] ViewController+Database mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:12:06] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 50 msgs, first 10 IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:06] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 50, first 10 IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:06] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=3
[09:12:06] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[09:12:06] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=62
[09:12:06] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28819, 28818, 28817, 28816, 28815]
[09:12:06] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[09:12:06] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:06] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[09:12:06] [SCROLL] wasNearBottom=true, threshold=758, offset=3973, contentH=4731, boundsH=758, forceScroll=false
[09:12:06] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[09:12:06] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[09:12:07] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:12:07] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:12:07] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:12:07] HELLO → sent (cached token, role=query)
[09:12:07] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:12:07] [WS] Query connection failed - cleaning up all agent connections and views
[09:12:07] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:12:07] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:12:07] [CLEANUP] ========================================
[09:12:07] [CLEANUP] Cleaning up all agent connections and views
[09:12:07] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:12:07] [CLEANUP] Stopped and removed 0 video connections
[09:12:07] [CLEANUP] Removed 0 video views
[09:12:07] [CLEANUP] Removed 0 feed scroll views
[09:12:07] [CLEANUP] Removed 0 status labels
[09:12:07] [CLEANUP] Reset agent query state
[09:12:07] [CLEANUP] Updated page indicator
[09:12:07] [CLEANUP] Rebuilt video layout
[09:12:07] [CLEANUP] ✅ All agent connections and views cleaned up
[09:12:07] [CLEANUP] ========================================
[09:12:07] [SERVER] Starting reconnect polling (5s interval)
[09:12:07] [CLEANUP] ========================================
[09:12:07] [CLEANUP] Cleaning up all agent connections and views
[09:12:07] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:12:07] [CLEANUP] Stopped and removed 0 video connections
[09:12:07] [CLEANUP] Removed 0 video views
[09:12:07] [CLEANUP] Removed 0 feed scroll views
[09:12:07] [CLEANUP] Removed 0 status labels
[09:12:07] [CLEANUP] Reset agent query state
[09:12:07] [CLEANUP] Updated page indicator
[09:12:07] [CLEANUP] Rebuilt video layout
[09:12:07] [CLEANUP] ✅ All agent connections and views cleaned up
[09:12:07] [CLEANUP] ========================================
[09:12:07] [SERVER] Starting reconnect polling (5s interval)
[09:12:08] [MENU] dismissAnyExistingMenu called
[09:12:08] [MENU] dismissAnyExistingMenu completed
[09:12:08] [SCROLL_BEGIN_DRAG] messagesTable offsetY=3973, insetTop=0, topDistance=3973, rows=52, prefetchedCount=0
[09:12:08] [SCROLL] 💓 alive, visible=42...51, rows=52, estHeight=0.0, heightCalls=1
[09:12:08] [SCROLL_WILL_END] velocity=(0.000, 1.133), currentY=3975, targetY=3973, movingTowardTop=true, decelNow=false, dragging=false
[09:12:08] [SCROLL_WILL_END] captured upward momentum velocityY=1.1332885380371427
[09:12:08] [SCROLL_END_DRAG] messagesTable decelerate=true, offsetY=3975, topInset=0, pendingVelocityY=1.1332885380371427, targetNearTop=3975
[09:12:08] [SCROLL_END_DECEL] messagesTable offsetY=3973, insetTop=0, pendingVelocityY=1.1332885380371427
[09:12:08] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:12:08] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:12:08] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:12:08] HELLO → sent (cached token, role=query)
[09:12:08] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:12:08] [WS] Query connection failed - cleaning up all agent connections and views
[09:12:08] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:12:08] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:12:08] [CLEANUP] ========================================
[09:12:08] [CLEANUP] Cleaning up all agent connections and views
[09:12:08] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:12:08] [CLEANUP] Stopped and removed 0 video connections
[09:12:08] [CLEANUP] Removed 0 video views
[09:12:08] [CLEANUP] Removed 0 feed scroll views
[09:12:08] [CLEANUP] Removed 0 status labels
[09:12:08] [CLEANUP] Reset agent query state
[09:12:08] [CLEANUP] Updated page indicator
[09:12:08] [CLEANUP] Rebuilt video layout
[09:12:08] [CLEANUP] ✅ All agent connections and views cleaned up
[09:12:08] [CLEANUP] ========================================
[09:12:08] [SERVER] Starting reconnect polling (5s interval)
[09:12:08] [CLEANUP] ========================================
[09:12:08] [CLEANUP] Cleaning up all agent connections and views
[09:12:08] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:12:08] [CLEANUP] Stopped and removed 0 video connections
[09:12:08] [CLEANUP] Removed 0 video views
[09:12:08] [CLEANUP] Removed 0 feed scroll views
[09:12:08] [CLEANUP] Removed 0 status labels
[09:12:08] [CLEANUP] Reset agent query state
[09:12:08] [CLEANUP] Updated page indicator
[09:12:08] [CLEANUP] Rebuilt video layout
[09:12:08] [CLEANUP] ✅ All agent connections and views cleaned up
[09:12:08] [CLEANUP] ========================================
[09:12:08] [SERVER] Starting reconnect polling (5s interval)
[09:12:10] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:12:10] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:12:10] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:12:10] HELLO → sent (cached token, role=query)
[09:12:10] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:12:10] [WS] Query connection failed - cleaning up all agent connections and views
[09:12:10] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:12:10] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:12:10] [CLEANUP] ========================================
[09:12:10] [CLEANUP] Cleaning up all agent connections and views
[09:12:10] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:12:10] [CLEANUP] Stopped and removed 0 video connections
[09:12:10] [CLEANUP] Removed 0 video views
[09:12:10] [CLEANUP] Removed 0 feed scroll views
[09:12:10] [CLEANUP] Removed 0 status labels
[09:12:10] [CLEANUP] Reset agent query state
[09:12:10] [CLEANUP] Updated page indicator
[09:12:10] [CLEANUP] Rebuilt video layout
[09:12:10] [CLEANUP] ✅ All agent connections and views cleaned up
[09:12:10] [CLEANUP] ========================================
[09:12:10] [SERVER] Starting reconnect polling (5s interval)
[09:12:10] [CLEANUP] ========================================
[09:12:10] [CLEANUP] Cleaning up all agent connections and views
[09:12:10] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:12:10] [CLEANUP] Stopped and removed 0 video connections
[09:12:10] [CLEANUP] Removed 0 video views
[09:12:10] [CLEANUP] Removed 0 feed scroll views
[09:12:10] [CLEANUP] Removed 0 status labels
[09:12:10] [CLEANUP] Reset agent query state
[09:12:10] [CLEANUP] Updated page indicator
[09:12:10] [CLEANUP] Rebuilt video layout
[09:12:10] [CLEANUP] ✅ All agent connections and views cleaned up
[09:12:10] [CLEANUP] ========================================
[09:12:10] [SERVER] Starting reconnect polling (5s interval)
[09:12:10] [MENU] dismissAnyExistingMenu called
[09:12:10] [MENU] dismissAnyExistingMenu completed
[09:12:10] [EMOJI_PICKER] Starting emoji picker for message 28817
[09:12:10] [MENU] Created button 'Reply' at index 0
[09:12:10] [MENU] Created button 'Copy' at index 1
[09:12:10] [MENU] Created button 'Delete' at index 2
[09:12:10] [MENU] Menu added at y=516.0
[09:12:11] [EMOJI_PICKER] ✅ Fetched 6 recent emojis
[09:12:11] [EMOJI_PICKER] ✅ Creating picker with 6 recent emojis
[09:12:11] [EMOJI_PICKER] ✅ Picker shown at y=360.0
[09:12:11] [CLIENT_SIG] Typing stop from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[09:12:11] [CLIENT_SIG] Event received: type=0 messageId=28820
[09:12:11] [WS_EVENT] Received event: type=0, messageId=28820
[09:12:11] [WS_EVENT] 📨 New message notification (msgId=28820) - triggering incremental refresh, currentMsgCount=50
[09:12:11] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[09:12:11] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28819, maxMemoryId=28819
[09:12:11] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28819
[09:12:11] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[09:12:11] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28820]
[09:12:11] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 50 msgs, first 10 IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:11] [PUSH_TRACE] 📡 INCREMENTAL: Adding new message id=28820
[09:12:11] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 1 new, total 51, first 10 IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:11] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[09:12:11] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:12:11] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[09:12:11] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[09:12:11] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28820, 28819, 28818, 28817, 28816]
[09:12:11] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[09:12:11] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:11] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[09:12:11] [SCROLL] wasNearBottom=true, threshold=758, offset=3973, contentH=4731, boundsH=758, forceScroll=false
[09:12:11] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[09:12:11] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28819 → 28820
[09:12:11] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=64
[09:12:11] [SCROLL] 💓 alive, visible=42...52, rows=53, estHeight=0.0, heightCalls=118
[09:12:11] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4025, currentOffset=4025
[09:12:11] [SCROLL] Scrolling to 4025, animated=true
[09:12:12] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:12:12] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:12:12] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:12:12] HELLO → sent (cached token, role=query)
[09:12:12] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:12:12] [WS] Query connection failed - cleaning up all agent connections and views
[09:12:12] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:12:12] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:12:12] [CLEANUP] ========================================
[09:12:12] [CLEANUP] Cleaning up all agent connections and views
[09:12:12] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:12:12] [CLEANUP] Stopped and removed 0 video connections
[09:12:12] [CLEANUP] Removed 0 video views
[09:12:12] [CLEANUP] Removed 0 feed scroll views
[09:12:12] [CLEANUP] Removed 0 status labels
[09:12:12] [CLEANUP] Reset agent query state
[09:12:12] [CLEANUP] Updated page indicator
[09:12:12] [CLEANUP] Rebuilt video layout
[09:12:12] [CLEANUP] ✅ All agent connections and views cleaned up
[09:12:12] [CLEANUP] ========================================
[09:12:12] [SERVER] Starting reconnect polling (5s interval)
[09:12:12] [CLEANUP] ========================================
[09:12:12] [CLEANUP] Cleaning up all agent connections and views
[09:12:12] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:12:12] [CLEANUP] Stopped and removed 0 video connections
[09:12:12] [CLEANUP] Removed 0 video views
[09:12:12] [CLEANUP] Removed 0 feed scroll views
[09:12:12] [CLEANUP] Removed 0 status labels
[09:12:12] [CLEANUP] Reset agent query state
[09:12:12] [CLEANUP] Updated page indicator
[09:12:12] [CLEANUP] Rebuilt video layout
[09:12:12] [CLEANUP] ✅ All agent connections and views cleaned up
[09:12:12] [CLEANUP] ========================================
[09:12:12] [SERVER] Starting reconnect polling (5s interval)
[09:12:12] [REACTION] add 👄 to message 28817 (alreadyReacted: false)
[09:12:12] [MENU] dismissAnyExistingMenu called
[09:12:12] [MENU] Found menu with tag 9999, removing
[09:12:12] [MENU] Removing blur effect
[09:12:12] [MENU] Removing floating message snapshot
[09:12:12] [MENU] Dismissing emoji picker
[09:12:12] [MENU] Recorded dismissal time for debounce
[09:12:12] [MENU] dismissAnyExistingMenu completed
[09:12:12] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[09:12:12] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:12] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=6055 vccs=0
[09:12:12] [GAP_FIX] maxMessageIdAtBackground=28816, currentMaxLocalId=28820
[09:12:12] [PUSH] handlePollEventsNotification userInfo: [:]
[09:12:12] [PUSH] No message_id in userInfo
[09:12:12] [PUSH] No operation_type in userInfo
[09:12:12] [FAST_REFRESH] Evolution disabled - performing incremental sync
[09:12:12] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=50, IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:12] [PUSH_TRACE] 📬 POLL: memory state: count=51, first 10 IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:12] [FAST_REFRESH] Already have 51 messages in memory
[09:12:12] [FAST_REFRESH] maxMemoryId=28820, maxLocalId=28820
[09:12:12] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[09:12:12] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:12:12] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[09:12:12] [READBY_OPT] No message IDs to fetch - skipping server call
[09:12:12] [GAP_FIX] Incremental sync will use since_id=28816 (background max=28816, current DB max=28820)
[09:12:12] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[09:12:12] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28816, maxMemoryId=28820
[09:12:12] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28816
[09:12:12] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[09:12:12] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:12:12] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:12:12] [PUSH_DEBUG] ⬇️ PUSH RECEIVED at 2026-04-23 07:12:12 +0000 - type: unknown, operation_type: 0, message_id: 28820, session_id: ILUIWU, state: 0
[09:12:12] [PUSH_DEBUG] Full userInfo: [AnyHashable("timer"): 0, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): , AnyHashable("message_type"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("thumb_file_name"): , AnyHashable("datesent"): 2026-04-23 07:12:11, AnyHashable("message"): Are you home baby?, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("message_id"): 28820, AnyHashable("sender_name"): Esra, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 07:12:11";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Are you home baby?";
    "message_id" = 28820;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28819;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
[09:12:12] [PUSH] App active - suppressing notification UI, posting internal event
[09:12:12] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:12:12 +0000
[09:12:12] [PUSH_TRACE] ⬇️ Processing embedded message_id=28820
[09:12:12] [PUSH_EMBED] 📩 Received embedded message: id=28820, type=0, sender=Esra
[09:12:12] [PUSH_TRACE] ⬇️ Message details: text="Are you home baby?...", datesent=2026-04-23 07:12:11
[09:12:12] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[09:12:12] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28820
[09:12:12] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28820
[09:12:12] [PUSH_EMBED] ✅ Saved message 28820 to local DB (sync)
[09:12:12] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28820
[09:12:12] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28820
[09:12:12] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28820
[09:12:12] [PUSH_TRACE] 📦 Cache state: valid=true, count=50, IDs=[28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811, 28810]
[09:12:12] [PUSH_EMBED] Inserted message 28820 into existing cache (now 51 messages)
[09:12:12] [PUSH_TRACE] 📦 ✅ Inserted message 28820, cache now has IDs: [28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:12] [PUSH_TRACE] 📦 EXITING cache update queue for message 28820
[09:12:12] [PUSH_EMBED] Fetching evolution data for message 28820 in background
[09:12:12] [PUSH_EMBED] ✅ Fully processed message 28820
[09:12:12] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28820
[09:12:12] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:12] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=6055 vccs=0
[09:12:12] [GAP_FIX] maxMessageIdAtBackground=28816, currentMaxLocalId=28820
[09:12:12] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("timer"): 0, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): , AnyHashable("message_type"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("thumb_file_name"): , AnyHashable("datesent"): 2026-04-23 07:12:11, AnyHashable("message"): Are you home baby?, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("message_id"): 28820, AnyHashable("sender_name"): Esra, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 07:12:11";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Are you home baby?";
    "message_id" = 28820;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28819;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
[09:12:12] [PUSH_EMBED_VC] Message 28820 already in memory - skipping
[09:12:12] [PUSH] ⚡ Embedded message handled directly in ViewController
[09:12:12] [PUSH] Parsed message_id: 28820
[09:12:12] [PUSH] Parsed operation_type: 0
[09:12:12] [PUSH] Taking direct action: opType=0, messageId=28820
[09:12:12] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28820
[09:12:12] [PUSH] ⚡ Message 28820 already in memory - skipping duplicate notification entirely
[09:12:12] [GAP_FIX] Post-action sync: using background max 28816 to catch coalesced messages
[09:12:12] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[09:12:12] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[09:12:12] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[09:12:12] [PUSH_TRACE] 👁️ Received message id=28820, text="Are you home baby?..."
[09:12:12] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[09:12:12] [PUSH_UI] Message 28820 already in memory - skipping insert
[09:12:12] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[09:12:12] [PUSH] Silent push received
[09:12:12] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:12:12 +0000, appState=0, message_id=28820, type=nil
[09:12:12] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=51, IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:12] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:12:12 +0000
[09:12:12] [PUSH_TRACE] ⬇️ Processing embedded message_id=28820
[09:12:12] [PUSH_EMBED] 📩 Received embedded message: id=28820, type=0, sender=Esra
[09:12:12] [PUSH_TRACE] ⬇️ Message details: text="Are you home baby?...", datesent=2026-04-23 07:12:11
[09:12:12] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[09:12:12] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28820
[09:12:12] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28820
[09:12:12] [PUSH_EMBED] ✅ Saved message 28820 to local DB (sync)
[09:12:12] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28820
[09:12:12] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28820
[09:12:12] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28820
[09:12:12] [PUSH_TRACE] 📦 Cache state: valid=true, count=51, IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:12] [PUSH_TRACE] 📦 ⚠️ Message 28820 already in cache, skipping insert
[09:12:12] [PUSH_TRACE] 📦 EXITING cache update queue for message 28820
[09:12:12] [PUSH_EMBED] Fetching evolution data for message 28820 in background
[09:12:12] [PUSH_EMBED] ✅ Fully processed message 28820
[09:12:12] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28820
[09:12:12] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811], handled=true
[09:12:12] [PUSH] Embedded message handled instantly from silent push
[09:12:12] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[09:12:12] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28820
[09:12:12] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[09:12:12] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[09:12:12] [PUSH_TRACE] 👁️ Received message id=28820, text="Are you home baby?..."
[09:12:12] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[09:12:12] [PUSH_UI] Message 28820 already in memory - skipping insert
[09:12:12] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[09:12:12] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:12] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=6055 vccs=0
[09:12:12] [GAP_FIX] maxMessageIdAtBackground=28816, currentMaxLocalId=28820
[09:12:12] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("timer"): 0, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 0;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): , AnyHashable("message_type"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("thumb_file_name"): , AnyHashable("datesent"): 2026-04-23 07:12:11, AnyHashable("message"): Are you home baby?, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("sender_name"): Esra, AnyHashable("message_id"): 28820, AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 07:12:11";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Are you home baby?";
    "message_id" = 28820;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28819;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
[09:12:12] [PUSH_EMBED_VC] Message 28820 already in memory - skipping
[09:12:12] [PUSH] ⚡ Embedded message handled directly in ViewController
[09:12:12] [PUSH] Parsed message_id: 28820
[09:12:12] [PUSH] Parsed operation_type: 0
[09:12:12] [PUSH] Taking direct action: opType=0, messageId=28820
[09:12:12] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28820
[09:12:12] [PUSH] ⚡ Message 28820 already in memory - skipping duplicate notification entirely
[09:12:12] [GAP_FIX] Post-action sync: using background max 28816 to catch coalesced messages
[09:12:12] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[09:12:12] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[09:12:12] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28820, 28819, 28818, 28817, 28816]
[09:12:12] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[09:12:12] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:12] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[09:12:12] [SCROLL] wasNearBottom=true, threshold=758, offset=4025, contentH=4783, boundsH=758, forceScroll=true
[09:12:12] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[09:12:12] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=64
[09:12:12] [LIFECYCLE] App resigning active - cleared crash flag
[09:12:12] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4025, currentOffset=4025
[09:12:12] [SCROLL] Scrolling to 4025, animated=false
[09:12:13] [PUSH] Silent push received
[09:12:13] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:12:13 +0000, appState=1, message_id=nil, type=nil
[09:12:13] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=51, IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:13] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:12:13 +0000
[09:12:13] [PUSH_EMBED] No embedded message_data in notification
[09:12:13] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[09:12:13] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811], handled=false
[09:12:13] [PUSH] No embedded data, pre-loading messages from server
[09:12:13] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:12:13] [REACTION] Added 👄 reaction to message 28817
[09:12:13] [REACTION_SCROLL] =====ENTER path=picker action=add msgId=28817 emoji=👄
[09:12:13] [REACTION_SCROLL] state offsetY=4025 bounds=758 adjTop=0 adjBot=0 contentH=4783 estH=0
[09:12:13] [REACTION_SCROLL] rows oldCount=53 newCount=53 reactedRow=49 reactedVisible=true
[09:12:13] [REACTION_SCROLL] reacted rectMinY=4475 rectH=96 cellFrameMinY=4475 cellFrameH=96
[09:12:13] [REACTION_SCROLL] anchor row=42 minY=3951 VPY=-74 visibleCount=11 visibleRows=[42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52]
[09:12:13] [REACTION_SCROLL] scrollState dragging=false decel=false tracking=false
[09:12:13] [REACTION_SCROLL] after reloadRows offsetΔ=0 contentHΔ=20
[09:12:13] [REACTION_SCROLL] after layoutIfNeeded offsetΔFromSave=0 contentHDelta=20
[09:12:13] [REACTION_SCROLL] reactedAfter rectMinY=4475 rectH=116 rectMinYΔ=0 rectHΔ=20
[09:12:13] [REACTION_SCROLL] reactedCellFrameAfter minY=4475 h=116
[09:12:13] [REACTION_SCROLL] anchor rectMinYAfter=3951 drift=0
[09:12:13] [REACTION_SCROLL] math rawTarget=4025 maxOffsetY=4045 clamped=4025 clampedAgainstRaw=0
[09:12:13] [REACTION_SCROLL] no offset change (within 0.5pt, current=4025)
[09:12:13] [REACTION_SCROLL] finalOffset=4025 totalΔFromSave=0
[09:12:13] [PUSH_EMBED] Got evolution data for message 28820, saving to local DB
[09:12:13] [PUSH_EMBED] Saved evolution data for message 28820
[09:12:13] [PUSH_EMBED] Got evolution data for message 28820, saving to local DB
[09:12:13] [PUSH_EMBED] Saved evolution data for message 28820
[09:12:13] [INCREMENTAL_SYNC] ✅ Found 4 new messages
[09:12:13] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 4 new messages, IDs=[28820, 28819, 28818, 28817]
[09:12:13] [REPLY_LOAD] ViewController+Database mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:12:13] [REPLY_LOAD] ViewController+Database mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:12:13] [PARSE_REACTIONS] Message 28817 has 1 reactions: ["👄"]
[09:12:13] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:13] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:13] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=4
[09:12:13] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:12:13] [INCREMENTAL_SYNC] 🔁 Processing queued retry refresh
[09:12:13] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[09:12:13] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28820, maxMemoryId=28820
[09:12:13] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28820
[09:12:13] [FAST_REFRESH] Incremental sync complete - 51 messages
[09:12:13] [CLIENT_SIG] Event received: type=3 messageId=28820
[09:12:13] [WS_EVENT] Received event: type=3, messageId=28820
[09:12:13] [WS_EVENT] Read receipt for message 28820 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:12:13] [INCREMENTAL_SYNC] ✅ No new messages
[09:12:13] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[09:12:13] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[09:12:13] [SECURITY] Saved background timestamp
[09:12:13] [LIFECYCLE] App entering background - cleared crash flag
[09:12:13] [CLIENT_SIG] Disconnecting
[09:12:13] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[09:12:13] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[09:12:13] [PUSH_TRACE] 💤 BACKGROUND: memory has 51 messages, first 10 IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:13] [LIFECYCLE] Background snapshot: count=51, maxId=28820
[09:12:13] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=3
[09:12:13] [WS] Canceling WebSocket for query connection to iosILUIWU
[09:12:13] In cleanupPeer
[09:12:13] In cleanupPeer
[09:12:13] [LIFECYCLE] WebRTC audio disabled
[09:12:13] [LIFECYCLE] AVAudioSession deactivated
[09:12:13] [LIFECYCLE] All connections stopped
[09:12:13] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[09:12:13] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:12:13] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:12:13] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:12:13] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:12:13] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:12:13] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:13] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=51, IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:13] [PRELOAD_CACHE] Preserving 1 push-inserted messages: [28729]
[09:12:13] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=1, IDs=[28729]
[09:12:13] [PUSH_TRACE] 🔀 mergeMessages: merged.count=51, first 10 IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:13] [PUSH_PRELOAD] ⚡ Pre-cached 51 messages for instant display (preserved 1 from push)
[09:12:13] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[09:12:13] [CLIENT_SIG] WebSocket closed with code 1001
[09:12:13] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[09:12:13] [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/}
[09:12:13] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[09:12:13] [SERVER] Stopped reconnect polling
[09:12:13] [WS] URLSession invalidated successfully
[09:12:13] Will request stop of video 0
[09:12:13] Will request stop of video 0
[09:12:13] [REACTION_SCROLL] =====EXIT
[09:12:13] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:12:13] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:12:13] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:13] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=6056 vccs=0
[09:12:13] [GAP_FIX] maxMessageIdAtBackground=28820, currentMaxLocalId=28820
[09:12:13] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28820, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3]
[09:12:13] [PUSH] Parsed message_id: 28820
[09:12:13] [PUSH] Parsed operation_type: 3
[09:12:13] [PUSH] Taking direct action: opType=3, messageId=28820
[09:12:13] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28820
[09:12:13] [GAP_FIX] Post-action sync: using background max 28820 to catch coalesced messages
[09:12:13] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[09:12:13] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28820, maxMemoryId=28820
[09:12:13] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28820
[09:12:13] [PIP] Removing 0 tracks from PiP for connection 0
[09:12:13] [PIP] ✅ All tracks removed for connection 0
[09:12:13] [PIP] Removing 0 tracks from PiP for connection 0
[09:12:13] [PIP] ✅ All tracks removed for connection 0
[09:12:13] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=118
[09:12:13] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28820, 28819, 28818, 28817, 28816]
[09:12:13] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[09:12:13] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:12:13] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[09:12:13] [SCROLL] wasNearBottom=true, threshold=758, offset=4025, contentH=4803, boundsH=758, forceScroll=false
[09:12:13] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[09:12:13] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=64
[09:12:13] [INCREMENTAL_SYNC] ✅ No new messages
[09:12:13] [SCROLL] Async handler: shouldScroll=false (force=false, newMsgs=false, nearBottom=true), maxY=4045, currentOffset=4025
[09:12:13] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:12:13] HELLO → sent (cached token, role=query)
[09:12:14] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:12:14] [WS] Query connection failed - cleaning up all agent connections and views
[09:12:14] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:12:14] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:12:14] [CLEANUP] ========================================
[09:12:14] [CLEANUP] Cleaning up all agent connections and views
[09:12:14] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:12:14] [CLEANUP] Stopped and removed 0 video connections
[09:12:14] [CLEANUP] Removed 0 video views
[09:12:14] [CLEANUP] Removed 0 feed scroll views
[09:12:14] [CLEANUP] Removed 0 status labels
[09:12:14] [CLEANUP] Reset agent query state
[09:12:14] [CLEANUP] Updated page indicator
[09:12:14] [CLEANUP] Rebuilt video layout
[09:12:14] [CLEANUP] ✅ All agent connections and views cleaned up
[09:12:14] [CLEANUP] ========================================
[09:12:14] [SERVER] Skipping reconnect polling - app is in background
[09:12:14] [CLEANUP] ========================================
[09:12:14] [CLEANUP] Cleaning up all agent connections and views
[09:12:14] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:12:14] [CLEANUP] Stopped and removed 0 video connections
[09:12:14] [CLEANUP] Removed 0 video views
[09:12:14] [CLEANUP] Removed 0 feed scroll views
[09:12:14] [CLEANUP] Removed 0 status labels
[09:12:14] [CLEANUP] Reset agent query state
[09:12:14] [CLEANUP] Updated page indicator
[09:12:14] [CLEANUP] Rebuilt video layout
[09:12:14] [CLEANUP] ✅ All agent connections and views cleaned up
[09:12:14] [CLEANUP] ========================================
[09:12:14] [SERVER] Skipping reconnect polling - app is in background
[09:16:06] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[09:16:06] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:16:06] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=6289 vccs=0
[09:16:06] [NETWORK] Status changed: connected
[09:16:06] [GAP_FIX] maxMessageIdAtBackground=28820, currentMaxLocalId=28821
[09:16:06] [PUSH] handlePollEventsNotification userInfo: [:]
[09:16:06] [PUSH] No message_id in userInfo
[09:16:06] [PUSH] No operation_type in userInfo
[09:16:06] [FAST_REFRESH] Evolution disabled - performing incremental sync
[09:16:06] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=51, IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:16:06] [PUSH_TRACE] 📬 POLL: memory state: count=51, first 10 IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:16:06] [FAST_REFRESH] Already have 51 messages in memory
[09:16:06] [FAST_REFRESH] maxMemoryId=28820, maxLocalId=28821
[09:16:06] [FAST_REFRESH] 🌙 Found 1 overnight messages in local DB (IDs > 28820)
[09:16:06] [FAST_REFRESH] 🌙 Merged 1 overnight messages into memory (now 52 total)
[09:16:06] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[09:16:06] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[09:16:06] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[09:16:06] [READBY_OPT] No message IDs to fetch - skipping server call
[09:16:06] [GAP_FIX] Incremental sync will use since_id=28820 (background max=28820, current DB max=28821)
[09:16:06] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[09:16:06] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28820, maxMemoryId=28821
[09:16:06] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28820
[09:16:06] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:16:06] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:16:06] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:16:06] [PUSH] Silent push received
[09:16:06] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:16:06 +0000, appState=2, message_id=28821, type=nil
[09:16:06] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=51, IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:16:06] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:16:06 +0000
[09:16:06] [PUSH_TRACE] ⬇️ Processing embedded message_id=28821
[09:16:06] [PUSH_EMBED] 📩 Received embedded message: id=28821, type=1, sender=Esra
[09:16:06] [PUSH_TRACE] ⬇️ Message details: text="...", datesent=2026-04-23 07:16:04
[09:16:06] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[09:16:06] [PUSH_EMBED] Media message detected - deferring until media available: 2c2436d604281163.jpg
[09:16:06] [PUSH_EMBED_MEDIA] Checking media availability (attempt 1/5): 2c2436d604281163.jpg
[09:16:06] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811], handled=false
[09:16:06] [PUSH] No embedded data, pre-loading messages from server
[09:16:06] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:16:06] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[09:16:06] [PUSH] Silent push received
[09:16:06] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:16:06 +0000, appState=2, message_id=nil, type=nil
[09:16:06] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=51, IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811]
[09:16:06] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:16:06 +0000
[09:16:06] [PUSH_EMBED] No embedded message_data in notification
[09:16:06] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[09:16:06] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812, 28811], handled=false
[09:16:06] [PUSH] No embedded data, pre-loading messages from server
[09:16:06] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:16:06] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[09:16:06] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:16:07] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:16:07] HELLO → sent (cached token, role=query)
[09:16:07] [CLIENT_SIG] WebSocket opened
[09:16:07] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[09:16:07] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:16:07] [WS] Query connection failed - cleaning up all agent connections and views
[09:16:07] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:16:07] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:16:07] [CLEANUP] ========================================
[09:16:07] [CLEANUP] Cleaning up all agent connections and views
[09:16:07] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:16:07] [CLEANUP] Stopped and removed 0 video connections
[09:16:07] [CLEANUP] Removed 0 video views
[09:16:07] [CLEANUP] Removed 0 feed scroll views
[09:16:07] [CLEANUP] Removed 0 status labels
[09:16:07] [CLEANUP] Reset agent query state
[09:16:07] [CLEANUP] Updated page indicator
[09:16:07] [CLEANUP] Rebuilt video layout
[09:16:07] [CLEANUP] ✅ All agent connections and views cleaned up
[09:16:07] [CLEANUP] ========================================
[09:16:07] [SERVER] Skipping reconnect polling - app is in background
[09:16:07] [CLEANUP] ========================================
[09:16:07] [CLEANUP] Cleaning up all agent connections and views
[09:16:07] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:16:07] [CLEANUP] Stopped and removed 0 video connections
[09:16:07] [CLEANUP] Removed 0 video views
[09:16:07] [CLEANUP] Removed 0 feed scroll views
[09:16:07] [CLEANUP] Removed 0 status labels
[09:16:07] [CLEANUP] Reset agent query state
[09:16:07] [CLEANUP] Updated page indicator
[09:16:07] [CLEANUP] Rebuilt video layout
[09:16:07] [CLEANUP] ✅ All agent connections and views cleaned up
[09:16:07] [CLEANUP] ========================================
[09:16:07] [SERVER] Skipping reconnect polling - app is in background
[09:16:07] [CLIENT_SIG] Connected! clientId=zmjyYiXucqy_EVv7
[09:16:07] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[09:16:07] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28821]
[09:16:07] [USTATUS] DB_INSERT msgId=28821 file=2c2436d604281163.jpg parsed=0 rawType=Optional<Any> raw=Optional(0)
[09:16:07] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[09:16:07] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:16:07] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 52 msgs, first 10 IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 52, first 10 IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[09:16:07] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[09:16:07] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:16:07] [FAST_REFRESH] Incremental sync complete - 52 messages
[09:16:07] [PUSH_EMBED_MEDIA] ✅ Media available on server: 2c2436d604281163.jpg
[09:16:07] [PUSH_EMBED_MEDIA] Processing verified media message: 28821
[09:16:07] [PUSH_EMBED_MEDIA] Saved message 28821 to local DB
[09:16:07] [PUSH_EMBED_MEDIA] Inserted message into existing cache
[09:16:07] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 52 msgs, IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=6289 vccs=0
[09:16:07] [GAP_FIX] maxMessageIdAtBackground=28820, currentMaxLocalId=28821
[09:16:07] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_data"): ["sender_id": "EDAD55A1-003F-415D-AA60-672B34B504FE", "message": "", "message_type": 1, "sender_name": "Esra", "datesent": "2026-04-23 07:16:04", "file_name": Optional("2c2436d604281163.jpg"), "message_id": 28821, "timer": 0]]
[09:16:07] [PUSH_EMBED_VC] Message 28821 already in memory - skipping
[09:16:07] [PUSH] ⚡ Embedded message handled directly in ViewController
[09:16:07] [PUSH] No message_id in userInfo
[09:16:07] [PUSH] No operation_type in userInfo
[09:16:07] [FAST_REFRESH] Evolution disabled - performing incremental sync
[09:16:07] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=52, IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [PUSH_TRACE] 📬 POLL: memory state: count=52, first 10 IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [FAST_REFRESH] Already have 52 messages in memory
[09:16:07] [FAST_REFRESH] maxMemoryId=28821, maxLocalId=28821
[09:16:07] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[09:16:07] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[09:16:07] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:16:07] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[09:16:07] [READBY_OPT] No message IDs to fetch - skipping server call
[09:16:07] [GAP_FIX] Incremental sync will use since_id=28820 (background max=28820, current DB max=28821)
[09:16:07] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[09:16:07] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28820, maxMemoryId=28821
[09:16:07] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28820
[09:16:07] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[09:16:07] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[09:16:07] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:16:07] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[09:16:07] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28821]
[09:16:07] [USTATUS] DB_INSERT msgId=28821 file=2c2436d604281163.jpg parsed=0 rawType=Optional<Any> raw=Optional(0)
[09:16:07] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 52 msgs, first 10 IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 52, first 10 IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[09:16:07] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[09:16:07] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:16:07] [FAST_REFRESH] Incremental sync complete - 52 messages
[09:16:07] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[09:16:07] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:16:07] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:16:07] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:16:07] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:16:07] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:16:07] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=52, IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [28730, 28729]
[09:16:07] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=2, IDs=[28730, 28729]
[09:16:07] [PUSH_TRACE] 🔀 mergeMessages: merged.count=52, first 10 IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [PUSH_PRELOAD] ⚡ Pre-cached 52 messages for instant display (preserved 2 from push)
[09:16:07] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=64
[09:16:07] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28821, 28820, 28819, 28818, 28817]
[09:16:07] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[09:16:07] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[09:16:07] [SCROLL] wasNearBottom=true, threshold=758, offset=4025, contentH=4803, boundsH=758, forceScroll=false
[09:16:07] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[09:16:07] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[09:16:07] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=65
[09:16:07] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 52 msgs, IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=6290 vccs=0
[09:16:07] [GAP_FIX] maxMessageIdAtBackground=28820, currentMaxLocalId=28821
[09:16:07] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28821, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("session_id"): ILUIWU]
[09:16:07] [PUSH] Parsed message_id: 28821
[09:16:07] [PUSH] Parsed operation_type: 0
[09:16:07] [PUSH] Taking direct action: opType=0, messageId=28821
[09:16:07] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28821
[09:16:07] [PUSH] ⚡ Message 28821 already in memory - skipping duplicate notification entirely
[09:16:07] [GAP_FIX] Post-action sync: using background max 28820 to catch coalesced messages
[09:16:07] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[09:16:07] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28820, maxMemoryId=28821
[09:16:07] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28820
[09:16:07] [SCROLL] Async handler: shouldScroll=false (force=false, newMsgs=false, nearBottom=true), maxY=4120, currentOffset=4025
[09:16:07] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[09:16:07] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:16:07] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:16:07] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:16:07] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:16:07] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:16:07] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=52, IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [28730, 28729]
[09:16:07] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=2, IDs=[28730, 28729]
[09:16:07] [PUSH_TRACE] 🔀 mergeMessages: merged.count=52, first 10 IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [PUSH_PRELOAD] ⚡ Pre-cached 52 messages for instant display (preserved 2 from push)
[09:16:07] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[09:16:07] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[09:16:07] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28821]
[09:16:07] [USTATUS] DB_INSERT msgId=28821 file=2c2436d604281163.jpg parsed=0 rawType=Optional<Any> raw=Optional(0)
[09:16:07] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 52 msgs, IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=1 secsSinceLastPong=6290 vccs=0
[09:16:07] [GAP_FIX] maxMessageIdAtBackground=28820, currentMaxLocalId=28821
[09:16:07] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message"): , AnyHashable("file_name"): 2c2436d604281163.jpg, AnyHashable("datesent"): 2026-04-23 07:16:04, AnyHashable("sender_name"): Esra, AnyHashable("message_type"): 1, AnyHashable("timer"): 0, AnyHashable("message_data"): {
    "crypto_version" = 1;
    datesent = "2026-04-23 07:16:04";
    "file_name" = "2c2436d604281163.jpg";
    "is_encrypted" = 1;
    message = "";
    "message_id" = 28821;
    "message_type" = 1;
    "mime_type" = "image/jpeg";
    "plaintext_size" = 625641;
    "prev_session_message_id" = 28820;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "t_2c2436d604281163.jpg";
    timer = 0;
    "upload_status" = 1;
}, AnyHashable("message_id"): 28821, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("thumb_file_name"): t_2c2436d604281163.jpg, AnyHashable("operation_type"): 0]
[09:16:07] [PUSH_EMBED_VC] Message 28821 already in memory - skipping
[09:16:07] [PUSH] ⚡ Embedded message handled directly in ViewController
[09:16:07] [PUSH] Parsed message_id: 28821
[09:16:07] [PUSH] Parsed operation_type: 0
[09:16:07] [PUSH] Taking direct action: opType=0, messageId=28821
[09:16:07] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28821
[09:16:07] [PUSH] ⚡ Message 28821 already in memory - skipping duplicate notification entirely
[09:16:07] [GAP_FIX] Post-action sync: using background max 28820 to catch coalesced messages
[09:16:07] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[09:16:07] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 52 msgs, first 10 IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 52, first 10 IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[09:16:07] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[09:16:07] [INCREMENTAL_SYNC] 🔁 Processing queued retry refresh
[09:16:07] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[09:16:07] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28821, maxMemoryId=28821
[09:16:07] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28821
[09:16:07] [INCREMENTAL_SYNC] ✅ No new messages
[09:16:07] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=65
[09:16:07] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28821, 28820, 28819, 28818, 28817]
[09:16:07] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[09:16:07] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:16:07] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[09:16:08] [SCROLL] wasNearBottom=true, threshold=758, offset=4025, contentH=4878, boundsH=758, forceScroll=false
[09:16:08] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[09:16:08] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[09:23:01] [SECURITY] Timeout check: elapsed=648.3127279281616s, timeout=300.0s
[09:23:01] [SECURITY] sceneWillEnterForeground - timeout exceeded, showing lock screen immediately
[09:23:01] [AUTH] ✅ All guards passed, showing privacy cover
[09:23:01] [NETWORK] Status changed: connected
[09:23:01] [LIFECYCLE] App entering foreground - restoring connections
[09:23:01] [CAPTURE] Live-feed protection [app-will-enter-foreground] - fullscreen=false, isCaptured=false, secureReady=true
[09:23:01] [CAPTURE] Refresh overlay [app-will-enter-foreground] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[09:23:01] [PUSH_TRACE] 🔄 FOREGROUND: memory has 52 msgs, IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:01] [PUSH_TRACE] 🔄 FOREGROUND: cache has 52 msgs, valid=true, IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:01] [LIFECYCLE] Away > 2 minutes (648s) - will scroll to bottom
[09:23:01] [UPLOAD_RETRY] No pending uploads to retry
[09:23:01] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[09:23:01] [READBY_OPT] No message IDs to fetch - skipping server call
[09:23:01] [LIFECYCLE] WebRTC audio re-enabled
[09:23:01] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[09:23:01] [CLIENT_SIG] Skipping connect - app in background (state=2)
[09:23:01] [VIEWER] Reconnecting after background - querying agents
[09:23:01] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=completed
[09:23:01] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[09:23:01] [UNSENT_RETRY] Checking for unsent messages...
[09:23:01] [PENDING_UPLOAD] Total pending upload messages: 0
[09:23:01] [UNSENT_RETRY] No unsent messages found
[09:23:01] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:01] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:01] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort}
[09:23:01] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[09:23:01] [CLIENT_SIG] Task completed with error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <62940768-E8B6-46F0-ABA4-17619A8B9EC0>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <62940768-E8B6-46F0-ABA4-17619A8B9EC0>.<1>}
[09:23:01] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[09:23:01] [FOREGROUND] Enriched 0/0 unsettled messages with readBy data
[09:23:01] [LIFECYCLE] scrollToBottomIfNeeded time=true, count=52>51=true, maxId=28821>28820=true, shouldScroll=true
[09:23:01] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[09:23:01] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:23:02] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[09:23:02] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28821, 28820, 28819, 28818, 28817]
[09:23:02] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[09:23:02] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:02] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[09:23:02] [SCROLL] wasNearBottom=true, threshold=758, offset=4025, contentH=4878, boundsH=758, forceScroll=true
[09:23:02] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[09:23:02] [SCROLL] 💓 alive, visible=43...53, rows=54, estHeight=0.0, heightCalls=0
[09:23:02] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28820 → 28821
[09:23:02] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=65
[09:23:02] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[09:23:02] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[09:23:02] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 52 msgs, IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:02] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=6704 vccs=0
[09:23:02] [GAP_FIX] maxMessageIdAtBackground=28820, currentMaxLocalId=28821
[09:23:02] [PUSH] handlePollEventsNotification userInfo: [:]
[09:23:02] [PUSH] No message_id in userInfo
[09:23:02] [PUSH] No operation_type in userInfo
[09:23:02] [FAST_REFRESH] Evolution disabled - performing incremental sync
[09:23:02] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=52, IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:02] [PUSH_TRACE] 📬 POLL: memory state: count=52, first 10 IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:02] [FAST_REFRESH] Already have 52 messages in memory
[09:23:02] [FAST_REFRESH] maxMemoryId=28821, maxLocalId=28821
[09:23:02] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[09:23:02] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[09:23:02] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[09:23:02] [READBY_OPT] No message IDs to fetch - skipping server call
[09:23:02] [GAP_FIX] Incremental sync will use since_id=28820 (background max=28820, current DB max=28821)
[09:23:02] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[09:23:02] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28820, maxMemoryId=28821
[09:23:02] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28820
[09:23:02] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4120, currentOffset=4120
[09:23:02] [SCROLL] Scrolling to 4120, animated=false
[09:23:02] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[09:23:02] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[09:23:02] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:23:02] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=65
[09:23:02] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28821, 28820, 28819, 28818, 28817]
[09:23:02] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[09:23:02] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:02] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[09:23:02] [SCROLL] wasNearBottom=true, threshold=758, offset=4120, contentH=4878, boundsH=758, forceScroll=true
[09:23:02] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[09:23:02] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=65
[09:23:02] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4120, currentOffset=4120
[09:23:02] [SCROLL] Scrolling to 4120, animated=false
[09:23:02] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:02] HELLO → sent (cached token, role=query)
[09:23:02] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:02] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:02] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:02] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:02] [CLEANUP] ========================================
[09:23:02] [CLEANUP] Cleaning up all agent connections and views
[09:23:02] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:02] [CLEANUP] Stopped and removed 0 video connections
[09:23:02] [CLEANUP] Removed 0 video views
[09:23:02] [CLEANUP] Removed 0 feed scroll views
[09:23:02] [CLEANUP] Removed 0 status labels
[09:23:02] [CLEANUP] Reset agent query state
[09:23:02] [CLEANUP] Updated page indicator
[09:23:02] [CLEANUP] Rebuilt video layout
[09:23:02] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:02] [CLEANUP] ========================================
[09:23:02] [SERVER] Starting reconnect polling (5s interval)
[09:23:02] [CLEANUP] ========================================
[09:23:02] [CLEANUP] Cleaning up all agent connections and views
[09:23:02] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:02] [CLEANUP] Stopped and removed 0 video connections
[09:23:02] [CLEANUP] Removed 0 video views
[09:23:02] [CLEANUP] Removed 0 feed scroll views
[09:23:02] [CLEANUP] Removed 0 status labels
[09:23:02] [CLEANUP] Reset agent query state
[09:23:02] [CLEANUP] Updated page indicator
[09:23:02] [CLEANUP] Rebuilt video layout
[09:23:02] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:02] [CLEANUP] ========================================
[09:23:02] [SERVER] Starting reconnect polling (5s interval)
[09:23:02] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[09:23:02] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28821]
[09:23:02] [USTATUS] DB_INSERT msgId=28821 file=2c2436d604281163.jpg parsed=0 rawType=Optional<Any> raw=Optional(0)
[09:23:02] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 52 msgs, first 10 IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:02] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 52, first 10 IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:02] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[09:23:02] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[09:23:02] [FAST_REFRESH] Incremental sync complete - 52 messages
[09:23:02] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=65
[09:23:02] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28821, 28820, 28819, 28818, 28817]
[09:23:02] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[09:23:02] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:02] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[09:23:02] [SCROLL] wasNearBottom=true, threshold=758, offset=4120, contentH=4878, boundsH=758, forceScroll=true
[09:23:02] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[09:23:02] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=65
[09:23:02] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4120, currentOffset=4120
[09:23:02] [SCROLL] Scrolling to 4120, animated=false
[09:23:03] [PIN_AUTH] Correct PIN
[09:23:03] [SECURITY] Restored real session: ILUIWU
[09:23:03] [SECURITY] Restored real session: ILUIWU
[09:23:03] [FAKE_AI] cancel() called, wasRunning=false
[09:23:03] [FAKE MODE] Exiting fake mode, restoring real session
[09:23:03] [SECURITY] Restored real session: ILUIWU
[09:23:03] [SECURITY] Saved real session: ILUIWU
[09:23:03] [FAKE MODE] ✅ Restored real session: ILUIWU
[09:23:03] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[09:23:03] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[09:23:03] [FAKE MODE] Loaded 50 messages (limited to page size)
[09:23:03] [READBY_OPT] No message IDs to fetch - skipping server call
[09:23:03] [AUTH] Authentication completed - updating UI only (data already fetched in foreground handler)
[09:23:03] [AUTH] Cache had 52 messages, maxExistingId=28821, inserted 0 truly new
[09:23:03] [LIFECYCLE] scrollToBottomIfNeeded time=false, count=50>51=false, maxId=28821>28820=true, shouldScroll=true
[09:23:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[09:23:03] [AUTH] UI update complete
[09:23:03] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[09:23:03] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:23:03] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=completed
[09:23:03] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[09:23:03] [FAKE MODE] Enriched 0/0 unsettled messages with readBy data
[09:23:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[09:23:03] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:23:03] [PUSH] Silent push received
[09:23:03] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:23:03 +0000, appState=0, message_id=nil, type=nil
[09:23:03] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[09:23:03] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:23:03 +0000
[09:23:03] [PUSH_EMBED] No embedded message_data in notification
[09:23:03] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[09:23:03] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[09:23:03] [PUSH] No embedded data, pre-loading messages from server
[09:23:03] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:23:03] [PUSH] Silent push received
[09:23:03] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:23:03 +0000, appState=0, message_id=nil, type=nil
[09:23:03] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[09:23:03] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:23:03 +0000
[09:23:03] [PUSH_EMBED] No embedded message_data in notification
[09:23:03] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[09:23:03] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[09:23:03] [PUSH] No embedded data, pre-loading messages from server
[09:23:03] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:23:03] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:23:03] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:23:03] [SCROLL] 💓 alive, visible=44...51, rows=52, estHeight=0.0, heightCalls=125
[09:23:03] DOWNLOADIIING t_2c2436d604281163.jpg
[09:23:03] [USER] ✅ User registered successfully
[09:23:03] [PUSH] User registration after token update: success
[09:23:03] [CLIENT_SIG] WebSocket opened
[09:23:03] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[09:23:03] [CLIENT_SIG] Connected! clientId=N1v4KhaeigMgSnAr
[09:23:03] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[09:23:03] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:23:03] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[09:23:03] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28821, 28820, 28819, 28818, 28817]
[09:23:03] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[09:23:03] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:03] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[09:23:03] [SCROLL] wasNearBottom=true, threshold=758, offset=4101, contentH=4859, boundsH=758, forceScroll=true
[09:23:03] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[09:23:03] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:23:03] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:23:03] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[09:23:03] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4101, currentOffset=4101
[09:23:03] [SCROLL] Scrolling to 4101, animated=false
[09:23:03] [MEDIA_DOWNLOAD] ✅ t_2c2436d604281163.jpg complete
[09:23:03] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:23:03] [MEDIA_DOWNLOAD] ✅ Set thumbnail for cell: 2c2436d604281163.jpg from downloaded: t_2c2436d604281163.jpg
[09:23:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[09:23:03] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=164
[09:23:03] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28821, 28820, 28819, 28818, 28817]
[09:23:03] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[09:23:03] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:03] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[09:23:03] [SCROLL] wasNearBottom=true, threshold=758, offset=4101, contentH=4939, boundsH=758, forceScroll=true
[09:23:03] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[09:23:04] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:23:04] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:23:04] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=59
[09:23:04] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4181, currentOffset=4181
[09:23:04] [SCROLL] Scrolling to 4181, animated=false
[09:23:04] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:04] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:04] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[09:23:04] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:23:04] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:23:04] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:23:04] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:23:04] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:23:04] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:04] [PUSH_TRACE] 🔀 mergeMessages: Different session (nil vs ILUIWU), replacing cache
[09:23:04] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[09:23:04] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[09:23:04] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:04] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=6706 vccs=0
[09:23:04] [GAP_FIX] maxMessageIdAtBackground=28820, currentMaxLocalId=28821
[09:23:04] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28821, AnyHashable("aps"): {
    "content-available" = 1;
}]
[09:23:04] [PUSH] Parsed message_id: 28821
[09:23:04] [PUSH] Parsed operation_type: 3
[09:23:04] [PUSH] Taking direct action: opType=3, messageId=28821
[09:23:04] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28821
[09:23:04] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[09:23:04] [GAP_FIX] Post-action sync: using background max 28820 to catch coalesced messages
[09:23:04] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[09:23:04] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28820, maxMemoryId=28821
[09:23:04] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28820
[09:23:04] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:23:04] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:23:04] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:23:04] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:23:04] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:04] HELLO → sent (cached token, role=query)
[09:23:04] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:23:04] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:04] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:04] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[09:23:04] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:04] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[09:23:04] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[09:23:04] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:04] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=6706 vccs=0
[09:23:04] [GAP_FIX] maxMessageIdAtBackground=28820, currentMaxLocalId=28821
[09:23:04] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28821, AnyHashable("aps"): {
    "content-available" = 1;
}]
[09:23:04] [PUSH] Parsed message_id: 28821
[09:23:04] [PUSH] Parsed operation_type: 3
[09:23:04] [PUSH] Taking direct action: opType=3, messageId=28821
[09:23:04] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28821
[09:23:04] [GAP_FIX] Post-action sync: using background max 28820 to catch coalesced messages
[09:23:04] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[09:23:04] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:04] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:04] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:04] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:04] [CLEANUP] ========================================
[09:23:04] [CLEANUP] Cleaning up all agent connections and views
[09:23:04] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:04] [CLEANUP] Stopped and removed 0 video connections
[09:23:04] [CLEANUP] Removed 0 video views
[09:23:04] [CLEANUP] Removed 0 feed scroll views
[09:23:04] [CLEANUP] Removed 0 status labels
[09:23:04] [CLEANUP] Reset agent query state
[09:23:04] [CLEANUP] Updated page indicator
[09:23:04] [CLEANUP] Rebuilt video layout
[09:23:04] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:04] [CLEANUP] ========================================
[09:23:04] [SERVER] Starting reconnect polling (5s interval)
[09:23:04] [CLEANUP] ========================================
[09:23:04] [CLEANUP] Cleaning up all agent connections and views
[09:23:04] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:04] [CLEANUP] Stopped and removed 0 video connections
[09:23:04] [CLEANUP] Removed 0 video views
[09:23:04] [CLEANUP] Removed 0 feed scroll views
[09:23:04] [CLEANUP] Removed 0 status labels
[09:23:04] [CLEANUP] Reset agent query state
[09:23:04] [CLEANUP] Updated page indicator
[09:23:04] [CLEANUP] Rebuilt video layout
[09:23:04] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:04] [CLEANUP] ========================================
[09:23:04] [SERVER] Starting reconnect polling (5s interval)
[09:23:04] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[09:23:04] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28821]
[09:23:04] [USTATUS] DB_INSERT msgId=28821 file=2c2436d604281163.jpg parsed=0 rawType=Optional<Any> raw=Optional(0)
[09:23:04] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 50 msgs, first 10 IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:04] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 50, first 10 IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:04] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[09:23:04] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[09:23:04] [INCREMENTAL_SYNC] 🔁 Processing queued retry refresh
[09:23:04] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[09:23:04] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28821, maxMemoryId=28821
[09:23:04] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28821
[09:23:04] [CLIENT_SIG] Event received: type=3 messageId=28821
[09:23:04] [WS_EVENT] Received event: type=3, messageId=28821
[09:23:04] [WS_EVENT] Read receipt for message 28821 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:23:04] [INCREMENTAL_SYNC] ✅ No new messages
[09:23:04] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=59
[09:23:04] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28821, 28820, 28819, 28818, 28817]
[09:23:04] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[09:23:04] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:23:04] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[09:23:04] [SCROLL] wasNearBottom=true, threshold=758, offset=4181, contentH=4939, boundsH=758, forceScroll=true
[09:23:04] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[09:23:04] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:23:04] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:23:04] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=59
[09:23:04] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4181, currentOffset=4181
[09:23:04] [SCROLL] Scrolling to 4181, animated=false
[09:23:05] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:05] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:05] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:05] HELLO → sent (cached token, role=query)
[09:23:05] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:05] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:05] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:05] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:05] [CLEANUP] ========================================
[09:23:05] [CLEANUP] Cleaning up all agent connections and views
[09:23:05] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:05] [CLEANUP] Stopped and removed 0 video connections
[09:23:05] [CLEANUP] Removed 0 video views
[09:23:05] [CLEANUP] Removed 0 feed scroll views
[09:23:05] [CLEANUP] Removed 0 status labels
[09:23:05] [CLEANUP] Reset agent query state
[09:23:05] [CLEANUP] Updated page indicator
[09:23:05] [CLEANUP] Rebuilt video layout
[09:23:05] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:05] [CLEANUP] ========================================
[09:23:05] [SERVER] Starting reconnect polling (5s interval)
[09:23:05] [CLEANUP] ========================================
[09:23:05] [CLEANUP] Cleaning up all agent connections and views
[09:23:05] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:05] [CLEANUP] Stopped and removed 0 video connections
[09:23:05] [CLEANUP] Removed 0 video views
[09:23:05] [CLEANUP] Removed 0 feed scroll views
[09:23:05] [CLEANUP] Removed 0 status labels
[09:23:05] [CLEANUP] Reset agent query state
[09:23:05] [CLEANUP] Updated page indicator
[09:23:05] [CLEANUP] Rebuilt video layout
[09:23:05] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:05] [CLEANUP] ========================================
[09:23:05] [SERVER] Starting reconnect polling (5s interval)
[09:23:06] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[09:23:06] [SCROLL] 💓 alive, visible=45...51, rows=52, estHeight=0.0, heightCalls=59
[09:23:07] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:07] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:07] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:07] HELLO → sent (cached token, role=query)
[09:23:07] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:07] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:07] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:07] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:07] [CLEANUP] ========================================
[09:23:07] [CLEANUP] Cleaning up all agent connections and views
[09:23:07] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:07] [CLEANUP] Stopped and removed 0 video connections
[09:23:07] [CLEANUP] Removed 0 video views
[09:23:07] [CLEANUP] Removed 0 feed scroll views
[09:23:07] [CLEANUP] Removed 0 status labels
[09:23:07] [CLEANUP] Reset agent query state
[09:23:07] [CLEANUP] Updated page indicator
[09:23:07] [CLEANUP] Rebuilt video layout
[09:23:07] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:07] [CLEANUP] ========================================
[09:23:07] [SERVER] Starting reconnect polling (5s interval)
[09:23:07] [CLEANUP] ========================================
[09:23:07] [CLEANUP] Cleaning up all agent connections and views
[09:23:07] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:07] [CLEANUP] Stopped and removed 0 video connections
[09:23:07] [CLEANUP] Removed 0 video views
[09:23:07] [CLEANUP] Removed 0 feed scroll views
[09:23:07] [CLEANUP] Removed 0 status labels
[09:23:07] [CLEANUP] Reset agent query state
[09:23:07] [CLEANUP] Updated page indicator
[09:23:07] [CLEANUP] Rebuilt video layout
[09:23:07] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:07] [CLEANUP] ========================================
[09:23:07] [SERVER] Starting reconnect polling (5s interval)
[09:23:08] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:08] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:09] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:09] HELLO → sent (cached token, role=query)
[09:23:09] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:09] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:09] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:09] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:09] [CLEANUP] ========================================
[09:23:09] [CLEANUP] Cleaning up all agent connections and views
[09:23:09] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:09] [CLEANUP] Stopped and removed 0 video connections
[09:23:09] [CLEANUP] Removed 0 video views
[09:23:09] [CLEANUP] Removed 0 feed scroll views
[09:23:09] [CLEANUP] Removed 0 status labels
[09:23:09] [CLEANUP] Reset agent query state
[09:23:09] [CLEANUP] Updated page indicator
[09:23:09] [CLEANUP] Rebuilt video layout
[09:23:09] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:09] [CLEANUP] ========================================
[09:23:09] [SERVER] Starting reconnect polling (5s interval)
[09:23:09] [CLEANUP] ========================================
[09:23:09] [CLEANUP] Cleaning up all agent connections and views
[09:23:09] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:09] [CLEANUP] Stopped and removed 0 video connections
[09:23:09] [CLEANUP] Removed 0 video views
[09:23:09] [CLEANUP] Removed 0 feed scroll views
[09:23:09] [CLEANUP] Removed 0 status labels
[09:23:09] [CLEANUP] Reset agent query state
[09:23:09] [CLEANUP] Updated page indicator
[09:23:09] [CLEANUP] Rebuilt video layout
[09:23:09] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:09] [CLEANUP] ========================================
[09:23:09] [SERVER] Starting reconnect polling (5s interval)
[09:23:10] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:10] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:10] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:10] HELLO → sent (cached token, role=query)
[09:23:10] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:10] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:10] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:10] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:10] [CLEANUP] ========================================
[09:23:10] [CLEANUP] Cleaning up all agent connections and views
[09:23:10] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:10] [CLEANUP] Stopped and removed 0 video connections
[09:23:10] [CLEANUP] Removed 0 video views
[09:23:10] [CLEANUP] Removed 0 feed scroll views
[09:23:10] [CLEANUP] Removed 0 status labels
[09:23:10] [CLEANUP] Reset agent query state
[09:23:10] [CLEANUP] Updated page indicator
[09:23:10] [CLEANUP] Rebuilt video layout
[09:23:10] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:10] [CLEANUP] ========================================
[09:23:10] [SERVER] Starting reconnect polling (5s interval)
[09:23:10] [CLEANUP] ========================================
[09:23:10] [CLEANUP] Cleaning up all agent connections and views
[09:23:10] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:10] [CLEANUP] Stopped and removed 0 video connections
[09:23:10] [CLEANUP] Removed 0 video views
[09:23:10] [CLEANUP] Removed 0 feed scroll views
[09:23:10] [CLEANUP] Removed 0 status labels
[09:23:10] [CLEANUP] Reset agent query state
[09:23:10] [CLEANUP] Updated page indicator
[09:23:10] [CLEANUP] Rebuilt video layout
[09:23:10] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:10] [CLEANUP] ========================================
[09:23:10] [SERVER] Starting reconnect polling (5s interval)
[09:23:12] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:12] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:12] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:12] HELLO → sent (cached token, role=query)
[09:23:12] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:12] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:12] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:12] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:12] [CLEANUP] ========================================
[09:23:12] [CLEANUP] Cleaning up all agent connections and views
[09:23:12] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:12] [CLEANUP] Stopped and removed 0 video connections
[09:23:12] [CLEANUP] Removed 0 video views
[09:23:12] [CLEANUP] Removed 0 feed scroll views
[09:23:12] [CLEANUP] Removed 0 status labels
[09:23:12] [CLEANUP] Reset agent query state
[09:23:12] [CLEANUP] Updated page indicator
[09:23:12] [CLEANUP] Rebuilt video layout
[09:23:12] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:12] [CLEANUP] ========================================
[09:23:12] [SERVER] Starting reconnect polling (5s interval)
[09:23:12] [CLEANUP] ========================================
[09:23:12] [CLEANUP] Cleaning up all agent connections and views
[09:23:12] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:12] [CLEANUP] Stopped and removed 0 video connections
[09:23:12] [CLEANUP] Removed 0 video views
[09:23:12] [CLEANUP] Removed 0 feed scroll views
[09:23:12] [CLEANUP] Removed 0 status labels
[09:23:12] [CLEANUP] Reset agent query state
[09:23:12] [CLEANUP] Updated page indicator
[09:23:12] [CLEANUP] Rebuilt video layout
[09:23:12] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:12] [CLEANUP] ========================================
[09:23:12] [SERVER] Starting reconnect polling (5s interval)
[09:23:12] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[09:23:12] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=50, isReloading=false
[09:23:12] [SEND_MESSAGE] ✅ Added optimistic message id=-5 to arrays, newMsgCount=51
[09:23:12] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[09:23:12] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[-5, 28821, 28820, 28819, 28818]
[09:23:12] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[09:23:12] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-5, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813]
[09:23:12] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[09:23:12] [SCROLL] wasNearBottom=true, threshold=447, offset=4492, contentH=4939, boundsH=447, forceScroll=false
[09:23:12] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[09:23:12] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:23:12] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:23:12] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=58
[09:23:12] [SCROLL] 💓 alive, visible=48...52, rows=53, estHeight=0.0, heightCalls=112
[09:23:12] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[09:23:12] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[09:23:13] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4569, currentOffset=4569
[09:23:13] [SCROLL] Scrolling to 4569, animated=true
[09:23:13] [CLIENT_SIG] Event received: type=0 messageId=28822
[09:23:13] [WS_EVENT] Received event: type=0, messageId=28822
[09:23:13] [WS_EVENT] 📨 New message notification (msgId=28822) - triggering incremental refresh, currentMsgCount=51
[09:23:13] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[09:23:13] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28821, maxMemoryId=28821
[09:23:13] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28821
[09:23:13] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28822,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 07:23:13"}
[09:23:13] [CHAT] receive_message.php JSON: ["message_type": 0, "session_id": ILUIWU, "datesent_utc": 2026-04-23 07:23:13, "message_id": 28822, "file_name": , "ok": 1]
[09:23:13] [DB_UPGRADE] Upgrading message ID: -5 → 28822, preserveOriginalDate=false
[09:23:13] [DB_UPGRADE] ✅ Upgraded -5 → 28822 with send_status=0, 1 row(s) affected
[09:23:13] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -5 → 28822
[09:23:13] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -5 → 28822
[09:23:13] ReloadData 9
[09:23:13] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:23:13] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:23:13] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[09:23:13] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28822]
[09:23:13] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813]
[09:23:13] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813]
[09:23:13] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[09:23:13] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:23:13] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[09:23:13] DOWNLOADIIING 2c2436d604281163.jpg
[09:23:13] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=56
[09:23:13] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28822, 28821, 28820, 28819, 28818]
[09:23:13] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[09:23:13] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813]
[09:23:13] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[09:23:13] [SCROLL] wasNearBottom=true, threshold=447, offset=4569, contentH=5016, boundsH=447, forceScroll=true
[09:23:13] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[09:23:13] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:23:13] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:23:13] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=56
[09:23:13] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4569, currentOffset=4569
[09:23:13] [SCROLL] Scrolling to 4569, animated=false
[09:23:13] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:13] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:13] [MEDIA_DOWNLOAD] ✅ 2c2436d604281163.jpg complete
[09:23:13] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:23:13] [MEDIA_DOWNLOAD] ✅ Set thumbnail for cell: 2c2436d604281163.jpg from downloaded: 2c2436d604281163.jpg
[09:23:13] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:13] HELLO → sent (cached token, role=query)
[09:23:13] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:23:13] [CAPTURE] Live-feed protection [fullscreen-media-state-changed] - fullscreen=false, isCaptured=false, secureReady=true
[09:23:13] [CAPTURE] Refresh overlay [fullscreen-media-state-changed] - isCaptured: false, mediaFullscreen: true, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[09:23:13] [MEDIA_VIEWER] 🟢 Presenting viewer (download path) for msgId=28821, file=2c2436d604281163.jpg, timer=0
[09:23:13] [PRESENT] Releasing inputField first responder before presenting MediaViewerController
[09:23:13] [LOG-KB] textViewShouldEndEditing: isInputField=true, allowKeyboardDismiss=true, returning=true, textView=<Eye.PastingTextView: 0x11ac70000; baseClass = UITextView; frame = (44 8; 320 36
[09:23:13] [LOG-KB] textViewDidEndEditing: isInputField=true, resetting allowKeyboardDismiss to false
[09:23:13] [MEDIA_VIEWER] viewDidLoad - isVideo=false, url=2c2436d604281163.jpg
[09:23:13] [CAPTURE_HOST] media-viewer moved hosted view to plain container
[09:23:13] [CAPTURE_HOST] media-viewer protectionEnabled=true
[09:23:13] [CAPTURE_HOST] media-viewer moved hosted view to secure container
[09:23:13] [MEDIA_VIEWER] Capture refresh [viewDidLoad] - isCaptured=false, secureReady=true, screenshotGrace=false
[09:23:13] [MEDIA_VIEWER] Capture refresh [viewDidLoad] -> visibleOverlay=false
[09:23:13] [MEDIA_ZOOM] 🔵 PRESENTING - container=(0.0, 0.0, 440.0, 956.0), hasImage=true
[09:23:13] [MEDIA_ZOOM] startFrame=(21.0, 487.0, 157.5, 280.0), finalFrame=(0.0, 86.0, 440.0, 782.0)
[09:23:13] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:13] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:13] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:13] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:13] [CLEANUP] ========================================
[09:23:13] [CLEANUP] Cleaning up all agent connections and views
[09:23:13] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:13] [CLEANUP] Stopped and removed 0 video connections
[09:23:13] [CLEANUP] Removed 0 video views
[09:23:13] [CLEANUP] Removed 0 feed scroll views
[09:23:13] [CLEANUP] Removed 0 status labels
[09:23:13] [CLEANUP] Reset agent query state
[09:23:13] [CLEANUP] Updated page indicator
[09:23:13] [CLEANUP] Rebuilt video layout
[09:23:13] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:13] [CLEANUP] ========================================
[09:23:13] [SERVER] Starting reconnect polling (5s interval)
[09:23:13] [CLEANUP] ========================================
[09:23:13] [CLEANUP] Cleaning up all agent connections and views
[09:23:13] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:13] [CLEANUP] Stopped and removed 0 video connections
[09:23:13] [CLEANUP] Removed 0 video views
[09:23:13] [CLEANUP] Removed 0 feed scroll views
[09:23:13] [CLEANUP] Removed 0 status labels
[09:23:13] [CLEANUP] Reset agent query state
[09:23:13] [CLEANUP] Updated page indicator
[09:23:13] [CLEANUP] Rebuilt video layout
[09:23:13] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:13] [CLEANUP] ========================================
[09:23:13] [SERVER] Starting reconnect polling (5s interval)
[09:23:14] [MEDIA_ZOOM] ✅ PRESENT animation complete - showing full viewer
[09:23:14] [MEDIA_VIEWER] viewDidAppear - fullscreen media viewer visible
[09:23:14] [MEDIA_VIEWER] allowDismissGesture = true (0.35s elapsed)
[09:23:15] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:15] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:15] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:15] HELLO → sent (cached token, role=query)
[09:23:15] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:15] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:15] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:15] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:15] [CLEANUP] ========================================
[09:23:15] [CLEANUP] Cleaning up all agent connections and views
[09:23:15] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:15] [CLEANUP] Stopped and removed 0 video connections
[09:23:15] [CLEANUP] Removed 0 video views
[09:23:15] [CLEANUP] Removed 0 feed scroll views
[09:23:15] [CLEANUP] Removed 0 status labels
[09:23:15] [CLEANUP] Reset agent query state
[09:23:15] [CLEANUP] Updated page indicator
[09:23:15] [CLEANUP] Rebuilt video layout
[09:23:15] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:15] [CLEANUP] ========================================
[09:23:15] [SERVER] Starting reconnect polling (5s interval)
[09:23:15] [CLEANUP] ========================================
[09:23:15] [CLEANUP] Cleaning up all agent connections and views
[09:23:15] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:15] [CLEANUP] Stopped and removed 0 video connections
[09:23:15] [CLEANUP] Removed 0 video views
[09:23:15] [CLEANUP] Removed 0 feed scroll views
[09:23:15] [CLEANUP] Removed 0 status labels
[09:23:15] [CLEANUP] Reset agent query state
[09:23:15] [CLEANUP] Updated page indicator
[09:23:15] [CLEANUP] Rebuilt video layout
[09:23:15] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:15] [CLEANUP] ========================================
[09:23:15] [SERVER] Starting reconnect polling (5s interval)
[09:23:17] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:17] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:17] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:17] HELLO → sent (cached token, role=query)
[09:23:17] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:17] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:17] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:17] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:17] [CLEANUP] ========================================
[09:23:17] [CLEANUP] Cleaning up all agent connections and views
[09:23:17] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:17] [CLEANUP] Stopped and removed 0 video connections
[09:23:17] [CLEANUP] Removed 0 video views
[09:23:17] [CLEANUP] Removed 0 feed scroll views
[09:23:17] [CLEANUP] Removed 0 status labels
[09:23:17] [CLEANUP] Reset agent query state
[09:23:17] [CLEANUP] Updated page indicator
[09:23:17] [CLEANUP] Rebuilt video layout
[09:23:17] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:17] [CLEANUP] ========================================
[09:23:17] [SERVER] Starting reconnect polling (5s interval)
[09:23:17] [CLEANUP] ========================================
[09:23:17] [CLEANUP] Cleaning up all agent connections and views
[09:23:17] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:17] [CLEANUP] Stopped and removed 0 video connections
[09:23:17] [CLEANUP] Removed 0 video views
[09:23:17] [CLEANUP] Removed 0 feed scroll views
[09:23:17] [CLEANUP] Removed 0 status labels
[09:23:17] [CLEANUP] Reset agent query state
[09:23:17] [CLEANUP] Updated page indicator
[09:23:17] [CLEANUP] Rebuilt video layout
[09:23:17] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:17] [CLEANUP] ========================================
[09:23:17] [SERVER] Starting reconnect polling (5s interval)
[09:23:18] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:18] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:18] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:18] HELLO → sent (cached token, role=query)
[09:23:19] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:19] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:19] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:19] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:19] [CLEANUP] ========================================
[09:23:19] [CLEANUP] Cleaning up all agent connections and views
[09:23:19] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:19] [CLEANUP] Stopped and removed 0 video connections
[09:23:19] [CLEANUP] Removed 0 video views
[09:23:19] [CLEANUP] Removed 0 feed scroll views
[09:23:19] [CLEANUP] Removed 0 status labels
[09:23:19] [CLEANUP] Reset agent query state
[09:23:19] [CLEANUP] Updated page indicator
[09:23:19] [CLEANUP] Rebuilt video layout
[09:23:19] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:19] [CLEANUP] ========================================
[09:23:19] [SERVER] Starting reconnect polling (5s interval)
[09:23:19] [CLEANUP] ========================================
[09:23:19] [CLEANUP] Cleaning up all agent connections and views
[09:23:19] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:19] [CLEANUP] Stopped and removed 0 video connections
[09:23:19] [CLEANUP] Removed 0 video views
[09:23:19] [CLEANUP] Removed 0 feed scroll views
[09:23:19] [CLEANUP] Removed 0 status labels
[09:23:19] [CLEANUP] Reset agent query state
[09:23:19] [CLEANUP] Updated page indicator
[09:23:19] [CLEANUP] Rebuilt video layout
[09:23:19] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:19] [CLEANUP] ========================================
[09:23:19] [SERVER] Starting reconnect polling (5s interval)
[09:23:19] [MEDIA_VIEWER] Pan gesture shouldBegin=true, velocity=(66.66000065076524, 346.63200338397604)
[09:23:19] [MEDIA_VIEWER] Pan-to-dismiss triggered (dy=72.66666666666674, velocityY=2855.6957195176474)
[09:23:19] [MEDIA_VIEWER] ❌ dismiss() CALLED - animated=true
0   Eye.debug.dylib                     0x0000000102f714bc $s3Eye21MediaViewerControllerC7dismiss8animated10completionySb_yycSgtF + 136
1   Eye.debug.dylib                     0x0000000102f7eabc $s3Eye21MediaViewerControllerC9handlePan33_791426CB2E96A6BD5D22046DA17161F6LLyySo22UIPanGestureRecognizerCF + 2084
2   Eye.debug.dylib                     0x0000000102f7edac $s3Eye21MediaViewerControllerC9handlePan33_791426CB2E96A6BD5D22046DA17161F6LLyySo22UIPanGestureRecognizerCFTo + 68
3   UIKitCore                           0x00000001966d1b28 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5954344
4   UIKitCore                           0x00000001966d1438 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5952568
5   UIKitCore                           0x00000001966d11e4 32C1B300-A601-3E14-8B53-3419A2D2F234 + 5951972
6   UIKitCore                           0x0000000196215a24 32C1B300-A601-3E14-8B53-3419A2D2F234 + 989732
7   UIKitCore                           0x00000001961da310 32C1B300-A601-3E14-8B53-3419A2D2F234 + 746256
8   Gestures                            0x000000019bdcb754 2441E699-9255-3327-A836-62B5C47B0C59 + 38740
9   Gestures                            0x000000019be09c1c 2441E699-9255-3327-A836-62B5C47B0C59 + 293916
[09:23:19] [MEDIA_VIEWER] viewWillDisappear - animated=true
[09:23:19] [MEDIA_ZOOM] 🔴 DISMISSING - zoom-out animation starting
[09:23:19] [MEDIA_ZOOM] 🔴 DISMISS endFrame=(21.0, 487.0, 157.5, 280.0)
[09:23:19] [MEDIA_ZOOM] ✅ DISMISS animation complete
[09:23:19] [MEDIA_VIEWER] viewDidDisappear - fullscreen media viewer dismissed
[09:23:19] [CAPTURE] Live-feed protection [fullscreen-media-state-changed] - fullscreen=false, isCaptured=false, secureReady=true
[09:23:19] [CAPTURE] Refresh overlay [fullscreen-media-state-changed] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[09:23:19] [CAPTURE] Live-feed protection [downloaded-media-dismissed] - fullscreen=false, isCaptured=false, secureReady=true
[09:23:19] [CAPTURE] Refresh overlay [downloaded-media-dismissed] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[09:23:20] [SCROLL] 💓 alive, visible=46...51, rows=53, estHeight=0.0, heightCalls=61
[09:23:20] [SCROLL_BTN] Showing button - 310pt from bottom > half 223pt
[09:23:20] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:20] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:20] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:20] HELLO → sent (cached token, role=query)
[09:23:20] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:20] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:20] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:20] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:20] [CLEANUP] ========================================
[09:23:20] [CLEANUP] Cleaning up all agent connections and views
[09:23:20] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:20] [CLEANUP] Stopped and removed 0 video connections
[09:23:20] [CLEANUP] Removed 0 video views
[09:23:20] [CLEANUP] Removed 0 feed scroll views
[09:23:20] [CLEANUP] Removed 0 status labels
[09:23:20] [CLEANUP] Reset agent query state
[09:23:20] [CLEANUP] Updated page indicator
[09:23:20] [CLEANUP] Rebuilt video layout
[09:23:20] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:20] [CLEANUP] ========================================
[09:23:20] [SERVER] Starting reconnect polling (5s interval)
[09:23:20] [CLEANUP] ========================================
[09:23:20] [CLEANUP] Cleaning up all agent connections and views
[09:23:20] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:20] [CLEANUP] Stopped and removed 0 video connections
[09:23:20] [CLEANUP] Removed 0 video views
[09:23:20] [CLEANUP] Removed 0 feed scroll views
[09:23:20] [CLEANUP] Removed 0 status labels
[09:23:20] [CLEANUP] Reset agent query state
[09:23:20] [CLEANUP] Updated page indicator
[09:23:20] [CLEANUP] Rebuilt video layout
[09:23:20] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:20] [CLEANUP] ========================================
[09:23:20] [SERVER] Starting reconnect polling (5s interval)
[09:23:20] [SCROLL_END_DECEL] messagesTable offsetY=4569, insetTop=0, pendingVelocityY=1.1332885380371427
[09:23:22] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:22] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:22] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:22] HELLO → sent (cached token, role=query)
[09:23:22] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:22] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:22] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:22] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:22] [CLEANUP] ========================================
[09:23:22] [CLEANUP] Cleaning up all agent connections and views
[09:23:22] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:22] [CLEANUP] Stopped and removed 0 video connections
[09:23:22] [CLEANUP] Removed 0 video views
[09:23:22] [CLEANUP] Removed 0 feed scroll views
[09:23:22] [CLEANUP] Removed 0 status labels
[09:23:22] [CLEANUP] Reset agent query state
[09:23:22] [CLEANUP] Updated page indicator
[09:23:22] [CLEANUP] Rebuilt video layout
[09:23:22] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:22] [CLEANUP] ========================================
[09:23:22] [SERVER] Starting reconnect polling (5s interval)
[09:23:22] [CLEANUP] ========================================
[09:23:22] [CLEANUP] Cleaning up all agent connections and views
[09:23:22] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:22] [CLEANUP] Stopped and removed 0 video connections
[09:23:22] [CLEANUP] Removed 0 video views
[09:23:22] [CLEANUP] Removed 0 feed scroll views
[09:23:22] [CLEANUP] Removed 0 status labels
[09:23:22] [CLEANUP] Reset agent query state
[09:23:22] [CLEANUP] Updated page indicator
[09:23:22] [CLEANUP] Rebuilt video layout
[09:23:22] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:22] [CLEANUP] ========================================
[09:23:22] [SERVER] Starting reconnect polling (5s interval)
[09:23:23] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:23] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:24] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:24] HELLO → sent (cached token, role=query)
[09:23:24] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:24] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:24] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:24] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:24] [CLEANUP] ========================================
[09:23:24] [CLEANUP] Cleaning up all agent connections and views
[09:23:24] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:24] [CLEANUP] Stopped and removed 0 video connections
[09:23:24] [CLEANUP] Removed 0 video views
[09:23:24] [CLEANUP] Removed 0 feed scroll views
[09:23:24] [CLEANUP] Removed 0 status labels
[09:23:24] [CLEANUP] Reset agent query state
[09:23:24] [CLEANUP] Updated page indicator
[09:23:24] [CLEANUP] Rebuilt video layout
[09:23:24] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:24] [CLEANUP] ========================================
[09:23:24] [SERVER] Starting reconnect polling (5s interval)
[09:23:24] [CLEANUP] ========================================
[09:23:24] [CLEANUP] Cleaning up all agent connections and views
[09:23:24] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:24] [CLEANUP] Stopped and removed 0 video connections
[09:23:24] [CLEANUP] Removed 0 video views
[09:23:24] [CLEANUP] Removed 0 feed scroll views
[09:23:24] [CLEANUP] Removed 0 status labels
[09:23:24] [CLEANUP] Reset agent query state
[09:23:24] [CLEANUP] Updated page indicator
[09:23:24] [CLEANUP] Rebuilt video layout
[09:23:24] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:24] [CLEANUP] ========================================
[09:23:24] [SERVER] Starting reconnect polling (5s interval)
[09:23:25] [SCROLL] 💓 alive, visible=50...52, rows=53, estHeight=0.0, heightCalls=1
[09:23:25] [SCROLL_END_DECEL] messagesTable offsetY=4623, insetTop=0, pendingVelocityY=1.1332885380371427
[09:23:25] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:25] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:25] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:25] HELLO → sent (cached token, role=query)
[09:23:25] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:25] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:25] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:25] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:25] [CLEANUP] ========================================
[09:23:25] [CLEANUP] Cleaning up all agent connections and views
[09:23:25] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:25] [CLEANUP] Stopped and removed 0 video connections
[09:23:25] [CLEANUP] Removed 0 video views
[09:23:25] [CLEANUP] Removed 0 feed scroll views
[09:23:25] [CLEANUP] Removed 0 status labels
[09:23:25] [CLEANUP] Reset agent query state
[09:23:25] [CLEANUP] Updated page indicator
[09:23:25] [CLEANUP] Rebuilt video layout
[09:23:25] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:25] [CLEANUP] ========================================
[09:23:25] [SERVER] Starting reconnect polling (5s interval)
[09:23:25] [CLEANUP] ========================================
[09:23:25] [CLEANUP] Cleaning up all agent connections and views
[09:23:25] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:25] [CLEANUP] Stopped and removed 0 video connections
[09:23:25] [CLEANUP] Removed 0 video views
[09:23:25] [CLEANUP] Removed 0 feed scroll views
[09:23:25] [CLEANUP] Removed 0 status labels
[09:23:25] [CLEANUP] Reset agent query state
[09:23:25] [CLEANUP] Updated page indicator
[09:23:25] [CLEANUP] Rebuilt video layout
[09:23:25] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:25] [CLEANUP] ========================================
[09:23:25] [SERVER] Starting reconnect polling (5s interval)
[09:23:27] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:27] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:27] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:27] HELLO → sent (cached token, role=query)
[09:23:27] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:27] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:27] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:27] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:27] [CLEANUP] ========================================
[09:23:27] [CLEANUP] Cleaning up all agent connections and views
[09:23:27] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:27] [CLEANUP] Stopped and removed 0 video connections
[09:23:27] [CLEANUP] Removed 0 video views
[09:23:27] [CLEANUP] Removed 0 feed scroll views
[09:23:27] [CLEANUP] Removed 0 status labels
[09:23:27] [CLEANUP] Reset agent query state
[09:23:27] [CLEANUP] Updated page indicator
[09:23:27] [CLEANUP] Rebuilt video layout
[09:23:27] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:27] [CLEANUP] ========================================
[09:23:27] [SERVER] Starting reconnect polling (5s interval)
[09:23:27] [CLEANUP] ========================================
[09:23:27] [CLEANUP] Cleaning up all agent connections and views
[09:23:27] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:27] [CLEANUP] Stopped and removed 0 video connections
[09:23:27] [CLEANUP] Removed 0 video views
[09:23:27] [CLEANUP] Removed 0 feed scroll views
[09:23:27] [CLEANUP] Removed 0 status labels
[09:23:27] [CLEANUP] Reset agent query state
[09:23:27] [CLEANUP] Updated page indicator
[09:23:27] [CLEANUP] Rebuilt video layout
[09:23:27] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:27] [CLEANUP] ========================================
[09:23:27] [SERVER] Starting reconnect polling (5s interval)
[09:23:28] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[09:23:28] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=51, isReloading=false
[09:23:28] [SEND_MESSAGE] ✅ Added optimistic message id=-6 to arrays, newMsgCount=52
[09:23:28] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[09:23:28] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[-6, 28822, 28821, 28820, 28819]
[09:23:28] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[09:23:28] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-6, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814]
[09:23:28] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[09:23:28] [SCROLL] wasNearBottom=true, threshold=375, offset=4623, contentH=5016, boundsH=375, forceScroll=false
[09:23:28] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[09:23:28] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:23:28] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:23:28] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=56
[09:23:28] [SCROLL] 💓 alive, visible=51...53, rows=54, estHeight=0.0, heightCalls=110
[09:23:28] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[09:23:28] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[09:23:28] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4696, currentOffset=4696
[09:23:28] [SCROLL] Scrolling to 4696, animated=true
[09:23:28] [CLIENT_SIG] Event received: type=0 messageId=28823
[09:23:28] [WS_EVENT] Received event: type=0, messageId=28823
[09:23:28] [WS_EVENT] 📨 New message notification (msgId=28823) - triggering incremental refresh, currentMsgCount=52
[09:23:28] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[09:23:28] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28822, maxMemoryId=28822
[09:23:28] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28822
[09:23:28] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28823,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 07:23:28"}
[09:23:28] [CHAT] receive_message.php JSON: ["message_type": 0, "session_id": ILUIWU, "message_id": 28823, "ok": 1, "datesent_utc": 2026-04-23 07:23:28, "file_name": ]
[09:23:28] [DB_UPGRADE] Upgrading message ID: -6 → 28823, preserveOriginalDate=false
[09:23:28] [DB_UPGRADE] ✅ Upgraded -6 → 28823 with send_status=0, 1 row(s) affected
[09:23:28] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -6 → 28823
[09:23:28] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -6 → 28823
[09:23:28] ReloadData 9
[09:23:28] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:23:28] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:23:28] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:28] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:29] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[09:23:29] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28823]
[09:23:29] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 52 msgs, first 10 IDs=[28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814]
[09:23:29] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 52, first 10 IDs=[28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814]
[09:23:29] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[09:23:29] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[09:23:29] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=52
[09:23:29] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:29] HELLO → sent (cached token, role=query)
[09:23:29] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:29] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:29] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:29] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:29] [CLEANUP] ========================================
[09:23:29] [CLEANUP] Cleaning up all agent connections and views
[09:23:29] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:29] [CLEANUP] Stopped and removed 0 video connections
[09:23:29] [CLEANUP] Removed 0 video views
[09:23:29] [CLEANUP] Removed 0 feed scroll views
[09:23:29] [CLEANUP] Removed 0 status labels
[09:23:29] [CLEANUP] Reset agent query state
[09:23:29] [CLEANUP] Updated page indicator
[09:23:29] [CLEANUP] Rebuilt video layout
[09:23:29] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:29] [CLEANUP] ========================================
[09:23:29] [SERVER] Starting reconnect polling (5s interval)
[09:23:29] [CLEANUP] ========================================
[09:23:29] [CLEANUP] Cleaning up all agent connections and views
[09:23:29] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:29] [CLEANUP] Stopped and removed 0 video connections
[09:23:29] [CLEANUP] Removed 0 video views
[09:23:29] [CLEANUP] Removed 0 feed scroll views
[09:23:29] [CLEANUP] Removed 0 status labels
[09:23:29] [CLEANUP] Reset agent query state
[09:23:29] [CLEANUP] Updated page indicator
[09:23:29] [CLEANUP] Rebuilt video layout
[09:23:29] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:29] [CLEANUP] ========================================
[09:23:29] [SERVER] Starting reconnect polling (5s interval)
[09:23:29] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=58
[09:23:29] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28823, 28822, 28821, 28820, 28819]
[09:23:29] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[09:23:29] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814]
[09:23:29] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[09:23:29] [SCROLL] wasNearBottom=true, threshold=393, offset=4696, contentH=5089, boundsH=393, forceScroll=true
[09:23:29] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[09:23:29] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:23:29] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:23:29] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=57
[09:23:29] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4696, currentOffset=4696
[09:23:29] [SCROLL] Scrolling to 4696, animated=false
[09:23:30] [SCROLL] 💓 alive, visible=51...53, rows=54, estHeight=0.0, heightCalls=57
[09:23:30] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:30] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:30] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:30] HELLO → sent (cached token, role=query)
[09:23:30] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:30] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:30] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:30] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:30] [CLEANUP] ========================================
[09:23:30] [CLEANUP] Cleaning up all agent connections and views
[09:23:30] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:30] [CLEANUP] Stopped and removed 0 video connections
[09:23:30] [CLEANUP] Removed 0 video views
[09:23:30] [CLEANUP] Removed 0 feed scroll views
[09:23:30] [CLEANUP] Removed 0 status labels
[09:23:30] [CLEANUP] Reset agent query state
[09:23:30] [CLEANUP] Updated page indicator
[09:23:30] [CLEANUP] Rebuilt video layout
[09:23:30] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:30] [CLEANUP] ========================================
[09:23:30] [SERVER] Starting reconnect polling (5s interval)
[09:23:30] [CLEANUP] ========================================
[09:23:30] [CLEANUP] Cleaning up all agent connections and views
[09:23:30] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:30] [CLEANUP] Stopped and removed 0 video connections
[09:23:30] [CLEANUP] Removed 0 video views
[09:23:30] [CLEANUP] Removed 0 feed scroll views
[09:23:30] [CLEANUP] Removed 0 status labels
[09:23:30] [CLEANUP] Reset agent query state
[09:23:30] [CLEANUP] Updated page indicator
[09:23:30] [CLEANUP] Rebuilt video layout
[09:23:30] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:30] [CLEANUP] ========================================
[09:23:30] [SERVER] Starting reconnect polling (5s interval)
[09:23:32] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:32] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:32] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:32] HELLO → sent (cached token, role=query)
[09:23:32] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:32] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:32] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:32] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:32] [CLEANUP] ========================================
[09:23:32] [CLEANUP] Cleaning up all agent connections and views
[09:23:32] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:32] [CLEANUP] Stopped and removed 0 video connections
[09:23:32] [CLEANUP] Removed 0 video views
[09:23:32] [CLEANUP] Removed 0 feed scroll views
[09:23:32] [CLEANUP] Removed 0 status labels
[09:23:32] [CLEANUP] Reset agent query state
[09:23:32] [CLEANUP] Updated page indicator
[09:23:32] [CLEANUP] Rebuilt video layout
[09:23:32] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:32] [CLEANUP] ========================================
[09:23:32] [SERVER] Starting reconnect polling (5s interval)
[09:23:32] [CLEANUP] ========================================
[09:23:32] [CLEANUP] Cleaning up all agent connections and views
[09:23:32] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:32] [CLEANUP] Stopped and removed 0 video connections
[09:23:32] [CLEANUP] Removed 0 video views
[09:23:32] [CLEANUP] Removed 0 feed scroll views
[09:23:32] [CLEANUP] Removed 0 status labels
[09:23:32] [CLEANUP] Reset agent query state
[09:23:32] [CLEANUP] Updated page indicator
[09:23:32] [CLEANUP] Rebuilt video layout
[09:23:32] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:32] [CLEANUP] ========================================
[09:23:32] [SERVER] Starting reconnect polling (5s interval)
[09:23:33] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:33] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:33] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:33] HELLO → sent (cached token, role=query)
[09:23:33] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:33] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:33] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:33] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:33] [CLEANUP] ========================================
[09:23:33] [CLEANUP] Cleaning up all agent connections and views
[09:23:33] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:33] [CLEANUP] Stopped and removed 0 video connections
[09:23:33] [CLEANUP] Removed 0 video views
[09:23:33] [CLEANUP] Removed 0 feed scroll views
[09:23:33] [CLEANUP] Removed 0 status labels
[09:23:33] [CLEANUP] Reset agent query state
[09:23:33] [CLEANUP] Updated page indicator
[09:23:33] [CLEANUP] Rebuilt video layout
[09:23:33] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:33] [CLEANUP] ========================================
[09:23:33] [SERVER] Starting reconnect polling (5s interval)
[09:23:33] [CLEANUP] ========================================
[09:23:33] [CLEANUP] Cleaning up all agent connections and views
[09:23:33] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:33] [CLEANUP] Stopped and removed 0 video connections
[09:23:33] [CLEANUP] Removed 0 video views
[09:23:33] [CLEANUP] Removed 0 feed scroll views
[09:23:33] [CLEANUP] Removed 0 status labels
[09:23:33] [CLEANUP] Reset agent query state
[09:23:33] [CLEANUP] Updated page indicator
[09:23:33] [CLEANUP] Rebuilt video layout
[09:23:33] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:33] [CLEANUP] ========================================
[09:23:33] [SERVER] Starting reconnect polling (5s interval)
[09:23:35] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:35] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:35] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:35] HELLO → sent (cached token, role=query)
[09:23:35] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:35] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:35] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:35] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:35] [CLEANUP] ========================================
[09:23:35] [CLEANUP] Cleaning up all agent connections and views
[09:23:35] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:35] [CLEANUP] Stopped and removed 0 video connections
[09:23:35] [CLEANUP] Removed 0 video views
[09:23:35] [CLEANUP] Removed 0 feed scroll views
[09:23:35] [CLEANUP] Removed 0 status labels
[09:23:35] [CLEANUP] Reset agent query state
[09:23:35] [CLEANUP] Updated page indicator
[09:23:35] [CLEANUP] Rebuilt video layout
[09:23:35] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:35] [CLEANUP] ========================================
[09:23:35] [SERVER] Starting reconnect polling (5s interval)
[09:23:35] [CLEANUP] ========================================
[09:23:35] [CLEANUP] Cleaning up all agent connections and views
[09:23:35] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:35] [CLEANUP] Stopped and removed 0 video connections
[09:23:35] [CLEANUP] Removed 0 video views
[09:23:35] [CLEANUP] Removed 0 feed scroll views
[09:23:35] [CLEANUP] Removed 0 status labels
[09:23:35] [CLEANUP] Reset agent query state
[09:23:35] [CLEANUP] Updated page indicator
[09:23:35] [CLEANUP] Rebuilt video layout
[09:23:35] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:35] [CLEANUP] ========================================
[09:23:35] [SERVER] Starting reconnect polling (5s interval)
[09:23:37] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:37] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:37] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:37] HELLO → sent (cached token, role=query)
[09:23:37] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:37] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:37] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:37] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:37] [CLEANUP] ========================================
[09:23:37] [CLEANUP] Cleaning up all agent connections and views
[09:23:37] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:37] [CLEANUP] Stopped and removed 0 video connections
[09:23:37] [CLEANUP] Removed 0 video views
[09:23:37] [CLEANUP] Removed 0 feed scroll views
[09:23:37] [CLEANUP] Removed 0 status labels
[09:23:37] [CLEANUP] Reset agent query state
[09:23:37] [CLEANUP] Updated page indicator
[09:23:37] [CLEANUP] Rebuilt video layout
[09:23:37] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:37] [CLEANUP] ========================================
[09:23:37] [SERVER] Starting reconnect polling (5s interval)
[09:23:37] [CLEANUP] ========================================
[09:23:37] [CLEANUP] Cleaning up all agent connections and views
[09:23:37] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:37] [CLEANUP] Stopped and removed 0 video connections
[09:23:37] [CLEANUP] Removed 0 video views
[09:23:37] [CLEANUP] Removed 0 feed scroll views
[09:23:37] [CLEANUP] Removed 0 status labels
[09:23:37] [CLEANUP] Reset agent query state
[09:23:37] [CLEANUP] Updated page indicator
[09:23:37] [CLEANUP] Rebuilt video layout
[09:23:37] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:37] [CLEANUP] ========================================
[09:23:37] [SERVER] Starting reconnect polling (5s interval)
[09:23:38] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:38] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:38] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:38] HELLO → sent (cached token, role=query)
[09:23:38] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:38] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:38] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:38] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:38] [CLEANUP] ========================================
[09:23:38] [CLEANUP] Cleaning up all agent connections and views
[09:23:38] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:38] [CLEANUP] Stopped and removed 0 video connections
[09:23:38] [CLEANUP] Removed 0 video views
[09:23:38] [CLEANUP] Removed 0 feed scroll views
[09:23:38] [CLEANUP] Removed 0 status labels
[09:23:38] [CLEANUP] Reset agent query state
[09:23:38] [CLEANUP] Updated page indicator
[09:23:38] [CLEANUP] Rebuilt video layout
[09:23:38] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:38] [CLEANUP] ========================================
[09:23:38] [SERVER] Starting reconnect polling (5s interval)
[09:23:38] [CLEANUP] ========================================
[09:23:38] [CLEANUP] Cleaning up all agent connections and views
[09:23:38] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:38] [CLEANUP] Stopped and removed 0 video connections
[09:23:38] [CLEANUP] Removed 0 video views
[09:23:38] [CLEANUP] Removed 0 feed scroll views
[09:23:38] [CLEANUP] Removed 0 status labels
[09:23:38] [CLEANUP] Reset agent query state
[09:23:38] [CLEANUP] Updated page indicator
[09:23:38] [CLEANUP] Rebuilt video layout
[09:23:38] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:38] [CLEANUP] ========================================
[09:23:38] [SERVER] Starting reconnect polling (5s interval)
[09:23:40] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:40] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:40] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:40] HELLO → sent (cached token, role=query)
[09:23:40] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:40] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:40] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:40] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:40] [CLEANUP] ========================================
[09:23:40] [CLEANUP] Cleaning up all agent connections and views
[09:23:40] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:40] [CLEANUP] Stopped and removed 0 video connections
[09:23:40] [CLEANUP] Removed 0 video views
[09:23:40] [CLEANUP] Removed 0 feed scroll views
[09:23:40] [CLEANUP] Removed 0 status labels
[09:23:40] [CLEANUP] Reset agent query state
[09:23:40] [CLEANUP] Updated page indicator
[09:23:40] [CLEANUP] Rebuilt video layout
[09:23:40] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:40] [CLEANUP] ========================================
[09:23:40] [SERVER] Starting reconnect polling (5s interval)
[09:23:40] [CLEANUP] ========================================
[09:23:40] [CLEANUP] Cleaning up all agent connections and views
[09:23:40] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:40] [CLEANUP] Stopped and removed 0 video connections
[09:23:40] [CLEANUP] Removed 0 video views
[09:23:40] [CLEANUP] Removed 0 feed scroll views
[09:23:40] [CLEANUP] Removed 0 status labels
[09:23:40] [CLEANUP] Reset agent query state
[09:23:40] [CLEANUP] Updated page indicator
[09:23:40] [CLEANUP] Rebuilt video layout
[09:23:40] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:40] [CLEANUP] ========================================
[09:23:40] [SERVER] Starting reconnect polling (5s interval)
[09:23:42] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:42] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:42] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:42] HELLO → sent (cached token, role=query)
[09:23:42] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:42] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:42] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:42] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:42] [CLEANUP] ========================================
[09:23:42] [CLEANUP] Cleaning up all agent connections and views
[09:23:42] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:42] [CLEANUP] Stopped and removed 0 video connections
[09:23:42] [CLEANUP] Removed 0 video views
[09:23:42] [CLEANUP] Removed 0 feed scroll views
[09:23:42] [CLEANUP] Removed 0 status labels
[09:23:42] [CLEANUP] Reset agent query state
[09:23:42] [CLEANUP] Updated page indicator
[09:23:42] [CLEANUP] Rebuilt video layout
[09:23:42] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:42] [CLEANUP] ========================================
[09:23:42] [SERVER] Starting reconnect polling (5s interval)
[09:23:42] [CLEANUP] ========================================
[09:23:42] [CLEANUP] Cleaning up all agent connections and views
[09:23:42] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:42] [CLEANUP] Stopped and removed 0 video connections
[09:23:42] [CLEANUP] Removed 0 video views
[09:23:42] [CLEANUP] Removed 0 feed scroll views
[09:23:42] [CLEANUP] Removed 0 status labels
[09:23:42] [CLEANUP] Reset agent query state
[09:23:42] [CLEANUP] Updated page indicator
[09:23:42] [CLEANUP] Rebuilt video layout
[09:23:42] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:42] [CLEANUP] ========================================
[09:23:42] [SERVER] Starting reconnect polling (5s interval)
[09:23:43] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:43] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:43] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:43] HELLO → sent (cached token, role=query)
[09:23:43] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:43] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:43] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:43] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:43] [CLEANUP] ========================================
[09:23:43] [CLEANUP] Cleaning up all agent connections and views
[09:23:43] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:43] [CLEANUP] Stopped and removed 0 video connections
[09:23:43] [CLEANUP] Removed 0 video views
[09:23:43] [CLEANUP] Removed 0 feed scroll views
[09:23:43] [CLEANUP] Removed 0 status labels
[09:23:43] [CLEANUP] Reset agent query state
[09:23:43] [CLEANUP] Updated page indicator
[09:23:43] [CLEANUP] Rebuilt video layout
[09:23:43] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:43] [CLEANUP] ========================================
[09:23:43] [SERVER] Starting reconnect polling (5s interval)
[09:23:43] [CLEANUP] ========================================
[09:23:43] [CLEANUP] Cleaning up all agent connections and views
[09:23:43] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:43] [CLEANUP] Stopped and removed 0 video connections
[09:23:43] [CLEANUP] Removed 0 video views
[09:23:43] [CLEANUP] Removed 0 feed scroll views
[09:23:43] [CLEANUP] Removed 0 status labels
[09:23:43] [CLEANUP] Reset agent query state
[09:23:43] [CLEANUP] Updated page indicator
[09:23:43] [CLEANUP] Rebuilt video layout
[09:23:43] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:43] [CLEANUP] ========================================
[09:23:43] [SERVER] Starting reconnect polling (5s interval)
[09:23:45] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:45] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:45] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:45] HELLO → sent (cached token, role=query)
[09:23:45] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:45] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:45] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:45] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:45] [CLEANUP] ========================================
[09:23:45] [CLEANUP] Cleaning up all agent connections and views
[09:23:45] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:45] [CLEANUP] Stopped and removed 0 video connections
[09:23:45] [CLEANUP] Removed 0 video views
[09:23:45] [CLEANUP] Removed 0 feed scroll views
[09:23:45] [CLEANUP] Removed 0 status labels
[09:23:45] [CLEANUP] Reset agent query state
[09:23:45] [CLEANUP] Updated page indicator
[09:23:45] [CLEANUP] Rebuilt video layout
[09:23:45] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:45] [CLEANUP] ========================================
[09:23:45] [SERVER] Starting reconnect polling (5s interval)
[09:23:45] [CLEANUP] ========================================
[09:23:45] [CLEANUP] Cleaning up all agent connections and views
[09:23:45] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:45] [CLEANUP] Stopped and removed 0 video connections
[09:23:45] [CLEANUP] Removed 0 video views
[09:23:45] [CLEANUP] Removed 0 feed scroll views
[09:23:45] [CLEANUP] Removed 0 status labels
[09:23:45] [CLEANUP] Reset agent query state
[09:23:45] [CLEANUP] Updated page indicator
[09:23:45] [CLEANUP] Rebuilt video layout
[09:23:45] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:45] [CLEANUP] ========================================
[09:23:45] [SERVER] Starting reconnect polling (5s interval)
[09:23:47] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:47] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:47] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:47] HELLO → sent (cached token, role=query)
[09:23:47] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:47] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:47] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:47] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:47] [CLEANUP] ========================================
[09:23:47] [CLEANUP] Cleaning up all agent connections and views
[09:23:47] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:47] [CLEANUP] Stopped and removed 0 video connections
[09:23:47] [CLEANUP] Removed 0 video views
[09:23:47] [CLEANUP] Removed 0 feed scroll views
[09:23:47] [CLEANUP] Removed 0 status labels
[09:23:47] [CLEANUP] Reset agent query state
[09:23:47] [CLEANUP] Updated page indicator
[09:23:47] [CLEANUP] Rebuilt video layout
[09:23:47] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:47] [CLEANUP] ========================================
[09:23:47] [SERVER] Starting reconnect polling (5s interval)
[09:23:47] [CLEANUP] ========================================
[09:23:47] [CLEANUP] Cleaning up all agent connections and views
[09:23:47] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:47] [CLEANUP] Stopped and removed 0 video connections
[09:23:47] [CLEANUP] Removed 0 video views
[09:23:47] [CLEANUP] Removed 0 feed scroll views
[09:23:47] [CLEANUP] Removed 0 status labels
[09:23:47] [CLEANUP] Reset agent query state
[09:23:47] [CLEANUP] Updated page indicator
[09:23:47] [CLEANUP] Rebuilt video layout
[09:23:47] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:47] [CLEANUP] ========================================
[09:23:47] [SERVER] Starting reconnect polling (5s interval)
[09:23:48] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:48] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:48] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:48] HELLO → sent (cached token, role=query)
[09:23:48] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:48] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:48] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:48] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:48] [CLEANUP] ========================================
[09:23:48] [CLEANUP] Cleaning up all agent connections and views
[09:23:48] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:48] [CLEANUP] Stopped and removed 0 video connections
[09:23:48] [CLEANUP] Removed 0 video views
[09:23:48] [CLEANUP] Removed 0 feed scroll views
[09:23:48] [CLEANUP] Removed 0 status labels
[09:23:48] [CLEANUP] Reset agent query state
[09:23:48] [CLEANUP] Updated page indicator
[09:23:48] [CLEANUP] Rebuilt video layout
[09:23:48] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:48] [CLEANUP] ========================================
[09:23:48] [SERVER] Starting reconnect polling (5s interval)
[09:23:48] [CLEANUP] ========================================
[09:23:48] [CLEANUP] Cleaning up all agent connections and views
[09:23:48] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:48] [CLEANUP] Stopped and removed 0 video connections
[09:23:48] [CLEANUP] Removed 0 video views
[09:23:48] [CLEANUP] Removed 0 feed scroll views
[09:23:48] [CLEANUP] Removed 0 status labels
[09:23:48] [CLEANUP] Reset agent query state
[09:23:48] [CLEANUP] Updated page indicator
[09:23:48] [CLEANUP] Rebuilt video layout
[09:23:48] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:48] [CLEANUP] ========================================
[09:23:48] [SERVER] Starting reconnect polling (5s interval)
[09:23:50] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:50] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:50] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:50] HELLO → sent (cached token, role=query)
[09:23:50] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:50] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:50] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:50] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:50] [CLEANUP] ========================================
[09:23:50] [CLEANUP] Cleaning up all agent connections and views
[09:23:50] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:50] [CLEANUP] Stopped and removed 0 video connections
[09:23:50] [CLEANUP] Removed 0 video views
[09:23:50] [CLEANUP] Removed 0 feed scroll views
[09:23:50] [CLEANUP] Removed 0 status labels
[09:23:50] [CLEANUP] Reset agent query state
[09:23:50] [CLEANUP] Updated page indicator
[09:23:50] [CLEANUP] Rebuilt video layout
[09:23:50] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:50] [CLEANUP] ========================================
[09:23:50] [SERVER] Starting reconnect polling (5s interval)
[09:23:50] [CLEANUP] ========================================
[09:23:50] [CLEANUP] Cleaning up all agent connections and views
[09:23:50] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:50] [CLEANUP] Stopped and removed 0 video connections
[09:23:50] [CLEANUP] Removed 0 video views
[09:23:50] [CLEANUP] Removed 0 feed scroll views
[09:23:50] [CLEANUP] Removed 0 status labels
[09:23:50] [CLEANUP] Reset agent query state
[09:23:50] [CLEANUP] Updated page indicator
[09:23:50] [CLEANUP] Rebuilt video layout
[09:23:50] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:50] [CLEANUP] ========================================
[09:23:50] [SERVER] Starting reconnect polling (5s interval)
[09:23:52] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:52] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:52] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:52] HELLO → sent (cached token, role=query)
[09:23:52] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:52] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:52] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:52] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:52] [CLEANUP] ========================================
[09:23:52] [CLEANUP] Cleaning up all agent connections and views
[09:23:52] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:52] [CLEANUP] Stopped and removed 0 video connections
[09:23:52] [CLEANUP] Removed 0 video views
[09:23:52] [CLEANUP] Removed 0 feed scroll views
[09:23:52] [CLEANUP] Removed 0 status labels
[09:23:52] [CLEANUP] Reset agent query state
[09:23:52] [CLEANUP] Updated page indicator
[09:23:52] [CLEANUP] Rebuilt video layout
[09:23:52] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:52] [CLEANUP] ========================================
[09:23:52] [SERVER] Starting reconnect polling (5s interval)
[09:23:52] [CLEANUP] ========================================
[09:23:52] [CLEANUP] Cleaning up all agent connections and views
[09:23:52] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:52] [CLEANUP] Stopped and removed 0 video connections
[09:23:52] [CLEANUP] Removed 0 video views
[09:23:52] [CLEANUP] Removed 0 feed scroll views
[09:23:52] [CLEANUP] Removed 0 status labels
[09:23:52] [CLEANUP] Reset agent query state
[09:23:52] [CLEANUP] Updated page indicator
[09:23:52] [CLEANUP] Rebuilt video layout
[09:23:52] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:52] [CLEANUP] ========================================
[09:23:52] [SERVER] Starting reconnect polling (5s interval)
[09:23:53] [SCROLL] 💓 alive, visible=51...53, rows=54, estHeight=0.0, heightCalls=0
[09:23:53] [SCROLL_END_DECEL] messagesTable offsetY=4713, insetTop=0, pendingVelocityY=1.1332885380371427
[09:23:53] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:53] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:53] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:53] HELLO → sent (cached token, role=query)
[09:23:53] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:23:53] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:53] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:23:53] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:23:53] [CLEANUP] ========================================
[09:23:53] [CLEANUP] Cleaning up all agent connections and views
[09:23:53] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:53] [CLEANUP] Stopped and removed 0 video connections
[09:23:53] [CLEANUP] Removed 0 video views
[09:23:53] [CLEANUP] Removed 0 feed scroll views
[09:23:53] [CLEANUP] Removed 0 status labels
[09:23:53] [CLEANUP] Reset agent query state
[09:23:53] [CLEANUP] Updated page indicator
[09:23:53] [CLEANUP] Rebuilt video layout
[09:23:53] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:53] [CLEANUP] ========================================
[09:23:53] [SERVER] Starting reconnect polling (5s interval)
[09:23:53] [CLEANUP] ========================================
[09:23:53] [CLEANUP] Cleaning up all agent connections and views
[09:23:53] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:53] [CLEANUP] Stopped and removed 0 video connections
[09:23:53] [CLEANUP] Removed 0 video views
[09:23:53] [CLEANUP] Removed 0 feed scroll views
[09:23:53] [CLEANUP] Removed 0 status labels
[09:23:53] [CLEANUP] Reset agent query state
[09:23:53] [CLEANUP] Updated page indicator
[09:23:53] [CLEANUP] Rebuilt video layout
[09:23:53] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:53] [CLEANUP] ========================================
[09:23:53] [SERVER] Starting reconnect polling (5s interval)
[09:23:54] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[09:23:54] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=52, isReloading=false
[09:23:54] [SEND_MESSAGE] ✅ Added optimistic message id=-7 to arrays, newMsgCount=53
[09:23:54] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=1
[09:23:54] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[-7, 28823, 28822, 28821, 28820]
[09:23:54] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 53 messages
[09:23:54] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-7, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:23:54] [RELOAD_TAB] 📊 Building chatRows from 53 messages
[09:23:54] [SCROLL] wasNearBottom=true, threshold=375, offset=4713, contentH=5089, boundsH=375, forceScroll=false
[09:23:54] [RELOAD_TAB] 📊 Built 55 chatRows, estHeight=0.0
[09:23:54] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:23:54] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:23:54] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=59
[09:23:54] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[09:23:54] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[09:23:54] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4769, currentOffset=4769
[09:23:54] [SCROLL] Scrolling to 4769, animated=true
[09:23:54] [CLIENT_SIG] Event received: type=0 messageId=28824
[09:23:54] [WS_EVENT] Received event: type=0, messageId=28824
[09:23:54] [WS_EVENT] 📨 New message notification (msgId=28824) - triggering incremental refresh, currentMsgCount=53
[09:23:54] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=53
[09:23:54] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28823, maxMemoryId=28823
[09:23:54] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28823
[09:23:54] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28824,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 07:23:54"}
[09:23:54] [CHAT] receive_message.php JSON: ["datesent_utc": 2026-04-23 07:23:54, "message_id": 28824, "message_type": 0, "ok": 1, "file_name": , "session_id": ILUIWU]
[09:23:54] [DB_UPGRADE] Upgrading message ID: -7 → 28824, preserveOriginalDate=false
[09:23:54] [DB_UPGRADE] ✅ Upgraded -7 → 28824 with send_status=0, 1 row(s) affected
[09:23:54] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -7 → 28824
[09:23:54] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -7 → 28824
[09:23:54] ReloadData 9
[09:23:54] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:23:54] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:23:54] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[09:23:54] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28824]
[09:23:54] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 53 msgs, first 10 IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:23:54] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 53, first 10 IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:23:54] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[09:23:54] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=53
[09:23:54] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=53
[09:23:54] [LIFECYCLE] App resigning active - cleared crash flag
[09:23:54] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=174
[09:23:54] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[28824, 28823, 28822, 28821, 28820]
[09:23:54] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 53 messages
[09:23:54] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:23:54] [RELOAD_TAB] 📊 Building chatRows from 53 messages
[09:23:54] [SCROLL] wasNearBottom=true, threshold=393, offset=4769, contentH=5162, boundsH=393, forceScroll=true
[09:23:54] [RELOAD_TAB] 📊 Built 55 chatRows, estHeight=0.0
[09:23:54] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:23:54] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:23:54] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=59
[09:23:54] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4769, currentOffset=4769
[09:23:54] [SCROLL] Scrolling to 4769, animated=false
[09:23:55] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:23:55] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:23:55] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[09:23:55] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[09:23:55] [SECURITY] Saved background timestamp
[09:23:55] [LIFECYCLE] App entering background - cleared crash flag
[09:23:55] [CLIENT_SIG] Disconnecting
[09:23:55] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[09:23:55] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[09:23:55] [PUSH_TRACE] 💤 BACKGROUND: memory has 53 messages, first 10 IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:23:55] [LIFECYCLE] Background snapshot: count=53, maxId=28824
[09:23:55] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[09:23:55] [WS] Canceling WebSocket for query connection to iosILUIWU
[09:23:55] In cleanupPeer
[09:23:55] In cleanupPeer
[09:23:55] [LIFECYCLE] WebRTC audio disabled
[09:23:55] [LIFECYCLE] AVAudioSession deactivated
[09:23:55] [LIFECYCLE] All connections stopped
[09:23:55] [CLIENT_SIG] WebSocket closed with code 1001
[09:23:55] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[09:23:55] [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/}
[09:23:55] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[09:23:55] [SERVER] Stopped reconnect polling
[09:23:55] Will request stop of video 0
[09:23:55] Will request stop of video 0
[09:23:55] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[09:23:55] [WS] Query connection error - cleaning up all agent connections and views
[09:23:55] [WS] Connection failed: cancelled
[09:23:55] [WS] Query connection failed - cleaning up all agent connections and views
[09:23:55] [SCROLL] 💓 alive, visible=51...54, rows=55, estHeight=0.0, heightCalls=59
[09:23:55] [PIP] Removing 0 tracks from PiP for connection 0
[09:23:55] [PIP] ✅ All tracks removed for connection 0
[09:23:55] [PIP] Removing 0 tracks from PiP for connection 0
[09:23:55] [PIP] ✅ All tracks removed for connection 0
[09:23:55] [CLEANUP] ========================================
[09:23:55] [CLEANUP] Cleaning up all agent connections and views
[09:23:55] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:55] [CLEANUP] Stopped and removed 0 video connections
[09:23:55] [CLEANUP] Removed 0 video views
[09:23:55] [CLEANUP] Removed 0 feed scroll views
[09:23:55] [CLEANUP] Removed 0 status labels
[09:23:55] [CLEANUP] Reset agent query state
[09:23:55] [CLEANUP] Updated page indicator
[09:23:55] [CLEANUP] Rebuilt video layout
[09:23:55] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:55] [CLEANUP] ========================================
[09:23:55] [SERVER] Skipping reconnect polling - app is in background
[09:23:55] [WS] URLSession invalidated successfully
[09:23:55] [CLEANUP] ========================================
[09:23:55] [CLEANUP] Cleaning up all agent connections and views
[09:23:55] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:23:55] [CLEANUP] Stopped and removed 0 video connections
[09:23:55] [CLEANUP] Removed 0 video views
[09:23:55] [CLEANUP] Removed 0 feed scroll views
[09:23:55] [CLEANUP] Removed 0 status labels
[09:23:55] [CLEANUP] Reset agent query state
[09:23:55] [CLEANUP] Updated page indicator
[09:23:55] [CLEANUP] Rebuilt video layout
[09:23:55] [CLEANUP] ✅ All agent connections and views cleaned up
[09:23:55] [CLEANUP] ========================================
[09:23:55] [SERVER] Skipping reconnect polling - app is in background
[09:33:08] [SECURITY] Timeout check: elapsed=553.6291000843048s, timeout=300.0s
[09:33:08] [SECURITY] sceneWillEnterForeground - timeout exceeded, showing lock screen immediately
[09:33:08] [AUTH] ✅ All guards passed, showing privacy cover
[09:33:08] [NETWORK] Status changed: connected
[09:33:08] [SCROLL] 💓 alive, visible=47...54, rows=55, estHeight=0.0, heightCalls=0
[09:33:08] [LIFECYCLE] App entering foreground - restoring connections
[09:33:08] [CAPTURE] Live-feed protection [app-will-enter-foreground] - fullscreen=false, isCaptured=false, secureReady=true
[09:33:08] [CAPTURE] Refresh overlay [app-will-enter-foreground] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[09:33:08] [PUSH_TRACE] 🔄 FOREGROUND: memory has 53 msgs, IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:33:08] [PUSH_TRACE] 🔄 FOREGROUND: cache has 50 msgs, valid=true, IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:33:08] [LIFECYCLE] Away > 2 minutes (553s) - will scroll to bottom
[09:33:09] [UPLOAD_RETRY] No pending uploads to retry
[09:33:09] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=53
[09:33:09] [READBY_OPT] Fetching readBy for 3 unsettled messages (targeted)
[09:33:09] [LIFECYCLE] WebRTC audio re-enabled
[09:33:09] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[09:33:09] [CLIENT_SIG] Skipping connect - app in background (state=2)
[09:33:09] [VIEWER] Reconnecting after background - querying agents
[09:33:09] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=nil
[09:33:09] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[09:33:09] [UNSENT_RETRY] Checking for unsent messages...
[09:33:09] [PENDING_UPLOAD] Total pending upload messages: 0
[09:33:09] [UNSENT_RETRY] No unsent messages found
[09:33:09] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:33:09] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:33:09] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:33:09] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=4
[09:33:09] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[28824, 28823, 28822, 28821, 28820]
[09:33:09] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 53 messages
[09:33:09] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:33:09] [RELOAD_TAB] 📊 Building chatRows from 53 messages
[09:33:09] [SCROLL] wasNearBottom=true, threshold=758, offset=4404, contentH=5162, boundsH=758, forceScroll=false
[09:33:09] [RELOAD_TAB] 📊 Built 55 chatRows, estHeight=0.0
[09:33:09] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[09:33:09] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[09:33:09] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[09:33:09] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 53 msgs, IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:33:09] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=7311 vccs=0
[09:33:09] [GAP_FIX] maxMessageIdAtBackground=28824, currentMaxLocalId=28824
[09:33:09] [PUSH] handlePollEventsNotification userInfo: [:]
[09:33:09] [PUSH] No message_id in userInfo
[09:33:09] [PUSH] No operation_type in userInfo
[09:33:09] [FAST_REFRESH] Evolution disabled - performing incremental sync
[09:33:09] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=50, IDs=[28821, 28820, 28819, 28818, 28817, 28816, 28815, 28814, 28813, 28812]
[09:33:09] [PUSH_TRACE] 📬 POLL: memory state: count=53, first 10 IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:33:09] [FAST_REFRESH] Already have 53 messages in memory
[09:33:09] [FAST_REFRESH] maxMemoryId=28824, maxLocalId=28824
[09:33:09] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[09:33:09] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=53
[09:33:09] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[09:33:09] [READBY_OPT] Fetching readBy for 3 unsettled messages (targeted)
[09:33:09] [GAP_FIX] Incremental sync will use since_id=28824 (background max=28824, current DB max=28824)
[09:33:09] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=53
[09:33:09] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28824, maxMemoryId=28824
[09:33:09] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28824
[09:33:09] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[09:33:09] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[28824, 28823, 28822, 28821, 28820]
[09:33:09] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 53 messages
[09:33:09] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:33:09] [RELOAD_TAB] 📊 Building chatRows from 53 messages
[09:33:09] [SCROLL] wasNearBottom=true, threshold=758, offset=4404, contentH=5162, boundsH=758, forceScroll=false
[09:33:09] [RELOAD_TAB] 📊 Built 55 chatRows, estHeight=0.0
[09:33:09] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[09:33:09] [CLIENT_SIG] WebSocket opened
[09:33:09] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:33:09] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[09:33:09] HELLO → sent (cached token, role=query)
[09:33:09] [CLIENT_SIG] Connected! clientId=q05N33mEMmxshJuQ
[09:33:09] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:33:09] [WS] Query connection failed - cleaning up all agent connections and views
[09:33:09] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:33:09] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:33:09] [CLEANUP] ========================================
[09:33:09] [CLEANUP] Cleaning up all agent connections and views
[09:33:09] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:33:09] [CLEANUP] Stopped and removed 0 video connections
[09:33:09] [CLEANUP] Removed 0 video views
[09:33:09] [CLEANUP] Removed 0 feed scroll views
[09:33:09] [CLEANUP] Removed 0 status labels
[09:33:09] [CLEANUP] Reset agent query state
[09:33:09] [CLEANUP] Updated page indicator
[09:33:09] [CLEANUP] Rebuilt video layout
[09:33:09] [CLEANUP] ✅ All agent connections and views cleaned up
[09:33:09] [CLEANUP] ========================================
[09:33:09] [SERVER] Starting reconnect polling (5s interval)
[09:33:09] [CLEANUP] ========================================
[09:33:09] [CLEANUP] Cleaning up all agent connections and views
[09:33:09] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:33:09] [CLEANUP] Stopped and removed 0 video connections
[09:33:09] [CLEANUP] Removed 0 video views
[09:33:09] [CLEANUP] Removed 0 feed scroll views
[09:33:09] [CLEANUP] Removed 0 status labels
[09:33:09] [CLEANUP] Reset agent query state
[09:33:09] [CLEANUP] Updated page indicator
[09:33:09] [CLEANUP] Rebuilt video layout
[09:33:09] [CLEANUP] ✅ All agent connections and views cleaned up
[09:33:09] [CLEANUP] ========================================
[09:33:09] [SERVER] Starting reconnect polling (5s interval)
[09:33:09] [COMBINED_FETCH] Loaded 3 read receipts, 0 messages with reactions
[09:33:09] [FOREGROUND] Enriched 0/3 unsettled messages with readBy data
[09:33:09] [LIFECYCLE] scrollToBottomIfNeeded time=true, count=53>53=false, maxId=28824>28824=false, shouldScroll=true
[09:33:09] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=53
[09:33:09] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[09:33:09] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:33:09] [COMBINED_FETCH] Loaded 3 read receipts, 0 messages with reactions
[09:33:09] [FAST_REFRESH] Enriched 3/3 unsettled messages with readBy data
[09:33:09] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=53
[09:33:09] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:33:09] [INCREMENTAL_SYNC] ✅ No new messages
[09:33:09] [FAST_REFRESH] Incremental sync complete - 53 messages
[09:33:09] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[09:33:09] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[28824, 28823, 28822, 28821, 28820]
[09:33:09] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 53 messages
[09:33:09] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:33:09] [RELOAD_TAB] 📊 Building chatRows from 53 messages
[09:33:09] [SCROLL] wasNearBottom=true, threshold=758, offset=4404, contentH=5162, boundsH=758, forceScroll=true
[09:33:09] [RELOAD_TAB] 📊 Built 55 chatRows, estHeight=0.0
[09:33:09] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:33:09] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:33:09] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=63
[09:33:09] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4404, currentOffset=4404
[09:33:09] [SCROLL] Scrolling to 4404, animated=false
[09:33:10] [PIN_AUTH] Correct PIN
[09:33:10] [SECURITY] Restored real session: ILUIWU
[09:33:10] [SECURITY] Restored real session: ILUIWU
[09:33:10] [FAKE_AI] cancel() called, wasRunning=false
[09:33:10] [FAKE MODE] Exiting fake mode, restoring real session
[09:33:10] [SECURITY] Restored real session: ILUIWU
[09:33:10] [SECURITY] Saved real session: ILUIWU
[09:33:10] [FAKE MODE] ✅ Restored real session: ILUIWU
[09:33:10] [FAKE MODE] Loaded 50 messages (limited to page size)
[09:33:10] [READBY_OPT] Fetching readBy for 3 unsettled messages (targeted)
[09:33:10] [AUTH] Authentication completed - updating UI only (data already fetched in foreground handler)
[09:33:10] [AUTH] Cache had 50 messages, maxExistingId=28824, inserted 0 truly new
[09:33:10] [LIFECYCLE] scrollToBottomIfNeeded time=false, count=50>53=false, maxId=28824>28824=false, shouldScroll=false
[09:33:10] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[09:33:10] [AUTH] UI update complete
[09:33:10] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[09:33:10] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[09:33:10] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[09:33:10] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[09:33:10] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=completed
[09:33:10] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[09:33:10] [SCROLL] 💓 alive, visible=48...51, rows=52, estHeight=0.0, heightCalls=115
[09:33:10] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:33:10] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:33:10] [COMBINED_FETCH] Loaded 3 read receipts, 0 messages with reactions
[09:33:10] [FAKE MODE] Enriched 3/3 unsettled messages with readBy data
[09:33:10] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[09:33:10] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:33:10] [USER] ✅ User registered successfully
[09:33:10] [PUSH] User registration after token update: success
[09:33:10] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=4
[09:33:10] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28824, 28823, 28822, 28821, 28820]
[09:33:10] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[09:33:10] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:33:10] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[09:33:10] [SCROLL] wasNearBottom=true, threshold=447, offset=4443, contentH=4890, boundsH=447, forceScroll=true
[09:33:10] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[09:33:10] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:33:10] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:33:10] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=56
[09:33:10] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4443, currentOffset=4443
[09:33:10] [SCROLL] Scrolling to 4443, animated=false
[09:33:11] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:33:11] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:33:11] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:33:11] HELLO → sent (cached token, role=query)
[09:33:11] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:33:11] [WS] Query connection failed - cleaning up all agent connections and views
[09:33:11] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:33:11] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:33:11] [CLEANUP] ========================================
[09:33:11] [CLEANUP] Cleaning up all agent connections and views
[09:33:11] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:33:11] [CLEANUP] Stopped and removed 0 video connections
[09:33:11] [CLEANUP] Removed 0 video views
[09:33:11] [CLEANUP] Removed 0 feed scroll views
[09:33:11] [CLEANUP] Removed 0 status labels
[09:33:11] [CLEANUP] Reset agent query state
[09:33:11] [CLEANUP] Updated page indicator
[09:33:11] [CLEANUP] Rebuilt video layout
[09:33:11] [CLEANUP] ✅ All agent connections and views cleaned up
[09:33:11] [CLEANUP] ========================================
[09:33:11] [SERVER] Starting reconnect polling (5s interval)
[09:33:11] [CLEANUP] ========================================
[09:33:11] [CLEANUP] Cleaning up all agent connections and views
[09:33:11] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:33:11] [CLEANUP] Stopped and removed 0 video connections
[09:33:11] [CLEANUP] Removed 0 video views
[09:33:11] [CLEANUP] Removed 0 feed scroll views
[09:33:11] [CLEANUP] Removed 0 status labels
[09:33:11] [CLEANUP] Reset agent query state
[09:33:11] [CLEANUP] Updated page indicator
[09:33:11] [CLEANUP] Rebuilt video layout
[09:33:11] [CLEANUP] ✅ All agent connections and views cleaned up
[09:33:11] [CLEANUP] ========================================
[09:33:11] [SERVER] Starting reconnect polling (5s interval)
[09:33:12] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:33:12] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:33:12] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:33:12] HELLO → sent (cached token, role=query)
[09:33:12] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:33:12] [WS] Query connection failed - cleaning up all agent connections and views
[09:33:12] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:33:12] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:33:12] [CLEANUP] ========================================
[09:33:12] [CLEANUP] Cleaning up all agent connections and views
[09:33:12] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:33:12] [CLEANUP] Stopped and removed 0 video connections
[09:33:12] [CLEANUP] Removed 0 video views
[09:33:12] [CLEANUP] Removed 0 feed scroll views
[09:33:12] [CLEANUP] Removed 0 status labels
[09:33:12] [CLEANUP] Reset agent query state
[09:33:12] [CLEANUP] Updated page indicator
[09:33:12] [CLEANUP] Rebuilt video layout
[09:33:12] [CLEANUP] ✅ All agent connections and views cleaned up
[09:33:12] [CLEANUP] ========================================
[09:33:12] [SERVER] Starting reconnect polling (5s interval)
[09:33:12] [CLEANUP] ========================================
[09:33:12] [CLEANUP] Cleaning up all agent connections and views
[09:33:12] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:33:12] [CLEANUP] Stopped and removed 0 video connections
[09:33:12] [CLEANUP] Removed 0 video views
[09:33:12] [CLEANUP] Removed 0 feed scroll views
[09:33:12] [CLEANUP] Removed 0 status labels
[09:33:12] [CLEANUP] Reset agent query state
[09:33:12] [CLEANUP] Updated page indicator
[09:33:12] [CLEANUP] Rebuilt video layout
[09:33:12] [CLEANUP] ✅ All agent connections and views cleaned up
[09:33:12] [CLEANUP] ========================================
[09:33:12] [SERVER] Starting reconnect polling (5s interval)
[09:33:14] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:33:14] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:33:14] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:33:14] HELLO → sent (cached token, role=query)
[09:33:14] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:33:14] [WS] Query connection failed - cleaning up all agent connections and views
[09:33:14] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:33:14] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:33:14] [CLEANUP] ========================================
[09:33:14] [CLEANUP] Cleaning up all agent connections and views
[09:33:14] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:33:14] [CLEANUP] Stopped and removed 0 video connections
[09:33:14] [CLEANUP] Removed 0 video views
[09:33:14] [CLEANUP] Removed 0 feed scroll views
[09:33:14] [CLEANUP] Removed 0 status labels
[09:33:14] [CLEANUP] Reset agent query state
[09:33:14] [CLEANUP] Updated page indicator
[09:33:14] [CLEANUP] Rebuilt video layout
[09:33:14] [CLEANUP] ✅ All agent connections and views cleaned up
[09:33:14] [CLEANUP] ========================================
[09:33:14] [SERVER] Starting reconnect polling (5s interval)
[09:33:14] [CLEANUP] ========================================
[09:33:14] [CLEANUP] Cleaning up all agent connections and views
[09:33:14] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:33:14] [CLEANUP] Stopped and removed 0 video connections
[09:33:14] [CLEANUP] Removed 0 video views
[09:33:14] [CLEANUP] Removed 0 feed scroll views
[09:33:14] [CLEANUP] Removed 0 status labels
[09:33:14] [CLEANUP] Reset agent query state
[09:33:14] [CLEANUP] Updated page indicator
[09:33:14] [CLEANUP] Rebuilt video layout
[09:33:14] [CLEANUP] ✅ All agent connections and views cleaned up
[09:33:14] [CLEANUP] ========================================
[09:33:14] [SERVER] Starting reconnect polling (5s interval)
[09:33:15] [MENU] dismissAnyExistingMenu called
[09:33:15] [MENU] dismissAnyExistingMenu completed
[09:33:15] [SCROLL_BEGIN_DRAG] messagesTable offsetY=4443, insetTop=0, topDistance=4443, rows=52, prefetchedCount=0
[09:33:15] [SCROLL] 💓 alive, visible=48...51, rows=52, estHeight=0.0, heightCalls=57
[09:33:16] [SCROLL_WILL_END] velocity=(0.000, -0.688), currentY=4132, targetY=3793, movingTowardTop=true, decelNow=false, dragging=true
[09:33:16] [SCROLL_WILL_END] captured upward momentum velocityY=-0.6879372876127373
[09:33:16] [SCROLL_END_DRAG] messagesTable decelerate=true, offsetY=4132, topInset=0, pendingVelocityY=-0.6879372876127373, targetNearTop=4132
[09:33:16] [LOG-KB] textViewShouldEndEditing: isInputField=true, allowKeyboardDismiss=true, returning=true, textView=<Eye.PastingTextView: 0x11ac70000; baseClass = UITextView; frame = (44 8; 320 36
[09:33:16] [LOG-KB] textViewDidEndEditing: isInputField=true, resetting allowKeyboardDismiss to false
[09:33:16] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:33:16] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:33:16] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:33:16] HELLO → sent (cached token, role=query)
[09:33:16] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:33:16] [WS] Query connection failed - cleaning up all agent connections and views
[09:33:16] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:33:16] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:33:16] [CLEANUP] ========================================
[09:33:16] [CLEANUP] Cleaning up all agent connections and views
[09:33:16] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:33:16] [CLEANUP] Stopped and removed 0 video connections
[09:33:16] [CLEANUP] Removed 0 video views
[09:33:16] [CLEANUP] Removed 0 feed scroll views
[09:33:16] [CLEANUP] Removed 0 status labels
[09:33:16] [CLEANUP] Reset agent query state
[09:33:16] [CLEANUP] Updated page indicator
[09:33:16] [CLEANUP] Rebuilt video layout
[09:33:16] [CLEANUP] ✅ All agent connections and views cleaned up
[09:33:16] [CLEANUP] ========================================
[09:33:16] [SERVER] Starting reconnect polling (5s interval)
[09:33:16] [CLEANUP] ========================================
[09:33:16] [CLEANUP] Cleaning up all agent connections and views
[09:33:16] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:33:16] [CLEANUP] Stopped and removed 0 video connections
[09:33:16] [CLEANUP] Removed 0 video views
[09:33:16] [CLEANUP] Removed 0 feed scroll views
[09:33:16] [CLEANUP] Removed 0 status labels
[09:33:16] [CLEANUP] Reset agent query state
[09:33:16] [CLEANUP] Updated page indicator
[09:33:16] [CLEANUP] Rebuilt video layout
[09:33:16] [CLEANUP] ✅ All agent connections and views cleaned up
[09:33:16] [CLEANUP] ========================================
[09:33:16] [SERVER] Starting reconnect polling (5s interval)
[09:33:16] [SCROLL] 💓 alive, visible=42...48, rows=52, estHeight=0.0, heightCalls=11
[09:33:17] [MENU] dismissAnyExistingMenu called
[09:33:17] [MENU] dismissAnyExistingMenu completed
[09:33:17] [SCROLL_BEGIN_DRAG] messagesTable offsetY=3872, insetTop=0, topDistance=3872, rows=52, prefetchedCount=0
[09:33:17] [SCROLL] 💓 alive, visible=43...49, rows=52, estHeight=0.0, heightCalls=4
[09:33:17] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:33:17] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:33:18] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:33:18] HELLO → sent (cached token, role=query)
[09:33:18] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:33:18] [WS] Query connection failed - cleaning up all agent connections and views
[09:33:18] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:33:18] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:33:18] [CLEANUP] ========================================
[09:33:18] [CLEANUP] Cleaning up all agent connections and views
[09:33:18] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:33:18] [CLEANUP] Stopped and removed 0 video connections
[09:33:18] [CLEANUP] Removed 0 video views
[09:33:18] [CLEANUP] Removed 0 feed scroll views
[09:33:18] [CLEANUP] Removed 0 status labels
[09:33:18] [CLEANUP] Reset agent query state
[09:33:18] [CLEANUP] Updated page indicator
[09:33:18] [CLEANUP] Rebuilt video layout
[09:33:18] [CLEANUP] ✅ All agent connections and views cleaned up
[09:33:18] [CLEANUP] ========================================
[09:33:18] [SERVER] Starting reconnect polling (5s interval)
[09:33:18] [CLEANUP] ========================================
[09:33:18] [CLEANUP] Cleaning up all agent connections and views
[09:33:18] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:33:18] [CLEANUP] Stopped and removed 0 video connections
[09:33:18] [CLEANUP] Removed 0 video views
[09:33:18] [CLEANUP] Removed 0 feed scroll views
[09:33:18] [CLEANUP] Removed 0 status labels
[09:33:18] [CLEANUP] Reset agent query state
[09:33:18] [CLEANUP] Updated page indicator
[09:33:18] [CLEANUP] Rebuilt video layout
[09:33:18] [CLEANUP] ✅ All agent connections and views cleaned up
[09:33:18] [CLEANUP] ========================================
[09:33:18] [SERVER] Starting reconnect polling (5s interval)
[09:33:18] [SCROLL] 💓 alive, visible=43...49, rows=52, estHeight=0.0, heightCalls=0
[09:33:19] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:33:19] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:33:19] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:33:19] HELLO → sent (cached token, role=query)
[09:33:19] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:33:19] [WS] Query connection failed - cleaning up all agent connections and views
[09:33:19] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:33:19] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:33:19] [CLEANUP] ========================================
[09:33:19] [CLEANUP] Cleaning up all agent connections and views
[09:33:19] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:33:19] [CLEANUP] Stopped and removed 0 video connections
[09:33:19] [CLEANUP] Removed 0 video views
[09:33:19] [CLEANUP] Removed 0 feed scroll views
[09:33:19] [CLEANUP] Removed 0 status labels
[09:33:19] [CLEANUP] Reset agent query state
[09:33:19] [CLEANUP] Updated page indicator
[09:33:19] [CLEANUP] Rebuilt video layout
[09:33:19] [CLEANUP] ✅ All agent connections and views cleaned up
[09:33:19] [CLEANUP] ========================================
[09:33:19] [SERVER] Starting reconnect polling (5s interval)
[09:33:19] [CLEANUP] ========================================
[09:33:19] [CLEANUP] Cleaning up all agent connections and views
[09:33:19] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:33:19] [CLEANUP] Stopped and removed 0 video connections
[09:33:19] [CLEANUP] Removed 0 video views
[09:33:19] [CLEANUP] Removed 0 feed scroll views
[09:33:19] [CLEANUP] Removed 0 status labels
[09:33:19] [CLEANUP] Reset agent query state
[09:33:19] [CLEANUP] Updated page indicator
[09:33:19] [CLEANUP] Rebuilt video layout
[09:33:19] [CLEANUP] ✅ All agent connections and views cleaned up
[09:33:19] [CLEANUP] ========================================
[09:33:19] [SERVER] Starting reconnect polling (5s interval)
[09:33:20] [SCROLL] 💓 alive, visible=43...49, rows=52, estHeight=0.0, heightCalls=0
[09:33:21] [SCROLL] 💓 alive, visible=43...50, rows=52, estHeight=0.0, heightCalls=2
[09:33:21] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:33:21] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:33:21] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:33:21] HELLO → sent (cached token, role=query)
[09:33:21] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:33:21] [WS] Query connection failed - cleaning up all agent connections and views
[09:33:21] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:33:21] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:33:21] [CLEANUP] ========================================
[09:33:21] [CLEANUP] Cleaning up all agent connections and views
[09:33:21] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:33:21] [CLEANUP] Stopped and removed 0 video connections
[09:33:21] [CLEANUP] Removed 0 video views
[09:33:21] [CLEANUP] Removed 0 feed scroll views
[09:33:21] [CLEANUP] Removed 0 status labels
[09:33:21] [CLEANUP] Reset agent query state
[09:33:21] [CLEANUP] Updated page indicator
[09:33:21] [CLEANUP] Rebuilt video layout
[09:33:21] [CLEANUP] ✅ All agent connections and views cleaned up
[09:33:21] [CLEANUP] ========================================
[09:33:21] [SERVER] Starting reconnect polling (5s interval)
[09:33:21] [CLEANUP] ========================================
[09:33:21] [CLEANUP] Cleaning up all agent connections and views
[09:33:21] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:33:21] [CLEANUP] Stopped and removed 0 video connections
[09:33:21] [CLEANUP] Removed 0 video views
[09:33:21] [CLEANUP] Removed 0 feed scroll views
[09:33:21] [CLEANUP] Removed 0 status labels
[09:33:21] [CLEANUP] Reset agent query state
[09:33:21] [CLEANUP] Updated page indicator
[09:33:21] [CLEANUP] Rebuilt video layout
[09:33:21] [CLEANUP] ✅ All agent connections and views cleaned up
[09:33:21] [CLEANUP] ========================================
[09:33:21] [SERVER] Starting reconnect polling (5s interval)
[09:33:22] [SCROLL] 💓 alive, visible=41...48, rows=52, estHeight=0.0, heightCalls=4
[09:33:22] [SCROLL_WILL_END] velocity=(0.000, 2.135), currentY=3946, targetY=4132, movingTowardTop=false, decelNow=true, dragging=true
[09:33:22] [SCROLL_WILL_END] cleared upward momentum capture
[09:33:22] [SCROLL_END_DRAG] messagesTable decelerate=true, offsetY=3946, topInset=0, pendingVelocityY=0.0, targetNearTop=3946
[09:33:22] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:33:22] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:33:23] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:33:23] HELLO → sent (cached token, role=query)
[09:33:23] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:33:23] [WS] Query connection failed - cleaning up all agent connections and views
[09:33:23] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[09:33:23] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[09:33:23] [CLEANUP] ========================================
[09:33:23] [CLEANUP] Cleaning up all agent connections and views
[09:33:23] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:33:23] [CLEANUP] Stopped and removed 0 video connections
[09:33:23] [CLEANUP] Removed 0 video views
[09:33:23] [CLEANUP] Removed 0 feed scroll views
[09:33:23] [CLEANUP] Removed 0 status labels
[09:33:23] [CLEANUP] Reset agent query state
[09:33:23] [CLEANUP] Updated page indicator
[09:33:23] [CLEANUP] Rebuilt video layout
[09:33:23] [CLEANUP] ✅ All agent connections and views cleaned up
[09:33:23] [CLEANUP] ========================================
[09:33:23] [SERVER] Starting reconnect polling (5s interval)
[09:33:23] [CLEANUP] ========================================
[09:33:23] [CLEANUP] Cleaning up all agent connections and views
[09:33:23] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:33:23] [CLEANUP] Stopped and removed 0 video connections
[09:33:23] [CLEANUP] Removed 0 video views
[09:33:23] [CLEANUP] Removed 0 feed scroll views
[09:33:23] [CLEANUP] Removed 0 status labels
[09:33:23] [CLEANUP] Reset agent query state
[09:33:23] [CLEANUP] Updated page indicator
[09:33:23] [CLEANUP] Rebuilt video layout
[09:33:23] [CLEANUP] ✅ All agent connections and views cleaned up
[09:33:23] [CLEANUP] ========================================
[09:33:23] [SERVER] Starting reconnect polling (5s interval)
[09:33:23] [LOCK] Lock button tapped - locking app immediately
[09:33:23] [LOCK] Received lock app notification
[09:33:23] [SCROLL] 💓 alive, visible=44...51, rows=52, estHeight=0.0, heightCalls=7
[09:33:23] [SCROLL_END_DECEL] messagesTable offsetY=4132, insetTop=0, pendingVelocityY=0.0
[09:33:23] [LIFECYCLE] App resigning active - cleared crash flag
[09:33:24] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[09:33:24] [SECURITY] sceneDidEnterBackground - isAuthenticated=false
[09:33:24] [SECURITY] ⚠️ NOT saving timestamp - isAuthenticated is false
[09:33:24] [LIFECYCLE] App entering background - cleared crash flag
[09:33:24] [CLIENT_SIG] Disconnecting
[09:33:24] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[09:33:24] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[09:33:24] [PUSH_TRACE] 💤 BACKGROUND: memory has 50 messages, first 10 IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:33:24] [LIFECYCLE] Background snapshot: count=50, maxId=28824
[09:33:24] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=3
[09:33:24] [WS] Canceling WebSocket for query connection to iosILUIWU
[09:33:24] In cleanupPeer
[09:33:24] In cleanupPeer
[09:33:24] [LIFECYCLE] WebRTC audio disabled
[09:33:24] [LIFECYCLE] AVAudioSession deactivated
[09:33:24] [LIFECYCLE] All connections stopped
[09:33:24] [CLIENT_SIG] WebSocket closed with code 1001
[09:33:24] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[09:33:24] [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/}
[09:33:24] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[09:33:24] [SERVER] Stopped reconnect polling
[09:33:24] [WS] URLSession invalidated successfully
[09:42:57] [CRASH] No crash detected
[09:42:57] [FONT] Roboto fonts loaded successfully: Roboto-Regular
[09:42:57] [FONT] ChatFont.regular(18) returns: Roboto-Regular, family: Roboto
[09:42:57] [GIPHY] SDK not available - using REST API fallback
[09:42:57] [BACKGROUND] Background fetch enabled
[09:42:57] [AUTH] Starting PIN authentication
[09:42:57] [BACKGROUND] Background fetch triggered
[09:42:57] [BACKGROUND] Fetching recent messages for pre-cache
[09:42:57] [PUSH] APNs token: 6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c
[09:42:57] [CLEANUP] No old timer messages to delete
[09:42:58] [PRELOAD] ⚡ Starting message pre-load during authentication (since_id=28752)...
[09:42:58] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[09:42:58] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[09:42:58] [PRELOAD] Fetched 31 messages
[09:42:58] [PRELOAD] ✅ Saved 31 messages to local DB
[09:42:58] [REPLY_LOAD] SceneDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:42:58] [REPLY_LOAD] SceneDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:42:58] [REPLY_LOAD] SceneDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:42:58] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=31, sessionId=ILUIWU
[09:42:58] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:42:58] [PUSH_TRACE] 🔀 mergeMessages: Different session (nil vs ILUIWU), replacing cache
[09:42:58] [PRELOAD] ⚡ Cached 31 messages for instant display (preserved 0 from push)
[09:42:58] [USER] ✅ User registered successfully
[09:42:58] [PUSH] User registration after token update: success
[09:42:58] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[09:42:58] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:42:58] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:42:58] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:42:58] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:42:58] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:42:58] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:42:58] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=31, IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:42:58] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[09:42:58] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:42:58] [BACKGROUND] Pre-cached 50 ChatMessage objects for instant display (preserved 0 from push)
[09:42:58] [BACKGROUND] Pre-downloaded 0 thumbnails
[09:42:58] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[09:49:04] [BACKGROUND] Background fetch triggered
[09:49:04] [BACKGROUND] Fetching recent messages for pre-cache
[09:49:05] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[09:49:05] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:49:05] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:49:05] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:49:05] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:49:05] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:49:05] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:49:05] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:49:05] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[09:49:05] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:49:05] [BACKGROUND] Pre-cached 50 ChatMessage objects for instant display (preserved 0 from push)
[09:49:05] [BACKGROUND] Pre-downloaded 0 thumbnails
[09:49:05] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[09:53:23] [PUSH] Silent push received
[09:53:23] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:53:23 +0000, appState=2, message_id=nil, type=nil
[09:53:23] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:53:23] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:53:23 +0000
[09:53:23] [PUSH_EMBED] No embedded message_data in notification
[09:53:23] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[09:53:23] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=50, IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815], handled=false
[09:53:23] [PUSH] No embedded data, pre-loading messages from server
[09:53:23] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:53:23] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[09:53:23] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:53:23] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:53:23] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:53:23] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:53:23] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:53:23] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:53:23] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=50, IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:53:23] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=0, IDs=[]
[09:53:23] [PUSH_TRACE] 🔀 mergeMessages: merged.count=50, first 10 IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:53:23] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[09:53:23] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[09:53:34] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[09:53:34] [PUSH] Silent push received
[09:53:34] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:53:34 +0000, appState=2, message_id=28825, type=nil
[09:53:34] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:53:34] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:53:34 +0000
[09:53:34] [PUSH_TRACE] ⬇️ Processing embedded message_id=28825
[09:53:34] [PUSH_EMBED] 📩 Received embedded message: id=28825, type=0, sender=Esra
[09:53:34] [PUSH_TRACE] ⬇️ Message details: text="😏😏😏...", datesent=2026-04-23 07:53:32
[09:53:34] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[09:53:34] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28825
[09:53:34] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28825
[09:53:34] [PUSH_EMBED] ✅ Saved message 28825 to local DB (sync)
[09:53:34] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28825
[09:53:34] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28825
[09:53:34] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28825
[09:53:34] [PUSH_TRACE] 📦 Cache state: valid=true, count=50, IDs=[28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816, 28815]
[09:53:34] [PUSH_EMBED] Inserted message 28825 into existing cache (now 51 messages)
[09:53:34] [PUSH_TRACE] 📦 ✅ Inserted message 28825, cache now has IDs: [28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816]
[09:53:34] [PUSH_TRACE] 📦 EXITING cache update queue for message 28825
[09:53:35] [PUSH_EMBED] Fetching evolution data for message 28825 in background
[09:53:35] [PUSH_EMBED] ✅ Fully processed message 28825
[09:53:35] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28825
[09:53:35] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816], handled=true
[09:53:35] [PUSH] Embedded message handled instantly from silent push
[09:53:35] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[09:53:35] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28825
[09:53:35] [PUSH_EMBED] Got evolution data for message 28825, saving to local DB
[09:53:35] [PUSH_EMBED] Saved evolution data for message 28825
[09:53:37] [PUSH] Notification tapped - session_id: ILUIWU
[09:53:37] [PUSH] Max message_id before tap: 28825
[09:53:37] [PUSH] Stored pending session: ILUIWU
[09:53:37] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:53:37 +0000
[09:53:37] [PUSH_TRACE] ⬇️ Processing embedded message_id=28825
[09:53:37] [PUSH_EMBED] 📩 Received embedded message: id=28825, type=0, sender=Esra
[09:53:37] [PUSH_TRACE] ⬇️ Message details: text="😏😏😏...", datesent=2026-04-23 07:53:32
[09:53:37] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[09:53:37] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28825
[09:53:37] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28825
[09:53:37] [PUSH_EMBED] ✅ Saved message 28825 to local DB (sync)
[09:53:37] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28825
[09:53:37] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28825
[09:53:37] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28825
[09:53:37] [PUSH_TRACE] 📦 Cache state: valid=true, count=51, IDs=[28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816]
[09:53:37] [PUSH_TRACE] 📦 ⚠️ Message 28825 already in cache, skipping insert
[09:53:37] [PUSH_TRACE] 📦 EXITING cache update queue for message 28825
[09:53:37] [PUSH_EMBED] Fetching evolution data for message 28825 in background
[09:53:37] [PUSH_EMBED] ✅ Fully processed message 28825
[09:53:37] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28825
[09:53:37] [PUSH] Embedded message handled instantly on tap
[09:53:37] [PUSH] Fetching server messages since_id=28825 to catch coalesced notifications on tap
[09:53:37] [PUSH_PRELOAD] Fetching up to 50 messages since_id=28825 to catch coalesced notifications
[09:53:37] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[09:53:37] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:53:37] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:53:37] [CLIENT_SIG] WebSocket opened
[09:53:37] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[09:53:37] [CLIENT_SIG] Connected! clientId=lv95Q0xoi4xoEWti
[09:53:37] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[09:53:37] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[09:53:37] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:53:37] [PUSH_EMBED] Got evolution data for message 28825, saving to local DB
[09:53:37] [PUSH_EMBED] Saved evolution data for message 28825
[09:53:38] [PUSH_PRELOAD] No messages or parse error
[09:53:38] [PUSH] Server fetch on tap completed (success=false)
[09:53:38] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[09:53:38] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[09:53:39] [PIN_AUTH] Correct PIN
[09:53:39] [SECURITY] Restored real session: ILUIWU
[09:53:39] [SECURITY] Restored real session: ILUIWU
[09:53:39] [SECURITY] Saved real session: ILUIWU
[09:53:39] [SCENE] Launched directly to chat view with sessionId: ILUIWU
[09:53:39] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[09:53:39] [UPLOAD_QUEUE] ✅ Database integrity check passed
[09:53:39] [UPLOAD_QUEUE] Active background session tasks: 0 (standard uploads now use foreground session, so this should be 0 after the fix)
[09:53:39] Documents Directory: /var/mobile/Containers/Data/Application/F022C66D-1F7D-4B3B-8B5B-832C2ABFA889/Documents
[09:53:39] [UPLOAD_QUEUE] Found 0 pending uploads to resume
[09:53:39] [CAPTURE_HOST] live-feed moved hosted view to plain container
[09:53:39] [THEME] Applying current theme
[09:53:39] [CHAT] Applied day theme (mode: day)
[09:53:39] [SECURITY] Saved real session: ILUIWU
[09:53:39] [CLIENT_SIG] Setting up client signaling for session: ILUIWU
[09:53:39] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[09:53:39] [NETWORK] Network monitor started
[09:53:39] [NETWORK] Status changed: connected
[09:53:39] Did transition
[09:53:39] [MODE] 🔍 updateModeUI called - currentTabIndex=0, sessionId=ILUIWU
[09:53:39] [VIEWER] Screen lock enabled - normal idle behavior
[09:53:39] [QUERY] 🔍 Creating query connection for iOS broadcast: iosILUIWU
[09:53:39] [VCC] ========== VideoConnectionClass INIT ==========
[09:53:39] [VCC] Session: iosILUIWU, ViewIdx: 0, AgentId: nil
[09:53:39] [DATA AUDIO] ========== setupWebRTC() START ==========
[09:53:39] [DATA AUDIO] Using data channel for audio - bypassing WebRTC audio device
[09:53:39] [DATA AUDIO] Creating encoder/decoder factories...
[09:53:39] [CODEC] Viewer - Available video codecs: H264, H264, VP8, VP9, AV1
[09:53:39] [CODEC] Viewer selected encoder: AV1 (best quality)
[09:53:39] [DATA AUDIO] Creating RTCPeerConnectionFactory...
[09:53:39] [DATA AUDIO] ✅ Factory created
[09:53:39] [DATA AUDIO] RTCAudioSession locked
[09:53:39] [DATA AUDIO] Set useManualAudio=true, isAudioEnabled=false
[09:53:39] [DATA AUDIO] RTCAudioSession unlocked
[09:53:39] [DATA AUDIO] Skipping AVAudioSession config - handled by DataChannelAudioPlayer
[09:53:39] [VCC] Initial ICE servers: ["stun:stun.l.google.com:19302", "turn:crivello.dyndns.org:3478?transport=udp", "turn:crivello.dyndns.org:3478?transport=tcp", "turns:crivello.dyndns.org:5349?transport=tcp"]
[09:53:39] [WS] Creating new WebSocket - isQueryOnly=false, connectionStr=iosILUIWU
[09:53:39] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:53:39] [QUERY] ✅ tempQueryConnection created for iosILUIWU
[09:53:39] [VIEWER_INIT] Already have 50 messages - just filtering for tab
[09:53:39] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[09:53:39] [EVENT_POLL] Event polling disabled - using WebSocket events instead
[09:53:39] [ORIENTATION] Updated pagingScrollView height to 247.5 for width 440.0
[09:53:39] Did transition
[09:53:39] [TABLEVIEW] cellForRowAt index 0 out of bounds (count=0)
[09:53:39] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[09:53:39] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[09:53:39] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:53:39] [CAPTURE] Live-feed protection [view-will-appear] - fullscreen=false, isCaptured=false, secureReady=true
[09:53:39] [READBY_OPT] Fetching readBy for 2 unsettled messages (targeted)
[09:53:39] [MIGRATION] No messages need sender_name backfill
[09:53:39] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=50
[09:53:39] [CAPTURE] Refresh overlay [view-will-appear] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[09:53:39] [GALLERY_DB] Loading ALL media messages for session: ILUIWU
[09:53:39] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28825, maxMemoryId=28825
[09:53:39] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28825
[09:53:39] [GALLERY_DB] Raw datesent for msg 28821: '2026-04-23 07:16:04'
[09:53:39] [GALLERY_DB] Raw datesent for msg 28740: '2026-04-22 16:15:17'
[09:53:39] [GALLERY_DB] Raw datesent for msg 28734: '2026-04-22 16:14:41'
[09:53:39] [USER] ✅ User registered successfully
[09:53:39] [USER] User registration successful
[09:53:39] [INCREMENTAL_SYNC] ✅ No new messages
[09:53:40] [GALLERY_DB] ✅ Loaded 1256 media messages
[09:53:40] [GALLERY] Filtered 1256 -> 1212 (only with local thumbnails)
[09:53:40] [GALLERY] First 5 after sort (newest first):
[09:53:40] [GALLERY]   0: id=28740, date=2026-04-22 16:15:17, file=adbb72082c79fd33.jpg
[09:53:40] [GALLERY]   1: id=28734, date=2026-04-22 16:14:41, file=653beabd4db198ba.jpg
[09:53:40] [GALLERY]   2: id=28718, date=2026-04-22 12:02:50, file=5a447861140baa5d.jpg
[09:53:40] [GALLERY]   3: id=28714, date=2026-04-22 10:16:33, file=e76ecd0d17b4f8dc.jpg
[09:53:40] [GALLERY]   4: id=28713, date=2026-04-22 10:12:56, file=55cec5a39e78220e.jpg
[09:53:40] [SCROLL] 💓 alive, visible=0...0, rows=0, estHeight=0.0, heightCalls=0
[09:53:40] [SCROLL_BTN] Showing button - 32pt from bottom > half 22pt
[09:53:40] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[09:53:40] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28825, 28824, 28823, 28822, 28821]
[09:53:40] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[09:53:40] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816]
[09:53:40] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[09:53:40] [SCROLL] wasNearBottom=true, threshold=758, offset=0, contentH=64, boundsH=758, forceScroll=true
[09:53:40] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[09:53:40] [EMOJI] ✅ Loaded 451 emoji-to-GIF mappings
[09:53:40] [CELL_UPLOAD] configure: msgId=28740, file=adbb72082c79fd33.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:53:40] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=adbb72082c79fd33.jpg, overlayExists=true
[09:53:40] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[09:53:40] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:53:40] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:53:40] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28824 → 28825
[09:53:40] [SERVER] Starting reconnect polling (5s interval)
[09:53:40] [ICONS] Screen width: 440.0, Tab spacing: 75.5
[09:53:40] [ICONS] Offset applied: -14.6
[09:53:40] [ICONS] New left margin: 11.2, New right margin: 11.3
[09:53:40] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:53:40] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[09:53:40] Trying API base: https://crivello.dyndns.org:443/WebRTC/public/
[09:53:40] Token POST → https://crivello.dyndns.org:443/WebRTC/public/new_session.php?sid=iosILUIWU
[09:53:40] [COMBINED_FETCH] Loaded 2 read receipts, 0 messages with reactions
[09:53:40] [READBY_ENRICH] Enriched 2/2 unsettled messages with readBy data
[09:53:40] [ICONS] Chat center: (31.2, 87.0)
[09:53:40] [ICONS] Gallery center: (106.7, 87.0), deltaX: 75.5
[09:53:40] [ICONS] Camera center: (182.2, 87.0), deltaX: 75.5
[09:53:40] [ICONS] Settings center: (257.7, 87.0), deltaX: 75.5
[09:53:40] [ICONS] Lock centerX: 333.2, deltaX from Settings: 75.5
[09:53:40] [ICONS] Bell centerX: 408.7, deltaX from Lock: 75.5
[09:53:40] [ICONS] LEFT MARGIN (screen left to Chat left): 11.2
[09:53:40] [ICONS] RIGHT MARGIN (Bell right to screen right): 11.3
[09:53:40] [ICONS] Screen width: 440.0
[09:53:40] [CLIENT_SIG] Typing start from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[09:53:40] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3759, currentOffset=3759
[09:53:40] [SCROLL] Scrolling to 3759, animated=false
[09:53:40] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[09:53:40] [PURGE] ⚠️ Media cache purge DISABLED for debugging
[09:53:40] [UNSENT_RETRY] Checking for unsent messages...
[09:53:40] [UPLOAD_RECOVERY] ========== CHECKING FOR MISSING UPLOADS ==========
[09:53:40] [UPLOAD_RECOVERY] User ID: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF
[09:53:40] [UPLOAD_RECOVERY] Session: ILUIWU
[09:53:40] [UPLOAD_RECOVERY] ✅ No stuck uploads found
[09:53:40] [UPLOAD_RECOVERY] Checking recent media messages on server...
[09:53:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28718, file=5a447861140baa5d.jpg, upload_status=complete
[09:53:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28714, file=e76ecd0d17b4f8dc.jpg, upload_status=complete
[09:53:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28713, file=55cec5a39e78220e.jpg, upload_status=complete
[09:53:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28702, file=7035e780531e78e1.mp4, upload_status=complete
[09:53:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28699, file=2f5ae78d2850faab.jpg, upload_status=complete
[09:53:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28640, file=f2317109ac17cc77.jpg, upload_status=complete
[09:53:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28628, file=0d1b02a5c4f3382f.mp4, upload_status=complete
[09:53:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28626, file=4d9299b5e3f3a7b2.mp4, upload_status=complete
[09:53:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28623, file=b68d406973c2b694.jpg, upload_status=complete
[09:53:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28617, file=4804eb8220be9527.jpg, upload_status=complete
[09:53:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28518, file=3d48ecdbf17858a0.jpg, upload_status=complete
[09:53:40] [UPLOAD_RECOVERY] 📋 Recent media: msgId=28504, file=df692a622eff9fa3.jpg, upload_status=complete
[09:53:40] [UPLOAD_RECOVERY] Verifying 12 media files exist on server...
[09:53:40] [PENDING_UPLOAD] Total pending upload messages: 0
[09:53:40] [UNSENT_RETRY] No unsent messages found
[09:53:40] new_session POST ok: token len=157
[09:53:40] HELLO → sent (fetched token, role=query)
[09:53:40] [WS] 💓 Started ping heartbeat (20s) — isQueryOnly=true, connectionStr=iosILUIWU
[09:53:40] [CAM_CONN] ✅ hello_ok — conn=iosILUIWU role=query serverSid=iosILUIWU query=true agentOnlineFlag=false
[09:53:40] [SIG] hello_ok received for query connection - ready to query agents
[09:53:40] [CAM_CONN] 🔎 onQueryHelloOk — sending get_agents for base=ILUIWU and iOS=iosILUIWU via conn=iosILUIWU
[09:53:40] [SIG] get_agents request sent for sessionId=ILUIWU
[09:53:40] [SIG] get_agents request sent for sessionId=iosILUIWU
[09:53:40] [SERVER] Stopped reconnect polling
[09:53:40] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[09:53:40] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=2 accumulated=0 tab=0
[09:53:40] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=1
[09:53:40] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[09:53:40] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=1 accumulated=0 tab=0
[09:53:40] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=0
[09:53:40] [CAM_CONN] 🧮 handleAgentsList processing 0 accumulated agents
[09:53:40] [SERVER] Starting reconnect polling (5s interval)
[09:53:40] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=68
[09:53:40] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28825, 28824, 28823, 28822, 28821]
[09:53:40] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[09:53:40] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816]
[09:53:40] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[09:53:40] [SCROLL] wasNearBottom=true, threshold=758, offset=3759, contentH=4517, boundsH=758, forceScroll=true
[09:53:40] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[09:53:40] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:53:40] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:53:40] [UPLOAD_RECOVERY] ✅ All media files verified on server
[09:53:40] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[09:53:40] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3759, currentOffset=3759
[09:53:40] [SCROLL] Scrolling to 3759, animated=false
[09:53:42] [PUSH] Silent push received
[09:53:42] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:53:42 +0000, appState=0, message_id=nil, type=nil
[09:53:42] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[09:53:42] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:53:42 +0000
[09:53:42] [PUSH_EMBED] No embedded message_data in notification
[09:53:42] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[09:53:42] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[09:53:42] [PUSH] No embedded data, pre-loading messages from server
[09:53:42] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:53:42] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[09:53:42] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:53:42] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:53:42] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:53:42] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:53:42] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:53:42] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816]
[09:53:42] [PUSH_TRACE] 🔀 mergeMessages: Different session (nil vs ILUIWU), replacing cache
[09:53:42] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[09:53:42] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[09:53:42] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816]
[09:53:42] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[09:53:42] [GAP_FIX] maxMessageIdAtBackground=0, currentMaxLocalId=28825
[09:53:42] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28825, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}]
[09:53:42] [PUSH] Parsed message_id: 28825
[09:53:42] [PUSH] Parsed operation_type: 3
[09:53:42] [PUSH] Taking direct action: opType=3, messageId=28825
[09:53:42] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28825
[09:53:43] [LIFECYCLE] App resigning active - cleared crash flag
[09:53:43] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[09:53:43] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[09:53:43] [SECURITY] Saved background timestamp
[09:53:43] [LIFECYCLE] App entering background - cleared crash flag
[09:53:43] [CLIENT_SIG] Disconnecting
[09:53:43] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[09:53:43] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[09:53:43] [PUSH_TRACE] 💤 BACKGROUND: memory has 50 messages, first 10 IDs=[28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816]
[09:53:43] [LIFECYCLE] Background snapshot: count=50, maxId=28825
[09:53:43] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[09:53:43] [WS] Canceling WebSocket for query connection to iosILUIWU
[09:53:43] In cleanupPeer
[09:53:43] In cleanupPeer
[09:53:43] [LIFECYCLE] WebRTC audio disabled
[09:53:43] [LIFECYCLE] AVAudioSession deactivated
[09:53:43] [LIFECYCLE] All connections stopped
[09:53:44] [CLIENT_SIG] WebSocket closed with code 1001
[09:53:44] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[09:53:44] [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/}
[09:53:44] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[09:53:44] [SERVER] Stopped reconnect polling
[09:53:44] Will request stop of video 0
[09:53:44] Will request stop of video 0
[09:53:44] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[09:53:44] [WS] Query connection error - cleaning up all agent connections and views
[09:53:44] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:53:44] [WS] Query connection failed - cleaning up all agent connections and views
[09:53:44] [PIP] Removing 0 tracks from PiP for connection 0
[09:53:44] [PIP] ✅ All tracks removed for connection 0
[09:53:44] [PIP] Removing 0 tracks from PiP for connection 0
[09:53:44] [PIP] ✅ All tracks removed for connection 0
[09:53:44] [CLEANUP] ========================================
[09:53:44] [CLEANUP] Cleaning up all agent connections and views
[09:53:44] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:53:44] [CLEANUP] Stopped and removed 0 video connections
[09:53:44] [CLEANUP] Removed 0 video views
[09:53:44] [CLEANUP] Removed 0 feed scroll views
[09:53:44] [CLEANUP] Removed 0 status labels
[09:53:44] [CLEANUP] Reset agent query state
[09:53:44] [CLEANUP] Updated page indicator
[09:53:44] [CLEANUP] Rebuilt video layout
[09:53:44] [CLEANUP] ✅ All agent connections and views cleaned up
[09:53:44] [CLEANUP] ========================================
[09:53:44] [SERVER] Skipping reconnect polling - app is in background
[09:53:44] [WS] URLSession invalidated successfully
[09:53:44] [CLEANUP] ========================================
[09:53:44] [CLEANUP] Cleaning up all agent connections and views
[09:53:44] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:53:44] [CLEANUP] Stopped and removed 0 video connections
[09:53:44] [CLEANUP] Removed 0 video views
[09:53:44] [CLEANUP] Removed 0 feed scroll views
[09:53:44] [CLEANUP] Removed 0 status labels
[09:53:44] [CLEANUP] Reset agent query state
[09:53:44] [CLEANUP] Updated page indicator
[09:53:44] [CLEANUP] Rebuilt video layout
[09:53:44] [CLEANUP] ✅ All agent connections and views cleaned up
[09:53:44] [CLEANUP] ========================================
[09:53:44] [SERVER] Skipping reconnect polling - app is in background
[09:54:04] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:54:04] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:54:04] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:54:04] [PUSH] Silent push received
[09:54:04] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:54:04 +0000, appState=2, message_id=28826, type=nil
[09:54:04] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816]
[09:54:04] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:54:04 +0000
[09:54:04] [PUSH_TRACE] ⬇️ Processing embedded message_id=28826
[09:54:04] [PUSH_EMBED] 📩 Received embedded message: id=28826, type=0, sender=Esra
[09:54:04] [PUSH_TRACE] ⬇️ Message details: text="Baby, Im getting notifications even I muted in app...", datesent=2026-04-23 07:54:03
[09:54:04] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[09:54:04] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28826
[09:54:04] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28826
[09:54:04] [PUSH_EMBED] ✅ Saved message 28826 to local DB (sync)
[09:54:04] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28826
[09:54:04] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28826
[09:54:04] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28826
[09:54:04] [PUSH_TRACE] 📦 Cache state: valid=true, count=50, IDs=[28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816]
[09:54:04] [PUSH_EMBED] Inserted message 28826 into existing cache (now 51 messages)
[09:54:04] [PUSH_TRACE] 📦 ✅ Inserted message 28826, cache now has IDs: [28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:04] [PUSH_TRACE] 📦 EXITING cache update queue for message 28826
[09:54:04] [PUSH_EMBED] Fetching evolution data for message 28826 in background
[09:54:04] [PUSH_EMBED] ✅ Fully processed message 28826
[09:54:04] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28826
[09:54:04] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817], handled=true
[09:54:04] [PUSH] Embedded message handled instantly from silent push
[09:54:04] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[09:54:04] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28826
[09:54:04] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[09:54:04] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 50 msgs, IDs=[28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816]
[09:54:04] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[09:54:04] [GAP_FIX] maxMessageIdAtBackground=28825, currentMaxLocalId=28826
[09:54:04] [PUSH] handlePollEventsNotification userInfo: [:]
[09:54:04] [PUSH] No message_id in userInfo
[09:54:04] [PUSH] No operation_type in userInfo
[09:54:04] [FAST_REFRESH] Evolution disabled - performing incremental sync
[09:54:04] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=51, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:04] [PUSH_TRACE] 📬 POLL: memory state: count=50, first 10 IDs=[28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817, 28816]
[09:54:04] [FAST_REFRESH] Already have 50 messages in memory
[09:54:04] [FAST_REFRESH] maxMemoryId=28825, maxLocalId=28826
[09:54:04] [FAST_REFRESH] 🌙 Found 1 overnight messages in local DB (IDs > 28825)
[09:54:04] [FAST_REFRESH] 🌙 Merged 1 overnight messages into memory (now 51 total)
[09:54:04] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[09:54:04] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:54:04] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[09:54:04] [READBY_OPT] Fetching readBy for 2 unsettled messages (targeted)
[09:54:04] [GAP_FIX] Incremental sync will use since_id=28825 (background max=28825, current DB max=28826)
[09:54:04] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[09:54:04] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28825, maxMemoryId=28826
[09:54:04] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28825
[09:54:04] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[09:54:04] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[09:54:04] [PUSH_TRACE] 👁️ Received message id=28826, text="Baby, Im getting notifications..."
[09:54:04] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[09:54:04] [PUSH_UI] Message 28826 already in memory - skipping insert
[09:54:04] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[09:54:04] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:04] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[09:54:04] [GAP_FIX] maxMessageIdAtBackground=28825, currentMaxLocalId=28826
[09:54:04] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 07:54:03";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Baby, Im getting notifications even I muted in app. Same for you?";
    "message_id" = 28826;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28825;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("sender_name"): Esra, AnyHashable("datesent"): 2026-04-23 07:54:03, AnyHashable("message_id"): 28826, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("thumb_file_name"): , AnyHashable("timer"): 0, AnyHashable("message"): Baby, Im getting notifications even I muted in app. Same for you?, AnyHashable("session_id"): ILUIWU, AnyHashable("message_type"): 0, AnyHashable("file_name"): , AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}]
[09:54:04] [PUSH_EMBED_VC] Message 28826 already in memory - skipping
[09:54:04] [PUSH] ⚡ Embedded message handled directly in ViewController
[09:54:04] [PUSH] Parsed message_id: 28826
[09:54:04] [PUSH] Parsed operation_type: 0
[09:54:04] [PUSH] Taking direct action: opType=0, messageId=28826
[09:54:04] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28826
[09:54:04] [PUSH] ⚡ Message 28826 already in memory - skipping duplicate notification entirely
[09:54:04] [GAP_FIX] Post-action sync: using background max 28825 to catch coalesced messages
[09:54:04] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[09:54:04] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:54:04] [CLIENT_SIG] WebSocket opened
[09:54:04] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[09:54:04] HELLO → sent (cached token, role=query)
[09:54:04] [PUSH_EMBED] Got evolution data for message 28826, saving to local DB
[09:54:04] [CLIENT_SIG] Connected! clientId=Bu7Joj0G5UYnSfWD
[09:54:04] [WS] 💓 Started ping heartbeat (20s) — isQueryOnly=true, connectionStr=iosILUIWU
[09:54:04] [CAM_CONN] ✅ hello_ok — conn=iosILUIWU role=query serverSid=iosILUIWU query=true agentOnlineFlag=false
[09:54:04] [SIG] hello_ok received for query connection - ready to query agents
[09:54:04] [CAM_CONN] 🔎 onQueryHelloOk — sending get_agents for base=ILUIWU and iOS=iosILUIWU via conn=iosILUIWU
[09:54:04] [SIG] get_agents request sent for sessionId=ILUIWU
[09:54:04] [SIG] get_agents request sent for sessionId=iosILUIWU
[09:54:04] [SERVER] Stopped reconnect polling
[09:54:04] [PUSH_EMBED] Saved evolution data for message 28826
[09:54:04] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[09:54:04] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=2 accumulated=0 tab=0
[09:54:04] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[09:54:04] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[09:54:04] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:54:04] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=1
[09:54:04] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[09:54:04] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=1 accumulated=0 tab=0
[09:54:04] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=0
[09:54:04] [CAM_CONN] 🧮 handleAgentsList processing 0 accumulated agents
[09:54:04] [SERVER] Skipping reconnect polling - app is in background
[09:54:04] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=60
[09:54:04] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28826, 28825, 28824, 28823, 28822]
[09:54:04] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[09:54:04] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:04] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[09:54:04] [SCROLL] wasNearBottom=true, threshold=758, offset=3759, contentH=4517, boundsH=758, forceScroll=false
[09:54:04] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[09:54:04] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[09:54:04] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28826]
[09:54:04] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:54:04] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:54:04] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28825 → 28826
[09:54:04] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=62
[09:54:04] [COMBINED_FETCH] Loaded 2 read receipts, 0 messages with reactions
[09:54:04] [FAST_REFRESH] Enriched 2/2 unsettled messages with readBy data
[09:54:04] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:04] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:04] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[09:54:04] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:54:04] [INCREMENTAL_SYNC] 🔁 Processing queued retry refresh
[09:54:04] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[09:54:04] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28826, maxMemoryId=28826
[09:54:04] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28826
[09:54:04] [SCROLL] Async handler: shouldScroll=false (force=false, newMsgs=false, nearBottom=true), maxY=3832, currentOffset=3759
[09:54:04] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:54:04] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:54:04] [FAST_REFRESH] Incremental sync complete - 51 messages
[09:54:05] [INCREMENTAL_SYNC] ✅ No new messages
[09:54:05] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=62
[09:54:05] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28826, 28825, 28824, 28823, 28822]
[09:54:05] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[09:54:05] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:05] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[09:54:05] [SCROLL] wasNearBottom=true, threshold=758, offset=3759, contentH=4590, boundsH=758, forceScroll=false
[09:54:05] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[09:54:05] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[09:54:05] [PUSH] Silent push received
[09:54:05] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:54:05 +0000, appState=2, message_id=nil, type=nil
[09:54:05] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=51, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:05] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:54:05 +0000
[09:54:05] [PUSH_EMBED] No embedded message_data in notification
[09:54:05] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[09:54:05] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817], handled=false
[09:54:05] [PUSH] No embedded data, pre-loading messages from server
[09:54:05] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:54:06] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[09:54:06] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:54:06] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:54:06] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:54:06] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:54:06] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:54:06] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:06] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=51, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:06] [PRELOAD_CACHE] Preserving 1 push-inserted messages: [28735]
[09:54:06] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=1, IDs=[28735]
[09:54:06] [PUSH_TRACE] 🔀 mergeMessages: merged.count=51, first 10 IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:06] [PUSH_PRELOAD] ⚡ Pre-cached 51 messages for instant display (preserved 1 from push)
[09:54:06] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[09:54:06] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:06] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[09:54:06] [GAP_FIX] maxMessageIdAtBackground=28825, currentMaxLocalId=28826
[09:54:06] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28826, AnyHashable("operation_type"): 3, AnyHashable("aps"): {
    "content-available" = 1;
}]
[09:54:06] [PUSH] Parsed message_id: 28826
[09:54:06] [PUSH] Parsed operation_type: 3
[09:54:06] [PUSH] Taking direct action: opType=3, messageId=28826
[09:54:06] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28826
[09:54:06] [GAP_FIX] Post-action sync: using background max 28825 to catch coalesced messages
[09:54:06] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[09:54:06] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28825, maxMemoryId=28826
[09:54:06] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28825
[09:54:06] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[09:54:06] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28826]
[09:54:06] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:06] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:06] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[09:54:06] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:54:06] [CLIENT_SIG] Event received: type=3 messageId=28826
[09:54:06] [WS_EVENT] Received event: type=3, messageId=28826
[09:54:06] [WS_EVENT] Read receipt for message 28826 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:54:06] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[09:54:06] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28826, 28825, 28824, 28823, 28822]
[09:54:06] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[09:54:06] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:06] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[09:54:06] [SCROLL] wasNearBottom=true, threshold=758, offset=3759, contentH=4590, boundsH=758, forceScroll=false
[09:54:06] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[09:54:06] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:54:06] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:54:06] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=62
[09:54:06] [SCROLL] Async handler: shouldScroll=false (force=false, newMsgs=false, nearBottom=true), maxY=3832, currentOffset=3759
[09:54:06] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[09:54:06] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[09:54:07] [PUSH] Notification tapped - session_id: ILUIWU
[09:54:07] [PUSH] Max message_id before tap: 28826
[09:54:07] [PUSH] Stored pending session: ILUIWU
[09:54:07] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:54:07 +0000
[09:54:07] [PUSH_TRACE] ⬇️ Processing embedded message_id=28826
[09:54:07] [PUSH_EMBED] 📩 Received embedded message: id=28826, type=0, sender=Esra
[09:54:07] [PUSH_TRACE] ⬇️ Message details: text="Baby, Im getting notifications even I muted in app...", datesent=2026-04-23 07:54:03
[09:54:07] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[09:54:07] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28826
[09:54:07] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28826
[09:54:07] [PUSH_EMBED] ✅ Saved message 28826 to local DB (sync)
[09:54:07] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28826
[09:54:07] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28826
[09:54:07] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28826
[09:54:07] [PUSH_TRACE] 📦 Cache state: valid=true, count=51, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:07] [PUSH_TRACE] 📦 ⚠️ Message 28826 already in cache, skipping insert
[09:54:07] [PUSH_TRACE] 📦 EXITING cache update queue for message 28826
[09:54:07] [PUSH_EMBED] Fetching evolution data for message 28826 in background
[09:54:07] [PUSH_EMBED] ✅ Fully processed message 28826
[09:54:07] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28826
[09:54:07] [PUSH] Embedded message handled instantly on tap
[09:54:07] [SECURITY] Timeout check: elapsed=23.997786045074463s, timeout=300.0s
[09:54:07] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[09:54:07] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[09:54:07] [LIFECYCLE] App entering foreground - restoring connections
[09:54:07] [CAPTURE] Live-feed protection [app-will-enter-foreground] - fullscreen=false, isCaptured=false, secureReady=true
[09:54:07] [CAPTURE] Refresh overlay [app-will-enter-foreground] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[09:54:07] [PUSH_TRACE] 🔄 FOREGROUND: memory has 51 msgs, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:07] [PUSH_TRACE] 🔄 FOREGROUND: cache has 51 msgs, valid=true, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:07] [UPLOAD_RETRY] No pending uploads to retry
[09:54:07] [PUSH] Fetching server messages since_id=28826 to catch coalesced notifications on tap
[09:54:07] [PUSH_PRELOAD] Fetching up to 50 messages since_id=28826 to catch coalesced notifications
[09:54:07] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:54:07] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:54:07] [READBY_OPT] Fetching readBy for 2 unsettled messages (targeted)
[09:54:07] [LIFECYCLE] WebRTC audio re-enabled
[09:54:07] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[09:54:07] [CLIENT_SIG] Skipping connect - app in background (state=2)
[09:54:07] [VIEWER] Reconnecting after background - querying agents
[09:54:07] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=running
[09:54:07] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[09:54:07] [UNSENT_RETRY] Checking for unsent messages...
[09:54:07] [PENDING_UPLOAD] Total pending upload messages: 0
[09:54:07] [UNSENT_RETRY] No unsent messages found
[09:54:07] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[09:54:07] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[09:54:07] [PUSH_TRACE] 👁️ Received message id=28826, text="Baby, Im getting notifications..."
[09:54:07] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[09:54:07] [PUSH_UI] Message 28826 already in memory - skipping insert
[09:54:07] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[09:54:07] [PUSH_EMBED] Got evolution data for message 28826, saving to local DB
[09:54:07] [PUSH_EMBED] Saved evolution data for message 28826
[09:54:07] [COMBINED_FETCH] Loaded 2 read receipts, 0 messages with reactions
[09:54:07] [FOREGROUND] Enriched 0/2 unsettled messages with readBy data
[09:54:07] [LIFECYCLE] scrollToBottomIfNeeded time=false, count=51>50=true, maxId=28826>28825=true, shouldScroll=true
[09:54:07] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:54:07] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:54:08] [PUSH_PRELOAD] No messages or parse error
[09:54:08] [PUSH] Server fetch on tap completed (success=false)
[09:54:08] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:08] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[09:54:08] [GAP_FIX] maxMessageIdAtBackground=28825, currentMaxLocalId=28826
[09:54:08] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("timer"): 0, AnyHashable("thumb_file_name"): , AnyHashable("session_id"): ILUIWU, AnyHashable("message"): Baby, Im getting notifications even I muted in app. Same for you?, AnyHashable("operation_type"): 0, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("message_id"): 28826, AnyHashable("datesent"): 2026-04-23 07:54:03, AnyHashable("message_type"): 0, AnyHashable("sender_name"): Esra, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 07:54:03";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Baby, Im getting notifications even I muted in app. Same for you?";
    "message_id" = 28826;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28825;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): ]
[09:54:08] [PUSH_EMBED_VC] Message 28826 already in memory - skipping
[09:54:08] [PUSH] ⚡ Embedded message handled directly in ViewController
[09:54:08] [PUSH] Parsed message_id: 28826
[09:54:08] [PUSH] Parsed operation_type: 0
[09:54:08] [PUSH] Taking direct action: opType=0, messageId=28826
[09:54:08] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28826
[09:54:08] [PUSH] ⚡ Message 28826 already in memory - skipping duplicate notification entirely
[09:54:08] [GAP_FIX] Post-action sync: using background max 28825 to catch coalesced messages
[09:54:08] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[09:54:08] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28825, maxMemoryId=28826
[09:54:08] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28825
[09:54:08] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[09:54:08] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28826]
[09:54:08] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:08] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:08] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[09:54:08] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:54:08] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:54:08] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=62
[09:54:08] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28826, 28825, 28824, 28823, 28822]
[09:54:08] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[09:54:08] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:08] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[09:54:08] [SCROLL] wasNearBottom=true, threshold=758, offset=3759, contentH=4590, boundsH=758, forceScroll=true
[09:54:08] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[09:54:08] [SCROLL] 💓 alive, visible=45...52, rows=53, estHeight=0.0, heightCalls=0
[09:54:08] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:54:08] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:54:08] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[09:54:08] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3832, currentOffset=3832
[09:54:08] [SCROLL] Scrolling to 3832, animated=false
[09:54:08] [SECURITY] sceneDidBecomeActive - isAuthenticated=true, didEnterBackground=true
[09:54:08] [SECURITY] Within timeout - cleared background flag
[09:54:08] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[09:54:08] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:08] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=0 secsSinceLastPong=-1 vccs=0
[09:54:08] [GAP_FIX] maxMessageIdAtBackground=28825, currentMaxLocalId=28826
[09:54:08] [PUSH] handlePollEventsNotification userInfo: [:]
[09:54:08] [PUSH] No message_id in userInfo
[09:54:08] [PUSH] No operation_type in userInfo
[09:54:08] [FAST_REFRESH] Evolution disabled - performing incremental sync
[09:54:08] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=51, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:08] [PUSH_TRACE] 📬 POLL: memory state: count=51, first 10 IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:08] [FAST_REFRESH] Already have 51 messages in memory
[09:54:08] [FAST_REFRESH] maxMemoryId=28826, maxLocalId=28826
[09:54:08] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[09:54:08] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:54:08] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[09:54:08] [READBY_OPT] Fetching readBy for 2 unsettled messages (targeted)
[09:54:08] [GAP_FIX] Incremental sync will use since_id=28825 (background max=28825, current DB max=28826)
[09:54:08] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[09:54:08] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28825, maxMemoryId=28826
[09:54:08] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28825
[09:54:08] [COMBINED_FETCH] Loaded 2 read receipts, 0 messages with reactions
[09:54:08] [FAST_REFRESH] Enriched 2/2 unsettled messages with readBy data
[09:54:08] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:54:08] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:54:08] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[09:54:08] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28826]
[09:54:08] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:08] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:08] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[09:54:08] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[09:54:08] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[09:54:08] [FAST_REFRESH] Incremental sync complete - 51 messages
[09:54:09] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=61
[09:54:09] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28826, 28825, 28824, 28823, 28822]
[09:54:09] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[09:54:09] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:09] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[09:54:09] [SCROLL] wasNearBottom=true, threshold=758, offset=3832, contentH=4590, boundsH=758, forceScroll=true
[09:54:09] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[09:54:09] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:54:09] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:54:09] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[09:54:09] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3832, currentOffset=3832
[09:54:09] [SCROLL] Scrolling to 3832, animated=false
[09:54:11] [SCROLL] 💓 alive, visible=45...52, rows=53, estHeight=0.0, heightCalls=61
[09:54:24] [CAM_CONN] 💓 PING #1 sent — conn=iosILUIWU query=true secsSinceLastPong=-1
[09:54:24] [CAM_CONN] 💓 PONG #1 received — conn=iosILUIWU query=true rtt=44ms
[09:54:26] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[09:54:26] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=51, isReloading=false
[09:54:26] [SEND_MESSAGE] ✅ Added optimistic message id=-1 to arrays, newMsgCount=52
[09:54:26] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[09:54:26] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[-1, 28826, 28825, 28824, 28823]
[09:54:26] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[09:54:26] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-1, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[09:54:26] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[09:54:26] [SCROLL] wasNearBottom=true, threshold=429, offset=4143, contentH=4590, boundsH=429, forceScroll=false
[09:54:26] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[09:54:26] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[09:54:26] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[09:54:27] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[09:54:27] [SCROLL] 💓 alive, visible=47...53, rows=54, estHeight=0.0, heightCalls=114
[09:54:27] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[09:54:27] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[09:54:27] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4241, currentOffset=4241
[09:54:27] [SCROLL] Scrolling to 4241, animated=true
[09:54:27] [CLIENT_SIG] Event received: type=0 messageId=28827
[09:54:27] [WS_EVENT] Received event: type=0, messageId=28827
[09:54:27] [WS_EVENT] 📨 New message notification (msgId=28827) - triggering incremental refresh, currentMsgCount=52
[09:54:27] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[09:54:27] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28826, maxMemoryId=28826
[09:54:27] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28826
[09:54:27] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28827,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 07:54:27"}
[09:54:27] [CHAT] receive_message.php JSON: ["message_id": 28827, "message_type": 0, "ok": 1, "session_id": ILUIWU, "datesent_utc": 2026-04-23 07:54:27, "file_name": ]
[09:54:27] [DB_UPGRADE] Upgrading message ID: -1 → 28827, preserveOriginalDate=false
[09:54:27] [DB_UPGRADE] ✅ Upgraded -1 → 28827 with send_status=0, 1 row(s) affected
[09:54:27] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -1 → 28827
[09:54:27] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -1 → 28827
[09:54:27] ReloadData 9
[09:54:27] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[09:54:27] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28827]
[09:54:27] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 52 msgs, first 10 IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[09:54:27] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 52, first 10 IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[09:54:27] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[09:54:27] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[09:54:27] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=52
[09:54:27] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=61
[09:54:27] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28827, 28826, 28825, 28824, 28823]
[09:54:27] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[09:54:27] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[09:54:27] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[09:54:27] [SCROLL] wasNearBottom=true, threshold=447, offset=4241, contentH=4688, boundsH=447, forceScroll=true
[09:54:27] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[09:54:27] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[09:54:27] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4241, currentOffset=4241
[09:54:27] [SCROLL] Scrolling to 4241, animated=false
[09:54:27] [LIFECYCLE] App resigning active - cleared crash flag
[09:54:28] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[09:54:28] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[09:54:28] [SECURITY] Saved background timestamp
[09:54:28] [LIFECYCLE] App entering background - cleared crash flag
[09:54:28] [CLIENT_SIG] Disconnecting
[09:54:28] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[09:54:28] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[09:54:28] [PUSH_TRACE] 💤 BACKGROUND: memory has 52 messages, first 10 IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[09:54:28] [LIFECYCLE] Background snapshot: count=52, maxId=28827
[09:54:28] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=0
[09:54:28] [WS] Canceling WebSocket for query connection to iosILUIWU
[09:54:28] In cleanupPeer
[09:54:28] In cleanupPeer
[09:54:28] [LIFECYCLE] WebRTC audio disabled
[09:54:28] [LIFECYCLE] AVAudioSession deactivated
[09:54:28] [LIFECYCLE] All connections stopped
[09:54:28] [CLIENT_SIG] WebSocket closed with code 1001
[09:54:28] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[09:54:28] [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/}
[09:54:28] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[09:54:28] [SERVER] Stopped reconnect polling
[09:54:28] Will request stop of video 0
[09:54:28] Will request stop of video 0
[09:54:28] [WS] WebSocket task completed with error - isQueryOnly=true: cancelled
[09:54:28] [WS] Query connection error - cleaning up all agent connections and views
[09:54:28] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[09:54:28] [WS] Query connection failed - cleaning up all agent connections and views
[09:54:28] [PIP] Removing 0 tracks from PiP for connection 0
[09:54:28] [PIP] ✅ All tracks removed for connection 0
[09:54:28] [PIP] Removing 0 tracks from PiP for connection 0
[09:54:28] [PIP] ✅ All tracks removed for connection 0
[09:54:28] [CLEANUP] ========================================
[09:54:28] [CLEANUP] Cleaning up all agent connections and views
[09:54:28] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:54:28] [CLEANUP] Stopped and removed 0 video connections
[09:54:28] [CLEANUP] Removed 0 video views
[09:54:28] [CLEANUP] Removed 0 feed scroll views
[09:54:28] [CLEANUP] Removed 0 status labels
[09:54:28] [CLEANUP] Reset agent query state
[09:54:28] [CLEANUP] Updated page indicator
[09:54:28] [CLEANUP] Rebuilt video layout
[09:54:28] [CLEANUP] ✅ All agent connections and views cleaned up
[09:54:28] [CLEANUP] ========================================
[09:54:28] [WS] URLSession invalidated successfully
[09:54:28] [CLEANUP] ========================================
[09:54:28] [CLEANUP] Cleaning up all agent connections and views
[09:54:28] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[09:54:28] [CLEANUP] Stopped and removed 0 video connections
[09:54:28] [CLEANUP] Removed 0 video views
[09:54:28] [CLEANUP] Removed 0 feed scroll views
[09:54:28] [CLEANUP] Removed 0 status labels
[09:54:28] [CLEANUP] Reset agent query state
[09:54:28] [CLEANUP] Updated page indicator
[09:54:28] [CLEANUP] Rebuilt video layout
[09:54:28] [CLEANUP] ✅ All agent connections and views cleaned up
[09:54:28] [CLEANUP] ========================================
[09:54:28] [SERVER] Skipping reconnect polling - app is in background
[09:54:34] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[09:54:34] [WS] Opening session at ws://crivello.dyndns.org:8081/
[09:54:34] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:54:34] [PUSH] Silent push received
[09:54:34] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:54:34 +0000, appState=2, message_id=nil, type=nil
[09:54:34] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=51, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:34] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:54:34 +0000
[09:54:34] [PUSH_EMBED] No embedded message_data in notification
[09:54:34] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[09:54:34] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817], handled=false
[09:54:34] [PUSH] No embedded data, pre-loading messages from server
[09:54:34] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:54:34] [PUSH] Silent push received
[09:54:34] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:54:34 +0000, appState=2, message_id=nil, type=nil
[09:54:34] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=51, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:34] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:54:34 +0000
[09:54:34] [PUSH_EMBED] No embedded message_data in notification
[09:54:34] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[09:54:34] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817], handled=false
[09:54:34] [PUSH] No embedded data, pre-loading messages from server
[09:54:34] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:54:34] [PUSH] Silent push received
[09:54:34] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 07:54:34 +0000, appState=2, message_id=nil, type=nil
[09:54:34] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=51, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:34] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 07:54:34 +0000
[09:54:34] [PUSH_EMBED] No embedded message_data in notification
[09:54:34] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[09:54:34] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817], handled=false
[09:54:34] [PUSH] No embedded data, pre-loading messages from server
[09:54:34] [PUSH_PRELOAD] Fetching messages for instant display cache
[09:54:34] [CLIENT_SIG] WebSocket opened
[09:54:34] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[09:54:34] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[09:54:34] HELLO → sent (cached token, role=query)
[09:54:34] [CLIENT_SIG] Connected! clientId=AQE6x-O2H7B-Xc5z
[09:54:34] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[09:54:34] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[09:54:34] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[09:54:34] [WS] 💓 Started ping heartbeat (20s) — isQueryOnly=true, connectionStr=iosILUIWU
[09:54:34] [CAM_CONN] ✅ hello_ok — conn=iosILUIWU role=query serverSid=iosILUIWU query=true agentOnlineFlag=false
[09:54:34] [SIG] hello_ok received for query connection - ready to query agents
[09:54:34] [CAM_CONN] 🔎 onQueryHelloOk — sending get_agents for base=ILUIWU and iOS=iosILUIWU via conn=iosILUIWU
[09:54:34] [SIG] get_agents request sent for sessionId=ILUIWU
[09:54:34] [SIG] get_agents request sent for sessionId=iosILUIWU
[09:54:34] [SERVER] Stopped reconnect polling
[09:54:34] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[09:54:34] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=2 accumulated=0 tab=0
[09:54:34] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=1
[09:54:34] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[09:54:34] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=1 accumulated=0 tab=0
[09:54:34] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=0
[09:54:34] [CAM_CONN] 🧮 handleAgentsList processing 0 accumulated agents
[09:54:34] [SERVER] Skipping reconnect polling - app is in background
[09:54:34] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[09:54:34] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:54:34] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:54:34] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:54:34] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:54:34] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:54:34] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[09:54:34] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=51, IDs=[28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818, 28817]
[09:54:34] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [28736, 28735]
[09:54:34] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=2, IDs=[28736, 28735]
[09:54:34] [PUSH_TRACE] 🔀 mergeMessages: merged.count=52, first 10 IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[09:54:34] [PUSH_PRELOAD] ⚡ Pre-cached 52 messages for instant display (preserved 2 from push)
[09:54:34] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[09:54:34] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 52 msgs, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[09:54:34] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=10 vccs=0
[09:54:34] [GAP_FIX] maxMessageIdAtBackground=28827, currentMaxLocalId=28827
[09:54:34] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28822]
[09:54:34] [PUSH] Parsed message_id: 28822
[09:54:34] [PUSH] Parsed operation_type: 3
[09:54:34] [PUSH] Taking direct action: opType=3, messageId=28822
[09:54:34] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28822
[09:54:34] [GAP_FIX] Post-action sync: using background max 28827 to catch coalesced messages
[09:54:34] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[09:54:34] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28827, maxMemoryId=28827
[09:54:34] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28827
[09:54:34] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[09:54:34] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:54:34] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:54:34] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:54:35] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:54:35] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:54:35] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[09:54:35] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=52, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[09:54:35] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [28736, 28735]
[09:54:35] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=2, IDs=[28736, 28735]
[09:54:35] [PUSH_TRACE] 🔀 mergeMessages: merged.count=52, first 10 IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[09:54:35] [PUSH_PRELOAD] ⚡ Pre-cached 52 messages for instant display (preserved 2 from push)
[09:54:35] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[09:54:35] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[09:54:35] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[09:54:35] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[09:54:35] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[09:54:35] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[09:54:35] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[09:54:35] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[09:54:35] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=52, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[09:54:35] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [28736, 28735]
[09:54:35] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=2, IDs=[28736, 28735]
[09:54:35] [PUSH_TRACE] 🔀 mergeMessages: merged.count=52, first 10 IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[09:54:35] [PUSH_PRELOAD] ⚡ Pre-cached 52 messages for instant display (preserved 2 from push)
[09:54:35] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[09:54:35] [INCREMENTAL_SYNC] ✅ No new messages
[09:54:35] [CLIENT_SIG] Event received: type=3 messageId=28822
[09:54:35] [WS_EVENT] Received event: type=3, messageId=28822
[09:54:35] [WS_EVENT] Read receipt for message 28822 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[09:54:35] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 52 msgs, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[09:54:35] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=10 vccs=0
[09:54:35] [GAP_FIX] maxMessageIdAtBackground=28827, currentMaxLocalId=28827
[09:54:35] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28827, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3]
[09:54:35] [PUSH] Parsed message_id: 28827
[09:54:35] [PUSH] Parsed operation_type: 3
[09:54:35] [PUSH] Taking direct action: opType=3, messageId=28827
[09:54:35] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28827
[09:54:35] [GAP_FIX] Post-action sync: using background max 28827 to catch coalesced messages
[09:54:35] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[09:54:35] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 52 msgs, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[09:54:35] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=1 secsSinceLastPong=10 vccs=0
[09:54:35] [GAP_FIX] maxMessageIdAtBackground=28827, currentMaxLocalId=28827
[09:54:35] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28823]
[09:54:35] [PUSH] Parsed message_id: 28823
[09:54:35] [PUSH] Parsed operation_type: 3
[09:54:35] [PUSH] Taking direct action: opType=3, messageId=28823
[09:54:35] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28823
[09:54:35] [GAP_FIX] Post-action sync: using background max 28827 to catch coalesced messages
[09:54:35] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[09:54:35] [INCREMENTAL_SYNC] 🔁 Processing queued retry refresh
[09:54:35] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[09:54:35] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28827, maxMemoryId=28827
[09:54:35] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28827
[09:54:35] [CLIENT_SIG] Event received: type=3 messageId=28823
[09:54:35] [WS_EVENT] Received event: type=3, messageId=28823
[09:54:35] [WS_EVENT] Read receipt for message 28823 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[09:54:35] [INCREMENTAL_SYNC] ✅ No new messages
[09:54:35] [CLIENT_SIG] Event received: type=3 messageId=28827
[09:54:35] [WS_EVENT] Received event: type=3, messageId=28827
[09:54:35] [WS_EVENT] Read receipt for message 28827 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:02:35] [NETWORK] Status changed: connected
[10:02:35] [CAM_CONN] 💓 skip ping — ws not running (state=completed) conn=iosILUIWU query=true
[10:02:35] [BACKGROUND] Background fetch triggered
[10:02:35] [BACKGROUND] Fetching recent messages for pre-cache
[10:02:35] [WS] Connection failed: The operation couldn’t be completed. Software caused connection abort
[10:02:35] [WS] Query connection failed - cleaning up all agent connections and views
[10:02:35] [WS] WebSocket task completed with error - isQueryOnly=true: The operation couldn’t be completed. Software caused connection abort
[10:02:35] [WS] Query connection error - cleaning up all agent connections and views
[10:02:35] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort}
[10:02:35] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[10:02:35] [CLIENT_SIG] Task completed with error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <3D4BBBEA-2EF8-4115-BC2B-50234DA21069>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <3D4BBBEA-2EF8-4115-BC2B-50234DA21069>.<1>}
[10:02:35] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[10:02:35] [CLIENT_SIG] Send error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort}
[10:02:35] [CLEANUP] ========================================
[10:02:35] [CLEANUP] Cleaning up all agent connections and views
[10:02:35] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:02:35] [CLEANUP] Stopped and removed 0 video connections
[10:02:35] [CLEANUP] Removed 0 video views
[10:02:35] [CLEANUP] Removed 0 feed scroll views
[10:02:35] [CLEANUP] Removed 0 status labels
[10:02:35] [CLEANUP] Reset agent query state
[10:02:35] [CLEANUP] Updated page indicator
[10:02:35] [CLEANUP] Rebuilt video layout
[10:02:35] [CLEANUP] ✅ All agent connections and views cleaned up
[10:02:35] [CLEANUP] ========================================
[10:02:35] [SERVER] Skipping reconnect polling - app is in background
[10:02:35] [CLEANUP] ========================================
[10:02:35] [CLEANUP] Cleaning up all agent connections and views
[10:02:35] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:02:35] [CLEANUP] Stopped and removed 0 video connections
[10:02:35] [CLEANUP] Removed 0 video views
[10:02:35] [CLEANUP] Removed 0 feed scroll views
[10:02:35] [CLEANUP] Removed 0 status labels
[10:02:35] [CLEANUP] Reset agent query state
[10:02:35] [CLEANUP] Updated page indicator
[10:02:35] [CLEANUP] Rebuilt video layout
[10:02:35] [CLEANUP] ✅ All agent connections and views cleaned up
[10:02:35] [CLEANUP] ========================================
[10:02:35] [SERVER] Skipping reconnect polling - app is in background
[10:02:36] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[10:02:36] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:02:36] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:02:36] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:02:36] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:02:36] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:02:36] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:02:36] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=52, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:02:36] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [28736, 28735]
[10:02:36] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=2, IDs=[28736, 28735]
[10:02:36] [PUSH_TRACE] 🔀 mergeMessages: merged.count=52, first 10 IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:02:36] [BACKGROUND] Pre-cached 52 ChatMessage objects for instant display (preserved 2 from push)
[10:02:36] [BACKGROUND] Pre-downloaded 0 thumbnails
[10:02:36] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[10:02:37] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:02:37] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:02:37] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:02:37] HELLO → sent (cached token, role=query)
[10:02:37] [WS] 💓 Started ping heartbeat (20s) — isQueryOnly=true, connectionStr=iosILUIWU
[10:02:37] [CAM_CONN] ✅ hello_ok — conn=iosILUIWU role=query serverSid=iosILUIWU query=true agentOnlineFlag=false
[10:02:37] [SIG] hello_ok received for query connection - ready to query agents
[10:02:37] [CAM_CONN] 🔎 onQueryHelloOk — sending get_agents for base=ILUIWU and iOS=iosILUIWU via conn=iosILUIWU
[10:02:37] [SIG] get_agents request sent for sessionId=ILUIWU
[10:02:37] [SIG] get_agents request sent for sessionId=iosILUIWU
[10:02:37] [SERVER] Stopped reconnect polling
[10:02:37] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[10:02:37] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=2 accumulated=0 tab=0
[10:02:37] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=1
[10:02:37] [CAM_CONN] 📋 agents_list — count=0 via=iosILUIWU agents=[]
[10:02:37] [CAM_CONN] ▶️ handleAgentsList ENTER count=0 pendingQueries=1 accumulated=0 tab=0
[10:02:37] [CAM_CONN] 📥 handleAgentsList accumulated=0, remaining=0
[10:02:37] [CAM_CONN] 🧮 handleAgentsList processing 0 accumulated agents
[10:02:37] [SERVER] Skipping reconnect polling - app is in background
[10:10:45] [CAM_CONN] 💓 PING #2 sent — conn=iosILUIWU query=true secsSinceLastPong=980
[10:10:45] [CAM_CONN] ⚠️ ZOMBIE SUSPECTED — no pong in 980s, conn=iosILUIWU query=true
[10:10:45] [BACKGROUND] Background fetch triggered
[10:10:45] [BACKGROUND] Fetching recent messages for pre-cache
[10:10:45] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:10:45] [NETWORK] Status changed: connected
[10:10:45] [WS] Connection failed: The operation couldn’t be completed. Software caused connection abort
[10:10:45] [WS] Query connection failed - cleaning up all agent connections and views
[10:10:45] [WS] WebSocket task completed with error - isQueryOnly=true: The operation couldn’t be completed. Software caused connection abort
[10:10:45] [WS] Query connection error - cleaning up all agent connections and views
[10:10:45] [CLEANUP] ========================================
[10:10:45] [CLEANUP] Cleaning up all agent connections and views
[10:10:45] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:10:45] [CLEANUP] Stopped and removed 0 video connections
[10:10:45] [CLEANUP] Removed 0 video views
[10:10:45] [CLEANUP] Removed 0 feed scroll views
[10:10:45] [CLEANUP] Removed 0 status labels
[10:10:45] [CLEANUP] Reset agent query state
[10:10:45] [CLEANUP] Updated page indicator
[10:10:45] [CLEANUP] Rebuilt video layout
[10:10:45] [CLEANUP] ✅ All agent connections and views cleaned up
[10:10:45] [CLEANUP] ========================================
[10:10:45] [SERVER] Skipping reconnect polling - app is in background
[10:10:45] [CLEANUP] ========================================
[10:10:45] [CLEANUP] Cleaning up all agent connections and views
[10:10:45] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:10:45] [CLEANUP] Stopped and removed 0 video connections
[10:10:45] [CLEANUP] Removed 0 video views
[10:10:45] [CLEANUP] Removed 0 feed scroll views
[10:10:45] [CLEANUP] Removed 0 status labels
[10:10:45] [CLEANUP] Reset agent query state
[10:10:45] [CLEANUP] Updated page indicator
[10:10:45] [CLEANUP] Rebuilt video layout
[10:10:45] [CLEANUP] ✅ All agent connections and views cleaned up
[10:10:45] [CLEANUP] ========================================
[10:10:45] [SERVER] Skipping reconnect polling - app is in background
[10:10:45] [CLIENT_SIG] WebSocket opened
[10:10:45] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[10:10:45] [CLIENT_SIG] Connected! clientId=fe2AF1sREwMLoA02
[10:10:45] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[10:10:45] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:10:46] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[10:10:46] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:10:46] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:10:46] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:10:46] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:10:46] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:10:46] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:10:46] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=52, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:10:46] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [28736, 28735]
[10:10:46] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=2, IDs=[28736, 28735]
[10:10:46] [PUSH_TRACE] 🔀 mergeMessages: merged.count=52, first 10 IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:10:46] [BACKGROUND] Pre-cached 52 ChatMessage objects for instant display (preserved 2 from push)
[10:10:46] [BACKGROUND] Pre-downloaded 0 thumbnails
[10:10:46] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[10:10:47] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:10:47] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:10:47] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:10:47] HELLO → sent (cached token, role=query)
[10:10:47] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:10:47] [WS] Query connection failed - cleaning up all agent connections and views
[10:10:47] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:10:47] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:10:47] [CLEANUP] ========================================
[10:10:47] [CLEANUP] Cleaning up all agent connections and views
[10:10:47] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:10:47] [CLEANUP] Stopped and removed 0 video connections
[10:10:47] [CLEANUP] Removed 0 video views
[10:10:47] [CLEANUP] Removed 0 feed scroll views
[10:10:47] [CLEANUP] Removed 0 status labels
[10:10:47] [CLEANUP] Reset agent query state
[10:10:47] [CLEANUP] Updated page indicator
[10:10:47] [CLEANUP] Rebuilt video layout
[10:10:47] [CLEANUP] ✅ All agent connections and views cleaned up
[10:10:47] [CLEANUP] ========================================
[10:10:47] [SERVER] Skipping reconnect polling - app is in background
[10:10:47] [CLEANUP] ========================================
[10:10:47] [CLEANUP] Cleaning up all agent connections and views
[10:10:47] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:10:47] [CLEANUP] Stopped and removed 0 video connections
[10:10:47] [CLEANUP] Removed 0 video views
[10:10:47] [CLEANUP] Removed 0 feed scroll views
[10:10:47] [CLEANUP] Removed 0 status labels
[10:10:47] [CLEANUP] Reset agent query state
[10:10:47] [CLEANUP] Updated page indicator
[10:10:47] [CLEANUP] Rebuilt video layout
[10:10:47] [CLEANUP] ✅ All agent connections and views cleaned up
[10:10:47] [CLEANUP] ========================================
[10:10:47] [SERVER] Skipping reconnect polling - app is in background
[10:19:07] [CAM_CONN] 💓 skip ping — ws not running (state=completed) conn=iosILUIWU query=true
[10:19:07] [BACKGROUND] Background fetch triggered
[10:19:07] [BACKGROUND] Fetching recent messages for pre-cache
[10:19:07] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:19:07] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:19:07] [NETWORK] Status changed: connected
[10:19:07] [CLIENT_SIG] Task completed with error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <523E92D0-E223-4E79-A510-E757C9321E00>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <523E92D0-E223-4E79-A510-E757C9321E00>.<1>, NSLocalizedDescription=The network connection was lost.}
[10:19:07] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[10:19:07] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=89 "Operation canceled" UserInfo={NSDescription=Operation canceled}
[10:19:07] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[10:19:07] [BACKGROUND] Background fetch triggered
[10:19:07] [BACKGROUND] Fetching recent messages for pre-cache
[10:19:07] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:19:07] HELLO → sent (cached token, role=query)
[10:19:08] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:19:08] [WS] Query connection failed - cleaning up all agent connections and views
[10:19:08] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:19:08] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:19:08] [CLEANUP] ========================================
[10:19:08] [CLEANUP] Cleaning up all agent connections and views
[10:19:08] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:19:08] [CLEANUP] Stopped and removed 0 video connections
[10:19:08] [CLEANUP] Removed 0 video views
[10:19:08] [CLEANUP] Removed 0 feed scroll views
[10:19:08] [CLEANUP] Removed 0 status labels
[10:19:08] [CLEANUP] Reset agent query state
[10:19:08] [CLEANUP] Updated page indicator
[10:19:08] [CLEANUP] Rebuilt video layout
[10:19:08] [CLEANUP] ✅ All agent connections and views cleaned up
[10:19:08] [CLEANUP] ========================================
[10:19:08] [SERVER] Skipping reconnect polling - app is in background
[10:19:08] [CLEANUP] ========================================
[10:19:08] [CLEANUP] Cleaning up all agent connections and views
[10:19:08] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:19:08] [CLEANUP] Stopped and removed 0 video connections
[10:19:08] [CLEANUP] Removed 0 video views
[10:19:08] [CLEANUP] Removed 0 feed scroll views
[10:19:08] [CLEANUP] Removed 0 status labels
[10:19:08] [CLEANUP] Reset agent query state
[10:19:08] [CLEANUP] Updated page indicator
[10:19:08] [CLEANUP] Rebuilt video layout
[10:19:08] [CLEANUP] ✅ All agent connections and views cleaned up
[10:19:08] [CLEANUP] ========================================
[10:19:08] [SERVER] Skipping reconnect polling - app is in background
[10:26:39] [CAM_CONN] 💓 skip ping — ws not running (state=completed) conn=iosILUIWU query=true
[10:26:39] [BACKGROUND] Fetch error: The request timed out.
[10:26:39] [BACKGROUND] Fetch error: The request timed out.
[10:26:39] [BACKGROUND] Background fetch triggered
[10:26:39] [BACKGROUND] Fetching recent messages for pre-cache
[10:26:39] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:26:39] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:26:39] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:26:39] [NETWORK] Status changed: connected
[10:26:40] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:26:40] HELLO → sent (cached token, role=query)
[10:26:40] [CLIENT_SIG] WebSocket opened
[10:26:40] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[10:26:40] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:26:40] [WS] Query connection failed - cleaning up all agent connections and views
[10:26:40] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:26:40] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:26:40] [CLEANUP] ========================================
[10:26:40] [CLEANUP] Cleaning up all agent connections and views
[10:26:40] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:26:40] [CLEANUP] Stopped and removed 0 video connections
[10:26:40] [CLEANUP] Removed 0 video views
[10:26:40] [CLEANUP] Removed 0 feed scroll views
[10:26:40] [CLEANUP] Removed 0 status labels
[10:26:40] [CLEANUP] Reset agent query state
[10:26:40] [CLEANUP] Updated page indicator
[10:26:40] [CLEANUP] Rebuilt video layout
[10:26:40] [CLEANUP] ✅ All agent connections and views cleaned up
[10:26:40] [CLEANUP] ========================================
[10:26:40] [SERVER] Skipping reconnect polling - app is in background
[10:26:40] [CLEANUP] ========================================
[10:26:40] [CLEANUP] Cleaning up all agent connections and views
[10:26:40] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:26:40] [CLEANUP] Stopped and removed 0 video connections
[10:26:40] [CLEANUP] Removed 0 video views
[10:26:40] [CLEANUP] Removed 0 feed scroll views
[10:26:40] [CLEANUP] Removed 0 status labels
[10:26:40] [CLEANUP] Reset agent query state
[10:26:40] [CLEANUP] Updated page indicator
[10:26:40] [CLEANUP] Rebuilt video layout
[10:26:40] [CLEANUP] ✅ All agent connections and views cleaned up
[10:26:40] [CLEANUP] ========================================
[10:26:40] [SERVER] Skipping reconnect polling - app is in background
[10:26:40] [CLIENT_SIG] Connected! clientId=7IsZbOQmz-SKz7GO
[10:26:40] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[10:26:40] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:26:40] [CAM_CONN] 💓 skip ping — ws not running (state=completed) conn=iosILUIWU query=true
[10:26:40] [BACKGROUND] Fetched 50 messages - saving to DB and pre-caching
[10:26:40] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:26:40] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:26:40] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:26:40] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:26:40] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:26:40] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:26:40] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=52, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:26:40] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [28736, 28735]
[10:26:40] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=2, IDs=[28736, 28735]
[10:26:40] [PUSH_TRACE] 🔀 mergeMessages: merged.count=52, first 10 IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:26:40] [BACKGROUND] Pre-cached 52 ChatMessage objects for instant display (preserved 2 from push)
[10:26:40] [BACKGROUND] Pre-downloaded 0 thumbnails
[10:26:40] [BACKGROUND] ✅ Background fetch complete with thumbnail pre-download
[10:27:49] [CAM_CONN] 💓 skip ping — ws not running (state=completed) conn=iosILUIWU query=true
[10:27:49] [SECURITY] Timeout check: elapsed=2001.4991612434387s, timeout=300.0s
[10:27:49] [NETWORK] Status changed: connected
[10:27:49] [SECURITY] sceneWillEnterForeground - timeout exceeded, showing lock screen immediately
[10:27:49] [AUTH] ✅ All guards passed, showing privacy cover
[10:27:49] [SCROLL] 💓 alive, visible=47...53, rows=54, estHeight=0.0, heightCalls=60
[10:27:49] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[10:27:49] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:27:49] [LIFECYCLE] App entering foreground - restoring connections
[10:27:49] [CAPTURE] Live-feed protection [app-will-enter-foreground] - fullscreen=false, isCaptured=false, secureReady=true
[10:27:49] [CAPTURE] Refresh overlay [app-will-enter-foreground] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[10:27:49] [PUSH_TRACE] 🔄 FOREGROUND: memory has 52 msgs, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:27:49] [PUSH_TRACE] 🔄 FOREGROUND: cache has 52 msgs, valid=true, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:27:49] [LIFECYCLE] Away > 2 minutes (2001s) - will scroll to bottom
[10:27:49] [UPLOAD_RETRY] No pending uploads to retry
[10:27:49] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[10:27:49] [READBY_OPT] No message IDs to fetch - skipping server call
[10:27:49] [LIFECYCLE] WebRTC audio re-enabled
[10:27:49] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[10:27:49] [CLIENT_SIG] Skipping connect - app in background (state=2)
[10:27:49] [VIEWER] Reconnecting after background - querying agents
[10:27:49] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=completed
[10:27:49] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:27:49] [UNSENT_RETRY] Checking for unsent messages...
[10:27:49] [PENDING_UPLOAD] Total pending upload messages: 0
[10:27:49] [UNSENT_RETRY] No unsent messages found
[10:27:50] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:27:50] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:27:50] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort}
[10:27:50] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[10:27:50] [CLIENT_SIG] Task completed with error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <D3836411-3767-440C-ACC4-024F480AE135>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <D3836411-3767-440C-ACC4-024F480AE135>.<1>}
[10:27:50] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[10:27:50] [CLIENT_SIG] Send error: Error Domain=NSPOSIXErrorDomain Code=89 "Operation canceled" UserInfo={NSDescription=Operation canceled}
[10:27:50] [FOREGROUND] Enriched 0/0 unsettled messages with readBy data
[10:27:50] [LIFECYCLE] scrollToBottomIfNeeded time=true, count=52>52=false, maxId=28827>28827=false, shouldScroll=true
[10:27:50] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[10:27:50] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:27:50] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:27:50] HELLO → sent (cached token, role=query)
[10:27:50] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:27:50] [WS] Query connection failed - cleaning up all agent connections and views
[10:27:50] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:27:50] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:27:50] [CLEANUP] ========================================
[10:27:50] [CLEANUP] Cleaning up all agent connections and views
[10:27:50] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:27:50] [CLEANUP] Stopped and removed 0 video connections
[10:27:50] [CLEANUP] Removed 0 video views
[10:27:50] [CLEANUP] Removed 0 feed scroll views
[10:27:50] [CLEANUP] Removed 0 status labels
[10:27:50] [CLEANUP] Reset agent query state
[10:27:50] [CLEANUP] Updated page indicator
[10:27:50] [CLEANUP] Rebuilt video layout
[10:27:50] [CLEANUP] ✅ All agent connections and views cleaned up
[10:27:50] [CLEANUP] ========================================
[10:27:50] [SERVER] Starting reconnect polling (5s interval)
[10:27:50] [CLEANUP] ========================================
[10:27:50] [CLEANUP] Cleaning up all agent connections and views
[10:27:50] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:27:50] [CLEANUP] Stopped and removed 0 video connections
[10:27:50] [CLEANUP] Removed 0 video views
[10:27:50] [CLEANUP] Removed 0 feed scroll views
[10:27:50] [CLEANUP] Removed 0 status labels
[10:27:50] [CLEANUP] Reset agent query state
[10:27:50] [CLEANUP] Updated page indicator
[10:27:50] [CLEANUP] Rebuilt video layout
[10:27:50] [CLEANUP] ✅ All agent connections and views cleaned up
[10:27:50] [CLEANUP] ========================================
[10:27:50] [SERVER] Starting reconnect polling (5s interval)
[10:27:50] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=1
[10:27:50] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28827, 28826, 28825, 28824, 28823]
[10:27:50] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[10:27:50] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:27:50] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[10:27:50] [SCROLL] wasNearBottom=true, threshold=758, offset=3930, contentH=4688, boundsH=758, forceScroll=true
[10:27:50] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[10:27:50] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[10:27:50] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:27:50] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[10:27:50] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3930, currentOffset=3930
[10:27:50] [SCROLL] Scrolling to 3930, animated=false
[10:27:50] [SECURITY] sceneDidBecomeActive - isAuthenticated=false, didEnterBackground=false
[10:27:50] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[10:27:50] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 52 msgs, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:27:50] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2005 vccs=0
[10:27:50] [GAP_FIX] maxMessageIdAtBackground=28827, currentMaxLocalId=28827
[10:27:50] [PUSH] handlePollEventsNotification userInfo: [:]
[10:27:50] [PUSH] No message_id in userInfo
[10:27:50] [PUSH] No operation_type in userInfo
[10:27:50] [FAST_REFRESH] Evolution disabled - performing incremental sync
[10:27:50] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=52, IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:27:50] [PUSH_TRACE] 📬 POLL: memory state: count=52, first 10 IDs=[28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:27:50] [FAST_REFRESH] Already have 52 messages in memory
[10:27:50] [FAST_REFRESH] maxMemoryId=28827, maxLocalId=28827
[10:27:50] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[10:27:50] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[10:27:50] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[10:27:50] [READBY_OPT] No message IDs to fetch - skipping server call
[10:27:50] [GAP_FIX] Incremental sync will use since_id=28827 (background max=28827, current DB max=28827)
[10:27:50] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[10:27:50] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28827, maxMemoryId=28827
[10:27:50] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28827
[10:27:50] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[10:27:50] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[10:27:50] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:27:50] [INCREMENTAL_SYNC] ✅ No new messages
[10:27:50] [FAST_REFRESH] Incremental sync complete - 52 messages
[10:27:50] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=61
[10:27:50] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28827, 28826, 28825, 28824, 28823]
[10:27:50] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[10:27:50] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:27:50] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[10:27:50] [SCROLL] wasNearBottom=true, threshold=758, offset=3930, contentH=4688, boundsH=758, forceScroll=true
[10:27:50] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[10:27:50] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[10:27:50] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:27:50] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[10:27:50] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=3930, currentOffset=3930
[10:27:50] [SCROLL] Scrolling to 3930, animated=false
[10:27:51] [PIN_AUTH] Correct PIN
[10:27:51] [SECURITY] Restored real session: ILUIWU
[10:27:51] [SECURITY] Restored real session: ILUIWU
[10:27:51] [FAKE_AI] cancel() called, wasRunning=false
[10:27:51] [FAKE MODE] Exiting fake mode, restoring real session
[10:27:51] [SECURITY] Restored real session: ILUIWU
[10:27:51] [SECURITY] Saved real session: ILUIWU
[10:27:51] [FAKE MODE] ✅ Restored real session: ILUIWU
[10:27:51] [FAKE MODE] Loaded 50 messages (limited to page size)
[10:27:51] [READBY_OPT] Fetching readBy for 4 unsettled messages (targeted)
[10:27:51] [AUTH] Authentication completed - updating UI only (data already fetched in foreground handler)
[10:27:51] [AUTH] Cache had 52 messages, maxExistingId=28827, inserted 0 truly new
[10:27:51] [LIFECYCLE] scrollToBottomIfNeeded time=false, count=50>52=false, maxId=28827>28827=false, shouldScroll=false
[10:27:51] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[10:27:51] [AUTH] UI update complete
[10:27:51] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[10:27:51] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:27:51] [PUSH] register_device.php HTTP 200: {"status":"ok","session_id":"ILUIWU","token":"6c0571d5e4b29f63eac8424c26f3737968330e20febf8cd9a320b0952fc80c1c","role":"viewer","muted":0,"removed_from_other_channels":0}
[10:27:51] [USER] Registering user: 3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, name: Laurent
[10:27:51] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=completed
[10:27:51] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:27:51] [SCROLL] 💓 alive, visible=45...51, rows=52, estHeight=0.0, heightCalls=113
[10:27:51] [CELL_UPLOAD] configure: msgId=28821, file=2c2436d604281163.jpg, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, isMyMessage=false, hasFilename=true, isGiphy=false, uploadStatus=0
[10:27:51] [CELL_UPLOAD] setUploadStatus(complete, progress=0.0) for file=2c2436d604281163.jpg, overlayExists=true
[10:27:51] [COMBINED_FETCH] Loaded 4 read receipts, 1 messages with reactions
[10:27:51] [FAKE MODE] Enriched 4/4 unsettled messages with readBy data
[10:27:51] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=50
[10:27:51] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:27:51] [USER] ✅ User registered successfully
[10:27:51] [PUSH] User registration after token update: success
[10:27:51] [CLIENT_SIG] WebSocket opened
[10:27:51] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[10:27:51] [CLIENT_SIG] Connected! clientId=kTJEOdZiHGnqLvpa
[10:27:51] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[10:27:51] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:27:51] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:27:51] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:27:51] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=7
[10:27:51] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=50, first5Ids=[28827, 28826, 28825, 28824, 28823]
[10:27:51] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 50 messages
[10:27:51] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819, 28818]
[10:27:51] [RELOAD_TAB] 📊 Building chatRows from 50 messages
[10:27:51] [SCROLL] wasNearBottom=true, threshold=447, offset=4227, contentH=4674, boundsH=447, forceScroll=true
[10:27:51] [RELOAD_TAB] 📊 Built 52 chatRows, estHeight=0.0
[10:27:51] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=58
[10:27:51] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4247, currentOffset=4247
[10:27:51] [SCROLL] Scrolling to 4247, animated=false
[10:27:51] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:27:51] HELLO → sent (cached token, role=query)
[10:27:51] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:27:51] [WS] Query connection failed - cleaning up all agent connections and views
[10:27:51] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:27:51] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:27:51] [CLEANUP] ========================================
[10:27:51] [CLEANUP] Cleaning up all agent connections and views
[10:27:51] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:27:51] [CLEANUP] Stopped and removed 0 video connections
[10:27:51] [CLEANUP] Removed 0 video views
[10:27:51] [CLEANUP] Removed 0 feed scroll views
[10:27:51] [CLEANUP] Removed 0 status labels
[10:27:51] [CLEANUP] Reset agent query state
[10:27:51] [CLEANUP] Updated page indicator
[10:27:51] [CLEANUP] Rebuilt video layout
[10:27:51] [CLEANUP] ✅ All agent connections and views cleaned up
[10:27:51] [CLEANUP] ========================================
[10:27:51] [SERVER] Starting reconnect polling (5s interval)
[10:27:51] [CLEANUP] ========================================
[10:27:51] [CLEANUP] Cleaning up all agent connections and views
[10:27:51] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:27:51] [CLEANUP] Stopped and removed 0 video connections
[10:27:51] [CLEANUP] Removed 0 video views
[10:27:51] [CLEANUP] Removed 0 feed scroll views
[10:27:51] [CLEANUP] Removed 0 status labels
[10:27:51] [CLEANUP] Reset agent query state
[10:27:51] [CLEANUP] Updated page indicator
[10:27:51] [CLEANUP] Rebuilt video layout
[10:27:51] [CLEANUP] ✅ All agent connections and views cleaned up
[10:27:51] [CLEANUP] ========================================
[10:27:51] [SERVER] Starting reconnect polling (5s interval)
[10:27:53] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:27:53] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:27:53] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:27:53] HELLO → sent (cached token, role=query)
[10:27:53] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:27:53] [WS] Query connection failed - cleaning up all agent connections and views
[10:27:53] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:27:53] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:27:53] [CLEANUP] ========================================
[10:27:53] [CLEANUP] Cleaning up all agent connections and views
[10:27:53] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:27:53] [CLEANUP] Stopped and removed 0 video connections
[10:27:53] [CLEANUP] Removed 0 video views
[10:27:53] [CLEANUP] Removed 0 feed scroll views
[10:27:53] [CLEANUP] Removed 0 status labels
[10:27:53] [CLEANUP] Reset agent query state
[10:27:53] [CLEANUP] Updated page indicator
[10:27:53] [CLEANUP] Rebuilt video layout
[10:27:53] [CLEANUP] ✅ All agent connections and views cleaned up
[10:27:53] [CLEANUP] ========================================
[10:27:53] [SERVER] Starting reconnect polling (5s interval)
[10:27:53] [CLEANUP] ========================================
[10:27:53] [CLEANUP] Cleaning up all agent connections and views
[10:27:53] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:27:53] [CLEANUP] Stopped and removed 0 video connections
[10:27:53] [CLEANUP] Removed 0 video views
[10:27:53] [CLEANUP] Removed 0 feed scroll views
[10:27:53] [CLEANUP] Removed 0 status labels
[10:27:53] [CLEANUP] Reset agent query state
[10:27:53] [CLEANUP] Updated page indicator
[10:27:53] [CLEANUP] Rebuilt video layout
[10:27:53] [CLEANUP] ✅ All agent connections and views cleaned up
[10:27:53] [CLEANUP] ========================================
[10:27:53] [SERVER] Starting reconnect polling (5s interval)
[10:27:54] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[10:27:54] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:27:54] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:27:54] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:27:54] HELLO → sent (cached token, role=query)
[10:27:54] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:27:54] [WS] Query connection failed - cleaning up all agent connections and views
[10:27:54] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:27:54] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:27:54] [CLEANUP] ========================================
[10:27:54] [CLEANUP] Cleaning up all agent connections and views
[10:27:54] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:27:54] [CLEANUP] Stopped and removed 0 video connections
[10:27:54] [CLEANUP] Removed 0 video views
[10:27:54] [CLEANUP] Removed 0 feed scroll views
[10:27:54] [CLEANUP] Removed 0 status labels
[10:27:54] [CLEANUP] Reset agent query state
[10:27:54] [CLEANUP] Updated page indicator
[10:27:54] [CLEANUP] Rebuilt video layout
[10:27:54] [CLEANUP] ✅ All agent connections and views cleaned up
[10:27:54] [CLEANUP] ========================================
[10:27:54] [SERVER] Starting reconnect polling (5s interval)
[10:27:54] [CLEANUP] ========================================
[10:27:54] [CLEANUP] Cleaning up all agent connections and views
[10:27:54] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:27:54] [CLEANUP] Stopped and removed 0 video connections
[10:27:54] [CLEANUP] Removed 0 video views
[10:27:54] [CLEANUP] Removed 0 feed scroll views
[10:27:54] [CLEANUP] Removed 0 status labels
[10:27:54] [CLEANUP] Reset agent query state
[10:27:54] [CLEANUP] Updated page indicator
[10:27:54] [CLEANUP] Rebuilt video layout
[10:27:54] [CLEANUP] ✅ All agent connections and views cleaned up
[10:27:54] [CLEANUP] ========================================
[10:27:54] [SERVER] Starting reconnect polling (5s interval)
[10:27:56] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:27:56] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:27:56] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:27:56] HELLO → sent (cached token, role=query)
[10:27:56] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:27:56] [WS] Query connection failed - cleaning up all agent connections and views
[10:27:56] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:27:56] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:27:56] [CLEANUP] ========================================
[10:27:56] [CLEANUP] Cleaning up all agent connections and views
[10:27:56] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:27:56] [CLEANUP] Stopped and removed 0 video connections
[10:27:56] [CLEANUP] Removed 0 video views
[10:27:56] [CLEANUP] Removed 0 feed scroll views
[10:27:56] [CLEANUP] Removed 0 status labels
[10:27:56] [CLEANUP] Reset agent query state
[10:27:56] [CLEANUP] Updated page indicator
[10:27:56] [CLEANUP] Rebuilt video layout
[10:27:56] [CLEANUP] ✅ All agent connections and views cleaned up
[10:27:56] [CLEANUP] ========================================
[10:27:56] [SERVER] Starting reconnect polling (5s interval)
[10:27:56] [CLEANUP] ========================================
[10:27:56] [CLEANUP] Cleaning up all agent connections and views
[10:27:56] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:27:56] [CLEANUP] Stopped and removed 0 video connections
[10:27:56] [CLEANUP] Removed 0 video views
[10:27:56] [CLEANUP] Removed 0 feed scroll views
[10:27:56] [CLEANUP] Removed 0 status labels
[10:27:56] [CLEANUP] Reset agent query state
[10:27:56] [CLEANUP] Updated page indicator
[10:27:56] [CLEANUP] Rebuilt video layout
[10:27:56] [CLEANUP] ✅ All agent connections and views cleaned up
[10:27:56] [CLEANUP] ========================================
[10:27:56] [SERVER] Starting reconnect polling (5s interval)
[10:27:58] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:27:58] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:27:58] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:27:58] HELLO → sent (cached token, role=query)
[10:27:58] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:27:58] [WS] Query connection failed - cleaning up all agent connections and views
[10:27:58] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:27:58] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:27:58] [CLEANUP] ========================================
[10:27:58] [CLEANUP] Cleaning up all agent connections and views
[10:27:58] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:27:58] [CLEANUP] Stopped and removed 0 video connections
[10:27:58] [CLEANUP] Removed 0 video views
[10:27:58] [CLEANUP] Removed 0 feed scroll views
[10:27:58] [CLEANUP] Removed 0 status labels
[10:27:58] [CLEANUP] Reset agent query state
[10:27:58] [CLEANUP] Updated page indicator
[10:27:58] [CLEANUP] Rebuilt video layout
[10:27:58] [CLEANUP] ✅ All agent connections and views cleaned up
[10:27:58] [CLEANUP] ========================================
[10:27:58] [SERVER] Starting reconnect polling (5s interval)
[10:27:58] [CLEANUP] ========================================
[10:27:58] [CLEANUP] Cleaning up all agent connections and views
[10:27:58] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:27:58] [CLEANUP] Stopped and removed 0 video connections
[10:27:58] [CLEANUP] Removed 0 video views
[10:27:58] [CLEANUP] Removed 0 feed scroll views
[10:27:58] [CLEANUP] Removed 0 status labels
[10:27:58] [CLEANUP] Reset agent query state
[10:27:58] [CLEANUP] Updated page indicator
[10:27:58] [CLEANUP] Rebuilt video layout
[10:27:58] [CLEANUP] ✅ All agent connections and views cleaned up
[10:27:58] [CLEANUP] ========================================
[10:27:58] [SERVER] Starting reconnect polling (5s interval)
[10:27:59] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:27:59] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:27:59] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:27:59] HELLO → sent (cached token, role=query)
[10:28:00] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:28:00] [WS] Query connection failed - cleaning up all agent connections and views
[10:28:00] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:28:00] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:28:00] [CLEANUP] ========================================
[10:28:00] [CLEANUP] Cleaning up all agent connections and views
[10:28:00] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:00] [CLEANUP] Stopped and removed 0 video connections
[10:28:00] [CLEANUP] Removed 0 video views
[10:28:00] [CLEANUP] Removed 0 feed scroll views
[10:28:00] [CLEANUP] Removed 0 status labels
[10:28:00] [CLEANUP] Reset agent query state
[10:28:00] [CLEANUP] Updated page indicator
[10:28:00] [CLEANUP] Rebuilt video layout
[10:28:00] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:00] [CLEANUP] ========================================
[10:28:00] [SERVER] Starting reconnect polling (5s interval)
[10:28:00] [CLEANUP] ========================================
[10:28:00] [CLEANUP] Cleaning up all agent connections and views
[10:28:00] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:00] [CLEANUP] Stopped and removed 0 video connections
[10:28:00] [CLEANUP] Removed 0 video views
[10:28:00] [CLEANUP] Removed 0 feed scroll views
[10:28:00] [CLEANUP] Removed 0 status labels
[10:28:00] [CLEANUP] Reset agent query state
[10:28:00] [CLEANUP] Updated page indicator
[10:28:00] [CLEANUP] Rebuilt video layout
[10:28:00] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:00] [CLEANUP] ========================================
[10:28:00] [SERVER] Starting reconnect polling (5s interval)
[10:28:00] [CAM_CONN] 💓 skip ping — ws not running (state=completed) conn=iosILUIWU query=true
[10:28:01] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:01] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:28:01] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:01] HELLO → sent (cached token, role=query)
[10:28:01] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:28:01] [WS] Query connection failed - cleaning up all agent connections and views
[10:28:01] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:28:01] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:28:01] [CLEANUP] ========================================
[10:28:01] [CLEANUP] Cleaning up all agent connections and views
[10:28:01] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:01] [CLEANUP] Stopped and removed 0 video connections
[10:28:01] [CLEANUP] Removed 0 video views
[10:28:01] [CLEANUP] Removed 0 feed scroll views
[10:28:01] [CLEANUP] Removed 0 status labels
[10:28:01] [CLEANUP] Reset agent query state
[10:28:01] [CLEANUP] Updated page indicator
[10:28:01] [CLEANUP] Rebuilt video layout
[10:28:01] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:01] [CLEANUP] ========================================
[10:28:01] [SERVER] Starting reconnect polling (5s interval)
[10:28:01] [CLEANUP] ========================================
[10:28:01] [CLEANUP] Cleaning up all agent connections and views
[10:28:01] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:01] [CLEANUP] Stopped and removed 0 video connections
[10:28:01] [CLEANUP] Removed 0 video views
[10:28:01] [CLEANUP] Removed 0 feed scroll views
[10:28:01] [CLEANUP] Removed 0 status labels
[10:28:01] [CLEANUP] Reset agent query state
[10:28:01] [CLEANUP] Updated page indicator
[10:28:01] [CLEANUP] Rebuilt video layout
[10:28:01] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:01] [CLEANUP] ========================================
[10:28:01] [SERVER] Starting reconnect polling (5s interval)
[10:28:03] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:03] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:28:03] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:03] HELLO → sent (cached token, role=query)
[10:28:03] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:28:03] [WS] Query connection failed - cleaning up all agent connections and views
[10:28:03] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:28:03] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:28:03] [CLEANUP] ========================================
[10:28:03] [CLEANUP] Cleaning up all agent connections and views
[10:28:03] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:03] [CLEANUP] Stopped and removed 0 video connections
[10:28:03] [CLEANUP] Removed 0 video views
[10:28:03] [CLEANUP] Removed 0 feed scroll views
[10:28:03] [CLEANUP] Removed 0 status labels
[10:28:03] [CLEANUP] Reset agent query state
[10:28:03] [CLEANUP] Updated page indicator
[10:28:03] [CLEANUP] Rebuilt video layout
[10:28:03] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:03] [CLEANUP] ========================================
[10:28:03] [SERVER] Starting reconnect polling (5s interval)
[10:28:03] [CLEANUP] ========================================
[10:28:03] [CLEANUP] Cleaning up all agent connections and views
[10:28:03] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:03] [CLEANUP] Stopped and removed 0 video connections
[10:28:03] [CLEANUP] Removed 0 video views
[10:28:03] [CLEANUP] Removed 0 feed scroll views
[10:28:03] [CLEANUP] Removed 0 status labels
[10:28:03] [CLEANUP] Reset agent query state
[10:28:03] [CLEANUP] Updated page indicator
[10:28:03] [CLEANUP] Rebuilt video layout
[10:28:03] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:03] [CLEANUP] ========================================
[10:28:03] [SERVER] Starting reconnect polling (5s interval)
[10:28:04] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:04] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:28:04] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:04] HELLO → sent (cached token, role=query)
[10:28:04] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:28:04] [WS] Query connection failed - cleaning up all agent connections and views
[10:28:04] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:28:04] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:28:04] [CLEANUP] ========================================
[10:28:04] [CLEANUP] Cleaning up all agent connections and views
[10:28:04] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:04] [CLEANUP] Stopped and removed 0 video connections
[10:28:04] [CLEANUP] Removed 0 video views
[10:28:04] [CLEANUP] Removed 0 feed scroll views
[10:28:04] [CLEANUP] Removed 0 status labels
[10:28:04] [CLEANUP] Reset agent query state
[10:28:04] [CLEANUP] Updated page indicator
[10:28:04] [CLEANUP] Rebuilt video layout
[10:28:04] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:04] [CLEANUP] ========================================
[10:28:04] [SERVER] Starting reconnect polling (5s interval)
[10:28:04] [CLEANUP] ========================================
[10:28:04] [CLEANUP] Cleaning up all agent connections and views
[10:28:04] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:04] [CLEANUP] Stopped and removed 0 video connections
[10:28:04] [CLEANUP] Removed 0 video views
[10:28:04] [CLEANUP] Removed 0 feed scroll views
[10:28:04] [CLEANUP] Removed 0 status labels
[10:28:04] [CLEANUP] Reset agent query state
[10:28:04] [CLEANUP] Updated page indicator
[10:28:05] [CLEANUP] Rebuilt video layout
[10:28:05] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:05] [CLEANUP] ========================================
[10:28:05] [SERVER] Starting reconnect polling (5s interval)
[10:28:06] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:06] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:28:06] [CLIENT_SIG] Client connected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[10:28:06] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:06] HELLO → sent (cached token, role=query)
[10:28:06] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:28:06] [WS] Query connection failed - cleaning up all agent connections and views
[10:28:06] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:28:06] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:28:06] [CLEANUP] ========================================
[10:28:06] [CLEANUP] Cleaning up all agent connections and views
[10:28:06] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:06] [CLEANUP] Stopped and removed 0 video connections
[10:28:06] [CLEANUP] Removed 0 video views
[10:28:06] [CLEANUP] Removed 0 feed scroll views
[10:28:06] [CLEANUP] Removed 0 status labels
[10:28:06] [CLEANUP] Reset agent query state
[10:28:06] [CLEANUP] Updated page indicator
[10:28:06] [CLEANUP] Rebuilt video layout
[10:28:06] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:06] [CLEANUP] ========================================
[10:28:06] [SERVER] Starting reconnect polling (5s interval)
[10:28:06] [CLEANUP] ========================================
[10:28:06] [CLEANUP] Cleaning up all agent connections and views
[10:28:06] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:06] [CLEANUP] Stopped and removed 0 video connections
[10:28:06] [CLEANUP] Removed 0 video views
[10:28:06] [CLEANUP] Removed 0 feed scroll views
[10:28:06] [CLEANUP] Removed 0 status labels
[10:28:06] [CLEANUP] Reset agent query state
[10:28:06] [CLEANUP] Updated page indicator
[10:28:06] [CLEANUP] Rebuilt video layout
[10:28:06] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:06] [CLEANUP] ========================================
[10:28:06] [SERVER] Starting reconnect polling (5s interval)
[10:28:06] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[10:28:06] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=50, isReloading=false
[10:28:06] [SEND_MESSAGE] ✅ Added optimistic message id=-2 to arrays, newMsgCount=51
[10:28:06] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=58
[10:28:06] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[-2, 28827, 28826, 28825, 28824]
[10:28:06] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[10:28:06] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-2, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[10:28:06] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[10:28:06] [SCROLL] wasNearBottom=true, threshold=429, offset=4247, contentH=4694, boundsH=429, forceScroll=false
[10:28:06] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[10:28:06] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=59
[10:28:06] [SCROLL] 💓 alive, visible=46...52, rows=53, estHeight=0.0, heightCalls=112
[10:28:06] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:28:06] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[10:28:06] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4320, currentOffset=4320
[10:28:06] [SCROLL] Scrolling to 4320, animated=true
[10:28:07] [CLIENT_SIG] Event received: type=0 messageId=28828
[10:28:07] [WS_EVENT] Received event: type=0, messageId=28828
[10:28:07] [WS_EVENT] 📨 New message notification (msgId=28828) - triggering incremental refresh, currentMsgCount=51
[10:28:07] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[10:28:07] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28827, maxMemoryId=28827
[10:28:07] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28827
[10:28:07] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28828,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 08:28:07"}
[10:28:07] [CHAT] receive_message.php JSON: ["datesent_utc": 2026-04-23 08:28:07, "ok": 1, "session_id": ILUIWU, "message_id": 28828, "file_name": , "message_type": 0]
[10:28:07] [DB_UPGRADE] Upgrading message ID: -2 → 28828, preserveOriginalDate=false
[10:28:07] [DB_UPGRADE] ✅ Upgraded -2 → 28828 with send_status=0, 1 row(s) affected
[10:28:07] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -2 → 28828
[10:28:07] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -2 → 28828
[10:28:07] ReloadData 9
[10:28:07] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:28:07] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28828]
[10:28:07] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[10:28:07] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[10:28:07] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:28:07] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[10:28:07] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=51
[10:28:07] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=60
[10:28:07] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28828, 28827, 28826, 28825, 28824]
[10:28:07] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[10:28:07] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[10:28:07] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[10:28:07] [SCROLL] wasNearBottom=true, threshold=447, offset=4320, contentH=4767, boundsH=447, forceScroll=true
[10:28:07] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[10:28:07] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=59
[10:28:07] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4320, currentOffset=4320
[10:28:07] [SCROLL] Scrolling to 4320, animated=false
[10:28:08] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:08] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:28:08] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:08] HELLO → sent (cached token, role=query)
[10:28:08] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:28:08] [WS] Query connection failed - cleaning up all agent connections and views
[10:28:08] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:28:08] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:28:08] [CLEANUP] ========================================
[10:28:08] [CLEANUP] Cleaning up all agent connections and views
[10:28:08] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:08] [CLEANUP] Stopped and removed 0 video connections
[10:28:08] [CLEANUP] Removed 0 video views
[10:28:08] [CLEANUP] Removed 0 feed scroll views
[10:28:08] [CLEANUP] Removed 0 status labels
[10:28:08] [CLEANUP] Reset agent query state
[10:28:08] [CLEANUP] Updated page indicator
[10:28:08] [CLEANUP] Rebuilt video layout
[10:28:08] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:08] [CLEANUP] ========================================
[10:28:08] [SERVER] Starting reconnect polling (5s interval)
[10:28:08] [CLEANUP] ========================================
[10:28:08] [CLEANUP] Cleaning up all agent connections and views
[10:28:08] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:08] [CLEANUP] Stopped and removed 0 video connections
[10:28:08] [CLEANUP] Removed 0 video views
[10:28:08] [CLEANUP] Removed 0 feed scroll views
[10:28:08] [CLEANUP] Removed 0 status labels
[10:28:08] [CLEANUP] Reset agent query state
[10:28:08] [CLEANUP] Updated page indicator
[10:28:08] [CLEANUP] Rebuilt video layout
[10:28:08] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:08] [CLEANUP] ========================================
[10:28:08] [SERVER] Starting reconnect polling (5s interval)
[10:28:08] [PUSH] Silent push received
[10:28:08] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:28:08 +0000, appState=0, message_id=nil, type=nil
[10:28:08] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=0, IDs=[]
[10:28:08] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:28:08 +0000
[10:28:08] [PUSH_EMBED] No embedded message_data in notification
[10:28:08] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:28:08] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=0, IDs=[], handled=false
[10:28:08] [PUSH] No embedded data, pre-loading messages from server
[10:28:08] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:28:08] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:28:08] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:28:08] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:28:08] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:28:08] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:28:08] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:28:08] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[10:28:08] [PUSH_TRACE] 🔀 mergeMessages: Different session (nil vs ILUIWU), replacing cache
[10:28:08] [PUSH_PRELOAD] ⚡ Pre-cached 50 messages for instant display (preserved 0 from push)
[10:28:08] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:28:08] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[10:28:08] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2023 vccs=0
[10:28:08] [GAP_FIX] maxMessageIdAtBackground=28827, currentMaxLocalId=28828
[10:28:08] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28828, AnyHashable("session_id"): ILUIWU]
[10:28:08] [PUSH] Parsed message_id: 28828
[10:28:08] [PUSH] Parsed operation_type: 3
[10:28:08] [PUSH] Taking direct action: opType=3, messageId=28828
[10:28:08] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28828
[10:28:08] [GAP_FIX] Post-action sync: using background max 28827 to catch coalesced messages
[10:28:08] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=51
[10:28:08] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28827, maxMemoryId=28828
[10:28:08] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28827
[10:28:08] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:28:08] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28828]
[10:28:08] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 51 msgs, first 10 IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[10:28:08] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 51, first 10 IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[10:28:08] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:28:08] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=51
[10:28:09] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=59
[10:28:09] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=51, first5Ids=[28828, 28827, 28826, 28825, 28824]
[10:28:09] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 51 messages
[10:28:09] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[10:28:09] [RELOAD_TAB] 📊 Building chatRows from 51 messages
[10:28:09] [SCROLL] wasNearBottom=true, threshold=447, offset=4320, contentH=4767, boundsH=447, forceScroll=false
[10:28:09] [RELOAD_TAB] 📊 Built 53 chatRows, estHeight=0.0
[10:28:09] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[10:28:09] [CLIENT_SIG] Event received: type=3 messageId=28828
[10:28:09] [WS_EVENT] Received event: type=3, messageId=28828
[10:28:09] [WS_EVENT] Read receipt for message 28828 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:28:09] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:09] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:28:09] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:09] HELLO → sent (cached token, role=query)
[10:28:09] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:28:09] [WS] Query connection failed - cleaning up all agent connections and views
[10:28:09] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:28:09] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:28:09] [CLEANUP] ========================================
[10:28:09] [CLEANUP] Cleaning up all agent connections and views
[10:28:09] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:09] [CLEANUP] Stopped and removed 0 video connections
[10:28:09] [CLEANUP] Removed 0 video views
[10:28:09] [CLEANUP] Removed 0 feed scroll views
[10:28:09] [CLEANUP] Removed 0 status labels
[10:28:09] [CLEANUP] Reset agent query state
[10:28:09] [CLEANUP] Updated page indicator
[10:28:09] [CLEANUP] Rebuilt video layout
[10:28:09] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:09] [CLEANUP] ========================================
[10:28:09] [SERVER] Starting reconnect polling (5s interval)
[10:28:09] [CLEANUP] ========================================
[10:28:09] [CLEANUP] Cleaning up all agent connections and views
[10:28:09] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:09] [CLEANUP] Stopped and removed 0 video connections
[10:28:09] [CLEANUP] Removed 0 video views
[10:28:09] [CLEANUP] Removed 0 feed scroll views
[10:28:09] [CLEANUP] Removed 0 status labels
[10:28:09] [CLEANUP] Reset agent query state
[10:28:09] [CLEANUP] Updated page indicator
[10:28:09] [CLEANUP] Rebuilt video layout
[10:28:09] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:09] [CLEANUP] ========================================
[10:28:09] [SERVER] Starting reconnect polling (5s interval)
[10:28:11] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:11] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:28:11] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:11] HELLO → sent (cached token, role=query)
[10:28:11] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:28:11] [WS] Query connection failed - cleaning up all agent connections and views
[10:28:11] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:28:11] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:28:11] [CLEANUP] ========================================
[10:28:11] [CLEANUP] Cleaning up all agent connections and views
[10:28:11] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:11] [CLEANUP] Stopped and removed 0 video connections
[10:28:11] [CLEANUP] Removed 0 video views
[10:28:11] [CLEANUP] Removed 0 feed scroll views
[10:28:11] [CLEANUP] Removed 0 status labels
[10:28:11] [CLEANUP] Reset agent query state
[10:28:11] [CLEANUP] Updated page indicator
[10:28:11] [CLEANUP] Rebuilt video layout
[10:28:11] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:11] [CLEANUP] ========================================
[10:28:11] [SERVER] Starting reconnect polling (5s interval)
[10:28:11] [CLEANUP] ========================================
[10:28:11] [CLEANUP] Cleaning up all agent connections and views
[10:28:11] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:11] [CLEANUP] Stopped and removed 0 video connections
[10:28:11] [CLEANUP] Removed 0 video views
[10:28:11] [CLEANUP] Removed 0 feed scroll views
[10:28:11] [CLEANUP] Removed 0 status labels
[10:28:11] [CLEANUP] Reset agent query state
[10:28:11] [CLEANUP] Updated page indicator
[10:28:11] [CLEANUP] Rebuilt video layout
[10:28:11] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:11] [CLEANUP] ========================================
[10:28:11] [SERVER] Starting reconnect polling (5s interval)
[10:28:13] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:13] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:28:13] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:13] HELLO → sent (cached token, role=query)
[10:28:13] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:28:13] [WS] Query connection failed - cleaning up all agent connections and views
[10:28:13] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:28:13] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:28:13] [CLEANUP] ========================================
[10:28:13] [CLEANUP] Cleaning up all agent connections and views
[10:28:13] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:13] [CLEANUP] Stopped and removed 0 video connections
[10:28:13] [CLEANUP] Removed 0 video views
[10:28:13] [CLEANUP] Removed 0 feed scroll views
[10:28:13] [CLEANUP] Removed 0 status labels
[10:28:13] [CLEANUP] Reset agent query state
[10:28:13] [CLEANUP] Updated page indicator
[10:28:13] [CLEANUP] Rebuilt video layout
[10:28:13] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:13] [CLEANUP] ========================================
[10:28:13] [SERVER] Starting reconnect polling (5s interval)
[10:28:13] [CLEANUP] ========================================
[10:28:13] [CLEANUP] Cleaning up all agent connections and views
[10:28:13] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:13] [CLEANUP] Stopped and removed 0 video connections
[10:28:13] [CLEANUP] Removed 0 video views
[10:28:13] [CLEANUP] Removed 0 feed scroll views
[10:28:13] [CLEANUP] Removed 0 status labels
[10:28:13] [CLEANUP] Reset agent query state
[10:28:13] [CLEANUP] Updated page indicator
[10:28:13] [CLEANUP] Rebuilt video layout
[10:28:13] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:13] [CLEANUP] ========================================
[10:28:13] [SERVER] Starting reconnect polling (5s interval)
[10:28:14] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:14] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:28:15] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:15] HELLO → sent (cached token, role=query)
[10:28:15] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:28:15] [WS] Query connection failed - cleaning up all agent connections and views
[10:28:15] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:28:15] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:28:15] [CLEANUP] ========================================
[10:28:15] [CLEANUP] Cleaning up all agent connections and views
[10:28:15] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:15] [CLEANUP] Stopped and removed 0 video connections
[10:28:15] [CLEANUP] Removed 0 video views
[10:28:15] [CLEANUP] Removed 0 feed scroll views
[10:28:15] [CLEANUP] Removed 0 status labels
[10:28:15] [CLEANUP] Reset agent query state
[10:28:15] [CLEANUP] Updated page indicator
[10:28:15] [CLEANUP] Rebuilt video layout
[10:28:15] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:15] [CLEANUP] ========================================
[10:28:15] [SERVER] Starting reconnect polling (5s interval)
[10:28:15] [CLEANUP] ========================================
[10:28:15] [CLEANUP] Cleaning up all agent connections and views
[10:28:15] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:15] [CLEANUP] Stopped and removed 0 video connections
[10:28:15] [CLEANUP] Removed 0 video views
[10:28:15] [CLEANUP] Removed 0 feed scroll views
[10:28:15] [CLEANUP] Removed 0 status labels
[10:28:15] [CLEANUP] Reset agent query state
[10:28:15] [CLEANUP] Updated page indicator
[10:28:15] [CLEANUP] Rebuilt video layout
[10:28:15] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:15] [CLEANUP] ========================================
[10:28:15] [SERVER] Starting reconnect polling (5s interval)
[10:28:16] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:16] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:28:16] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:28:16] HELLO → sent (cached token, role=query)
[10:28:16] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:28:16] [WS] Query connection failed - cleaning up all agent connections and views
[10:28:16] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:28:16] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:28:16] [CLEANUP] ========================================
[10:28:16] [CLEANUP] Cleaning up all agent connections and views
[10:28:16] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:16] [CLEANUP] Stopped and removed 0 video connections
[10:28:16] [CLEANUP] Removed 0 video views
[10:28:16] [CLEANUP] Removed 0 feed scroll views
[10:28:16] [CLEANUP] Removed 0 status labels
[10:28:16] [CLEANUP] Reset agent query state
[10:28:16] [CLEANUP] Updated page indicator
[10:28:16] [CLEANUP] Rebuilt video layout
[10:28:16] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:16] [CLEANUP] ========================================
[10:28:16] [SERVER] Starting reconnect polling (5s interval)
[10:28:16] [CLEANUP] ========================================
[10:28:16] [CLEANUP] Cleaning up all agent connections and views
[10:28:16] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:28:16] [CLEANUP] Stopped and removed 0 video connections
[10:28:16] [CLEANUP] Removed 0 video views
[10:28:16] [CLEANUP] Removed 0 feed scroll views
[10:28:16] [CLEANUP] Removed 0 status labels
[10:28:16] [CLEANUP] Reset agent query state
[10:28:16] [CLEANUP] Updated page indicator
[10:28:16] [CLEANUP] Rebuilt video layout
[10:28:16] [CLEANUP] ✅ All agent connections and views cleaned up
[10:28:16] [CLEANUP] ========================================
[10:28:16] [SERVER] Starting reconnect polling (5s interval)
[10:28:17] [LIFECYCLE] App resigning active - cleared crash flag
[10:28:17] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[10:28:17] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[10:28:17] [SECURITY] Saved background timestamp
[10:28:17] [LIFECYCLE] App entering background - cleared crash flag
[10:28:17] [CLIENT_SIG] Disconnecting
[10:28:17] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[10:28:17] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[10:28:17] [PUSH_TRACE] 💤 BACKGROUND: memory has 51 messages, first 10 IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[10:28:17] [LIFECYCLE] Background snapshot: count=51, maxId=28828
[10:28:17] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=3
[10:28:17] [WS] Canceling WebSocket for query connection to iosILUIWU
[10:28:17] In cleanupPeer
[10:28:17] In cleanupPeer
[10:28:17] [LIFECYCLE] WebRTC audio disabled
[10:28:17] [LIFECYCLE] AVAudioSession deactivated
[10:28:17] [LIFECYCLE] All connections stopped
[10:28:17] [CLIENT_SIG] WebSocket closed with code 1001
[10:28:17] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[10:28:17] [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/}
[10:28:17] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[10:28:17] [SERVER] Stopped reconnect polling
[10:28:17] [WS] URLSession invalidated successfully
[10:28:17] Will request stop of video 0
[10:28:17] Will request stop of video 0
[10:28:17] [PIP] Removing 0 tracks from PiP for connection 0
[10:28:17] [PIP] ✅ All tracks removed for connection 0
[10:28:17] [PIP] Removing 0 tracks from PiP for connection 0
[10:28:17] [PIP] ✅ All tracks removed for connection 0
[10:29:59] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[10:29:59] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 51 msgs, IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[10:29:59] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=nil pings=2 secsSinceLastPong=2135 vccs=0
[10:29:59] [GAP_FIX] maxMessageIdAtBackground=28828, currentMaxLocalId=28829
[10:29:59] [PUSH] handlePollEventsNotification userInfo: [:]
[10:29:59] [PUSH] No message_id in userInfo
[10:29:59] [PUSH] No operation_type in userInfo
[10:29:59] [FAST_REFRESH] Evolution disabled - performing incremental sync
[10:29:59] [NETWORK] Status changed: connected
[10:29:59] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=50, IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[10:29:59] [PUSH_TRACE] 📬 POLL: memory state: count=51, first 10 IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[10:29:59] [FAST_REFRESH] Already have 51 messages in memory
[10:29:59] [FAST_REFRESH] maxMemoryId=28828, maxLocalId=28829
[10:29:59] [FAST_REFRESH] 🌙 Found 1 overnight messages in local DB (IDs > 28828)
[10:29:59] [FAST_REFRESH] 🌙 Merged 1 overnight messages into memory (now 52 total)
[10:29:59] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[10:29:59] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[10:29:59] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[10:29:59] [READBY_OPT] No message IDs to fetch - skipping server call
[10:29:59] [GAP_FIX] Incremental sync will use since_id=28828 (background max=28828, current DB max=28829)
[10:29:59] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[10:29:59] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28828, maxMemoryId=28829
[10:29:59] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28828
[10:29:59] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:29:59] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:29:59] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:29:59] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[10:29:59] [PUSH] Silent push received
[10:29:59] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:29:59 +0000, appState=2, message_id=28829, type=nil
[10:29:59] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=50, IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[10:29:59] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:29:59 +0000
[10:29:59] [PUSH_TRACE] ⬇️ Processing embedded message_id=28829
[10:29:59] [PUSH_EMBED] 📩 Received embedded message: id=28829, type=0, sender=Esra
[10:29:59] [PUSH_TRACE] ⬇️ Message details: text="Thanks baby...", datesent=2026-04-23 08:29:56
[10:29:59] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[10:29:59] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28829
[10:29:59] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28829
[10:29:59] [PUSH_EMBED] ✅ Saved message 28829 to local DB (sync)
[10:29:59] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28829
[10:29:59] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28829
[10:29:59] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28829
[10:29:59] [PUSH_TRACE] 📦 Cache state: valid=true, count=50, IDs=[28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820, 28819]
[10:29:59] [PUSH_EMBED] Inserted message 28829 into existing cache (now 51 messages)
[10:29:59] [PUSH_TRACE] 📦 ✅ Inserted message 28829, cache now has IDs: [28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:29:59] [PUSH_TRACE] 📦 EXITING cache update queue for message 28829
[10:29:59] [PUSH_EMBED] Fetching evolution data for message 28829 in background
[10:29:59] [PUSH_EMBED] ✅ Fully processed message 28829
[10:29:59] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28829
[10:29:59] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820], handled=true
[10:29:59] [PUSH] Embedded message handled instantly from silent push
[10:29:59] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[10:29:59] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28829
[10:29:59] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[10:29:59] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:29:59] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[10:29:59] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[10:29:59] [PUSH_TRACE] 👁️ Received message id=28829, text="Thanks baby..."
[10:29:59] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[10:29:59] [PUSH_UI] Message 28829 already in memory - skipping insert
[10:29:59] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[10:29:59] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 52 msgs, IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:29:59] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=2 secsSinceLastPong=2135 vccs=0
[10:29:59] [GAP_FIX] maxMessageIdAtBackground=28828, currentMaxLocalId=28829
[10:29:59] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("sender_name"): Esra, AnyHashable("file_name"): , AnyHashable("datesent"): 2026-04-23 08:29:56, AnyHashable("operation_type"): 0, AnyHashable("message_type"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("timer"): 0, AnyHashable("message_id"): 28829, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("thumb_file_name"): , AnyHashable("message"): Thanks baby, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:29:56";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Thanks baby";
    "message_id" = 28829;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28828;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE]
[10:29:59] [PUSH_EMBED_VC] Message 28829 already in memory - skipping
[10:29:59] [PUSH] ⚡ Embedded message handled directly in ViewController
[10:29:59] [PUSH] Parsed message_id: 28829
[10:29:59] [PUSH] Parsed operation_type: 0
[10:29:59] [PUSH] Taking direct action: opType=0, messageId=28829
[10:29:59] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28829
[10:29:59] [PUSH] ⚡ Message 28829 already in memory - skipping duplicate notification entirely
[10:29:59] [GAP_FIX] Post-action sync: using background max 28828 to catch coalesced messages
[10:29:59] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[10:30:00] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:30:00] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28829]
[10:30:00] [PUSH_EMBED] Got evolution data for message 28829, saving to local DB
[10:30:00] [PUSH_EMBED] Saved evolution data for message 28829
[10:30:00] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:00] [CLIENT_SIG] WebSocket opened
[10:30:00] HELLO → sent (cached token, role=query)
[10:30:00] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[10:30:00] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:30:00] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28829, 28828, 28827, 28826, 28825]
[10:30:00] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[10:30:00] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:00] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[10:30:00] [SCROLL] wasNearBottom=true, threshold=447, offset=4320, contentH=4767, boundsH=447, forceScroll=false
[10:30:00] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[10:30:00] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28828 → 28829
[10:30:00] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[10:30:00] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 52 msgs, first 10 IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:00] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 52, first 10 IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:00] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:30:00] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[10:30:00] [INCREMENTAL_SYNC] 🔁 Processing queued retry refresh
[10:30:00] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[10:30:00] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28829, maxMemoryId=28829
[10:30:00] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28829
[10:30:00] [SCROLL_END_DECEL] messagesTable offsetY=4320, insetTop=0, pendingVelocityY=0.0
[10:30:00] [SCROLL] Async handler: shouldScroll=false (force=false, newMsgs=false, nearBottom=true), maxY=4397, currentOffset=4320
[10:30:00] [SCROLL_END_DECEL] messagesTable offsetY=4320, insetTop=0, pendingVelocityY=0.0
[10:30:00] [FAST_REFRESH] Incremental sync complete - 52 messages
[10:30:00] [CLIENT_SIG] Connected! clientId=Juau-gbdnB4ToW8J
[10:30:00] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:30:00] [WS] Query connection failed - cleaning up all agent connections and views
[10:30:00] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:30:00] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:30:00] [CLEANUP] ========================================
[10:30:00] [CLEANUP] Cleaning up all agent connections and views
[10:30:00] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:00] [CLEANUP] Stopped and removed 0 video connections
[10:30:00] [CLEANUP] Removed 0 video views
[10:30:00] [CLEANUP] Removed 0 feed scroll views
[10:30:00] [CLEANUP] Removed 0 status labels
[10:30:00] [CLEANUP] Reset agent query state
[10:30:00] [CLEANUP] Updated page indicator
[10:30:00] [CLEANUP] Rebuilt video layout
[10:30:00] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:00] [CLEANUP] ========================================
[10:30:00] [SERVER] Skipping reconnect polling - app is in background
[10:30:00] [CLEANUP] ========================================
[10:30:00] [CLEANUP] Cleaning up all agent connections and views
[10:30:00] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:00] [CLEANUP] Stopped and removed 0 video connections
[10:30:00] [CLEANUP] Removed 0 video views
[10:30:00] [CLEANUP] Removed 0 feed scroll views
[10:30:00] [CLEANUP] Removed 0 status labels
[10:30:00] [CLEANUP] Reset agent query state
[10:30:00] [CLEANUP] Updated page indicator
[10:30:00] [CLEANUP] Rebuilt video layout
[10:30:00] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:00] [CLEANUP] ========================================
[10:30:00] [SERVER] Skipping reconnect polling - app is in background
[10:30:00] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[10:30:00] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:30:00] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:30:00] [INCREMENTAL_SYNC] ✅ No new messages
[10:30:00] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=61
[10:30:00] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28829, 28828, 28827, 28826, 28825]
[10:30:00] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[10:30:00] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:00] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[10:30:00] [SCROLL] wasNearBottom=true, threshold=447, offset=4320, contentH=4844, boundsH=447, forceScroll=false
[10:30:00] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[10:30:00] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[10:30:01] [CLIENT_SIG] Typing start from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:30:02] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:02] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:30:02] [PUSH] Silent push received
[10:30:02] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:30:02 +0000, appState=2, message_id=nil, type=nil
[10:30:02] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=51, IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:02] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:30:02 +0000
[10:30:02] [PUSH_EMBED] No embedded message_data in notification
[10:30:02] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:30:02] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820], handled=false
[10:30:02] [PUSH] No embedded data, pre-loading messages from server
[10:30:02] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:30:02] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort}
[10:30:02] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[10:30:02] [CLIENT_SIG] Task completed with error: Error Domain=NSPOSIXErrorDomain Code=53 "Software caused connection abort" UserInfo={NSDescription=Software caused connection abort, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <F6F1BDBE-029D-4BC4-BAD6-F411812E9D4C>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <F6F1BDBE-029D-4BC4-BAD6-F411812E9D4C>.<1>}
[10:30:02] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[10:30:02] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:02] HELLO → sent (cached token, role=query)
[10:30:02] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:30:02] [WS] Query connection failed - cleaning up all agent connections and views
[10:30:02] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:30:02] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:30:02] [CLEANUP] ========================================
[10:30:02] [CLEANUP] Cleaning up all agent connections and views
[10:30:02] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:02] [CLEANUP] Stopped and removed 0 video connections
[10:30:02] [CLEANUP] Removed 0 video views
[10:30:02] [CLEANUP] Removed 0 feed scroll views
[10:30:02] [CLEANUP] Removed 0 status labels
[10:30:02] [CLEANUP] Reset agent query state
[10:30:02] [CLEANUP] Updated page indicator
[10:30:02] [CLEANUP] Rebuilt video layout
[10:30:02] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:02] [CLEANUP] ========================================
[10:30:02] [SERVER] Skipping reconnect polling - app is in background
[10:30:02] [CLEANUP] ========================================
[10:30:02] [CLEANUP] Cleaning up all agent connections and views
[10:30:02] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:02] [CLEANUP] Stopped and removed 0 video connections
[10:30:02] [CLEANUP] Removed 0 video views
[10:30:02] [CLEANUP] Removed 0 feed scroll views
[10:30:02] [CLEANUP] Removed 0 status labels
[10:30:02] [CLEANUP] Reset agent query state
[10:30:02] [CLEANUP] Updated page indicator
[10:30:02] [CLEANUP] Rebuilt video layout
[10:30:02] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:02] [CLEANUP] ========================================
[10:30:02] [SERVER] Skipping reconnect polling - app is in background
[10:30:02] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:30:02] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:30:02] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:30:02] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:30:02] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:30:02] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:30:02] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:02] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=51, IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:02] [PRELOAD_CACHE] Preserving 1 push-inserted messages: [28738]
[10:30:02] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=1, IDs=[28738]
[10:30:02] [PUSH_TRACE] 🔀 mergeMessages: merged.count=51, first 10 IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:02] [PUSH_PRELOAD] ⚡ Pre-cached 51 messages for instant display (preserved 1 from push)
[10:30:02] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:30:02] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 52 msgs, IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:02] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2137 vccs=0
[10:30:02] [GAP_FIX] maxMessageIdAtBackground=28828, currentMaxLocalId=28829
[10:30:02] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28829, AnyHashable("operation_type"): 3, AnyHashable("aps"): {
    "content-available" = 1;
}]
[10:30:02] [PUSH] Parsed message_id: 28829
[10:30:02] [PUSH] Parsed operation_type: 3
[10:30:02] [PUSH] Taking direct action: opType=3, messageId=28829
[10:30:02] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28829
[10:30:02] [GAP_FIX] Post-action sync: using background max 28828 to catch coalesced messages
[10:30:02] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[10:30:02] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28828, maxMemoryId=28829
[10:30:02] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28828
[10:30:02] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:30:02] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28829]
[10:30:02] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 52 msgs, first 10 IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:02] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 52, first 10 IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:02] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:30:02] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[10:30:02] [SCROLL_END_DECEL] messagesTable offsetY=4320, insetTop=0, pendingVelocityY=0.0
[10:30:02] [SCROLL] 💓 alive, visible=47...53, rows=54, estHeight=0.0, heightCalls=1
[10:30:03] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:30:03] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28829, 28828, 28827, 28826, 28825]
[10:30:03] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[10:30:03] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:03] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[10:30:03] [SCROLL] wasNearBottom=true, threshold=447, offset=4389, contentH=4844, boundsH=447, forceScroll=false
[10:30:03] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[10:30:03] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[10:30:03] [SCROLL_END_DECEL] messagesTable offsetY=4397, insetTop=0, pendingVelocityY=0.0
[10:30:03] [NETWORK] Status changed: connected
[10:30:03] [SECURITY] Timeout check: elapsed=106.63840389251709s, timeout=300.0s
[10:30:03] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[10:30:03] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:30:03] [LIFECYCLE] App entering foreground - restoring connections
[10:30:03] [CAPTURE] Live-feed protection [app-will-enter-foreground] - fullscreen=false, isCaptured=false, secureReady=true
[10:30:03] [CAPTURE] Refresh overlay [app-will-enter-foreground] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[10:30:03] [PUSH_TRACE] 🔄 FOREGROUND: memory has 52 msgs, IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:03] [PUSH_TRACE] 🔄 FOREGROUND: cache has 51 msgs, valid=true, IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:03] [UPLOAD_RETRY] No pending uploads to retry
[10:30:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[10:30:03] [READBY_OPT] No message IDs to fetch - skipping server call
[10:30:03] [LIFECYCLE] WebRTC audio re-enabled
[10:30:03] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[10:30:03] [CLIENT_SIG] Skipping connect - app in background (state=2)
[10:30:03] [VIEWER] Reconnecting after background - querying agents
[10:30:03] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=completed
[10:30:03] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:30:03] [UNSENT_RETRY] Checking for unsent messages...
[10:30:03] [PENDING_UPLOAD] Total pending upload messages: 0
[10:30:03] [UNSENT_RETRY] No unsent messages found
[10:30:03] [FOREGROUND] Enriched 0/0 unsettled messages with readBy data
[10:30:03] [PUSH] Notification tapped - session_id: ILUIWU
[10:30:03] [PUSH] Max message_id before tap: 28829
[10:30:03] [PUSH] Stored pending session: ILUIWU
[10:30:03] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:30:03 +0000
[10:30:03] [PUSH_TRACE] ⬇️ Processing embedded message_id=28829
[10:30:03] [PUSH_EMBED] 📩 Received embedded message: id=28829, type=0, sender=Esra
[10:30:03] [PUSH_TRACE] ⬇️ Message details: text="Thanks baby...", datesent=2026-04-23 08:29:56
[10:30:03] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[10:30:03] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28829
[10:30:03] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28829
[10:30:03] [PUSH_EMBED] ✅ Saved message 28829 to local DB (sync)
[10:30:03] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28829
[10:30:03] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28829
[10:30:03] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28829
[10:30:03] [PUSH_TRACE] 📦 Cache state: valid=true, count=51, IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:03] [PUSH_TRACE] 📦 ⚠️ Message 28829 already in cache, skipping insert
[10:30:03] [PUSH_TRACE] 📦 EXITING cache update queue for message 28829
[10:30:03] [PUSH_EMBED] Fetching evolution data for message 28829 in background
[10:30:03] [PUSH_EMBED] ✅ Fully processed message 28829
[10:30:03] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28829
[10:30:03] [PUSH] Embedded message handled instantly on tap
[10:30:03] [PUSH] Fetching server messages since_id=28829 to catch coalesced notifications on tap
[10:30:03] [PUSH_PRELOAD] Fetching up to 50 messages since_id=28829 to catch coalesced notifications
[10:30:03] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:30:03] [LIFECYCLE] scrollToBottomIfNeeded time=false, count=52>51=true, maxId=28829>28828=true, shouldScroll=true
[10:30:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[10:30:03] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:30:03] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[10:30:03] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[10:30:03] [PUSH_TRACE] 👁️ Received message id=28829, text="Thanks baby..."
[10:30:03] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[10:30:03] [PUSH_UI] Message 28829 already in memory - skipping insert
[10:30:03] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[10:30:03] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:03] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:30:03] [CLIENT_SIG] WebSocket opened
[10:30:03] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[10:30:03] [CLIENT_SIG] Connected! clientId=TESJxpwPdpRkJ6L2
[10:30:03] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[10:30:03] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:30:03] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:30:03] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:03] HELLO → sent (cached token, role=query)
[10:30:03] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:30:03] [WS] Query connection failed - cleaning up all agent connections and views
[10:30:03] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:30:03] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:30:03] [CLEANUP] ========================================
[10:30:03] [CLEANUP] Cleaning up all agent connections and views
[10:30:03] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:03] [CLEANUP] Stopped and removed 0 video connections
[10:30:03] [CLEANUP] Removed 0 video views
[10:30:03] [CLEANUP] Removed 0 feed scroll views
[10:30:03] [CLEANUP] Removed 0 status labels
[10:30:03] [CLEANUP] Reset agent query state
[10:30:03] [CLEANUP] Updated page indicator
[10:30:03] [CLEANUP] Rebuilt video layout
[10:30:03] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:03] [CLEANUP] ========================================
[10:30:03] [SERVER] Starting reconnect polling (5s interval)
[10:30:03] [CLEANUP] ========================================
[10:30:03] [CLEANUP] Cleaning up all agent connections and views
[10:30:03] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:03] [CLEANUP] Stopped and removed 0 video connections
[10:30:03] [CLEANUP] Removed 0 video views
[10:30:03] [CLEANUP] Removed 0 feed scroll views
[10:30:03] [CLEANUP] Removed 0 status labels
[10:30:03] [CLEANUP] Reset agent query state
[10:30:03] [CLEANUP] Updated page indicator
[10:30:03] [CLEANUP] Rebuilt video layout
[10:30:03] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:03] [CLEANUP] ========================================
[10:30:03] [SERVER] Starting reconnect polling (5s interval)
[10:30:03] [PUSH_EMBED] Got evolution data for message 28829, saving to local DB
[10:30:03] [PUSH_EMBED] Saved evolution data for message 28829
[10:30:03] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:30:03] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28829, 28828, 28827, 28826, 28825]
[10:30:03] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[10:30:03] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:03] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[10:30:03] [SCROLL] wasNearBottom=true, threshold=447, offset=4397, contentH=4844, boundsH=447, forceScroll=true
[10:30:03] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[10:30:03] [PUSH_PRELOAD] No messages or parse error
[10:30:03] [PUSH] Server fetch on tap completed (success=false)
[10:30:03] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[10:30:03] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 52 msgs, IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:03] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2139 vccs=0
[10:30:03] [GAP_FIX] maxMessageIdAtBackground=28828, currentMaxLocalId=28829
[10:30:03] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28829, AnyHashable("message"): Thanks baby, AnyHashable("file_name"): , AnyHashable("timer"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:29:56";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Thanks baby";
    "message_id" = 28829;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28828;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("thumb_file_name"): , AnyHashable("datesent"): 2026-04-23 08:29:56, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("sender_name"): Esra, AnyHashable("message_type"): 0, AnyHashable("operation_type"): 0]
[10:30:03] [PUSH_EMBED_VC] Message 28829 already in memory - skipping
[10:30:03] [PUSH] ⚡ Embedded message handled directly in ViewController
[10:30:03] [PUSH] Parsed message_id: 28829
[10:30:03] [PUSH] Parsed operation_type: 0
[10:30:03] [PUSH] Taking direct action: opType=0, messageId=28829
[10:30:03] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28829
[10:30:03] [PUSH] ⚡ Message 28829 already in memory - skipping duplicate notification entirely
[10:30:03] [GAP_FIX] Post-action sync: using background max 28828 to catch coalesced messages
[10:30:03] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[10:30:03] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28828, maxMemoryId=28829
[10:30:03] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28828
[10:30:03] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4397, currentOffset=4397
[10:30:03] [SCROLL] Scrolling to 4397, animated=false
[10:30:04] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:30:04] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28829]
[10:30:04] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 52 msgs, first 10 IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:04] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 52, first 10 IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:04] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:30:04] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[10:30:04] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=60
[10:30:04] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28829, 28828, 28827, 28826, 28825]
[10:30:04] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[10:30:04] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:04] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[10:30:04] [SCROLL] wasNearBottom=true, threshold=447, offset=4397, contentH=4844, boundsH=447, forceScroll=true
[10:30:04] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[10:30:04] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[10:30:04] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4397, currentOffset=4397
[10:30:04] [SCROLL] Scrolling to 4397, animated=false
[10:30:04] [SECURITY] sceneDidBecomeActive - isAuthenticated=true, didEnterBackground=true
[10:30:04] [SECURITY] Within timeout - cleared background flag
[10:30:04] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[10:30:04] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 52 msgs, IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:04] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2139 vccs=0
[10:30:04] [GAP_FIX] maxMessageIdAtBackground=28828, currentMaxLocalId=28829
[10:30:04] [PUSH] handlePollEventsNotification userInfo: [:]
[10:30:04] [PUSH] No message_id in userInfo
[10:30:04] [PUSH] No operation_type in userInfo
[10:30:04] [FAST_REFRESH] Evolution disabled - performing incremental sync
[10:30:04] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=51, IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:04] [PUSH_TRACE] 📬 POLL: memory state: count=52, first 10 IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:04] [FAST_REFRESH] Already have 52 messages in memory
[10:30:04] [FAST_REFRESH] maxMemoryId=28829, maxLocalId=28829
[10:30:04] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[10:30:04] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[10:30:04] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[10:30:04] [READBY_OPT] No message IDs to fetch - skipping server call
[10:30:04] [GAP_FIX] Incremental sync will use since_id=28828 (background max=28828, current DB max=28829)
[10:30:04] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=52
[10:30:04] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28828, maxMemoryId=28829
[10:30:04] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28828
[10:30:04] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[10:30:04] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[10:30:04] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:30:04] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:30:04] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28829]
[10:30:04] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 52 msgs, first 10 IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:04] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 52, first 10 IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:04] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:30:04] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=52
[10:30:04] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:30:04] [FAST_REFRESH] Incremental sync complete - 52 messages
[10:30:04] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=60
[10:30:04] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=52, first5Ids=[28829, 28828, 28827, 28826, 28825]
[10:30:04] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 52 messages
[10:30:04] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:04] [RELOAD_TAB] 📊 Building chatRows from 52 messages
[10:30:04] [SCROLL] wasNearBottom=true, threshold=447, offset=4397, contentH=4844, boundsH=447, forceScroll=true
[10:30:04] [RELOAD_TAB] 📊 Built 54 chatRows, estHeight=0.0
[10:30:04] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=60
[10:30:04] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4397, currentOffset=4397
[10:30:04] [SCROLL] Scrolling to 4397, animated=false
[10:30:05] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:05] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:30:05] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:05] HELLO → sent (cached token, role=query)
[10:30:05] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:30:05] [WS] Query connection failed - cleaning up all agent connections and views
[10:30:05] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:30:05] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:30:05] [CLEANUP] ========================================
[10:30:05] [CLEANUP] Cleaning up all agent connections and views
[10:30:05] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:05] [CLEANUP] Stopped and removed 0 video connections
[10:30:05] [CLEANUP] Removed 0 video views
[10:30:05] [CLEANUP] Removed 0 feed scroll views
[10:30:05] [CLEANUP] Removed 0 status labels
[10:30:05] [CLEANUP] Reset agent query state
[10:30:05] [CLEANUP] Updated page indicator
[10:30:05] [CLEANUP] Rebuilt video layout
[10:30:05] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:05] [CLEANUP] ========================================
[10:30:05] [SERVER] Starting reconnect polling (5s interval)
[10:30:05] [CLEANUP] ========================================
[10:30:05] [CLEANUP] Cleaning up all agent connections and views
[10:30:05] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:05] [CLEANUP] Stopped and removed 0 video connections
[10:30:05] [CLEANUP] Removed 0 video views
[10:30:05] [CLEANUP] Removed 0 feed scroll views
[10:30:05] [CLEANUP] Removed 0 status labels
[10:30:05] [CLEANUP] Reset agent query state
[10:30:05] [CLEANUP] Updated page indicator
[10:30:05] [CLEANUP] Rebuilt video layout
[10:30:05] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:05] [CLEANUP] ========================================
[10:30:05] [SERVER] Starting reconnect polling (5s interval)
[10:30:06] [CLIENT_SIG] Typing stop from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:30:06] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[10:30:07] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:07] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:30:07] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:07] HELLO → sent (cached token, role=query)
[10:30:07] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:30:07] [WS] Query connection failed - cleaning up all agent connections and views
[10:30:07] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:30:07] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:30:07] [CLEANUP] ========================================
[10:30:07] [CLEANUP] Cleaning up all agent connections and views
[10:30:07] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:07] [CLEANUP] Stopped and removed 0 video connections
[10:30:07] [CLEANUP] Removed 0 video views
[10:30:07] [CLEANUP] Removed 0 feed scroll views
[10:30:07] [CLEANUP] Removed 0 status labels
[10:30:07] [CLEANUP] Reset agent query state
[10:30:07] [CLEANUP] Updated page indicator
[10:30:07] [CLEANUP] Rebuilt video layout
[10:30:07] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:07] [CLEANUP] ========================================
[10:30:07] [SERVER] Starting reconnect polling (5s interval)
[10:30:07] [CLEANUP] ========================================
[10:30:07] [CLEANUP] Cleaning up all agent connections and views
[10:30:07] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:07] [CLEANUP] Stopped and removed 0 video connections
[10:30:07] [CLEANUP] Removed 0 video views
[10:30:07] [CLEANUP] Removed 0 feed scroll views
[10:30:07] [CLEANUP] Removed 0 status labels
[10:30:07] [CLEANUP] Reset agent query state
[10:30:07] [CLEANUP] Updated page indicator
[10:30:07] [CLEANUP] Rebuilt video layout
[10:30:07] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:07] [CLEANUP] ========================================
[10:30:07] [SERVER] Starting reconnect polling (5s interval)
[10:30:08] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:08] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:30:08] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:08] HELLO → sent (cached token, role=query)
[10:30:08] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:30:08] [WS] Query connection failed - cleaning up all agent connections and views
[10:30:08] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:30:08] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:30:08] [CLEANUP] ========================================
[10:30:08] [CLEANUP] Cleaning up all agent connections and views
[10:30:08] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:08] [CLEANUP] Stopped and removed 0 video connections
[10:30:08] [CLEANUP] Removed 0 video views
[10:30:08] [CLEANUP] Removed 0 feed scroll views
[10:30:08] [CLEANUP] Removed 0 status labels
[10:30:08] [CLEANUP] Reset agent query state
[10:30:08] [CLEANUP] Updated page indicator
[10:30:08] [CLEANUP] Rebuilt video layout
[10:30:08] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:08] [CLEANUP] ========================================
[10:30:08] [SERVER] Starting reconnect polling (5s interval)
[10:30:08] [CLEANUP] ========================================
[10:30:08] [CLEANUP] Cleaning up all agent connections and views
[10:30:08] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:08] [CLEANUP] Stopped and removed 0 video connections
[10:30:08] [CLEANUP] Removed 0 video views
[10:30:08] [CLEANUP] Removed 0 feed scroll views
[10:30:08] [CLEANUP] Removed 0 status labels
[10:30:08] [CLEANUP] Reset agent query state
[10:30:08] [CLEANUP] Updated page indicator
[10:30:08] [CLEANUP] Rebuilt video layout
[10:30:08] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:08] [CLEANUP] ========================================
[10:30:08] [SERVER] Starting reconnect polling (5s interval)
[10:30:10] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:10] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:30:10] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:10] HELLO → sent (cached token, role=query)
[10:30:10] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:30:10] [WS] Query connection failed - cleaning up all agent connections and views
[10:30:10] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:30:10] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:30:10] [CLEANUP] ========================================
[10:30:10] [CLEANUP] Cleaning up all agent connections and views
[10:30:10] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:10] [CLEANUP] Stopped and removed 0 video connections
[10:30:10] [CLEANUP] Removed 0 video views
[10:30:10] [CLEANUP] Removed 0 feed scroll views
[10:30:10] [CLEANUP] Removed 0 status labels
[10:30:10] [CLEANUP] Reset agent query state
[10:30:10] [CLEANUP] Updated page indicator
[10:30:10] [CLEANUP] Rebuilt video layout
[10:30:10] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:10] [CLEANUP] ========================================
[10:30:10] [SERVER] Starting reconnect polling (5s interval)
[10:30:10] [CLEANUP] ========================================
[10:30:10] [CLEANUP] Cleaning up all agent connections and views
[10:30:10] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:10] [CLEANUP] Stopped and removed 0 video connections
[10:30:10] [CLEANUP] Removed 0 video views
[10:30:10] [CLEANUP] Removed 0 feed scroll views
[10:30:10] [CLEANUP] Removed 0 status labels
[10:30:10] [CLEANUP] Reset agent query state
[10:30:10] [CLEANUP] Updated page indicator
[10:30:10] [CLEANUP] Rebuilt video layout
[10:30:10] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:10] [CLEANUP] ========================================
[10:30:10] [SERVER] Starting reconnect polling (5s interval)
[10:30:10] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[10:30:10] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[10:30:12] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:12] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:30:12] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:12] HELLO → sent (cached token, role=query)
[10:30:12] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:30:12] [WS] Query connection failed - cleaning up all agent connections and views
[10:30:12] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:30:12] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:30:12] [CLEANUP] ========================================
[10:30:12] [CLEANUP] Cleaning up all agent connections and views
[10:30:12] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:12] [CLEANUP] Stopped and removed 0 video connections
[10:30:12] [CLEANUP] Removed 0 video views
[10:30:12] [CLEANUP] Removed 0 feed scroll views
[10:30:12] [CLEANUP] Removed 0 status labels
[10:30:12] [CLEANUP] Reset agent query state
[10:30:12] [CLEANUP] Updated page indicator
[10:30:12] [CLEANUP] Rebuilt video layout
[10:30:12] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:12] [CLEANUP] ========================================
[10:30:12] [SERVER] Starting reconnect polling (5s interval)
[10:30:12] [CLEANUP] ========================================
[10:30:12] [CLEANUP] Cleaning up all agent connections and views
[10:30:12] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:12] [CLEANUP] Stopped and removed 0 video connections
[10:30:12] [CLEANUP] Removed 0 video views
[10:30:12] [CLEANUP] Removed 0 feed scroll views
[10:30:12] [CLEANUP] Removed 0 status labels
[10:30:12] [CLEANUP] Reset agent query state
[10:30:12] [CLEANUP] Updated page indicator
[10:30:12] [CLEANUP] Rebuilt video layout
[10:30:12] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:12] [CLEANUP] ========================================
[10:30:12] [SERVER] Starting reconnect polling (5s interval)
[10:30:13] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[10:30:13] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=52, isReloading=false
[10:30:13] [SEND_MESSAGE] ✅ Added optimistic message id=-3 to arrays, newMsgCount=53
[10:30:13] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=60
[10:30:13] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[-3, 28829, 28828, 28827, 28826]
[10:30:13] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 53 messages
[10:30:13] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-3, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821]
[10:30:13] [RELOAD_TAB] 📊 Building chatRows from 53 messages
[10:30:13] [SCROLL] wasNearBottom=true, threshold=447, offset=4397, contentH=4844, boundsH=447, forceScroll=false
[10:30:13] [RELOAD_TAB] 📊 Built 55 chatRows, estHeight=0.0
[10:30:13] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=62
[10:30:13] [SCROLL] 💓 alive, visible=48...54, rows=55, estHeight=0.0, heightCalls=118
[10:30:13] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:30:13] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[10:30:13] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4474, currentOffset=4474
[10:30:13] [SCROLL] Scrolling to 4474, animated=true
[10:30:13] [CLIENT_SIG] Event received: type=0 messageId=28830
[10:30:13] [WS_EVENT] Received event: type=0, messageId=28830
[10:30:13] [WS_EVENT] 📨 New message notification (msgId=28830) - triggering incremental refresh, currentMsgCount=53
[10:30:13] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=53
[10:30:13] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28829, maxMemoryId=28829
[10:30:13] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28829
[10:30:13] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28830,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 08:30:13"}
[10:30:13] [CHAT] receive_message.php JSON: ["ok": 1, "file_name": , "message_id": 28830, "datesent_utc": 2026-04-23 08:30:13, "message_type": 0, "session_id": ILUIWU]
[10:30:13] [DB_UPGRADE] Upgrading message ID: -3 → 28830, preserveOriginalDate=false
[10:30:13] [DB_UPGRADE] ✅ Upgraded -3 → 28830 with send_status=0, 1 row(s) affected
[10:30:13] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -3 → 28830
[10:30:13] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -3 → 28830
[10:30:13] ReloadData 9
[10:30:13] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:30:13] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28830]
[10:30:13] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 53 msgs, first 10 IDs=[28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821]
[10:30:13] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 53, first 10 IDs=[28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821]
[10:30:13] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:30:13] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=53
[10:30:13] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=53
[10:30:13] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:13] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:30:13] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=61
[10:30:13] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=53, first5Ids=[28830, 28829, 28828, 28827, 28826]
[10:30:13] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 53 messages
[10:30:13] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821]
[10:30:13] [RELOAD_TAB] 📊 Building chatRows from 53 messages
[10:30:13] [SCROLL] wasNearBottom=true, threshold=447, offset=4474, contentH=4921, boundsH=447, forceScroll=true
[10:30:13] [RELOAD_TAB] 📊 Built 55 chatRows, estHeight=0.0
[10:30:13] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[10:30:13] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:13] HELLO → sent (cached token, role=query)
[10:30:13] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4474, currentOffset=4474
[10:30:13] [SCROLL] Scrolling to 4474, animated=false
[10:30:13] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:30:13] [WS] Query connection failed - cleaning up all agent connections and views
[10:30:13] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:30:13] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:30:13] [CLEANUP] ========================================
[10:30:13] [CLEANUP] Cleaning up all agent connections and views
[10:30:13] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:13] [CLEANUP] Stopped and removed 0 video connections
[10:30:13] [CLEANUP] Removed 0 video views
[10:30:13] [CLEANUP] Removed 0 feed scroll views
[10:30:13] [CLEANUP] Removed 0 status labels
[10:30:13] [CLEANUP] Reset agent query state
[10:30:13] [CLEANUP] Updated page indicator
[10:30:13] [CLEANUP] Rebuilt video layout
[10:30:13] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:13] [CLEANUP] ========================================
[10:30:13] [SERVER] Starting reconnect polling (5s interval)
[10:30:13] [CLEANUP] ========================================
[10:30:13] [CLEANUP] Cleaning up all agent connections and views
[10:30:13] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:13] [CLEANUP] Stopped and removed 0 video connections
[10:30:13] [CLEANUP] Removed 0 video views
[10:30:13] [CLEANUP] Removed 0 feed scroll views
[10:30:13] [CLEANUP] Removed 0 status labels
[10:30:13] [CLEANUP] Reset agent query state
[10:30:13] [CLEANUP] Updated page indicator
[10:30:13] [CLEANUP] Rebuilt video layout
[10:30:13] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:13] [CLEANUP] ========================================
[10:30:13] [SERVER] Starting reconnect polling (5s interval)
[10:30:14] [LIFECYCLE] App resigning active - cleared crash flag
[10:30:15] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[10:30:15] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[10:30:15] [SECURITY] Saved background timestamp
[10:30:15] [LIFECYCLE] App entering background - cleared crash flag
[10:30:15] [CLIENT_SIG] Disconnecting
[10:30:15] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[10:30:15] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[10:30:15] [PUSH_TRACE] 💤 BACKGROUND: memory has 53 messages, first 10 IDs=[28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821]
[10:30:15] [LIFECYCLE] Background snapshot: count=53, maxId=28830
[10:30:15] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=3
[10:30:15] [WS] Canceling WebSocket for query connection to iosILUIWU
[10:30:15] In cleanupPeer
[10:30:15] In cleanupPeer
[10:30:15] [LIFECYCLE] WebRTC audio disabled
[10:30:15] [LIFECYCLE] AVAudioSession deactivated
[10:30:15] [LIFECYCLE] All connections stopped
[10:30:15] [CLIENT_SIG] WebSocket closed with code 1001
[10:30:15] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[10:30:15] [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/}
[10:30:15] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[10:30:15] [SERVER] Stopped reconnect polling
[10:30:15] [WS] URLSession invalidated successfully
[10:30:15] Will request stop of video 0
[10:30:15] Will request stop of video 0
[10:30:15] [PIP] Removing 0 tracks from PiP for connection 0
[10:30:15] [PIP] ✅ All tracks removed for connection 0
[10:30:15] [PIP] Removing 0 tracks from PiP for connection 0
[10:30:15] [PIP] ✅ All tracks removed for connection 0
[10:30:15] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:15] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:30:15] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:15] HELLO → sent (cached token, role=query)
[10:30:15] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:30:15] [WS] Query connection failed - cleaning up all agent connections and views
[10:30:15] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:30:15] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:30:15] [CLEANUP] ========================================
[10:30:15] [CLEANUP] Cleaning up all agent connections and views
[10:30:15] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:15] [CLEANUP] Stopped and removed 0 video connections
[10:30:15] [CLEANUP] Removed 0 video views
[10:30:15] [CLEANUP] Removed 0 feed scroll views
[10:30:15] [CLEANUP] Removed 0 status labels
[10:30:15] [CLEANUP] Reset agent query state
[10:30:15] [CLEANUP] Updated page indicator
[10:30:15] [CLEANUP] Rebuilt video layout
[10:30:15] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:15] [CLEANUP] ========================================
[10:30:15] [SERVER] Skipping reconnect polling - app is in background
[10:30:15] [CLEANUP] ========================================
[10:30:15] [CLEANUP] Cleaning up all agent connections and views
[10:30:15] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:15] [CLEANUP] Stopped and removed 0 video connections
[10:30:15] [CLEANUP] Removed 0 video views
[10:30:15] [CLEANUP] Removed 0 feed scroll views
[10:30:15] [CLEANUP] Removed 0 status labels
[10:30:15] [CLEANUP] Reset agent query state
[10:30:15] [CLEANUP] Updated page indicator
[10:30:15] [CLEANUP] Rebuilt video layout
[10:30:15] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:15] [CLEANUP] ========================================
[10:30:15] [SERVER] Skipping reconnect polling - app is in background
[10:30:31] [PUSH] Silent push received
[10:30:31] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:30:31 +0000, appState=2, message_id=nil, type=nil
[10:30:31] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=51, IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:31] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:30:31 +0000
[10:30:31] [PUSH_EMBED] No embedded message_data in notification
[10:30:31] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:30:31] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=51, IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820], handled=false
[10:30:31] [PUSH] No embedded data, pre-loading messages from server
[10:30:31] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:30:31] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:31] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:30:31] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:30:31] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:31] [CLIENT_SIG] WebSocket opened
[10:30:31] HELLO → sent (cached token, role=query)
[10:30:31] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[10:30:31] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:30:31] [WS] Query connection failed - cleaning up all agent connections and views
[10:30:31] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:30:31] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:30:31] [CLIENT_SIG] Connected! clientId=4kYUx8lo9s7Eo1qz
[10:30:31] [CLEANUP] ========================================
[10:30:31] [CLEANUP] Cleaning up all agent connections and views
[10:30:31] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:31] [CLEANUP] Stopped and removed 0 video connections
[10:30:31] [CLEANUP] Removed 0 video views
[10:30:31] [CLEANUP] Removed 0 feed scroll views
[10:30:31] [CLEANUP] Removed 0 status labels
[10:30:31] [CLEANUP] Reset agent query state
[10:30:31] [CLEANUP] Updated page indicator
[10:30:31] [CLEANUP] Rebuilt video layout
[10:30:31] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:31] [CLEANUP] ========================================
[10:30:31] [SERVER] Skipping reconnect polling - app is in background
[10:30:31] [CLEANUP] ========================================
[10:30:31] [CLEANUP] Cleaning up all agent connections and views
[10:30:31] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:31] [CLEANUP] Stopped and removed 0 video connections
[10:30:31] [CLEANUP] Removed 0 video views
[10:30:31] [CLEANUP] Removed 0 feed scroll views
[10:30:31] [CLEANUP] Removed 0 status labels
[10:30:31] [CLEANUP] Reset agent query state
[10:30:31] [CLEANUP] Updated page indicator
[10:30:31] [CLEANUP] Rebuilt video layout
[10:30:31] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:31] [CLEANUP] ========================================
[10:30:31] [SERVER] Skipping reconnect polling - app is in background
[10:30:31] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[10:30:31] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:30:31] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:30:31] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:30:31] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:30:31] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:30:31] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:30:31] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:30:31] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:30:31] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821]
[10:30:31] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=51, IDs=[28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821, 28820]
[10:30:31] [PRELOAD_CACHE] Preserving 2 push-inserted messages: [28739, 28738]
[10:30:31] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=2, IDs=[28739, 28738]
[10:30:31] [PUSH_TRACE] 🔀 mergeMessages: merged.count=52, first 10 IDs=[28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821]
[10:30:31] [PUSH_PRELOAD] ⚡ Pre-cached 52 messages for instant display (preserved 2 from push)
[10:30:31] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:30:31] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 53 msgs, IDs=[28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821]
[10:30:31] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2166 vccs=0
[10:30:31] [GAP_FIX] maxMessageIdAtBackground=28830, currentMaxLocalId=28830
[10:30:31] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28830]
[10:30:31] [PUSH] Parsed message_id: 28830
[10:30:31] [PUSH] Parsed operation_type: 3
[10:30:31] [PUSH] Taking direct action: opType=3, messageId=28830
[10:30:31] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28830
[10:30:31] [GAP_FIX] Post-action sync: using background max 28830 to catch coalesced messages
[10:30:31] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=53
[10:30:31] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28830, maxMemoryId=28830
[10:30:31] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28830
[10:30:31] [INCREMENTAL_SYNC] ✅ No new messages
[10:30:31] [CLIENT_SIG] Event received: type=3 messageId=28830
[10:30:31] [WS_EVENT] Received event: type=3, messageId=28830
[10:30:31] [WS_EVENT] Read receipt for message 28830 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:30:32] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:32] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:30:32] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:30:32] HELLO → sent (cached token, role=query)
[10:30:32] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:30:33] [WS] Query connection failed - cleaning up all agent connections and views
[10:30:33] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:30:33] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:30:33] [CLEANUP] ========================================
[10:30:33] [CLEANUP] Cleaning up all agent connections and views
[10:30:33] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:33] [CLEANUP] Stopped and removed 0 video connections
[10:30:33] [CLEANUP] Removed 0 video views
[10:30:33] [CLEANUP] Removed 0 feed scroll views
[10:30:33] [CLEANUP] Removed 0 status labels
[10:30:33] [CLEANUP] Reset agent query state
[10:30:33] [CLEANUP] Updated page indicator
[10:30:33] [CLEANUP] Rebuilt video layout
[10:30:33] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:33] [CLEANUP] ========================================
[10:30:33] [SERVER] Skipping reconnect polling - app is in background
[10:30:33] [CLEANUP] ========================================
[10:30:33] [CLEANUP] Cleaning up all agent connections and views
[10:30:33] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:30:33] [CLEANUP] Stopped and removed 0 video connections
[10:30:33] [CLEANUP] Removed 0 video views
[10:30:33] [CLEANUP] Removed 0 feed scroll views
[10:30:33] [CLEANUP] Removed 0 status labels
[10:30:33] [CLEANUP] Reset agent query state
[10:30:33] [CLEANUP] Updated page indicator
[10:30:33] [CLEANUP] Rebuilt video layout
[10:30:33] [CLEANUP] ✅ All agent connections and views cleaned up
[10:30:33] [CLEANUP] ========================================
[10:30:33] [SERVER] Skipping reconnect polling - app is in background
[10:31:12] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:12] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:12] [PUSH] Silent push received
[10:31:12] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:31:12 +0000, appState=2, message_id=28831, type=nil
[10:31:12] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=52, IDs=[28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821]
[10:31:12] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:31:12 +0000
[10:31:12] [PUSH_TRACE] ⬇️ Processing embedded message_id=28831
[10:31:12] [PUSH_EMBED] 📩 Received embedded message: id=28831, type=0, sender=Esra
[10:31:12] [PUSH_TRACE] ⬇️ Message details: text="Lets test the notifications. Otherwise I need to m...", datesent=2026-04-23 08:31:11
[10:31:12] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[10:31:12] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28831
[10:31:12] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28831
[10:31:12] [PUSH_EMBED] ✅ Saved message 28831 to local DB (sync)
[10:31:12] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28831
[10:31:12] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28831
[10:31:12] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28831
[10:31:12] [PUSH_TRACE] 📦 Cache state: valid=true, count=52, IDs=[28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821]
[10:31:12] [PUSH_EMBED] Inserted message 28831 into existing cache (now 53 messages)
[10:31:12] [PUSH_TRACE] 📦 ✅ Inserted message 28831, cache now has IDs: [28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:12] [PUSH_TRACE] 📦 EXITING cache update queue for message 28831
[10:31:12] [PUSH_EMBED] Fetching evolution data for message 28831 in background
[10:31:12] [PUSH_EMBED] ✅ Fully processed message 28831
[10:31:12] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28831
[10:31:12] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=53, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822], handled=true
[10:31:12] [PUSH] Embedded message handled instantly from silent push
[10:31:12] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[10:31:12] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28831
[10:31:12] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[10:31:12] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 53 msgs, IDs=[28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821]
[10:31:12] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=2 secsSinceLastPong=2208 vccs=0
[10:31:12] [GAP_FIX] maxMessageIdAtBackground=28830, currentMaxLocalId=28831
[10:31:12] [PUSH] handlePollEventsNotification userInfo: [:]
[10:31:12] [PUSH] No message_id in userInfo
[10:31:12] [PUSH] No operation_type in userInfo
[10:31:12] [FAST_REFRESH] Evolution disabled - performing incremental sync
[10:31:12] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=53, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:12] [PUSH_TRACE] 📬 POLL: memory state: count=53, first 10 IDs=[28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822, 28821]
[10:31:12] [FAST_REFRESH] Already have 53 messages in memory
[10:31:12] [FAST_REFRESH] maxMemoryId=28830, maxLocalId=28831
[10:31:12] [FAST_REFRESH] 🌙 Found 1 overnight messages in local DB (IDs > 28830)
[10:31:12] [FAST_REFRESH] 🌙 Merged 1 overnight messages into memory (now 54 total)
[10:31:12] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[10:31:12] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=54
[10:31:12] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[10:31:12] [READBY_OPT] No message IDs to fetch - skipping server call
[10:31:12] [GAP_FIX] Incremental sync will use since_id=28830 (background max=28830, current DB max=28831)
[10:31:12] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=54
[10:31:12] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28830, maxMemoryId=28831
[10:31:12] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28830
[10:31:12] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[10:31:12] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[10:31:12] [PUSH_TRACE] 👁️ Received message id=28831, text="Lets test the notifications. O..."
[10:31:12] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[10:31:12] [PUSH_UI] Message 28831 already in memory - skipping insert
[10:31:12] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[10:31:12] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 54 msgs, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:12] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=2 secsSinceLastPong=2208 vccs=0
[10:31:12] [GAP_FIX] maxMessageIdAtBackground=28830, currentMaxLocalId=28831
[10:31:12] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("thumb_file_name"): , AnyHashable("message"): Lets test the notifications. Otherwise I need to mute in app settings., AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:31:11";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Lets test the notifications. Otherwise I need to mute in app settings.";
    "message_id" = 28831;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28830;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("sender_name"): Esra, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("session_id"): ILUIWU, AnyHashable("message_type"): 0, AnyHashable("message_id"): 28831, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("operation_type"): 0, AnyHashable("file_name"): , AnyHashable("datesent"): 2026-04-23 08:31:11, AnyHashable("timer"): 0]
[10:31:12] [PUSH_EMBED_VC] Message 28831 already in memory - skipping
[10:31:12] [PUSH] ⚡ Embedded message handled directly in ViewController
[10:31:12] [PUSH] Parsed message_id: 28831
[10:31:12] [PUSH] Parsed operation_type: 0
[10:31:12] [PUSH] Taking direct action: opType=0, messageId=28831
[10:31:12] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28831
[10:31:12] [PUSH] ⚡ Message 28831 already in memory - skipping duplicate notification entirely
[10:31:12] [GAP_FIX] Post-action sync: using background max 28830 to catch coalesced messages
[10:31:12] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[10:31:12] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[10:31:12] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=54
[10:31:12] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:31:13] [PUSH_EMBED] Got evolution data for message 28831, saving to local DB
[10:31:13] [PUSH_EMBED] Saved evolution data for message 28831
[10:31:13] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:13] HELLO → sent (cached token, role=query)
[10:31:13] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=61
[10:31:13] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[28831, 28830, 28829, 28828, 28827]
[10:31:13] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 54 messages
[10:31:13] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:13] [RELOAD_TAB] 📊 Building chatRows from 54 messages
[10:31:13] [SCROLL] wasNearBottom=true, threshold=447, offset=4474, contentH=4921, boundsH=447, forceScroll=false
[10:31:13] [RELOAD_TAB] 📊 Built 56 chatRows, estHeight=0.0
[10:31:13] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:31:13] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28831]
[10:31:13] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28830 → 28831
[10:31:13] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=63
[10:31:13] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 54 msgs, first 10 IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:13] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 54, first 10 IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:13] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:31:13] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=54
[10:31:13] [INCREMENTAL_SYNC] 🔁 Processing queued retry refresh
[10:31:13] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=54
[10:31:13] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28831, maxMemoryId=28831
[10:31:13] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28831
[10:31:13] [SCROLL] Async handler: shouldScroll=false (force=false, newMsgs=false, nearBottom=true), maxY=4572, currentOffset=4474
[10:31:13] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:13] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:13] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:13] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:13] [FAST_REFRESH] Incremental sync complete - 54 messages
[10:31:13] [CLEANUP] ========================================
[10:31:13] [CLEANUP] Cleaning up all agent connections and views
[10:31:13] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:13] [CLEANUP] Stopped and removed 0 video connections
[10:31:13] [CLEANUP] Removed 0 video views
[10:31:13] [CLEANUP] Removed 0 feed scroll views
[10:31:13] [CLEANUP] Removed 0 status labels
[10:31:13] [CLEANUP] Reset agent query state
[10:31:13] [CLEANUP] Updated page indicator
[10:31:13] [CLEANUP] Rebuilt video layout
[10:31:13] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:13] [CLEANUP] ========================================
[10:31:13] [SERVER] Skipping reconnect polling - app is in background
[10:31:13] [CLEANUP] ========================================
[10:31:13] [CLEANUP] Cleaning up all agent connections and views
[10:31:13] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:13] [CLEANUP] Stopped and removed 0 video connections
[10:31:13] [CLEANUP] Removed 0 video views
[10:31:13] [CLEANUP] Removed 0 feed scroll views
[10:31:13] [CLEANUP] Removed 0 status labels
[10:31:13] [CLEANUP] Reset agent query state
[10:31:13] [CLEANUP] Updated page indicator
[10:31:13] [CLEANUP] Rebuilt video layout
[10:31:13] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:13] [CLEANUP] ========================================
[10:31:13] [SERVER] Skipping reconnect polling - app is in background
[10:31:13] [INCREMENTAL_SYNC] ✅ No new messages
[10:31:13] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=63
[10:31:13] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[28831, 28830, 28829, 28828, 28827]
[10:31:13] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 54 messages
[10:31:13] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:13] [RELOAD_TAB] 📊 Building chatRows from 54 messages
[10:31:13] [SCROLL] wasNearBottom=true, threshold=447, offset=4474, contentH=5019, boundsH=447, forceScroll=false
[10:31:13] [RELOAD_TAB] 📊 Built 56 chatRows, estHeight=0.0
[10:31:13] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[10:31:14] [PUSH] Silent push received
[10:31:14] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:31:14 +0000, appState=2, message_id=nil, type=nil
[10:31:14] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=53, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:14] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:31:14 +0000
[10:31:14] [PUSH_EMBED] No embedded message_data in notification
[10:31:14] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:31:14] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=53, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822], handled=false
[10:31:14] [PUSH] No embedded data, pre-loading messages from server
[10:31:14] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:31:14] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:14] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:14] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:14] HELLO → sent (cached token, role=query)
[10:31:14] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:14] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:14] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:14] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:14] [CLEANUP] ========================================
[10:31:14] [CLEANUP] Cleaning up all agent connections and views
[10:31:14] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:14] [CLEANUP] Stopped and removed 0 video connections
[10:31:14] [CLEANUP] Removed 0 video views
[10:31:14] [CLEANUP] Removed 0 feed scroll views
[10:31:14] [CLEANUP] Removed 0 status labels
[10:31:14] [CLEANUP] Reset agent query state
[10:31:14] [CLEANUP] Updated page indicator
[10:31:14] [CLEANUP] Rebuilt video layout
[10:31:14] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:14] [CLEANUP] ========================================
[10:31:14] [SERVER] Skipping reconnect polling - app is in background
[10:31:14] [CLEANUP] ========================================
[10:31:14] [CLEANUP] Cleaning up all agent connections and views
[10:31:14] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:14] [CLEANUP] Stopped and removed 0 video connections
[10:31:14] [CLEANUP] Removed 0 video views
[10:31:14] [CLEANUP] Removed 0 feed scroll views
[10:31:14] [CLEANUP] Removed 0 status labels
[10:31:14] [CLEANUP] Reset agent query state
[10:31:14] [CLEANUP] Updated page indicator
[10:31:14] [CLEANUP] Rebuilt video layout
[10:31:14] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:14] [CLEANUP] ========================================
[10:31:14] [SERVER] Skipping reconnect polling - app is in background
[10:31:15] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:31:15] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:31:15] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:31:15] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:31:15] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:31:15] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:31:15] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:15] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=53, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:15] [PRELOAD_CACHE] Preserving 3 push-inserted messages: [28740, 28739, 28738]
[10:31:15] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=3, IDs=[28740, 28739, 28738]
[10:31:15] [PUSH_TRACE] 🔀 mergeMessages: merged.count=53, first 10 IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:15] [PUSH_PRELOAD] ⚡ Pre-cached 53 messages for instant display (preserved 3 from push)
[10:31:15] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:31:15] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 54 msgs, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:15] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2210 vccs=0
[10:31:15] [GAP_FIX] maxMessageIdAtBackground=28830, currentMaxLocalId=28831
[10:31:15] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28831, AnyHashable("operation_type"): 3]
[10:31:15] [PUSH] Parsed message_id: 28831
[10:31:15] [PUSH] Parsed operation_type: 3
[10:31:15] [PUSH] Taking direct action: opType=3, messageId=28831
[10:31:15] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28831
[10:31:15] [GAP_FIX] Post-action sync: using background max 28830 to catch coalesced messages
[10:31:15] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=54
[10:31:15] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28830, maxMemoryId=28831
[10:31:15] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28830
[10:31:15] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:31:15] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28831]
[10:31:15] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 54 msgs, first 10 IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:15] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 54, first 10 IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:15] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:31:15] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=54
[10:31:15] [SCROLL_END_DECEL] messagesTable offsetY=4474, insetTop=0, pendingVelocityY=0.0
[10:31:15] [SCROLL] 💓 alive, visible=49...55, rows=56, estHeight=0.0, heightCalls=1
[10:31:15] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:31:15] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[28831, 28830, 28829, 28828, 28827]
[10:31:15] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 54 messages
[10:31:15] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:15] [RELOAD_TAB] 📊 Building chatRows from 54 messages
[10:31:15] [SCROLL] wasNearBottom=true, threshold=447, offset=4559, contentH=5019, boundsH=447, forceScroll=false
[10:31:15] [RELOAD_TAB] 📊 Built 56 chatRows, estHeight=0.0
[10:31:15] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[10:31:15] [SCROLL_END_DECEL] messagesTable offsetY=4572, insetTop=0, pendingVelocityY=0.0
[10:31:23] [PUSH] Notification tapped - session_id: ILUIWU
[10:31:23] [PUSH] Max message_id before tap: 28831
[10:31:23] [PUSH] Stored pending session: ILUIWU
[10:31:23] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:31:23 +0000
[10:31:23] [PUSH_TRACE] ⬇️ Processing embedded message_id=28831
[10:31:23] [PUSH_EMBED] 📩 Received embedded message: id=28831, type=0, sender=Esra
[10:31:23] [PUSH_TRACE] ⬇️ Message details: text="Lets test the notifications. Otherwise I need to m...", datesent=2026-04-23 08:31:11
[10:31:23] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[10:31:23] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28831
[10:31:23] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28831
[10:31:23] [PUSH_EMBED] ✅ Saved message 28831 to local DB (sync)
[10:31:23] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28831
[10:31:23] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28831
[10:31:23] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28831
[10:31:23] [PUSH_TRACE] 📦 Cache state: valid=true, count=53, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:23] [PUSH_TRACE] 📦 ⚠️ Message 28831 already in cache, skipping insert
[10:31:23] [PUSH_TRACE] 📦 EXITING cache update queue for message 28831
[10:31:23] [PUSH_EMBED] Fetching evolution data for message 28831 in background
[10:31:23] [PUSH_EMBED] ✅ Fully processed message 28831
[10:31:23] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28831
[10:31:23] [PUSH] Embedded message handled instantly on tap
[10:31:23] [SECURITY] Timeout check: elapsed=68.09459519386292s, timeout=300.0s
[10:31:23] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[10:31:23] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[10:31:23] [PUSH] Fetching server messages since_id=28831 to catch coalesced notifications on tap
[10:31:23] [PUSH_PRELOAD] Fetching up to 50 messages since_id=28831 to catch coalesced notifications
[10:31:23] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:31:23] [LIFECYCLE] App entering foreground - restoring connections
[10:31:23] [CAPTURE] Live-feed protection [app-will-enter-foreground] - fullscreen=false, isCaptured=false, secureReady=true
[10:31:23] [CAPTURE] Refresh overlay [app-will-enter-foreground] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[10:31:23] [PUSH_TRACE] 🔄 FOREGROUND: memory has 54 msgs, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:23] [PUSH_TRACE] 🔄 FOREGROUND: cache has 53 msgs, valid=true, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:23] [UPLOAD_RETRY] No pending uploads to retry
[10:31:23] [NETWORK] Status changed: connected
[10:31:23] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=54
[10:31:23] [READBY_OPT] No message IDs to fetch - skipping server call
[10:31:23] [LIFECYCLE] WebRTC audio re-enabled
[10:31:23] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[10:31:23] [CLIENT_SIG] Skipping connect - app in background (state=2)
[10:31:23] [VIEWER] Reconnecting after background - querying agents
[10:31:23] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=completed
[10:31:23] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:31:23] [UNSENT_RETRY] Checking for unsent messages...
[10:31:23] [PENDING_UPLOAD] Total pending upload messages: 0
[10:31:23] [UNSENT_RETRY] No unsent messages found
[10:31:23] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:23] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:23] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[10:31:23] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[10:31:23] [PUSH_TRACE] 👁️ Received message id=28831, text="Lets test the notifications. O..."
[10:31:23] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[10:31:23] [PUSH_UI] Message 28831 already in memory - skipping insert
[10:31:23] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[10:31:23] [CLIENT_SIG] Task completed with error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <C239F834-B9E8-435F-BCD9-79452D5E35F3>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <C239F834-B9E8-435F-BCD9-79452D5E35F3>.<1>, NSLocalizedDescription=The network connection was lost.}
[10:31:23] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[10:31:23] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=89 "Operation canceled" UserInfo={NSDescription=Operation canceled}
[10:31:23] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[10:31:23] [FOREGROUND] Enriched 0/0 unsettled messages with readBy data
[10:31:23] [LIFECYCLE] scrollToBottomIfNeeded time=false, count=54>53=true, maxId=28831>28830=true, shouldScroll=true
[10:31:23] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=54
[10:31:23] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:31:23] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:23] HELLO → sent (cached token, role=query)
[10:31:23] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:23] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:23] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:23] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:23] [CLEANUP] ========================================
[10:31:23] [CLEANUP] Cleaning up all agent connections and views
[10:31:23] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:23] [CLEANUP] Stopped and removed 0 video connections
[10:31:23] [CLEANUP] Removed 0 video views
[10:31:23] [CLEANUP] Removed 0 feed scroll views
[10:31:23] [CLEANUP] Removed 0 status labels
[10:31:23] [CLEANUP] Reset agent query state
[10:31:23] [CLEANUP] Updated page indicator
[10:31:23] [CLEANUP] Rebuilt video layout
[10:31:23] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:23] [CLEANUP] ========================================
[10:31:23] [SERVER] Starting reconnect polling (5s interval)
[10:31:23] [CLEANUP] ========================================
[10:31:23] [CLEANUP] Cleaning up all agent connections and views
[10:31:23] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:23] [CLEANUP] Stopped and removed 0 video connections
[10:31:23] [CLEANUP] Removed 0 video views
[10:31:23] [CLEANUP] Removed 0 feed scroll views
[10:31:23] [CLEANUP] Removed 0 status labels
[10:31:23] [CLEANUP] Reset agent query state
[10:31:23] [CLEANUP] Updated page indicator
[10:31:23] [CLEANUP] Rebuilt video layout
[10:31:23] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:23] [CLEANUP] ========================================
[10:31:23] [SERVER] Starting reconnect polling (5s interval)
[10:31:23] [PUSH_EMBED] Got evolution data for message 28831, saving to local DB
[10:31:23] [PUSH_EMBED] Saved evolution data for message 28831
[10:31:23] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:31:23] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[28831, 28830, 28829, 28828, 28827]
[10:31:23] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 54 messages
[10:31:23] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:23] [RELOAD_TAB] 📊 Building chatRows from 54 messages
[10:31:23] [SCROLL] wasNearBottom=true, threshold=447, offset=4572, contentH=5019, boundsH=447, forceScroll=true
[10:31:23] [RELOAD_TAB] 📊 Built 56 chatRows, estHeight=0.0
[10:31:23] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[10:31:23] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4572, currentOffset=4572
[10:31:23] [SCROLL] Scrolling to 4572, animated=false
[10:31:23] [PUSH_PRELOAD] No messages or parse error
[10:31:23] [PUSH] Server fetch on tap completed (success=false)
[10:31:23] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 54 msgs, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:23] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2218 vccs=0
[10:31:23] [GAP_FIX] maxMessageIdAtBackground=28830, currentMaxLocalId=28831
[10:31:23] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28831, AnyHashable("message_type"): 0, AnyHashable("message"): Lets test the notifications. Otherwise I need to mute in app settings., AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("sender_name"): Esra, AnyHashable("datesent"): 2026-04-23 08:31:11, AnyHashable("file_name"): , AnyHashable("thumb_file_name"): , AnyHashable("session_id"): ILUIWU, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:31:11";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Lets test the notifications. Otherwise I need to mute in app settings.";
    "message_id" = 28831;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28830;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("timer"): 0, AnyHashable("operation_type"): 0]
[10:31:23] [PUSH_EMBED_VC] Message 28831 already in memory - skipping
[10:31:23] [PUSH] ⚡ Embedded message handled directly in ViewController
[10:31:23] [PUSH] Parsed message_id: 28831
[10:31:23] [PUSH] Parsed operation_type: 0
[10:31:23] [PUSH] Taking direct action: opType=0, messageId=28831
[10:31:23] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28831
[10:31:23] [PUSH] ⚡ Message 28831 already in memory - skipping duplicate notification entirely
[10:31:23] [GAP_FIX] Post-action sync: using background max 28830 to catch coalesced messages
[10:31:23] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=54
[10:31:23] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28830, maxMemoryId=28831
[10:31:23] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28830
[10:31:23] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:31:23] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28831]
[10:31:23] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 54 msgs, first 10 IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:23] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 54, first 10 IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:23] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:31:23] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=54
[10:31:23] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=61
[10:31:23] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[28831, 28830, 28829, 28828, 28827]
[10:31:23] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 54 messages
[10:31:23] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:23] [RELOAD_TAB] 📊 Building chatRows from 54 messages
[10:31:23] [SCROLL] wasNearBottom=true, threshold=447, offset=4572, contentH=5019, boundsH=447, forceScroll=true
[10:31:23] [RELOAD_TAB] 📊 Built 56 chatRows, estHeight=0.0
[10:31:23] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[10:31:23] [SECURITY] sceneDidBecomeActive - isAuthenticated=true, didEnterBackground=true
[10:31:23] [SECURITY] Within timeout - cleared background flag
[10:31:23] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[10:31:23] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 54 msgs, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:23] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2218 vccs=0
[10:31:23] [GAP_FIX] maxMessageIdAtBackground=28830, currentMaxLocalId=28831
[10:31:23] [PUSH] handlePollEventsNotification userInfo: [:]
[10:31:23] [PUSH] No message_id in userInfo
[10:31:23] [PUSH] No operation_type in userInfo
[10:31:23] [FAST_REFRESH] Evolution disabled - performing incremental sync
[10:31:23] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=53, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:23] [PUSH_TRACE] 📬 POLL: memory state: count=54, first 10 IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:23] [FAST_REFRESH] Already have 54 messages in memory
[10:31:23] [FAST_REFRESH] maxMemoryId=28831, maxLocalId=28831
[10:31:23] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[10:31:23] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=54
[10:31:23] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[10:31:23] [READBY_OPT] No message IDs to fetch - skipping server call
[10:31:23] [GAP_FIX] Incremental sync will use since_id=28830 (background max=28830, current DB max=28831)
[10:31:23] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=54
[10:31:23] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28830, maxMemoryId=28831
[10:31:23] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28830
[10:31:23] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4572, currentOffset=4572
[10:31:23] [SCROLL] Scrolling to 4572, animated=false
[10:31:23] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[10:31:23] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=54
[10:31:23] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:31:23] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:31:23] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28831]
[10:31:23] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 54 msgs, first 10 IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:23] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 54, first 10 IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:23] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:31:23] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=54
[10:31:23] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:31:23] [FAST_REFRESH] Incremental sync complete - 54 messages
[10:31:23] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=61
[10:31:23] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=54, first5Ids=[28831, 28830, 28829, 28828, 28827]
[10:31:23] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 54 messages
[10:31:23] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:23] [RELOAD_TAB] 📊 Building chatRows from 54 messages
[10:31:23] [SCROLL] wasNearBottom=true, threshold=447, offset=4572, contentH=5019, boundsH=447, forceScroll=true
[10:31:23] [RELOAD_TAB] 📊 Built 56 chatRows, estHeight=0.0
[10:31:24] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=61
[10:31:24] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4572, currentOffset=4572
[10:31:24] [SCROLL] Scrolling to 4572, animated=false
[10:31:24] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:24] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:24] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:24] HELLO → sent (cached token, role=query)
[10:31:24] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:24] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:24] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:24] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:24] [CLEANUP] ========================================
[10:31:24] [CLEANUP] Cleaning up all agent connections and views
[10:31:24] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:24] [CLEANUP] Stopped and removed 0 video connections
[10:31:24] [CLEANUP] Removed 0 video views
[10:31:24] [CLEANUP] Removed 0 feed scroll views
[10:31:24] [CLEANUP] Removed 0 status labels
[10:31:24] [CLEANUP] Reset agent query state
[10:31:24] [CLEANUP] Updated page indicator
[10:31:24] [CLEANUP] Rebuilt video layout
[10:31:24] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:24] [CLEANUP] ========================================
[10:31:25] [SERVER] Starting reconnect polling (5s interval)
[10:31:25] [CLEANUP] ========================================
[10:31:25] [CLEANUP] Cleaning up all agent connections and views
[10:31:25] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:25] [CLEANUP] Stopped and removed 0 video connections
[10:31:25] [CLEANUP] Removed 0 video views
[10:31:25] [CLEANUP] Removed 0 feed scroll views
[10:31:25] [CLEANUP] Removed 0 status labels
[10:31:25] [CLEANUP] Reset agent query state
[10:31:25] [CLEANUP] Updated page indicator
[10:31:25] [CLEANUP] Rebuilt video layout
[10:31:25] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:25] [CLEANUP] ========================================
[10:31:25] [SERVER] Starting reconnect polling (5s interval)
[10:31:26] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:26] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:26] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:26] HELLO → sent (cached token, role=query)
[10:31:26] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:26] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:26] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:26] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:26] [CLEANUP] ========================================
[10:31:26] [CLEANUP] Cleaning up all agent connections and views
[10:31:26] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:26] [CLEANUP] Stopped and removed 0 video connections
[10:31:26] [CLEANUP] Removed 0 video views
[10:31:26] [CLEANUP] Removed 0 feed scroll views
[10:31:26] [CLEANUP] Removed 0 status labels
[10:31:26] [CLEANUP] Reset agent query state
[10:31:26] [CLEANUP] Updated page indicator
[10:31:26] [CLEANUP] Rebuilt video layout
[10:31:26] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:26] [CLEANUP] ========================================
[10:31:26] [SERVER] Starting reconnect polling (5s interval)
[10:31:26] [CLEANUP] ========================================
[10:31:26] [CLEANUP] Cleaning up all agent connections and views
[10:31:26] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:26] [CLEANUP] Stopped and removed 0 video connections
[10:31:26] [CLEANUP] Removed 0 video views
[10:31:26] [CLEANUP] Removed 0 feed scroll views
[10:31:26] [CLEANUP] Removed 0 status labels
[10:31:26] [CLEANUP] Reset agent query state
[10:31:26] [CLEANUP] Updated page indicator
[10:31:26] [CLEANUP] Rebuilt video layout
[10:31:26] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:26] [CLEANUP] ========================================
[10:31:26] [SERVER] Starting reconnect polling (5s interval)
[10:31:27] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:31:27] [CLIENT_SIG] WebSocket opened
[10:31:27] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[10:31:27] [CLIENT_SIG] Connected! clientId=tLg_8iAlZK4uaKhx
[10:31:27] [CLIENT_SIG] Received 1 clients for session 'ILUIWU' (my session: 'ILUIWU')
[10:31:27] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:31:28] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:28] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:28] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:28] HELLO → sent (cached token, role=query)
[10:31:28] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:28] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:28] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:28] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:28] [CLEANUP] ========================================
[10:31:28] [CLEANUP] Cleaning up all agent connections and views
[10:31:28] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:28] [CLEANUP] Stopped and removed 0 video connections
[10:31:28] [CLEANUP] Removed 0 video views
[10:31:28] [CLEANUP] Removed 0 feed scroll views
[10:31:28] [CLEANUP] Removed 0 status labels
[10:31:28] [CLEANUP] Reset agent query state
[10:31:28] [CLEANUP] Updated page indicator
[10:31:28] [CLEANUP] Rebuilt video layout
[10:31:28] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:28] [CLEANUP] ========================================
[10:31:28] [SERVER] Starting reconnect polling (5s interval)
[10:31:28] [CLEANUP] ========================================
[10:31:28] [CLEANUP] Cleaning up all agent connections and views
[10:31:28] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:28] [CLEANUP] Stopped and removed 0 video connections
[10:31:28] [CLEANUP] Removed 0 video views
[10:31:28] [CLEANUP] Removed 0 feed scroll views
[10:31:28] [CLEANUP] Removed 0 status labels
[10:31:28] [CLEANUP] Reset agent query state
[10:31:28] [CLEANUP] Updated page indicator
[10:31:28] [CLEANUP] Rebuilt video layout
[10:31:28] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:28] [CLEANUP] ========================================
[10:31:28] [SERVER] Starting reconnect polling (5s interval)
[10:31:29] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:29] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:29] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:29] HELLO → sent (cached token, role=query)
[10:31:29] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:29] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:29] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:29] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:29] [CLEANUP] ========================================
[10:31:29] [CLEANUP] Cleaning up all agent connections and views
[10:31:29] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:29] [CLEANUP] Stopped and removed 0 video connections
[10:31:29] [CLEANUP] Removed 0 video views
[10:31:29] [CLEANUP] Removed 0 feed scroll views
[10:31:29] [CLEANUP] Removed 0 status labels
[10:31:29] [CLEANUP] Reset agent query state
[10:31:29] [CLEANUP] Updated page indicator
[10:31:29] [CLEANUP] Rebuilt video layout
[10:31:29] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:29] [CLEANUP] ========================================
[10:31:29] [SERVER] Starting reconnect polling (5s interval)
[10:31:29] [CLEANUP] ========================================
[10:31:29] [CLEANUP] Cleaning up all agent connections and views
[10:31:29] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:29] [CLEANUP] Stopped and removed 0 video connections
[10:31:29] [CLEANUP] Removed 0 video views
[10:31:29] [CLEANUP] Removed 0 feed scroll views
[10:31:29] [CLEANUP] Removed 0 status labels
[10:31:29] [CLEANUP] Reset agent query state
[10:31:29] [CLEANUP] Updated page indicator
[10:31:29] [CLEANUP] Rebuilt video layout
[10:31:29] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:29] [CLEANUP] ========================================
[10:31:29] [SERVER] Starting reconnect polling (5s interval)
[10:31:31] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[10:31:31] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=54, isReloading=false
[10:31:31] [SEND_MESSAGE] ✅ Added optimistic message id=-4 to arrays, newMsgCount=55
[10:31:31] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=61
[10:31:31] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=55, first5Ids=[-4, 28831, 28830, 28829, 28828]
[10:31:31] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 55 messages
[10:31:31] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-4, 28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823]
[10:31:31] [RELOAD_TAB] 📊 Building chatRows from 55 messages
[10:31:31] [SCROLL] wasNearBottom=true, threshold=447, offset=4572, contentH=5019, boundsH=447, forceScroll=false
[10:31:31] [RELOAD_TAB] 📊 Built 57 chatRows, estHeight=0.0
[10:31:31] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=63
[10:31:31] [SCROLL] 💓 alive, visible=51...56, rows=57, estHeight=0.0, heightCalls=121
[10:31:31] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:31:31] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[10:31:31] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4649, currentOffset=4649
[10:31:31] [SCROLL] Scrolling to 4649, animated=true
[10:31:31] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:31] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:31] [CLIENT_SIG] Event received: type=0 messageId=28832
[10:31:31] [WS_EVENT] Received event: type=0, messageId=28832
[10:31:31] [WS_EVENT] 📨 New message notification (msgId=28832) - triggering incremental refresh, currentMsgCount=55
[10:31:31] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=55
[10:31:31] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28831, maxMemoryId=28831
[10:31:31] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28831
[10:31:31] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28832,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 08:31:31"}
[10:31:31] [CHAT] receive_message.php JSON: ["message_id": 28832, "ok": 1, "datesent_utc": 2026-04-23 08:31:31, "message_type": 0, "session_id": ILUIWU, "file_name": ]
[10:31:31] [DB_UPGRADE] Upgrading message ID: -4 → 28832, preserveOriginalDate=false
[10:31:31] [DB_UPGRADE] ✅ Upgraded -4 → 28832 with send_status=0, 1 row(s) affected
[10:31:31] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -4 → 28832
[10:31:31] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -4 → 28832
[10:31:31] ReloadData 9
[10:31:31] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:31] HELLO → sent (cached token, role=query)
[10:31:31] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:31] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:31] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:31] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:31] [CLEANUP] ========================================
[10:31:31] [CLEANUP] Cleaning up all agent connections and views
[10:31:31] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:31] [CLEANUP] Stopped and removed 0 video connections
[10:31:31] [CLEANUP] Removed 0 video views
[10:31:31] [CLEANUP] Removed 0 feed scroll views
[10:31:31] [CLEANUP] Removed 0 status labels
[10:31:31] [CLEANUP] Reset agent query state
[10:31:31] [CLEANUP] Updated page indicator
[10:31:31] [CLEANUP] Rebuilt video layout
[10:31:31] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:31] [CLEANUP] ========================================
[10:31:31] [SERVER] Starting reconnect polling (5s interval)
[10:31:31] [CLEANUP] ========================================
[10:31:31] [CLEANUP] Cleaning up all agent connections and views
[10:31:31] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:31] [CLEANUP] Stopped and removed 0 video connections
[10:31:31] [CLEANUP] Removed 0 video views
[10:31:31] [CLEANUP] Removed 0 feed scroll views
[10:31:31] [CLEANUP] Removed 0 status labels
[10:31:31] [CLEANUP] Reset agent query state
[10:31:31] [CLEANUP] Updated page indicator
[10:31:31] [CLEANUP] Rebuilt video layout
[10:31:31] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:31] [CLEANUP] ========================================
[10:31:31] [SERVER] Starting reconnect polling (5s interval)
[10:31:31] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:31:31] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28832]
[10:31:31] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 55 msgs, first 10 IDs=[28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823]
[10:31:31] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 55, first 10 IDs=[28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823]
[10:31:31] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:31:31] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=55
[10:31:31] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=55
[10:31:31] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=63
[10:31:31] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=55, first5Ids=[28832, 28831, 28830, 28829, 28828]
[10:31:31] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 55 messages
[10:31:31] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823]
[10:31:31] [RELOAD_TAB] 📊 Building chatRows from 55 messages
[10:31:31] [SCROLL] wasNearBottom=true, threshold=447, offset=4649, contentH=5096, boundsH=447, forceScroll=true
[10:31:31] [RELOAD_TAB] 📊 Built 57 chatRows, estHeight=0.0
[10:31:31] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=63
[10:31:31] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4649, currentOffset=4649
[10:31:31] [SCROLL] Scrolling to 4649, animated=false
[10:31:33] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:33] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:33] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:33] HELLO → sent (cached token, role=query)
[10:31:33] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:33] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:33] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:33] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:33] [CLEANUP] ========================================
[10:31:33] [CLEANUP] Cleaning up all agent connections and views
[10:31:33] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:33] [CLEANUP] Stopped and removed 0 video connections
[10:31:33] [CLEANUP] Removed 0 video views
[10:31:33] [CLEANUP] Removed 0 feed scroll views
[10:31:33] [CLEANUP] Removed 0 status labels
[10:31:33] [CLEANUP] Reset agent query state
[10:31:33] [CLEANUP] Updated page indicator
[10:31:33] [CLEANUP] Rebuilt video layout
[10:31:33] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:33] [CLEANUP] ========================================
[10:31:33] [SERVER] Starting reconnect polling (5s interval)
[10:31:33] [CLEANUP] ========================================
[10:31:33] [CLEANUP] Cleaning up all agent connections and views
[10:31:33] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:33] [CLEANUP] Stopped and removed 0 video connections
[10:31:33] [CLEANUP] Removed 0 video views
[10:31:33] [CLEANUP] Removed 0 feed scroll views
[10:31:33] [CLEANUP] Removed 0 status labels
[10:31:33] [CLEANUP] Reset agent query state
[10:31:33] [CLEANUP] Updated page indicator
[10:31:33] [CLEANUP] Rebuilt video layout
[10:31:33] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:33] [CLEANUP] ========================================
[10:31:33] [SERVER] Starting reconnect polling (5s interval)
[10:31:34] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:34] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:35] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:35] HELLO → sent (cached token, role=query)
[10:31:35] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:35] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:35] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:35] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:35] [CLEANUP] ========================================
[10:31:35] [CLEANUP] Cleaning up all agent connections and views
[10:31:35] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:35] [CLEANUP] Stopped and removed 0 video connections
[10:31:35] [CLEANUP] Removed 0 video views
[10:31:35] [CLEANUP] Removed 0 feed scroll views
[10:31:35] [CLEANUP] Removed 0 status labels
[10:31:35] [CLEANUP] Reset agent query state
[10:31:35] [CLEANUP] Updated page indicator
[10:31:35] [CLEANUP] Rebuilt video layout
[10:31:35] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:35] [CLEANUP] ========================================
[10:31:35] [SERVER] Starting reconnect polling (5s interval)
[10:31:35] [CLEANUP] ========================================
[10:31:35] [CLEANUP] Cleaning up all agent connections and views
[10:31:35] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:35] [CLEANUP] Stopped and removed 0 video connections
[10:31:35] [CLEANUP] Removed 0 video views
[10:31:35] [CLEANUP] Removed 0 feed scroll views
[10:31:35] [CLEANUP] Removed 0 status labels
[10:31:35] [CLEANUP] Reset agent query state
[10:31:35] [CLEANUP] Updated page indicator
[10:31:35] [CLEANUP] Rebuilt video layout
[10:31:35] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:35] [CLEANUP] ========================================
[10:31:35] [SERVER] Starting reconnect polling (5s interval)
[10:31:36] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:36] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:36] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:36] HELLO → sent (cached token, role=query)
[10:31:36] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:36] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:36] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:36] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:36] [CLEANUP] ========================================
[10:31:36] [CLEANUP] Cleaning up all agent connections and views
[10:31:36] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:36] [CLEANUP] Stopped and removed 0 video connections
[10:31:36] [CLEANUP] Removed 0 video views
[10:31:36] [CLEANUP] Removed 0 feed scroll views
[10:31:36] [CLEANUP] Removed 0 status labels
[10:31:36] [CLEANUP] Reset agent query state
[10:31:36] [CLEANUP] Updated page indicator
[10:31:36] [CLEANUP] Rebuilt video layout
[10:31:36] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:36] [CLEANUP] ========================================
[10:31:36] [SERVER] Starting reconnect polling (5s interval)
[10:31:36] [CLEANUP] ========================================
[10:31:36] [CLEANUP] Cleaning up all agent connections and views
[10:31:36] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:36] [CLEANUP] Stopped and removed 0 video connections
[10:31:36] [CLEANUP] Removed 0 video views
[10:31:36] [CLEANUP] Removed 0 feed scroll views
[10:31:36] [CLEANUP] Removed 0 status labels
[10:31:36] [CLEANUP] Reset agent query state
[10:31:36] [CLEANUP] Updated page indicator
[10:31:36] [CLEANUP] Rebuilt video layout
[10:31:36] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:36] [CLEANUP] ========================================
[10:31:36] [SERVER] Starting reconnect polling (5s interval)
[10:31:38] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:38] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:38] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:38] HELLO → sent (cached token, role=query)
[10:31:38] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:38] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:38] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:38] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:38] [CLEANUP] ========================================
[10:31:38] [CLEANUP] Cleaning up all agent connections and views
[10:31:38] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:38] [CLEANUP] Stopped and removed 0 video connections
[10:31:38] [CLEANUP] Removed 0 video views
[10:31:38] [CLEANUP] Removed 0 feed scroll views
[10:31:38] [CLEANUP] Removed 0 status labels
[10:31:38] [CLEANUP] Reset agent query state
[10:31:38] [CLEANUP] Updated page indicator
[10:31:38] [CLEANUP] Rebuilt video layout
[10:31:38] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:38] [CLEANUP] ========================================
[10:31:38] [SERVER] Starting reconnect polling (5s interval)
[10:31:38] [CLEANUP] ========================================
[10:31:38] [CLEANUP] Cleaning up all agent connections and views
[10:31:38] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:38] [CLEANUP] Stopped and removed 0 video connections
[10:31:38] [CLEANUP] Removed 0 video views
[10:31:38] [CLEANUP] Removed 0 feed scroll views
[10:31:38] [CLEANUP] Removed 0 status labels
[10:31:38] [CLEANUP] Reset agent query state
[10:31:38] [CLEANUP] Updated page indicator
[10:31:38] [CLEANUP] Rebuilt video layout
[10:31:38] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:38] [CLEANUP] ========================================
[10:31:38] [SERVER] Starting reconnect polling (5s interval)
[10:31:39] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[10:31:39] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=55, isReloading=false
[10:31:39] [SEND_MESSAGE] ✅ Added optimistic message id=-5 to arrays, newMsgCount=56
[10:31:39] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=63
[10:31:39] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=56, first5Ids=[-5, 28832, 28831, 28830, 28829]
[10:31:39] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 56 messages
[10:31:39] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-5, 28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824]
[10:31:39] [RELOAD_TAB] 📊 Building chatRows from 56 messages
[10:31:39] [SCROLL] wasNearBottom=true, threshold=447, offset=4649, contentH=5096, boundsH=447, forceScroll=false
[10:31:39] [RELOAD_TAB] 📊 Built 58 chatRows, estHeight=0.0
[10:31:39] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=65
[10:31:39] [SCROLL] 💓 alive, visible=51...57, rows=58, estHeight=0.0, heightCalls=124
[10:31:39] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:31:39] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[10:31:39] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4701, currentOffset=4701
[10:31:39] [SCROLL] Scrolling to 4701, animated=true
[10:31:39] [CLIENT_SIG] Event received: type=0 messageId=28833
[10:31:39] [WS_EVENT] Received event: type=0, messageId=28833
[10:31:39] [WS_EVENT] 📨 New message notification (msgId=28833) - triggering incremental refresh, currentMsgCount=56
[10:31:39] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=56
[10:31:39] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28832, maxMemoryId=28832
[10:31:39] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28832
[10:31:39] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28833,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 08:31:39"}
[10:31:39] [CHAT] receive_message.php JSON: ["datesent_utc": 2026-04-23 08:31:39, "ok": 1, "file_name": , "session_id": ILUIWU, "message_type": 0, "message_id": 28833]
[10:31:39] [DB_UPGRADE] Upgrading message ID: -5 → 28833, preserveOriginalDate=false
[10:31:39] [DB_UPGRADE] ✅ Upgraded -5 → 28833 with send_status=0, 1 row(s) affected
[10:31:39] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -5 → 28833
[10:31:39] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -5 → 28833
[10:31:39] ReloadData 9
[10:31:39] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:31:39] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28833]
[10:31:39] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 56 msgs, first 10 IDs=[28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824]
[10:31:39] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 56, first 10 IDs=[28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824]
[10:31:39] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:31:39] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=56
[10:31:39] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=56
[10:31:39] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=64
[10:31:39] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=56, first5Ids=[28833, 28832, 28831, 28830, 28829]
[10:31:39] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 56 messages
[10:31:39] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824]
[10:31:39] [RELOAD_TAB] 📊 Building chatRows from 56 messages
[10:31:39] [SCROLL] wasNearBottom=true, threshold=447, offset=4701, contentH=5148, boundsH=447, forceScroll=true
[10:31:39] [RELOAD_TAB] 📊 Built 58 chatRows, estHeight=0.0
[10:31:39] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=64
[10:31:39] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4701, currentOffset=4701
[10:31:39] [SCROLL] Scrolling to 4701, animated=false
[10:31:39] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:39] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:39] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:39] HELLO → sent (cached token, role=query)
[10:31:39] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:39] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:39] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:39] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:39] [CLEANUP] ========================================
[10:31:39] [CLEANUP] Cleaning up all agent connections and views
[10:31:39] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:39] [CLEANUP] Stopped and removed 0 video connections
[10:31:39] [CLEANUP] Removed 0 video views
[10:31:39] [CLEANUP] Removed 0 feed scroll views
[10:31:39] [CLEANUP] Removed 0 status labels
[10:31:39] [CLEANUP] Reset agent query state
[10:31:39] [CLEANUP] Updated page indicator
[10:31:39] [CLEANUP] Rebuilt video layout
[10:31:39] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:39] [CLEANUP] ========================================
[10:31:39] [SERVER] Starting reconnect polling (5s interval)
[10:31:39] [CLEANUP] ========================================
[10:31:39] [CLEANUP] Cleaning up all agent connections and views
[10:31:39] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:39] [CLEANUP] Stopped and removed 0 video connections
[10:31:39] [CLEANUP] Removed 0 video views
[10:31:39] [CLEANUP] Removed 0 feed scroll views
[10:31:39] [CLEANUP] Removed 0 status labels
[10:31:39] [CLEANUP] Reset agent query state
[10:31:39] [CLEANUP] Updated page indicator
[10:31:39] [CLEANUP] Rebuilt video layout
[10:31:39] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:39] [CLEANUP] ========================================
[10:31:39] [SERVER] Starting reconnect polling (5s interval)
[10:31:41] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:41] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:41] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:41] HELLO → sent (cached token, role=query)
[10:31:41] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:41] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:41] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:41] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:41] [CLEANUP] ========================================
[10:31:41] [CLEANUP] Cleaning up all agent connections and views
[10:31:41] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:41] [CLEANUP] Stopped and removed 0 video connections
[10:31:41] [CLEANUP] Removed 0 video views
[10:31:41] [CLEANUP] Removed 0 feed scroll views
[10:31:41] [CLEANUP] Removed 0 status labels
[10:31:41] [CLEANUP] Reset agent query state
[10:31:41] [CLEANUP] Updated page indicator
[10:31:41] [CLEANUP] Rebuilt video layout
[10:31:41] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:41] [CLEANUP] ========================================
[10:31:41] [SERVER] Starting reconnect polling (5s interval)
[10:31:41] [CLEANUP] ========================================
[10:31:41] [CLEANUP] Cleaning up all agent connections and views
[10:31:41] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:41] [CLEANUP] Stopped and removed 0 video connections
[10:31:41] [CLEANUP] Removed 0 video views
[10:31:41] [CLEANUP] Removed 0 feed scroll views
[10:31:41] [CLEANUP] Removed 0 status labels
[10:31:41] [CLEANUP] Reset agent query state
[10:31:41] [CLEANUP] Updated page indicator
[10:31:41] [CLEANUP] Rebuilt video layout
[10:31:41] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:41] [CLEANUP] ========================================
[10:31:41] [SERVER] Starting reconnect polling (5s interval)
[10:31:42] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[10:31:42] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=56, isReloading=false
[10:31:42] [SEND_MESSAGE] ✅ Added optimistic message id=-6 to arrays, newMsgCount=57
[10:31:42] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=64
[10:31:42] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=57, first5Ids=[-6, 28833, 28832, 28831, 28830]
[10:31:42] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 57 messages
[10:31:42] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-6, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825]
[10:31:42] [RELOAD_TAB] 📊 Building chatRows from 57 messages
[10:31:42] [SCROLL] wasNearBottom=true, threshold=447, offset=4701, contentH=5148, boundsH=447, forceScroll=false
[10:31:42] [RELOAD_TAB] 📊 Built 59 chatRows, estHeight=0.0
[10:31:42] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=66
[10:31:42] [SCROLL] 💓 alive, visible=52...58, rows=59, estHeight=0.0, heightCalls=126
[10:31:42] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:31:42] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[10:31:42] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4753, currentOffset=4753
[10:31:42] [SCROLL] Scrolling to 4753, animated=true
[10:31:42] [CLIENT_SIG] Event received: type=0 messageId=28834
[10:31:42] [WS_EVENT] Received event: type=0, messageId=28834
[10:31:42] [WS_EVENT] 📨 New message notification (msgId=28834) - triggering incremental refresh, currentMsgCount=57
[10:31:42] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=57
[10:31:42] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28833, maxMemoryId=28833
[10:31:42] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28833
[10:31:42] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28834,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 08:31:42"}
[10:31:42] [CHAT] receive_message.php JSON: ["session_id": ILUIWU, "datesent_utc": 2026-04-23 08:31:42, "file_name": , "ok": 1, "message_type": 0, "message_id": 28834]
[10:31:42] [DB_UPGRADE] Upgrading message ID: -6 → 28834, preserveOriginalDate=false
[10:31:42] [DB_UPGRADE] ✅ Upgraded -6 → 28834 with send_status=0, 1 row(s) affected
[10:31:42] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -6 → 28834
[10:31:42] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -6 → 28834
[10:31:42] ReloadData 9
[10:31:42] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:31:42] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28834]
[10:31:42] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 57 msgs, first 10 IDs=[28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825]
[10:31:42] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 57, first 10 IDs=[28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825]
[10:31:42] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:31:42] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=57
[10:31:42] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=57
[10:31:43] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=66
[10:31:43] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=57, first5Ids=[28834, 28833, 28832, 28831, 28830]
[10:31:43] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 57 messages
[10:31:43] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826, 28825]
[10:31:43] [RELOAD_TAB] 📊 Building chatRows from 57 messages
[10:31:43] [SCROLL] wasNearBottom=true, threshold=447, offset=4753, contentH=5200, boundsH=447, forceScroll=true
[10:31:43] [RELOAD_TAB] 📊 Built 59 chatRows, estHeight=0.0
[10:31:43] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=66
[10:31:43] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4753, currentOffset=4753
[10:31:43] [SCROLL] Scrolling to 4753, animated=false
[10:31:43] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:43] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:43] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:43] HELLO → sent (cached token, role=query)
[10:31:43] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:43] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:43] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:43] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:43] [CLEANUP] ========================================
[10:31:43] [CLEANUP] Cleaning up all agent connections and views
[10:31:43] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:43] [CLEANUP] Stopped and removed 0 video connections
[10:31:43] [CLEANUP] Removed 0 video views
[10:31:43] [CLEANUP] Removed 0 feed scroll views
[10:31:43] [CLEANUP] Removed 0 status labels
[10:31:43] [CLEANUP] Reset agent query state
[10:31:43] [CLEANUP] Updated page indicator
[10:31:43] [CLEANUP] Rebuilt video layout
[10:31:43] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:43] [CLEANUP] ========================================
[10:31:43] [SERVER] Starting reconnect polling (5s interval)
[10:31:43] [CLEANUP] ========================================
[10:31:43] [CLEANUP] Cleaning up all agent connections and views
[10:31:43] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:43] [CLEANUP] Stopped and removed 0 video connections
[10:31:43] [CLEANUP] Removed 0 video views
[10:31:43] [CLEANUP] Removed 0 feed scroll views
[10:31:43] [CLEANUP] Removed 0 status labels
[10:31:43] [CLEANUP] Reset agent query state
[10:31:43] [CLEANUP] Updated page indicator
[10:31:43] [CLEANUP] Rebuilt video layout
[10:31:43] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:43] [CLEANUP] ========================================
[10:31:43] [SERVER] Starting reconnect polling (5s interval)
[10:31:44] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:44] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:44] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:44] HELLO → sent (cached token, role=query)
[10:31:44] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:44] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:44] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:44] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:44] [CLEANUP] ========================================
[10:31:44] [CLEANUP] Cleaning up all agent connections and views
[10:31:44] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:44] [CLEANUP] Stopped and removed 0 video connections
[10:31:44] [CLEANUP] Removed 0 video views
[10:31:44] [CLEANUP] Removed 0 feed scroll views
[10:31:44] [CLEANUP] Removed 0 status labels
[10:31:44] [CLEANUP] Reset agent query state
[10:31:44] [CLEANUP] Updated page indicator
[10:31:44] [CLEANUP] Rebuilt video layout
[10:31:44] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:44] [CLEANUP] ========================================
[10:31:44] [SERVER] Starting reconnect polling (5s interval)
[10:31:44] [CLEANUP] ========================================
[10:31:44] [CLEANUP] Cleaning up all agent connections and views
[10:31:44] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:44] [CLEANUP] Stopped and removed 0 video connections
[10:31:44] [CLEANUP] Removed 0 video views
[10:31:44] [CLEANUP] Removed 0 feed scroll views
[10:31:44] [CLEANUP] Removed 0 status labels
[10:31:44] [CLEANUP] Reset agent query state
[10:31:44] [CLEANUP] Updated page indicator
[10:31:44] [CLEANUP] Rebuilt video layout
[10:31:44] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:44] [CLEANUP] ========================================
[10:31:44] [SERVER] Starting reconnect polling (5s interval)
[10:31:46] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:46] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:46] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:46] HELLO → sent (cached token, role=query)
[10:31:46] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:46] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:46] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:46] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:46] [CLEANUP] ========================================
[10:31:46] [CLEANUP] Cleaning up all agent connections and views
[10:31:46] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:46] [CLEANUP] Stopped and removed 0 video connections
[10:31:46] [CLEANUP] Removed 0 video views
[10:31:46] [CLEANUP] Removed 0 feed scroll views
[10:31:46] [CLEANUP] Removed 0 status labels
[10:31:46] [CLEANUP] Reset agent query state
[10:31:46] [CLEANUP] Updated page indicator
[10:31:46] [CLEANUP] Rebuilt video layout
[10:31:46] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:46] [CLEANUP] ========================================
[10:31:46] [SERVER] Starting reconnect polling (5s interval)
[10:31:46] [CLEANUP] ========================================
[10:31:46] [CLEANUP] Cleaning up all agent connections and views
[10:31:46] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:46] [CLEANUP] Stopped and removed 0 video connections
[10:31:46] [CLEANUP] Removed 0 video views
[10:31:46] [CLEANUP] Removed 0 feed scroll views
[10:31:46] [CLEANUP] Removed 0 status labels
[10:31:46] [CLEANUP] Reset agent query state
[10:31:46] [CLEANUP] Updated page indicator
[10:31:46] [CLEANUP] Rebuilt video layout
[10:31:46] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:46] [CLEANUP] ========================================
[10:31:46] [SERVER] Starting reconnect polling (5s interval)
[10:31:48] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:48] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:48] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:48] HELLO → sent (cached token, role=query)
[10:31:48] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:48] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:48] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:48] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:48] [CLEANUP] ========================================
[10:31:48] [CLEANUP] Cleaning up all agent connections and views
[10:31:48] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:48] [CLEANUP] Stopped and removed 0 video connections
[10:31:48] [CLEANUP] Removed 0 video views
[10:31:48] [CLEANUP] Removed 0 feed scroll views
[10:31:48] [CLEANUP] Removed 0 status labels
[10:31:48] [CLEANUP] Reset agent query state
[10:31:48] [CLEANUP] Updated page indicator
[10:31:48] [CLEANUP] Rebuilt video layout
[10:31:48] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:48] [CLEANUP] ========================================
[10:31:48] [SERVER] Starting reconnect polling (5s interval)
[10:31:48] [CLEANUP] ========================================
[10:31:48] [CLEANUP] Cleaning up all agent connections and views
[10:31:48] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:48] [CLEANUP] Stopped and removed 0 video connections
[10:31:48] [CLEANUP] Removed 0 video views
[10:31:48] [CLEANUP] Removed 0 feed scroll views
[10:31:48] [CLEANUP] Removed 0 status labels
[10:31:48] [CLEANUP] Reset agent query state
[10:31:48] [CLEANUP] Updated page indicator
[10:31:48] [CLEANUP] Rebuilt video layout
[10:31:48] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:48] [CLEANUP] ========================================
[10:31:48] [SERVER] Starting reconnect polling (5s interval)
[10:31:49] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:49] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:49] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:49] HELLO → sent (cached token, role=query)
[10:31:49] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:49] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:49] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:49] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:49] [CLEANUP] ========================================
[10:31:49] [CLEANUP] Cleaning up all agent connections and views
[10:31:49] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:49] [CLEANUP] Stopped and removed 0 video connections
[10:31:49] [CLEANUP] Removed 0 video views
[10:31:49] [CLEANUP] Removed 0 feed scroll views
[10:31:49] [CLEANUP] Removed 0 status labels
[10:31:49] [CLEANUP] Reset agent query state
[10:31:49] [CLEANUP] Updated page indicator
[10:31:49] [CLEANUP] Rebuilt video layout
[10:31:49] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:49] [CLEANUP] ========================================
[10:31:49] [SERVER] Starting reconnect polling (5s interval)
[10:31:49] [CLEANUP] ========================================
[10:31:49] [CLEANUP] Cleaning up all agent connections and views
[10:31:49] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:49] [CLEANUP] Stopped and removed 0 video connections
[10:31:49] [CLEANUP] Removed 0 video views
[10:31:49] [CLEANUP] Removed 0 feed scroll views
[10:31:49] [CLEANUP] Removed 0 status labels
[10:31:49] [CLEANUP] Reset agent query state
[10:31:49] [CLEANUP] Updated page indicator
[10:31:49] [CLEANUP] Rebuilt video layout
[10:31:49] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:49] [CLEANUP] ========================================
[10:31:49] [SERVER] Starting reconnect polling (5s interval)
[10:31:50] [SCROLL] 💓 alive, visible=53...58, rows=59, estHeight=0.0, heightCalls=66
[10:31:51] [CLIENT_SIG] Client connected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[10:31:51] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:51] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:51] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:51] HELLO → sent (cached token, role=query)
[10:31:51] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:51] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:51] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:51] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:51] [CLEANUP] ========================================
[10:31:51] [CLEANUP] Cleaning up all agent connections and views
[10:31:51] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:51] [CLEANUP] Stopped and removed 0 video connections
[10:31:51] [CLEANUP] Removed 0 video views
[10:31:51] [CLEANUP] Removed 0 feed scroll views
[10:31:51] [CLEANUP] Removed 0 status labels
[10:31:51] [CLEANUP] Reset agent query state
[10:31:51] [CLEANUP] Updated page indicator
[10:31:51] [CLEANUP] Rebuilt video layout
[10:31:51] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:51] [CLEANUP] ========================================
[10:31:51] [SERVER] Starting reconnect polling (5s interval)
[10:31:51] [CLEANUP] ========================================
[10:31:51] [CLEANUP] Cleaning up all agent connections and views
[10:31:51] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:51] [CLEANUP] Stopped and removed 0 video connections
[10:31:51] [CLEANUP] Removed 0 video views
[10:31:51] [CLEANUP] Removed 0 feed scroll views
[10:31:51] [CLEANUP] Removed 0 status labels
[10:31:51] [CLEANUP] Reset agent query state
[10:31:51] [CLEANUP] Updated page indicator
[10:31:51] [CLEANUP] Rebuilt video layout
[10:31:51] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:51] [CLEANUP] ========================================
[10:31:51] [SERVER] Starting reconnect polling (5s interval)
[10:31:52] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[10:31:52] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=57, isReloading=false
[10:31:52] [SEND_MESSAGE] ✅ Added optimistic message id=-7 to arrays, newMsgCount=58
[10:31:52] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:31:52] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=58, first5Ids=[-7, 28834, 28833, 28832, 28831]
[10:31:52] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 58 messages
[10:31:52] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-7, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:52] [RELOAD_TAB] 📊 Building chatRows from 58 messages
[10:31:52] [SCROLL] wasNearBottom=true, threshold=429, offset=4770, contentH=5200, boundsH=429, forceScroll=false
[10:31:52] [RELOAD_TAB] 📊 Built 60 chatRows, estHeight=0.0
[10:31:52] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=67
[10:31:52] [SCROLL] 💓 alive, visible=53...59, rows=60, estHeight=0.0, heightCalls=128
[10:31:52] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:31:52] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[10:31:52] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=4826, currentOffset=4826
[10:31:52] [SCROLL] Scrolling to 4826, animated=true
[10:31:52] [PUSH] Silent push received
[10:31:52] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:31:52 +0000, appState=0, message_id=nil, type=nil
[10:31:52] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=53, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:52] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:31:52 +0000
[10:31:52] [PUSH_EMBED] No embedded message_data in notification
[10:31:52] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:31:52] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=53, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822], handled=false
[10:31:52] [PUSH] No embedded data, pre-loading messages from server
[10:31:52] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:31:52] [CLIENT_SIG] Event received: type=0 messageId=28835
[10:31:52] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28835,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 08:31:52"}
[10:31:52] [WS_EVENT] Received event: type=0, messageId=28835
[10:31:52] [CHAT] receive_message.php JSON: ["file_name": , "datesent_utc": 2026-04-23 08:31:52, "message_id": 28835, "session_id": ILUIWU, "ok": 1, "message_type": 0]
[10:31:52] [WS_EVENT] 📨 New message notification (msgId=28835) - triggering incremental refresh, currentMsgCount=58
[10:31:52] [DB_UPGRADE] Upgrading message ID: -7 → 28835, preserveOriginalDate=false
[10:31:52] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=58
[10:31:52] [DB_UPGRADE] ✅ Upgraded -7 → 28835 with send_status=0, 1 row(s) affected
[10:31:52] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28835, maxMemoryId=28834
[10:31:52] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28835
[10:31:52] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -7 → 28835
[10:31:52] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -7 → 28835
[10:31:52] ReloadData 9
[10:31:52] [INCREMENTAL_SYNC] ✅ No new messages
[10:31:52] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=58
[10:31:52] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:31:52] [PUSH] Silent push received
[10:31:52] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:31:52 +0000, appState=0, message_id=nil, type=nil
[10:31:52] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=53, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:52] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:31:52 +0000
[10:31:52] [PUSH_EMBED] No embedded message_data in notification
[10:31:52] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:31:52] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=53, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822], handled=false
[10:31:52] [PUSH] No embedded data, pre-loading messages from server
[10:31:52] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:31:52] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:31:52] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:31:52] [PUSH] Silent push received
[10:31:52] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:31:52 +0000, appState=0, message_id=nil, type=nil
[10:31:52] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=53, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:52] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:31:52 +0000
[10:31:52] [PUSH_EMBED] No embedded message_data in notification
[10:31:52] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:31:52] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=53, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822], handled=false
[10:31:52] [PUSH] No embedded data, pre-loading messages from server
[10:31:52] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:31:52] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:31:52] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:31:52] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:31:52] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:52] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=53, IDs=[28831, 28830, 28829, 28828, 28827, 28826, 28825, 28824, 28823, 28822]
[10:31:52] [PRELOAD_CACHE] Preserving 7 push-inserted messages: [28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:31:52] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=7, IDs=[28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:31:52] [PUSH_TRACE] 🔀 mergeMessages: merged.count=57, first 10 IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:52] [PUSH_PRELOAD] ⚡ Pre-cached 57 messages for instant display (preserved 7 from push)
[10:31:52] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:31:52] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 58 msgs, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:52] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2247 vccs=0
[10:31:52] [GAP_FIX] maxMessageIdAtBackground=28830, currentMaxLocalId=28835
[10:31:52] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("message_id"): 28832, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
[10:31:52] [PUSH] Parsed message_id: 28832
[10:31:52] [PUSH] Parsed operation_type: 3
[10:31:52] [PUSH] Taking direct action: opType=3, messageId=28832
[10:31:52] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28832
[10:31:52] [GAP_FIX] Post-action sync: using background max 28830 to catch coalesced messages
[10:31:52] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=58
[10:31:52] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28830, maxMemoryId=28835
[10:31:52] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28830
[10:31:52] [INCREMENTAL_SYNC] ✅ Found 5 new messages
[10:31:52] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 5 new messages, IDs=[28835, 28834, 28833, 28832, 28831]
[10:31:52] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 58 msgs, first 10 IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:52] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 58, first 10 IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:52] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=5
[10:31:52] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=58
[10:31:52] [CLIENT_SIG] Event received: type=3 messageId=28832
[10:31:52] [WS_EVENT] Received event: type=3, messageId=28832
[10:31:52] [WS_EVENT] Read receipt for message 28832 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:31:52] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:31:52] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:31:52] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:31:52] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:31:52] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:31:52] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:31:52] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:52] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=57, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:52] [PRELOAD_CACHE] Preserving 7 push-inserted messages: [28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:31:52] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=7, IDs=[28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:31:52] [PUSH_TRACE] 🔀 mergeMessages: merged.count=57, first 10 IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:52] [PUSH_PRELOAD] ⚡ Pre-cached 57 messages for instant display (preserved 7 from push)
[10:31:52] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:31:52] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 58 msgs, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:52] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2248 vccs=0
[10:31:52] [GAP_FIX] maxMessageIdAtBackground=28830, currentMaxLocalId=28835
[10:31:52] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28834]
[10:31:52] [PUSH] Parsed message_id: 28834
[10:31:52] [PUSH] Parsed operation_type: 3
[10:31:52] [PUSH] Taking direct action: opType=3, messageId=28834
[10:31:52] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28834
[10:31:52] [GAP_FIX] Post-action sync: using background max 28830 to catch coalesced messages
[10:31:52] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=58
[10:31:52] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28830, maxMemoryId=28835
[10:31:52] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28830
[10:31:52] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:31:52] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=67
[10:31:52] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=58, first5Ids=[28835, 28834, 28833, 28832, 28831]
[10:31:52] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 58 messages
[10:31:52] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:52] [RELOAD_TAB] 📊 Building chatRows from 58 messages
[10:31:52] [SCROLL] wasNearBottom=true, threshold=447, offset=4826, contentH=5273, boundsH=447, forceScroll=true
[10:31:52] [RELOAD_TAB] 📊 Built 60 chatRows, estHeight=0.0
[10:31:52] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:31:52] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:31:52] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:31:52] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:31:52] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=67
[10:31:52] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4826, currentOffset=4826
[10:31:52] [SCROLL] Scrolling to 4826, animated=false
[10:31:52] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:31:52] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:52] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=57, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:52] [PRELOAD_CACHE] Preserving 7 push-inserted messages: [28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:31:52] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=7, IDs=[28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:31:52] [PUSH_TRACE] 🔀 mergeMessages: merged.count=57, first 10 IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:52] [PUSH_PRELOAD] ⚡ Pre-cached 57 messages for instant display (preserved 7 from push)
[10:31:52] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:31:52] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 58 msgs, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:52] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2248 vccs=0
[10:31:52] [GAP_FIX] maxMessageIdAtBackground=28830, currentMaxLocalId=28835
[10:31:52] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28833, AnyHashable("operation_type"): 3, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
[10:31:52] [PUSH] Parsed message_id: 28833
[10:31:52] [PUSH] Parsed operation_type: 3
[10:31:52] [PUSH] Taking direct action: opType=3, messageId=28833
[10:31:52] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28833
[10:31:52] [GAP_FIX] Post-action sync: using background max 28830 to catch coalesced messages
[10:31:52] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[10:31:52] [INCREMENTAL_SYNC] ✅ Found 5 new messages
[10:31:52] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 5 new messages, IDs=[28835, 28834, 28833, 28832, 28831]
[10:31:52] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 58 msgs, first 10 IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:52] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 58, first 10 IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:52] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=5
[10:31:52] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=58
[10:31:52] [INCREMENTAL_SYNC] 🔁 Processing queued retry refresh
[10:31:52] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=58
[10:31:52] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28835, maxMemoryId=28835
[10:31:52] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28835
[10:31:53] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:53] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:53] [INCREMENTAL_SYNC] ✅ No new messages
[10:31:53] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=67
[10:31:53] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=58, first5Ids=[28835, 28834, 28833, 28832, 28831]
[10:31:53] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 58 messages
[10:31:53] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:53] [RELOAD_TAB] 📊 Building chatRows from 58 messages
[10:31:53] [SCROLL] wasNearBottom=true, threshold=447, offset=4826, contentH=5273, boundsH=447, forceScroll=true
[10:31:53] [RELOAD_TAB] 📊 Built 60 chatRows, estHeight=0.0
[10:31:53] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=67
[10:31:53] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:53] HELLO → sent (cached token, role=query)
[10:31:53] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4826, currentOffset=4826
[10:31:53] [SCROLL] Scrolling to 4826, animated=false
[10:31:53] [CLIENT_SIG] Event received: type=3 messageId=28833
[10:31:53] [WS_EVENT] Received event: type=3, messageId=28833
[10:31:53] [WS_EVENT] Read receipt for message 28833 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:31:53] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:53] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:53] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:53] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:53] [CLEANUP] ========================================
[10:31:53] [CLEANUP] Cleaning up all agent connections and views
[10:31:53] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:53] [CLEANUP] Stopped and removed 0 video connections
[10:31:53] [CLEANUP] Removed 0 video views
[10:31:53] [CLEANUP] Removed 0 feed scroll views
[10:31:53] [CLEANUP] Removed 0 status labels
[10:31:53] [CLEANUP] Reset agent query state
[10:31:53] [CLEANUP] Updated page indicator
[10:31:53] [CLEANUP] Rebuilt video layout
[10:31:53] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:53] [CLEANUP] ========================================
[10:31:53] [SERVER] Starting reconnect polling (5s interval)
[10:31:53] [CLEANUP] ========================================
[10:31:53] [CLEANUP] Cleaning up all agent connections and views
[10:31:53] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:53] [CLEANUP] Stopped and removed 0 video connections
[10:31:53] [CLEANUP] Removed 0 video views
[10:31:53] [CLEANUP] Removed 0 feed scroll views
[10:31:53] [CLEANUP] Removed 0 status labels
[10:31:53] [CLEANUP] Reset agent query state
[10:31:53] [CLEANUP] Updated page indicator
[10:31:53] [CLEANUP] Rebuilt video layout
[10:31:53] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:53] [CLEANUP] ========================================
[10:31:53] [SERVER] Starting reconnect polling (5s interval)
[10:31:53] [CLIENT_SIG] Event received: type=3 messageId=28834
[10:31:53] [WS_EVENT] Received event: type=3, messageId=28834
[10:31:53] [WS_EVENT] Read receipt for message 28834 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:31:53] [LIFECYCLE] App resigning active - cleared crash flag
[10:31:53] [PUSH] Silent push received
[10:31:53] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:31:53 +0000, appState=1, message_id=nil, type=nil
[10:31:53] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=57, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:53] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:31:53 +0000
[10:31:53] [PUSH_EMBED] No embedded message_data in notification
[10:31:53] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:31:53] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=57, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826], handled=false
[10:31:53] [PUSH] No embedded data, pre-loading messages from server
[10:31:53] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:31:53] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:31:53] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:31:53] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:31:53] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:31:53] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:31:53] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:31:53] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:53] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=57, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:53] [PRELOAD_CACHE] Preserving 7 push-inserted messages: [28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:31:53] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=7, IDs=[28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:31:53] [PUSH_TRACE] 🔀 mergeMessages: merged.count=57, first 10 IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:53] [PUSH_PRELOAD] ⚡ Pre-cached 57 messages for instant display (preserved 7 from push)
[10:31:53] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:31:53] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 58 msgs, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:53] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2249 vccs=0
[10:31:53] [GAP_FIX] maxMessageIdAtBackground=28830, currentMaxLocalId=28835
[10:31:53] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("message_id"): 28835]
[10:31:53] [PUSH] Parsed message_id: 28835
[10:31:53] [PUSH] Parsed operation_type: 3
[10:31:53] [PUSH] Taking direct action: opType=3, messageId=28835
[10:31:53] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28835
[10:31:53] [GAP_FIX] Post-action sync: using background max 28830 to catch coalesced messages
[10:31:53] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=58
[10:31:53] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28830, maxMemoryId=28835
[10:31:53] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28830
[10:31:53] [INCREMENTAL_SYNC] ✅ Found 5 new messages
[10:31:53] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 5 new messages, IDs=[28835, 28834, 28833, 28832, 28831]
[10:31:53] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 58 msgs, first 10 IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:53] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 58, first 10 IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:53] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=5
[10:31:53] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=58
[10:31:54] [UPLOAD_QUEUE] ✅ Database flushed (WAL checkpoint) before background
[10:31:54] [SECURITY] sceneDidEnterBackground - isAuthenticated=true
[10:31:54] [SECURITY] Saved background timestamp
[10:31:54] [LIFECYCLE] App entering background - cleared crash flag
[10:31:54] [CLIENT_SIG] Disconnecting
[10:31:54] [LIFECYCLE] App entering background - disconnecting connections and stopping audio
[10:31:54] [DB] ✅ Chat database flushed (WAL checkpoint) before background
[10:31:54] [PUSH_TRACE] 💤 BACKGROUND: memory has 58 messages, first 10 IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:54] [LIFECYCLE] Background snapshot: count=58, maxId=28835
[10:31:54] [WS] stopSignalingAndPeer called - isQueryOnly=true, connectionStr=iosILUIWU, wsState=3
[10:31:54] [WS] Canceling WebSocket for query connection to iosILUIWU
[10:31:54] In cleanupPeer
[10:31:54] In cleanupPeer
[10:31:54] [LIFECYCLE] WebRTC audio disabled
[10:31:54] [LIFECYCLE] AVAudioSession deactivated
[10:31:54] [LIFECYCLE] All connections stopped
[10:31:54] [CLIENT_SIG] WebSocket closed with code 1001
[10:31:54] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[10:31:54] [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/}
[10:31:54] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[10:31:54] [SERVER] Stopped reconnect polling
[10:31:54] [WS] URLSession invalidated successfully
[10:31:54] Will request stop of video 0
[10:31:54] Will request stop of video 0
[10:31:54] [PIP] Removing 0 tracks from PiP for connection 0
[10:31:54] [PIP] ✅ All tracks removed for connection 0
[10:31:54] [PIP] Removing 0 tracks from PiP for connection 0
[10:31:54] [PIP] ✅ All tracks removed for connection 0
[10:31:54] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=67
[10:31:54] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=58, first5Ids=[28835, 28834, 28833, 28832, 28831]
[10:31:54] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 58 messages
[10:31:54] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:31:54] [RELOAD_TAB] 📊 Building chatRows from 58 messages
[10:31:54] [SCROLL] wasNearBottom=true, threshold=447, offset=4826, contentH=5273, boundsH=447, forceScroll=false
[10:31:54] [RELOAD_TAB] 📊 Built 60 chatRows, estHeight=0.0
[10:31:54] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=67
[10:31:54] [SCROLL] Async handler: shouldScroll=false (force=false, newMsgs=false, nearBottom=true), maxY=4826, currentOffset=4826
[10:31:54] [NETWORK] Status changed: connected
[10:31:54] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:54] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:31:54] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:31:54] HELLO → sent (cached token, role=query)
[10:31:54] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:31:54] [WS] Query connection failed - cleaning up all agent connections and views
[10:31:54] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:31:54] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:31:54] [CLEANUP] ========================================
[10:31:54] [CLEANUP] Cleaning up all agent connections and views
[10:31:54] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:54] [CLEANUP] Stopped and removed 0 video connections
[10:31:54] [CLEANUP] Removed 0 video views
[10:31:54] [CLEANUP] Removed 0 feed scroll views
[10:31:54] [CLEANUP] Removed 0 status labels
[10:31:54] [CLEANUP] Reset agent query state
[10:31:54] [CLEANUP] Updated page indicator
[10:31:54] [CLEANUP] Rebuilt video layout
[10:31:54] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:54] [CLEANUP] ========================================
[10:31:54] [SERVER] Skipping reconnect polling - app is in background
[10:31:54] [CLEANUP] ========================================
[10:31:54] [CLEANUP] Cleaning up all agent connections and views
[10:31:54] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:31:54] [CLEANUP] Stopped and removed 0 video connections
[10:31:54] [CLEANUP] Removed 0 video views
[10:31:54] [CLEANUP] Removed 0 feed scroll views
[10:31:54] [CLEANUP] Removed 0 status labels
[10:31:54] [CLEANUP] Reset agent query state
[10:31:54] [CLEANUP] Updated page indicator
[10:31:54] [CLEANUP] Rebuilt video layout
[10:31:54] [CLEANUP] ✅ All agent connections and views cleaned up
[10:31:54] [CLEANUP] ========================================
[10:31:54] [SERVER] Skipping reconnect polling - app is in background
[10:32:03] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:03] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:03] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:32:03] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[10:32:03] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 58 msgs, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:32:03] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=2 secsSinceLastPong=2258 vccs=0
[10:32:03] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28836
[10:32:03] [PUSH] handlePollEventsNotification userInfo: [:]
[10:32:03] [PUSH] No message_id in userInfo
[10:32:03] [PUSH] No operation_type in userInfo
[10:32:03] [FAST_REFRESH] Evolution disabled - performing incremental sync
[10:32:03] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=57, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:32:03] [PUSH_TRACE] 📬 POLL: memory state: count=58, first 10 IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:32:03] [FAST_REFRESH] Already have 58 messages in memory
[10:32:03] [FAST_REFRESH] maxMemoryId=28835, maxLocalId=28836
[10:32:03] [FAST_REFRESH] 🌙 Found 1 overnight messages in local DB (IDs > 28835)
[10:32:03] [FAST_REFRESH] 🌙 Merged 1 overnight messages into memory (now 59 total)
[10:32:03] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[10:32:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=59
[10:32:03] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[10:32:03] [READBY_OPT] Fetching readBy for 1 unsettled messages (targeted)
[10:32:03] [GAP_FIX] Incremental sync will use since_id=28835 (background max=28835, current DB max=28836)
[10:32:03] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=59
[10:32:03] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28835, maxMemoryId=28836
[10:32:03] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28835
[10:32:03] [PUSH] Silent push received
[10:32:03] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:03 +0000, appState=2, message_id=28836, type=nil
[10:32:03] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=57, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:32:03] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:03 +0000
[10:32:03] [PUSH_TRACE] ⬇️ Processing embedded message_id=28836
[10:32:03] [PUSH_EMBED] 📩 Received embedded message: id=28836, type=0, sender=Esra
[10:32:03] [PUSH_TRACE] ⬇️ Message details: text="Same🥲🥲🥲🥲...", datesent=2026-04-23 08:32:02
[10:32:03] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[10:32:03] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28836
[10:32:03] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28836
[10:32:03] [PUSH_EMBED] ✅ Saved message 28836 to local DB (sync)
[10:32:03] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28836
[10:32:03] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28836
[10:32:03] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28836
[10:32:03] [PUSH_TRACE] 📦 Cache state: valid=true, count=57, IDs=[28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827, 28826]
[10:32:03] [PUSH_EMBED] Inserted message 28836 into existing cache (now 58 messages)
[10:32:03] [PUSH_TRACE] 📦 ✅ Inserted message 28836, cache now has IDs: [28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:03] [PUSH_TRACE] 📦 EXITING cache update queue for message 28836
[10:32:03] [PUSH_EMBED] Fetching evolution data for message 28836 in background
[10:32:03] [PUSH_EMBED] ✅ Fully processed message 28836
[10:32:03] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28836
[10:32:03] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=58, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827], handled=true
[10:32:03] [PUSH] Embedded message handled instantly from silent push
[10:32:03] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[10:32:03] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28836
[10:32:03] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[10:32:03] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[10:32:03] [PUSH_TRACE] 👁️ Received message id=28836, text="Same🥲🥲🥲🥲..."
[10:32:03] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[10:32:03] [PUSH_UI] Message 28836 already in memory - skipping insert
[10:32:03] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[10:32:03] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 59 msgs, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:03] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=2 secsSinceLastPong=2258 vccs=0
[10:32:03] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28836
[10:32:03] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message"): Same🥲🥲🥲🥲, AnyHashable("message_id"): 28836, AnyHashable("file_name"): , AnyHashable("timer"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:32:02";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Same\Ud83e\Udd72\Ud83e\Udd72\Ud83e\Udd72\Ud83e\Udd72";
    "message_id" = 28836;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28835;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("thumb_file_name"): , AnyHashable("datesent"): 2026-04-23 08:32:02, AnyHashable("sender_name"): Esra, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_type"): 0, AnyHashable("operation_type"): 0]
[10:32:03] [PUSH_EMBED_VC] Message 28836 already in memory - skipping
[10:32:03] [PUSH] ⚡ Embedded message handled directly in ViewController
[10:32:03] [PUSH] Parsed message_id: 28836
[10:32:03] [PUSH] Parsed operation_type: 0
[10:32:03] [PUSH] Taking direct action: opType=0, messageId=28836
[10:32:03] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28836
[10:32:03] [PUSH] ⚡ Message 28836 already in memory - skipping duplicate notification entirely
[10:32:03] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:32:03] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[10:32:03] [CLIENT_SIG] WebSocket opened
[10:32:03] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:03] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[10:32:03] HELLO → sent (cached token, role=query)
[10:32:03] [COMBINED_FETCH] Loaded 1 read receipts, 0 messages with reactions
[10:32:03] [FAST_REFRESH] Enriched 1/1 unsettled messages with readBy data
[10:32:03] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=67
[10:32:03] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=59, first5Ids=[28836, 28835, 28834, 28833, 28832]
[10:32:03] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 59 messages
[10:32:03] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:03] [RELOAD_TAB] 📊 Building chatRows from 59 messages
[10:32:03] [SCROLL] wasNearBottom=true, threshold=447, offset=4826, contentH=5273, boundsH=447, forceScroll=false
[10:32:03] [RELOAD_TAB] 📊 Built 61 chatRows, estHeight=0.0
[10:32:03] [PUSH_EMBED] Got evolution data for message 28836, saving to local DB
[10:32:03] [PUSH_EMBED] Saved evolution data for message 28836
[10:32:03] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28835 → 28836
[10:32:03] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=69
[10:32:03] [SCROLL_END_DECEL] messagesTable offsetY=4826, insetTop=0, pendingVelocityY=0.0
[10:32:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=59
[10:32:03] [SCROLL] Async handler: shouldScroll=false (force=false, newMsgs=false, nearBottom=true), maxY=4903, currentOffset=4826
[10:32:03] [SCROLL_END_DECEL] messagesTable offsetY=4826, insetTop=0, pendingVelocityY=0.0
[10:32:03] [CLIENT_SIG] Connected! clientId=jzIog2T1WBU0-Pa7
[10:32:03] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:03] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:03] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:03] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:03] [CLEANUP] ========================================
[10:32:03] [CLEANUP] Cleaning up all agent connections and views
[10:32:03] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:03] [CLEANUP] Stopped and removed 0 video connections
[10:32:03] [CLEANUP] Removed 0 video views
[10:32:03] [CLEANUP] Removed 0 feed scroll views
[10:32:03] [CLEANUP] Removed 0 status labels
[10:32:03] [CLEANUP] Reset agent query state
[10:32:03] [CLEANUP] Updated page indicator
[10:32:03] [CLEANUP] Rebuilt video layout
[10:32:03] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:03] [CLEANUP] ========================================
[10:32:03] [SERVER] Skipping reconnect polling - app is in background
[10:32:03] [CLEANUP] ========================================
[10:32:03] [CLEANUP] Cleaning up all agent connections and views
[10:32:03] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:03] [CLEANUP] Stopped and removed 0 video connections
[10:32:03] [CLEANUP] Removed 0 video views
[10:32:03] [CLEANUP] Removed 0 feed scroll views
[10:32:03] [CLEANUP] Removed 0 status labels
[10:32:03] [CLEANUP] Reset agent query state
[10:32:03] [CLEANUP] Updated page indicator
[10:32:03] [CLEANUP] Rebuilt video layout
[10:32:03] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:03] [CLEANUP] ========================================
[10:32:03] [SERVER] Skipping reconnect polling - app is in background
[10:32:03] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[10:32:03] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:32:03] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:32:03] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:32:03] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28836]
[10:32:03] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 59 msgs, first 10 IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:03] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 59, first 10 IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:03] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:32:03] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=59
[10:32:03] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:32:03] [INCREMENTAL_SYNC] 🔁 Processing queued retry refresh
[10:32:03] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=59
[10:32:03] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28836, maxMemoryId=28836
[10:32:03] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28836
[10:32:03] [FAST_REFRESH] Incremental sync complete - 59 messages
[10:32:03] [INCREMENTAL_SYNC] ✅ No new messages
[10:32:04] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=69
[10:32:04] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=59, first5Ids=[28836, 28835, 28834, 28833, 28832]
[10:32:04] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 59 messages
[10:32:04] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:04] [RELOAD_TAB] 📊 Building chatRows from 59 messages
[10:32:04] [SCROLL] wasNearBottom=true, threshold=447, offset=4826, contentH=5350, boundsH=447, forceScroll=false
[10:32:04] [RELOAD_TAB] 📊 Built 61 chatRows, estHeight=0.0
[10:32:04] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[10:32:04] [PUSH] Silent push received
[10:32:04] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:04 +0000, appState=2, message_id=nil, type=nil
[10:32:04] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=58, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:04] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:04 +0000
[10:32:04] [PUSH_EMBED] No embedded message_data in notification
[10:32:04] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:32:04] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=58, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827], handled=false
[10:32:04] [PUSH] No embedded data, pre-loading messages from server
[10:32:04] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:32:05] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:32:05] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:32:05] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:32:05] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:32:05] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:32:05] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:32:05] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:05] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=58, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:05] [PRELOAD_CACHE] Preserving 8 push-inserted messages: [28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:32:05] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=8, IDs=[28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:32:05] [PUSH_TRACE] 🔀 mergeMessages: merged.count=58, first 10 IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:05] [PUSH_PRELOAD] ⚡ Pre-cached 58 messages for instant display (preserved 8 from push)
[10:32:05] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:32:05] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 59 msgs, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:05] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2260 vccs=0
[10:32:05] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28836
[10:32:05] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("message_id"): 28836, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
[10:32:05] [PUSH] Parsed message_id: 28836
[10:32:05] [PUSH] Parsed operation_type: 3
[10:32:05] [PUSH] Taking direct action: opType=3, messageId=28836
[10:32:05] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28836
[10:32:05] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:32:05] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=59
[10:32:05] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28835, maxMemoryId=28836
[10:32:05] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28835
[10:32:05] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:32:05] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28836]
[10:32:05] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 59 msgs, first 10 IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:05] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 59, first 10 IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:05] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:32:05] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=59
[10:32:05] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:05] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:05] [SCROLL_END_DECEL] messagesTable offsetY=4826, insetTop=0, pendingVelocityY=0.0
[10:32:05] [SCROLL] 💓 alive, visible=53...60, rows=61, estHeight=0.0, heightCalls=1
[10:32:05] [CLIENT_SIG] Event received: type=3 messageId=28836
[10:32:05] [WS_EVENT] Received event: type=3, messageId=28836
[10:32:05] [WS_EVENT] Read receipt for message 28836 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:32:05] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:05] HELLO → sent (cached token, role=query)
[10:32:05] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:05] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:05] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:05] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:05] [CLEANUP] ========================================
[10:32:05] [CLEANUP] Cleaning up all agent connections and views
[10:32:05] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:05] [CLEANUP] Stopped and removed 0 video connections
[10:32:05] [CLEANUP] Removed 0 video views
[10:32:05] [CLEANUP] Removed 0 feed scroll views
[10:32:05] [CLEANUP] Removed 0 status labels
[10:32:05] [CLEANUP] Reset agent query state
[10:32:05] [CLEANUP] Updated page indicator
[10:32:05] [CLEANUP] Rebuilt video layout
[10:32:05] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:05] [CLEANUP] ========================================
[10:32:05] [SERVER] Skipping reconnect polling - app is in background
[10:32:05] [CLEANUP] ========================================
[10:32:05] [CLEANUP] Cleaning up all agent connections and views
[10:32:05] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:05] [CLEANUP] Stopped and removed 0 video connections
[10:32:05] [CLEANUP] Removed 0 video views
[10:32:05] [CLEANUP] Removed 0 feed scroll views
[10:32:05] [CLEANUP] Removed 0 status labels
[10:32:05] [CLEANUP] Reset agent query state
[10:32:05] [CLEANUP] Updated page indicator
[10:32:05] [CLEANUP] Rebuilt video layout
[10:32:05] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:05] [CLEANUP] ========================================
[10:32:05] [SERVER] Skipping reconnect polling - app is in background
[10:32:05] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:32:05] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=59, first5Ids=[28836, 28835, 28834, 28833, 28832]
[10:32:05] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 59 messages
[10:32:05] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:05] [RELOAD_TAB] 📊 Building chatRows from 59 messages
[10:32:05] [SCROLL] wasNearBottom=true, threshold=447, offset=4864, contentH=5350, boundsH=447, forceScroll=false
[10:32:05] [RELOAD_TAB] 📊 Built 61 chatRows, estHeight=0.0
[10:32:05] [SCROLL_END_DECEL] messagesTable offsetY=4864, insetTop=0, pendingVelocityY=0.0
[10:32:05] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=68
[10:32:05] [SCROLL] Async handler: shouldScroll=false (force=false, newMsgs=false, nearBottom=true), maxY=4903, currentOffset=4864
[10:32:05] [CLIENT_SIG] Typing start from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:32:07] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:07] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:07] [PUSH] Notification tapped - session_id: ILUIWU
[10:32:07] [PUSH] Max message_id before tap: 28836
[10:32:07] [PUSH] Stored pending session: ILUIWU
[10:32:07] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:07 +0000
[10:32:07] [PUSH_TRACE] ⬇️ Processing embedded message_id=28836
[10:32:07] [PUSH_EMBED] 📩 Received embedded message: id=28836, type=0, sender=Esra
[10:32:07] [PUSH_TRACE] ⬇️ Message details: text="Same🥲🥲🥲🥲...", datesent=2026-04-23 08:32:02
[10:32:07] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[10:32:07] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28836
[10:32:07] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28836
[10:32:07] [PUSH_EMBED] ✅ Saved message 28836 to local DB (sync)
[10:32:07] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28836
[10:32:07] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28836
[10:32:07] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28836
[10:32:07] [PUSH_TRACE] 📦 Cache state: valid=true, count=58, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:07] [PUSH_TRACE] 📦 ⚠️ Message 28836 already in cache, skipping insert
[10:32:07] [PUSH_TRACE] 📦 EXITING cache update queue for message 28836
[10:32:07] [PUSH_EMBED] Fetching evolution data for message 28836 in background
[10:32:07] [PUSH_EMBED] ✅ Fully processed message 28836
[10:32:07] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28836
[10:32:07] [PUSH] Embedded message handled instantly on tap
[10:32:07] [PUSH] Fetching server messages since_id=28836 to catch coalesced notifications on tap
[10:32:07] [SECURITY] Timeout check: elapsed=13.648544311523438s, timeout=300.0s
[10:32:07] [PUSH_PRELOAD] Fetching up to 50 messages since_id=28836 to catch coalesced notifications
[10:32:07] [CLIENT_SIG] Reconnecting on foreground for session: ILUIWU
[10:32:07] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:32:07] [CLIENT_SIG] Already connected/connecting to session ILUIWU
[10:32:07] [LIFECYCLE] App entering foreground - restoring connections
[10:32:07] [CAPTURE] Live-feed protection [app-will-enter-foreground] - fullscreen=false, isCaptured=false, secureReady=true
[10:32:07] [CAPTURE] Refresh overlay [app-will-enter-foreground] - isCaptured: false, mediaFullscreen: false, liveFullscreen: false, pipFullscreen: false, screenshotTimer: false, fallbackWindowOverlay: false
[10:32:07] [PUSH_TRACE] 🔄 FOREGROUND: memory has 59 msgs, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:07] [PUSH_TRACE] 🔄 FOREGROUND: cache has 58 msgs, valid=true, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:07] [UPLOAD_RETRY] No pending uploads to retry
[10:32:07] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=59
[10:32:07] [READBY_OPT] No message IDs to fetch - skipping server call
[10:32:07] [LIFECYCLE] WebRTC audio re-enabled
[10:32:07] [AUDIO] ✅ Chat mode - audio will be managed by WebRTCViewer (no microphone)
[10:32:07] [CLIENT_SIG] Skipping connect - app in background (state=2)
[10:32:07] [VIEWER] Reconnecting after background - querying agents
[10:32:07] [CAM_CONN] ▶️ queryAgents ENTER tab=0 isServerConnected=false hasQueryConn=true wsState=running
[10:32:07] [CAM_CONN] ⏸️ queryAgents SKIP — only works on tab 1, currently on tab 0
[10:32:07] [UNSENT_RETRY] Checking for unsent messages...
[10:32:07] [PENDING_UPLOAD] Total pending upload messages: 0
[10:32:07] [UNSENT_RETRY] No unsent messages found
[10:32:07] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[10:32:07] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[10:32:07] [PUSH_TRACE] 👁️ Received message id=28836, text="Same🥲🥲🥲🥲..."
[10:32:07] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[10:32:07] [PUSH_UI] Message 28836 already in memory - skipping insert
[10:32:07] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[10:32:07] [FOREGROUND] Enriched 0/0 unsettled messages with readBy data
[10:32:07] [LIFECYCLE] scrollToBottomIfNeeded time=false, count=59>58=true, maxId=28836>28835=true, shouldScroll=true
[10:32:07] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=59
[10:32:07] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:32:07] [SCROLL] 💓 alive, visible=54...60, rows=61, estHeight=0.0, heightCalls=69
[10:32:07] [CLIENT_SIG] Task completed with error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={NSErrorFailingURLStringKey=http://crivello.dyndns.org:8081/, NSErrorFailingURLKey=http://crivello.dyndns.org:8081/, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalWebSocketTask <E764161D-59C5-4234-BE05-642B8718DD55>.<1>"
), _NSURLErrorFailingURLSessionTaskErrorKey=LocalWebSocketTask <E764161D-59C5-4234-BE05-642B8718DD55>.<1>, NSLocalizedDescription=The network connection was lost.}
[10:32:07] [CLIENT_SIG] Reconnecting in 2.0s (attempt 1)
[10:32:07] [CLIENT_SIG] Receive error: Error Domain=NSPOSIXErrorDomain Code=89 "Operation canceled" UserInfo={NSDescription=Operation canceled}
[10:32:07] [CLIENT_SIG] Reconnecting in 4.0s (attempt 2)
[10:32:07] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:07] HELLO → sent (cached token, role=query)
[10:32:07] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:07] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:07] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:07] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:07] [CLEANUP] ========================================
[10:32:07] [CLEANUP] Cleaning up all agent connections and views
[10:32:07] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:07] [CLEANUP] Stopped and removed 0 video connections
[10:32:07] [CLEANUP] Removed 0 video views
[10:32:07] [CLEANUP] Removed 0 feed scroll views
[10:32:07] [CLEANUP] Removed 0 status labels
[10:32:07] [CLEANUP] Reset agent query state
[10:32:07] [CLEANUP] Updated page indicator
[10:32:07] [CLEANUP] Rebuilt video layout
[10:32:07] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:07] [CLEANUP] ========================================
[10:32:07] [SERVER] Starting reconnect polling (5s interval)
[10:32:07] [CLEANUP] ========================================
[10:32:07] [CLEANUP] Cleaning up all agent connections and views
[10:32:07] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:07] [CLEANUP] Stopped and removed 0 video connections
[10:32:07] [CLEANUP] Removed 0 video views
[10:32:07] [CLEANUP] Removed 0 feed scroll views
[10:32:07] [CLEANUP] Removed 0 status labels
[10:32:07] [CLEANUP] Reset agent query state
[10:32:07] [CLEANUP] Updated page indicator
[10:32:07] [CLEANUP] Rebuilt video layout
[10:32:07] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:07] [CLEANUP] ========================================
[10:32:07] [SERVER] Starting reconnect polling (5s interval)
[10:32:07] [PUSH_EMBED] Got evolution data for message 28836, saving to local DB
[10:32:07] [PUSH_EMBED] Saved evolution data for message 28836
[10:32:07] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:32:07] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=59, first5Ids=[28836, 28835, 28834, 28833, 28832]
[10:32:07] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 59 messages
[10:32:07] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:07] [RELOAD_TAB] 📊 Building chatRows from 59 messages
[10:32:07] [SCROLL] wasNearBottom=true, threshold=447, offset=4883, contentH=5350, boundsH=447, forceScroll=true
[10:32:07] [RELOAD_TAB] 📊 Built 61 chatRows, estHeight=0.0
[10:32:07] [SCROLL_END_DECEL] messagesTable offsetY=4903, insetTop=0, pendingVelocityY=0.0
[10:32:07] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=68
[10:32:07] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4903, currentOffset=4903
[10:32:07] [SCROLL] Scrolling to 4903, animated=false
[10:32:07] [PUSH_PRELOAD] No messages or parse error
[10:32:07] [PUSH] Server fetch on tap completed (success=false)
[10:32:07] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 59 msgs, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:07] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2263 vccs=0
[10:32:07] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28836
[10:32:07] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("file_name"): , AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("operation_type"): 0, AnyHashable("sender_name"): Esra, AnyHashable("timer"): 0, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_id"): 28836, AnyHashable("message"): Same🥲🥲🥲🥲, AnyHashable("session_id"): ILUIWU, AnyHashable("datesent"): 2026-04-23 08:32:02, AnyHashable("thumb_file_name"): , AnyHashable("message_type"): 0, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:32:02";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Same\Ud83e\Udd72\Ud83e\Udd72\Ud83e\Udd72\Ud83e\Udd72";
    "message_id" = 28836;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28835;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}]
[10:32:07] [PUSH_EMBED_VC] Message 28836 already in memory - skipping
[10:32:07] [PUSH] ⚡ Embedded message handled directly in ViewController
[10:32:07] [PUSH] Parsed message_id: 28836
[10:32:07] [PUSH] Parsed operation_type: 0
[10:32:07] [PUSH] Taking direct action: opType=0, messageId=28836
[10:32:07] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28836
[10:32:07] [PUSH] ⚡ Message 28836 already in memory - skipping duplicate notification entirely
[10:32:07] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:32:07] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=59
[10:32:07] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28835, maxMemoryId=28836
[10:32:07] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28835
[10:32:08] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:32:08] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28836]
[10:32:08] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 59 msgs, first 10 IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:08] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 59, first 10 IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:08] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:32:08] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=59
[10:32:08] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=68
[10:32:08] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=59, first5Ids=[28836, 28835, 28834, 28833, 28832]
[10:32:08] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 59 messages
[10:32:08] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:08] [RELOAD_TAB] 📊 Building chatRows from 59 messages
[10:32:08] [SCROLL] wasNearBottom=true, threshold=447, offset=4903, contentH=5350, boundsH=447, forceScroll=true
[10:32:08] [RELOAD_TAB] 📊 Built 61 chatRows, estHeight=0.0
[10:32:08] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=68
[10:32:08] [SECURITY] sceneDidBecomeActive - isAuthenticated=true, didEnterBackground=true
[10:32:08] [SECURITY] Within timeout - cleared background flag
[10:32:08] [PUSH_DEBUG] 🟢 App became ACTIVE - resetting badges and triggering pollEventsNow
[10:32:08] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 59 msgs, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:08] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2263 vccs=0
[10:32:08] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28836
[10:32:08] [PUSH] handlePollEventsNotification userInfo: [:]
[10:32:08] [PUSH] No message_id in userInfo
[10:32:08] [PUSH] No operation_type in userInfo
[10:32:08] [FAST_REFRESH] Evolution disabled - performing incremental sync
[10:32:08] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=58, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:08] [PUSH_TRACE] 📬 POLL: memory state: count=59, first 10 IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:08] [FAST_REFRESH] Already have 59 messages in memory
[10:32:08] [FAST_REFRESH] maxMemoryId=28836, maxLocalId=28836
[10:32:08] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[10:32:08] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=59
[10:32:08] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[10:32:08] [READBY_OPT] No message IDs to fetch - skipping server call
[10:32:08] [GAP_FIX] Incremental sync will use since_id=28835 (background max=28835, current DB max=28836)
[10:32:08] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=59
[10:32:08] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28835, maxMemoryId=28836
[10:32:08] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28835
[10:32:08] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4903, currentOffset=4903
[10:32:08] [SCROLL] Scrolling to 4903, animated=false
[10:32:08] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[10:32:08] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=59
[10:32:08] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:32:08] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:32:08] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28836]
[10:32:08] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 59 msgs, first 10 IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:08] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 59, first 10 IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:08] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:32:08] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=59
[10:32:08] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:32:08] [FAST_REFRESH] Incremental sync complete - 59 messages
[10:32:08] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=68
[10:32:08] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=59, first5Ids=[28836, 28835, 28834, 28833, 28832]
[10:32:08] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 59 messages
[10:32:08] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:08] [RELOAD_TAB] 📊 Building chatRows from 59 messages
[10:32:08] [SCROLL] wasNearBottom=true, threshold=447, offset=4903, contentH=5350, boundsH=447, forceScroll=true
[10:32:08] [RELOAD_TAB] 📊 Built 61 chatRows, estHeight=0.0
[10:32:08] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=68
[10:32:08] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=4903, currentOffset=4903
[10:32:08] [SCROLL] Scrolling to 4903, animated=false
[10:32:09] [CLIENT_SIG] Cannot send typing_start - not connected
[10:32:09] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:09] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:09] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:09] HELLO → sent (cached token, role=query)
[10:32:09] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:09] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:09] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:09] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:09] [CLEANUP] ========================================
[10:32:09] [CLEANUP] Cleaning up all agent connections and views
[10:32:09] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:09] [CLEANUP] Stopped and removed 0 video connections
[10:32:09] [CLEANUP] Removed 0 video views
[10:32:09] [CLEANUP] Removed 0 feed scroll views
[10:32:09] [CLEANUP] Removed 0 status labels
[10:32:09] [CLEANUP] Reset agent query state
[10:32:09] [CLEANUP] Updated page indicator
[10:32:09] [CLEANUP] Rebuilt video layout
[10:32:09] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:09] [CLEANUP] ========================================
[10:32:09] [SERVER] Starting reconnect polling (5s interval)
[10:32:09] [CLEANUP] ========================================
[10:32:09] [CLEANUP] Cleaning up all agent connections and views
[10:32:09] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:09] [CLEANUP] Stopped and removed 0 video connections
[10:32:09] [CLEANUP] Removed 0 video views
[10:32:09] [CLEANUP] Removed 0 feed scroll views
[10:32:09] [CLEANUP] Removed 0 status labels
[10:32:09] [CLEANUP] Reset agent query state
[10:32:09] [CLEANUP] Updated page indicator
[10:32:09] [CLEANUP] Rebuilt video layout
[10:32:09] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:09] [CLEANUP] ========================================
[10:32:09] [SERVER] Starting reconnect polling (5s interval)
[10:32:10] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[10:32:10] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=59, isReloading=false
[10:32:10] [SEND_MESSAGE] ✅ Added optimistic message id=-8 to arrays, newMsgCount=60
[10:32:10] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=68
[10:32:10] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=60, first5Ids=[-8, 28836, 28835, 28834, 28833]
[10:32:10] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 60 messages
[10:32:10] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-8, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[10:32:10] [RELOAD_TAB] 📊 Building chatRows from 60 messages
[10:32:10] [SCROLL] wasNearBottom=true, threshold=447, offset=4903, contentH=5350, boundsH=447, forceScroll=true
[10:32:10] [RELOAD_TAB] 📊 Built 62 chatRows, estHeight=0.0
[10:32:10] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=70
[10:32:10] [SCROLL] 💓 alive, visible=54...61, rows=62, estHeight=0.0, heightCalls=133
[10:32:10] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:32:10] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[10:32:10] [CLIENT_SIG] Cannot send typing_stop - not connected
[10:32:10] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=true, nearBottom=true), maxY=4980, currentOffset=4980
[10:32:10] [SCROLL] Scrolling to 4980, animated=false
[10:32:10] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28837,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 08:32:10"}
[10:32:10] [CHAT] receive_message.php JSON: ["message_type": 0, "file_name": , "message_id": 28837, "ok": 1, "session_id": ILUIWU, "datesent_utc": 2026-04-23 08:32:10]
[10:32:10] [DB_UPGRADE] Upgrading message ID: -8 → 28837, preserveOriginalDate=false
[10:32:10] [DB_UPGRADE] ✅ Upgraded -8 → 28837 with send_status=0, 1 row(s) affected
[10:32:10] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -8 → 28837
[10:32:10] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -8 → 28837
[10:32:10] ReloadData 9
[10:32:11] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:11] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:11] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:11] HELLO → sent (cached token, role=query)
[10:32:11] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:11] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:11] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:11] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:11] [CLEANUP] ========================================
[10:32:11] [CLEANUP] Cleaning up all agent connections and views
[10:32:11] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:11] [CLEANUP] Stopped and removed 0 video connections
[10:32:11] [CLEANUP] Removed 0 video views
[10:32:11] [CLEANUP] Removed 0 feed scroll views
[10:32:11] [CLEANUP] Removed 0 status labels
[10:32:11] [CLEANUP] Reset agent query state
[10:32:11] [CLEANUP] Updated page indicator
[10:32:11] [CLEANUP] Rebuilt video layout
[10:32:11] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:11] [CLEANUP] ========================================
[10:32:11] [SERVER] Starting reconnect polling (5s interval)
[10:32:11] [CLEANUP] ========================================
[10:32:11] [CLEANUP] Cleaning up all agent connections and views
[10:32:11] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:11] [CLEANUP] Stopped and removed 0 video connections
[10:32:11] [CLEANUP] Removed 0 video views
[10:32:11] [CLEANUP] Removed 0 feed scroll views
[10:32:11] [CLEANUP] Removed 0 status labels
[10:32:11] [CLEANUP] Reset agent query state
[10:32:11] [CLEANUP] Updated page indicator
[10:32:11] [CLEANUP] Rebuilt video layout
[10:32:11] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:11] [CLEANUP] ========================================
[10:32:11] [SERVER] Starting reconnect polling (5s interval)
[10:32:11] [CLIENT_SIG] Connecting to session ILUIWU as Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:32:11] [CLIENT_SIG] Cannot send typing_start - not connected
[10:32:11] [CLIENT_SIG] WebSocket opened
[10:32:11] [CLIENT_SIG] HELLO sent as client for session ILUIWU
[10:32:11] [CLIENT_SIG] Connected! clientId=C2xCTE_c-9YWkHjI
[10:32:12] [CLIENT_SIG] Received 2 clients for session 'ILUIWU' (my session: 'ILUIWU')
[10:32:12] [CLIENT_SIG]   - Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:32:12] [CLIENT_SIG]   - Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:32:12] [PUSH] Silent push received
[10:32:12] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:12 +0000, appState=0, message_id=nil, type=nil
[10:32:12] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=58, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:12] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:12 +0000
[10:32:12] [PUSH_EMBED] No embedded message_data in notification
[10:32:12] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:32:12] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=58, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827], handled=false
[10:32:12] [PUSH] No embedded data, pre-loading messages from server
[10:32:12] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:32:12] [PUSH] Silent push received
[10:32:12] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:12 +0000, appState=0, message_id=nil, type=nil
[10:32:12] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=58, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:12] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:12 +0000
[10:32:12] [PUSH_EMBED] No embedded message_data in notification
[10:32:12] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:32:12] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=58, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827], handled=false
[10:32:12] [PUSH] No embedded data, pre-loading messages from server
[10:32:12] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:32:12] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:32:12] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:32:12] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:32:12] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:32:12] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:32:12] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:32:12] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[10:32:12] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=58, IDs=[28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828, 28827]
[10:32:12] [PRELOAD_CACHE] Preserving 9 push-inserted messages: [28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:32:12] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=9, IDs=[28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:32:12] [PUSH_TRACE] 🔀 mergeMessages: merged.count=59, first 10 IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[10:32:12] [PUSH_PRELOAD] ⚡ Pre-cached 59 messages for instant display (preserved 9 from push)
[10:32:12] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:32:12] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 60 msgs, IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[10:32:12] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2267 vccs=0
[10:32:12] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28837
[10:32:12] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28837, AnyHashable("operation_type"): 3, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
[10:32:12] [PUSH] Parsed message_id: 28837
[10:32:12] [PUSH] Parsed operation_type: 3
[10:32:12] [PUSH] Taking direct action: opType=3, messageId=28837
[10:32:12] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28837
[10:32:12] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:32:12] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:32:12] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=60
[10:32:12] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28835, maxMemoryId=28837
[10:32:12] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28835
[10:32:12] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:32:12] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:32:12] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:32:12] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:32:12] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:32:12] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[10:32:12] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=59, IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[10:32:12] [PRELOAD_CACHE] Preserving 9 push-inserted messages: [28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:32:12] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=9, IDs=[28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:32:12] [PUSH_TRACE] 🔀 mergeMessages: merged.count=59, first 10 IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[10:32:12] [PUSH_PRELOAD] ⚡ Pre-cached 59 messages for instant display (preserved 9 from push)
[10:32:12] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:32:12] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 60 msgs, IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[10:32:12] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2267 vccs=0
[10:32:12] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28837
[10:32:12] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28837, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("aps"): {
    "content-available" = 1;
}]
[10:32:12] [PUSH] Parsed message_id: 28837
[10:32:12] [PUSH] Parsed operation_type: 3
[10:32:12] [PUSH] Taking direct action: opType=3, messageId=28837
[10:32:12] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28837
[10:32:12] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:32:12] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[10:32:12] [INCREMENTAL_SYNC] ✅ Found 2 new messages
[10:32:12] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 2 new messages, IDs=[28837, 28836]
[10:32:12] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 60 msgs, first 10 IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[10:32:12] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 60, first 10 IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[10:32:12] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=2
[10:32:12] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=60
[10:32:12] [INCREMENTAL_SYNC] 🔁 Processing queued retry refresh
[10:32:12] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=60
[10:32:12] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28837, maxMemoryId=28837
[10:32:12] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28837
[10:32:12] [INCREMENTAL_SYNC] ✅ No new messages
[10:32:12] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:12] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:12] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=69
[10:32:12] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=60, first5Ids=[28837, 28836, 28835, 28834, 28833]
[10:32:12] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 60 messages
[10:32:12] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[10:32:12] [RELOAD_TAB] 📊 Building chatRows from 60 messages
[10:32:12] [SCROLL] wasNearBottom=true, threshold=447, offset=4980, contentH=5427, boundsH=447, forceScroll=false
[10:32:12] [RELOAD_TAB] 📊 Built 62 chatRows, estHeight=0.0
[10:32:12] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=69
[10:32:12] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:12] HELLO → sent (cached token, role=query)
[10:32:12] [SCROLL] Async handler: shouldScroll=false (force=false, newMsgs=false, nearBottom=true), maxY=4980, currentOffset=4980
[10:32:12] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:12] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:12] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:12] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:12] [CLEANUP] ========================================
[10:32:12] [CLEANUP] Cleaning up all agent connections and views
[10:32:12] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:12] [CLEANUP] Stopped and removed 0 video connections
[10:32:12] [CLEANUP] Removed 0 video views
[10:32:12] [CLEANUP] Removed 0 feed scroll views
[10:32:12] [CLEANUP] Removed 0 status labels
[10:32:12] [CLEANUP] Reset agent query state
[10:32:12] [CLEANUP] Updated page indicator
[10:32:12] [CLEANUP] Rebuilt video layout
[10:32:12] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:12] [CLEANUP] ========================================
[10:32:12] [SERVER] Starting reconnect polling (5s interval)
[10:32:12] [CLEANUP] ========================================
[10:32:12] [CLEANUP] Cleaning up all agent connections and views
[10:32:12] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:12] [CLEANUP] Stopped and removed 0 video connections
[10:32:12] [CLEANUP] Removed 0 video views
[10:32:12] [CLEANUP] Removed 0 feed scroll views
[10:32:12] [CLEANUP] Removed 0 status labels
[10:32:12] [CLEANUP] Reset agent query state
[10:32:12] [CLEANUP] Updated page indicator
[10:32:12] [CLEANUP] Rebuilt video layout
[10:32:12] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:12] [CLEANUP] ========================================
[10:32:12] [SERVER] Starting reconnect polling (5s interval)
[10:32:13] [CLIENT_SIG] Event received: type=3 messageId=28837
[10:32:13] [WS_EVENT] Received event: type=3, messageId=28837
[10:32:13] [WS_EVENT] Read receipt for message 28837 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:32:14] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:14] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:14] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:14] HELLO → sent (cached token, role=query)
[10:32:14] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:14] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:14] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:14] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:14] [CLEANUP] ========================================
[10:32:14] [CLEANUP] Cleaning up all agent connections and views
[10:32:14] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:14] [CLEANUP] Stopped and removed 0 video connections
[10:32:14] [CLEANUP] Removed 0 video views
[10:32:14] [CLEANUP] Removed 0 feed scroll views
[10:32:14] [CLEANUP] Removed 0 status labels
[10:32:14] [CLEANUP] Reset agent query state
[10:32:14] [CLEANUP] Updated page indicator
[10:32:14] [CLEANUP] Rebuilt video layout
[10:32:14] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:14] [CLEANUP] ========================================
[10:32:14] [SERVER] Starting reconnect polling (5s interval)
[10:32:14] [CLEANUP] ========================================
[10:32:14] [CLEANUP] Cleaning up all agent connections and views
[10:32:14] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:14] [CLEANUP] Stopped and removed 0 video connections
[10:32:14] [CLEANUP] Removed 0 video views
[10:32:14] [CLEANUP] Removed 0 feed scroll views
[10:32:14] [CLEANUP] Removed 0 status labels
[10:32:14] [CLEANUP] Reset agent query state
[10:32:14] [CLEANUP] Updated page indicator
[10:32:14] [CLEANUP] Rebuilt video layout
[10:32:14] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:14] [CLEANUP] ========================================
[10:32:14] [SERVER] Starting reconnect polling (5s interval)
[10:32:15] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:15] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:16] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:16] HELLO → sent (cached token, role=query)
[10:32:16] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:16] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:16] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:16] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:16] [CLEANUP] ========================================
[10:32:16] [CLEANUP] Cleaning up all agent connections and views
[10:32:16] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:16] [CLEANUP] Stopped and removed 0 video connections
[10:32:16] [CLEANUP] Removed 0 video views
[10:32:16] [CLEANUP] Removed 0 feed scroll views
[10:32:16] [CLEANUP] Removed 0 status labels
[10:32:16] [CLEANUP] Reset agent query state
[10:32:16] [CLEANUP] Updated page indicator
[10:32:16] [CLEANUP] Rebuilt video layout
[10:32:16] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:16] [CLEANUP] ========================================
[10:32:16] [SERVER] Starting reconnect polling (5s interval)
[10:32:16] [CLEANUP] ========================================
[10:32:16] [CLEANUP] Cleaning up all agent connections and views
[10:32:16] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:16] [CLEANUP] Stopped and removed 0 video connections
[10:32:16] [CLEANUP] Removed 0 video views
[10:32:16] [CLEANUP] Removed 0 feed scroll views
[10:32:16] [CLEANUP] Removed 0 status labels
[10:32:16] [CLEANUP] Reset agent query state
[10:32:16] [CLEANUP] Updated page indicator
[10:32:16] [CLEANUP] Rebuilt video layout
[10:32:16] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:16] [CLEANUP] ========================================
[10:32:16] [SERVER] Starting reconnect polling (5s interval)
[10:32:17] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:17] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:17] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:17] HELLO → sent (cached token, role=query)
[10:32:17] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:17] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:17] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:17] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:17] [CLEANUP] ========================================
[10:32:17] [CLEANUP] Cleaning up all agent connections and views
[10:32:17] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:17] [CLEANUP] Stopped and removed 0 video connections
[10:32:17] [CLEANUP] Removed 0 video views
[10:32:17] [CLEANUP] Removed 0 feed scroll views
[10:32:17] [CLEANUP] Removed 0 status labels
[10:32:17] [CLEANUP] Reset agent query state
[10:32:17] [CLEANUP] Updated page indicator
[10:32:17] [CLEANUP] Rebuilt video layout
[10:32:17] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:17] [CLEANUP] ========================================
[10:32:17] [SERVER] Starting reconnect polling (5s interval)
[10:32:17] [CLEANUP] ========================================
[10:32:17] [CLEANUP] Cleaning up all agent connections and views
[10:32:17] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:17] [CLEANUP] Stopped and removed 0 video connections
[10:32:17] [CLEANUP] Removed 0 video views
[10:32:17] [CLEANUP] Removed 0 feed scroll views
[10:32:17] [CLEANUP] Removed 0 status labels
[10:32:17] [CLEANUP] Reset agent query state
[10:32:17] [CLEANUP] Updated page indicator
[10:32:17] [CLEANUP] Rebuilt video layout
[10:32:17] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:17] [CLEANUP] ========================================
[10:32:17] [SERVER] Starting reconnect polling (5s interval)
[10:32:19] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:19] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:19] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:19] HELLO → sent (cached token, role=query)
[10:32:19] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:19] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:19] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:19] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:19] [CLEANUP] ========================================
[10:32:19] [CLEANUP] Cleaning up all agent connections and views
[10:32:19] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:19] [CLEANUP] Stopped and removed 0 video connections
[10:32:19] [CLEANUP] Removed 0 video views
[10:32:19] [CLEANUP] Removed 0 feed scroll views
[10:32:19] [CLEANUP] Removed 0 status labels
[10:32:19] [CLEANUP] Reset agent query state
[10:32:19] [CLEANUP] Updated page indicator
[10:32:19] [CLEANUP] Rebuilt video layout
[10:32:19] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:19] [CLEANUP] ========================================
[10:32:19] [SERVER] Starting reconnect polling (5s interval)
[10:32:19] [CLEANUP] ========================================
[10:32:19] [CLEANUP] Cleaning up all agent connections and views
[10:32:19] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:19] [CLEANUP] Stopped and removed 0 video connections
[10:32:19] [CLEANUP] Removed 0 video views
[10:32:19] [CLEANUP] Removed 0 feed scroll views
[10:32:19] [CLEANUP] Removed 0 status labels
[10:32:19] [CLEANUP] Reset agent query state
[10:32:19] [CLEANUP] Updated page indicator
[10:32:19] [CLEANUP] Rebuilt video layout
[10:32:19] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:19] [CLEANUP] ========================================
[10:32:19] [SERVER] Starting reconnect polling (5s interval)
[10:32:20] [SCROLL] 💓 alive, visible=55...61, rows=62, estHeight=0.0, heightCalls=69
[10:32:20] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:20] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:21] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:21] HELLO → sent (cached token, role=query)
[10:32:21] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:21] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:21] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:21] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:21] [CLEANUP] ========================================
[10:32:21] [CLEANUP] Cleaning up all agent connections and views
[10:32:21] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:21] [CLEANUP] Stopped and removed 0 video connections
[10:32:21] [CLEANUP] Removed 0 video views
[10:32:21] [CLEANUP] Removed 0 feed scroll views
[10:32:21] [CLEANUP] Removed 0 status labels
[10:32:21] [CLEANUP] Reset agent query state
[10:32:21] [CLEANUP] Updated page indicator
[10:32:21] [CLEANUP] Rebuilt video layout
[10:32:21] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:21] [CLEANUP] ========================================
[10:32:21] [SERVER] Starting reconnect polling (5s interval)
[10:32:21] [CLEANUP] ========================================
[10:32:21] [CLEANUP] Cleaning up all agent connections and views
[10:32:21] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:21] [CLEANUP] Stopped and removed 0 video connections
[10:32:21] [CLEANUP] Removed 0 video views
[10:32:21] [CLEANUP] Removed 0 feed scroll views
[10:32:21] [CLEANUP] Removed 0 status labels
[10:32:21] [CLEANUP] Reset agent query state
[10:32:21] [CLEANUP] Updated page indicator
[10:32:21] [CLEANUP] Rebuilt video layout
[10:32:21] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:21] [CLEANUP] ========================================
[10:32:21] [SERVER] Starting reconnect polling (5s interval)
[10:32:21] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[10:32:21] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=60, isReloading=false
[10:32:21] [SEND_MESSAGE] ✅ Added optimistic message id=-9 to arrays, newMsgCount=61
[10:32:21] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:32:21] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=61, first5Ids=[-9, 28837, 28836, 28835, 28834]
[10:32:21] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 61 messages
[10:32:21] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-9, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[10:32:21] [RELOAD_TAB] 📊 Building chatRows from 61 messages
[10:32:21] [SCROLL] wasNearBottom=true, threshold=429, offset=4997, contentH=5427, boundsH=429, forceScroll=false
[10:32:21] [RELOAD_TAB] 📊 Built 63 chatRows, estHeight=0.0
[10:32:21] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=71
[10:32:21] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:32:21] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[10:32:21] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=5053, currentOffset=5053
[10:32:21] [SCROLL] Scrolling to 5053, animated=true
[10:32:21] [CLIENT_SIG] Event received: type=0 messageId=28838
[10:32:21] [WS_EVENT] Received event: type=0, messageId=28838
[10:32:21] [WS_EVENT] 📨 New message notification (msgId=28838) - triggering incremental refresh, currentMsgCount=61
[10:32:21] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=61
[10:32:21] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28837, maxMemoryId=28837
[10:32:21] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28837
[10:32:21] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28838,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 08:32:21"}
[10:32:21] [CHAT] receive_message.php JSON: ["message_type": 0, "message_id": 28838, "session_id": ILUIWU, "file_name": , "datesent_utc": 2026-04-23 08:32:21, "ok": 1]
[10:32:21] [DB_UPGRADE] Upgrading message ID: -9 → 28838, preserveOriginalDate=false
[10:32:21] [DB_UPGRADE] ✅ Upgraded -9 → 28838 with send_status=0, 1 row(s) affected
[10:32:21] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -9 → 28838
[10:32:21] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -9 → 28838
[10:32:21] ReloadData 9
[10:32:21] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:32:21] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28838]
[10:32:21] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 61 msgs, first 10 IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[10:32:21] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 61, first 10 IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[10:32:21] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:32:21] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=61
[10:32:21] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=61
[10:32:21] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=205
[10:32:21] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=61, first5Ids=[28838, 28837, 28836, 28835, 28834]
[10:32:21] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 61 messages
[10:32:21] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[10:32:21] [RELOAD_TAB] 📊 Building chatRows from 61 messages
[10:32:21] [SCROLL] wasNearBottom=true, threshold=447, offset=5053, contentH=5500, boundsH=447, forceScroll=true
[10:32:21] [RELOAD_TAB] 📊 Built 63 chatRows, estHeight=0.0
[10:32:21] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=70
[10:32:21] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=5053, currentOffset=5053
[10:32:21] [SCROLL] Scrolling to 5053, animated=false
[10:32:22] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:22] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:22] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:22] HELLO → sent (cached token, role=query)
[10:32:22] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:22] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:22] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:22] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:22] [CLEANUP] ========================================
[10:32:22] [CLEANUP] Cleaning up all agent connections and views
[10:32:22] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:22] [CLEANUP] Stopped and removed 0 video connections
[10:32:22] [CLEANUP] Removed 0 video views
[10:32:22] [CLEANUP] Removed 0 feed scroll views
[10:32:22] [CLEANUP] Removed 0 status labels
[10:32:22] [CLEANUP] Reset agent query state
[10:32:22] [CLEANUP] Updated page indicator
[10:32:22] [CLEANUP] Rebuilt video layout
[10:32:22] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:22] [CLEANUP] ========================================
[10:32:22] [SERVER] Starting reconnect polling (5s interval)
[10:32:22] [CLEANUP] ========================================
[10:32:22] [CLEANUP] Cleaning up all agent connections and views
[10:32:22] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:22] [CLEANUP] Stopped and removed 0 video connections
[10:32:22] [CLEANUP] Removed 0 video views
[10:32:22] [CLEANUP] Removed 0 feed scroll views
[10:32:22] [CLEANUP] Removed 0 status labels
[10:32:22] [CLEANUP] Reset agent query state
[10:32:22] [CLEANUP] Updated page indicator
[10:32:22] [CLEANUP] Rebuilt video layout
[10:32:22] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:22] [CLEANUP] ========================================
[10:32:22] [SERVER] Starting reconnect polling (5s interval)
[10:32:23] [PUSH] Silent push received
[10:32:23] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:23 +0000, appState=0, message_id=nil, type=nil
[10:32:23] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=59, IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[10:32:23] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:23 +0000
[10:32:23] [PUSH_EMBED] No embedded message_data in notification
[10:32:23] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:32:23] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=59, IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828], handled=false
[10:32:23] [PUSH] No embedded data, pre-loading messages from server
[10:32:23] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:32:23] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:32:23] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:32:23] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:32:23] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:32:23] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:32:23] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:32:23] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[10:32:23] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=59, IDs=[28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829, 28828]
[10:32:23] [PRELOAD_CACHE] Preserving 10 push-inserted messages: [28747, 28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:32:23] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=10, IDs=[28747, 28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:32:23] [PUSH_TRACE] 🔀 mergeMessages: merged.count=60, first 10 IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[10:32:23] [PUSH_PRELOAD] ⚡ Pre-cached 60 messages for instant display (preserved 10 from push)
[10:32:23] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:32:23] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 61 msgs, IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[10:32:23] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2278 vccs=0
[10:32:23] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28838
[10:32:23] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28838, AnyHashable("session_id"): ILUIWU, AnyHashable("aps"): {
    "content-available" = 1;
}]
[10:32:23] [PUSH] Parsed message_id: 28838
[10:32:23] [PUSH] Parsed operation_type: 3
[10:32:23] [PUSH] Taking direct action: opType=3, messageId=28838
[10:32:23] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28838
[10:32:23] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:32:23] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=61
[10:32:23] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28835, maxMemoryId=28838
[10:32:23] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28835
[10:32:23] [INCREMENTAL_SYNC] ✅ Found 3 new messages
[10:32:23] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 3 new messages, IDs=[28838, 28837, 28836]
[10:32:23] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 61 msgs, first 10 IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[10:32:23] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 61, first 10 IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[10:32:23] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=3
[10:32:23] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=61
[10:32:23] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=70
[10:32:23] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=61, first5Ids=[28838, 28837, 28836, 28835, 28834]
[10:32:23] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 61 messages
[10:32:23] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[10:32:23] [RELOAD_TAB] 📊 Building chatRows from 61 messages
[10:32:23] [SCROLL] wasNearBottom=true, threshold=447, offset=5053, contentH=5500, boundsH=447, forceScroll=false
[10:32:23] [RELOAD_TAB] 📊 Built 63 chatRows, estHeight=0.0
[10:32:23] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[10:32:24] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:24] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:24] [CLIENT_SIG] Event received: type=3 messageId=28838
[10:32:24] [WS_EVENT] Received event: type=3, messageId=28838
[10:32:24] [WS_EVENT] Read receipt for message 28838 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:32:24] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:24] HELLO → sent (cached token, role=query)
[10:32:24] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:24] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:24] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:24] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:24] [CLEANUP] ========================================
[10:32:24] [CLEANUP] Cleaning up all agent connections and views
[10:32:24] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:24] [CLEANUP] Stopped and removed 0 video connections
[10:32:24] [CLEANUP] Removed 0 video views
[10:32:24] [CLEANUP] Removed 0 feed scroll views
[10:32:24] [CLEANUP] Removed 0 status labels
[10:32:24] [CLEANUP] Reset agent query state
[10:32:24] [CLEANUP] Updated page indicator
[10:32:24] [CLEANUP] Rebuilt video layout
[10:32:24] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:24] [CLEANUP] ========================================
[10:32:24] [SERVER] Starting reconnect polling (5s interval)
[10:32:24] [CLEANUP] ========================================
[10:32:24] [CLEANUP] Cleaning up all agent connections and views
[10:32:24] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:24] [CLEANUP] Stopped and removed 0 video connections
[10:32:24] [CLEANUP] Removed 0 video views
[10:32:24] [CLEANUP] Removed 0 feed scroll views
[10:32:24] [CLEANUP] Removed 0 status labels
[10:32:24] [CLEANUP] Reset agent query state
[10:32:24] [CLEANUP] Updated page indicator
[10:32:24] [CLEANUP] Rebuilt video layout
[10:32:24] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:24] [CLEANUP] ========================================
[10:32:24] [SERVER] Starting reconnect polling (5s interval)
[10:32:26] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:26] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:26] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:26] HELLO → sent (cached token, role=query)
[10:32:26] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:26] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:26] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:26] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:26] [CLEANUP] ========================================
[10:32:26] [CLEANUP] Cleaning up all agent connections and views
[10:32:26] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:26] [CLEANUP] Stopped and removed 0 video connections
[10:32:26] [CLEANUP] Removed 0 video views
[10:32:26] [CLEANUP] Removed 0 feed scroll views
[10:32:26] [CLEANUP] Removed 0 status labels
[10:32:26] [CLEANUP] Reset agent query state
[10:32:26] [CLEANUP] Updated page indicator
[10:32:26] [CLEANUP] Rebuilt video layout
[10:32:26] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:26] [CLEANUP] ========================================
[10:32:26] [SERVER] Starting reconnect polling (5s interval)
[10:32:26] [CLEANUP] ========================================
[10:32:26] [CLEANUP] Cleaning up all agent connections and views
[10:32:26] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:26] [CLEANUP] Stopped and removed 0 video connections
[10:32:26] [CLEANUP] Removed 0 video views
[10:32:26] [CLEANUP] Removed 0 feed scroll views
[10:32:26] [CLEANUP] Removed 0 status labels
[10:32:26] [CLEANUP] Reset agent query state
[10:32:26] [CLEANUP] Updated page indicator
[10:32:26] [CLEANUP] Rebuilt video layout
[10:32:26] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:26] [CLEANUP] ========================================
[10:32:26] [SERVER] Starting reconnect polling (5s interval)
[10:32:27] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:27] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:27] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:27] HELLO → sent (cached token, role=query)
[10:32:27] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:27] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:27] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:27] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:27] [CLEANUP] ========================================
[10:32:27] [CLEANUP] Cleaning up all agent connections and views
[10:32:27] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:27] [CLEANUP] Stopped and removed 0 video connections
[10:32:27] [CLEANUP] Removed 0 video views
[10:32:27] [CLEANUP] Removed 0 feed scroll views
[10:32:27] [CLEANUP] Removed 0 status labels
[10:32:27] [CLEANUP] Reset agent query state
[10:32:27] [CLEANUP] Updated page indicator
[10:32:27] [CLEANUP] Rebuilt video layout
[10:32:27] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:27] [CLEANUP] ========================================
[10:32:27] [SERVER] Starting reconnect polling (5s interval)
[10:32:27] [CLEANUP] ========================================
[10:32:27] [CLEANUP] Cleaning up all agent connections and views
[10:32:27] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:27] [CLEANUP] Stopped and removed 0 video connections
[10:32:27] [CLEANUP] Removed 0 video views
[10:32:27] [CLEANUP] Removed 0 feed scroll views
[10:32:27] [CLEANUP] Removed 0 status labels
[10:32:27] [CLEANUP] Reset agent query state
[10:32:27] [CLEANUP] Updated page indicator
[10:32:27] [CLEANUP] Rebuilt video layout
[10:32:27] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:27] [CLEANUP] ========================================
[10:32:27] [SERVER] Starting reconnect polling (5s interval)
[10:32:29] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:29] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:29] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:29] HELLO → sent (cached token, role=query)
[10:32:29] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:29] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:29] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:29] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:29] [CLEANUP] ========================================
[10:32:29] [CLEANUP] Cleaning up all agent connections and views
[10:32:29] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:29] [CLEANUP] Stopped and removed 0 video connections
[10:32:29] [CLEANUP] Removed 0 video views
[10:32:29] [CLEANUP] Removed 0 feed scroll views
[10:32:29] [CLEANUP] Removed 0 status labels
[10:32:29] [CLEANUP] Reset agent query state
[10:32:29] [CLEANUP] Updated page indicator
[10:32:29] [CLEANUP] Rebuilt video layout
[10:32:29] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:29] [CLEANUP] ========================================
[10:32:29] [SERVER] Starting reconnect polling (5s interval)
[10:32:29] [CLEANUP] ========================================
[10:32:29] [CLEANUP] Cleaning up all agent connections and views
[10:32:29] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:29] [CLEANUP] Stopped and removed 0 video connections
[10:32:29] [CLEANUP] Removed 0 video views
[10:32:29] [CLEANUP] Removed 0 feed scroll views
[10:32:29] [CLEANUP] Removed 0 status labels
[10:32:29] [CLEANUP] Reset agent query state
[10:32:29] [CLEANUP] Updated page indicator
[10:32:29] [CLEANUP] Rebuilt video layout
[10:32:29] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:29] [CLEANUP] ========================================
[10:32:29] [SERVER] Starting reconnect polling (5s interval)
[10:32:31] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:31] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:31] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:31] HELLO → sent (cached token, role=query)
[10:32:31] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:31] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:31] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:31] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:31] [CLEANUP] ========================================
[10:32:31] [CLEANUP] Cleaning up all agent connections and views
[10:32:31] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:31] [CLEANUP] Stopped and removed 0 video connections
[10:32:31] [CLEANUP] Removed 0 video views
[10:32:31] [CLEANUP] Removed 0 feed scroll views
[10:32:31] [CLEANUP] Removed 0 status labels
[10:32:31] [CLEANUP] Reset agent query state
[10:32:31] [CLEANUP] Updated page indicator
[10:32:31] [CLEANUP] Rebuilt video layout
[10:32:31] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:31] [CLEANUP] ========================================
[10:32:31] [SERVER] Starting reconnect polling (5s interval)
[10:32:31] [CLEANUP] ========================================
[10:32:31] [CLEANUP] Cleaning up all agent connections and views
[10:32:31] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:31] [CLEANUP] Stopped and removed 0 video connections
[10:32:31] [CLEANUP] Removed 0 video views
[10:32:31] [CLEANUP] Removed 0 feed scroll views
[10:32:31] [CLEANUP] Removed 0 status labels
[10:32:31] [CLEANUP] Reset agent query state
[10:32:31] [CLEANUP] Updated page indicator
[10:32:31] [CLEANUP] Rebuilt video layout
[10:32:31] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:31] [CLEANUP] ========================================
[10:32:31] [SERVER] Starting reconnect polling (5s interval)
[10:32:32] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:32] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:33] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:33] HELLO → sent (cached token, role=query)
[10:32:33] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:33] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:33] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:33] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:33] [CLEANUP] ========================================
[10:32:33] [CLEANUP] Cleaning up all agent connections and views
[10:32:33] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:33] [CLEANUP] Stopped and removed 0 video connections
[10:32:33] [CLEANUP] Removed 0 video views
[10:32:33] [CLEANUP] Removed 0 feed scroll views
[10:32:33] [CLEANUP] Removed 0 status labels
[10:32:33] [CLEANUP] Reset agent query state
[10:32:33] [CLEANUP] Updated page indicator
[10:32:33] [CLEANUP] Rebuilt video layout
[10:32:33] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:33] [CLEANUP] ========================================
[10:32:33] [SERVER] Starting reconnect polling (5s interval)
[10:32:33] [CLEANUP] ========================================
[10:32:33] [CLEANUP] Cleaning up all agent connections and views
[10:32:33] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:33] [CLEANUP] Stopped and removed 0 video connections
[10:32:33] [CLEANUP] Removed 0 video views
[10:32:33] [CLEANUP] Removed 0 feed scroll views
[10:32:33] [CLEANUP] Removed 0 status labels
[10:32:33] [CLEANUP] Reset agent query state
[10:32:33] [CLEANUP] Updated page indicator
[10:32:33] [CLEANUP] Rebuilt video layout
[10:32:33] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:33] [CLEANUP] ========================================
[10:32:33] [SERVER] Starting reconnect polling (5s interval)
[10:32:34] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:34] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:34] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:34] HELLO → sent (cached token, role=query)
[10:32:34] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:34] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:34] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:34] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:34] [CLEANUP] ========================================
[10:32:34] [CLEANUP] Cleaning up all agent connections and views
[10:32:34] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:34] [CLEANUP] Stopped and removed 0 video connections
[10:32:34] [CLEANUP] Removed 0 video views
[10:32:34] [CLEANUP] Removed 0 feed scroll views
[10:32:34] [CLEANUP] Removed 0 status labels
[10:32:34] [CLEANUP] Reset agent query state
[10:32:34] [CLEANUP] Updated page indicator
[10:32:34] [CLEANUP] Rebuilt video layout
[10:32:34] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:34] [CLEANUP] ========================================
[10:32:34] [SERVER] Starting reconnect polling (5s interval)
[10:32:34] [CLEANUP] ========================================
[10:32:34] [CLEANUP] Cleaning up all agent connections and views
[10:32:34] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:34] [CLEANUP] Stopped and removed 0 video connections
[10:32:34] [CLEANUP] Removed 0 video views
[10:32:34] [CLEANUP] Removed 0 feed scroll views
[10:32:34] [CLEANUP] Removed 0 status labels
[10:32:34] [CLEANUP] Reset agent query state
[10:32:34] [CLEANUP] Updated page indicator
[10:32:34] [CLEANUP] Rebuilt video layout
[10:32:34] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:34] [CLEANUP] ========================================
[10:32:34] [SERVER] Starting reconnect polling (5s interval)
[10:32:36] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:36] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:36] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:36] HELLO → sent (cached token, role=query)
[10:32:36] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:36] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:36] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:36] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:36] [CLEANUP] ========================================
[10:32:36] [CLEANUP] Cleaning up all agent connections and views
[10:32:36] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:36] [CLEANUP] Stopped and removed 0 video connections
[10:32:36] [CLEANUP] Removed 0 video views
[10:32:36] [CLEANUP] Removed 0 feed scroll views
[10:32:36] [CLEANUP] Removed 0 status labels
[10:32:36] [CLEANUP] Reset agent query state
[10:32:36] [CLEANUP] Updated page indicator
[10:32:36] [CLEANUP] Rebuilt video layout
[10:32:36] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:36] [CLEANUP] ========================================
[10:32:36] [SERVER] Starting reconnect polling (5s interval)
[10:32:36] [CLEANUP] ========================================
[10:32:36] [CLEANUP] Cleaning up all agent connections and views
[10:32:36] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:36] [CLEANUP] Stopped and removed 0 video connections
[10:32:36] [CLEANUP] Removed 0 video views
[10:32:36] [CLEANUP] Removed 0 feed scroll views
[10:32:36] [CLEANUP] Removed 0 status labels
[10:32:36] [CLEANUP] Reset agent query state
[10:32:36] [CLEANUP] Updated page indicator
[10:32:36] [CLEANUP] Rebuilt video layout
[10:32:36] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:36] [CLEANUP] ========================================
[10:32:36] [SERVER] Starting reconnect polling (5s interval)
[10:32:36] [CLIENT_SIG] Typing stop from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:32:37] [CLIENT_SIG] Event received: type=0 messageId=28839
[10:32:37] [WS_EVENT] Received event: type=0, messageId=28839
[10:32:37] [WS_EVENT] 📨 New message notification (msgId=28839) - triggering incremental refresh, currentMsgCount=61
[10:32:37] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=61
[10:32:37] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28838, maxMemoryId=28838
[10:32:37] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28838
[10:32:37] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:32:37] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28839]
[10:32:37] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 61 msgs, first 10 IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[10:32:37] [PUSH_TRACE] 📡 INCREMENTAL: Adding new message id=28839
[10:32:37] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 1 new, total 62, first 10 IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:37] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:32:37] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=62
[10:32:37] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=62
[10:32:37] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:32:37] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=62, first5Ids=[28839, 28838, 28837, 28836, 28835]
[10:32:37] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 62 messages
[10:32:37] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:37] [RELOAD_TAB] 📊 Building chatRows from 62 messages
[10:32:37] [SCROLL] wasNearBottom=true, threshold=447, offset=5053, contentH=5500, boundsH=447, forceScroll=false
[10:32:37] [RELOAD_TAB] 📊 Built 64 chatRows, estHeight=0.0
[10:32:37] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28838 → 28839
[10:32:37] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=72
[10:32:37] [SCROLL] 💓 alive, visible=56...63, rows=64, estHeight=0.0, heightCalls=137
[10:32:37] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=5130, currentOffset=5130
[10:32:37] [SCROLL] Scrolling to 5130, animated=true
[10:32:38] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:38] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:38] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:38] HELLO → sent (cached token, role=query)
[10:32:38] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:38] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:38] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:38] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:38] [CLEANUP] ========================================
[10:32:38] [CLEANUP] Cleaning up all agent connections and views
[10:32:38] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:38] [CLEANUP] Stopped and removed 0 video connections
[10:32:38] [CLEANUP] Removed 0 video views
[10:32:38] [CLEANUP] Removed 0 feed scroll views
[10:32:38] [CLEANUP] Removed 0 status labels
[10:32:38] [CLEANUP] Reset agent query state
[10:32:38] [CLEANUP] Updated page indicator
[10:32:38] [CLEANUP] Rebuilt video layout
[10:32:38] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:38] [CLEANUP] ========================================
[10:32:38] [SERVER] Starting reconnect polling (5s interval)
[10:32:38] [CLEANUP] ========================================
[10:32:38] [CLEANUP] Cleaning up all agent connections and views
[10:32:38] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:38] [CLEANUP] Stopped and removed 0 video connections
[10:32:38] [CLEANUP] Removed 0 video views
[10:32:38] [CLEANUP] Removed 0 feed scroll views
[10:32:38] [CLEANUP] Removed 0 status labels
[10:32:38] [CLEANUP] Reset agent query state
[10:32:38] [CLEANUP] Updated page indicator
[10:32:38] [CLEANUP] Rebuilt video layout
[10:32:38] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:38] [CLEANUP] ========================================
[10:32:38] [SERVER] Starting reconnect polling (5s interval)
[10:32:38] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[10:32:38] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 62 msgs, IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2293 vccs=0
[10:32:38] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28839
[10:32:38] [PUSH] handlePollEventsNotification userInfo: [:]
[10:32:38] [PUSH] No message_id in userInfo
[10:32:38] [PUSH] No operation_type in userInfo
[10:32:38] [FAST_REFRESH] Evolution disabled - performing incremental sync
[10:32:38] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=60, IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[10:32:38] [PUSH_TRACE] 📬 POLL: memory state: count=62, first 10 IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [FAST_REFRESH] Already have 62 messages in memory
[10:32:38] [FAST_REFRESH] maxMemoryId=28839, maxLocalId=28839
[10:32:38] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[10:32:38] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=62
[10:32:38] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[10:32:38] [READBY_OPT] No message IDs to fetch - skipping server call
[10:32:38] [GAP_FIX] Incremental sync will use since_id=28835 (background max=28835, current DB max=28839)
[10:32:38] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=62
[10:32:38] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28835, maxMemoryId=28839
[10:32:38] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28835
[10:32:38] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[10:32:38] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=62
[10:32:38] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:32:38] [PUSH] Silent push received
[10:32:38] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:38 +0000, appState=0, message_id=nil, type=nil
[10:32:38] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=60, IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[10:32:38] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:38 +0000
[10:32:38] [PUSH_EMBED] No embedded message_data in notification
[10:32:38] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:32:38] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=60, IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829], handled=false
[10:32:38] [PUSH] No embedded data, pre-loading messages from server
[10:32:38] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:32:38] [PUSH_DEBUG] ⬇️ PUSH RECEIVED at 2026-04-23 08:32:38 +0000 - type: unknown, operation_type: 0, message_id: 28839, session_id: ILUIWU, state: 0
[10:32:38] [PUSH_DEBUG] Full userInfo: [AnyHashable("operation_type"): 0, AnyHashable("timer"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("message_id"): 28839, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): , AnyHashable("thumb_file_name"): , AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:32:36";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "I did baby. But let me do it again";
    "message_id" = 28839;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28838;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("datesent"): 2026-04-23 08:32:36, AnyHashable("message"): I did baby. But let me do it again, AnyHashable("message_type"): 0, AnyHashable("sender_name"): Esra]
[10:32:38] [PUSH] App active - suppressing notification UI, posting internal event
[10:32:38] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:38 +0000
[10:32:38] [PUSH_TRACE] ⬇️ Processing embedded message_id=28839
[10:32:38] [PUSH_EMBED] 📩 Received embedded message: id=28839, type=0, sender=Esra
[10:32:38] [PUSH_TRACE] ⬇️ Message details: text="I did baby. But let me do it again...", datesent=2026-04-23 08:32:36
[10:32:38] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[10:32:38] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28839
[10:32:38] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28839
[10:32:38] [PUSH_EMBED] ✅ Saved message 28839 to local DB (sync)
[10:32:38] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28839
[10:32:38] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28839
[10:32:38] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28839
[10:32:38] [PUSH_TRACE] 📦 Cache state: valid=true, count=60, IDs=[28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830, 28829]
[10:32:38] [PUSH_EMBED] Inserted message 28839 into existing cache (now 61 messages)
[10:32:38] [PUSH_TRACE] 📦 ✅ Inserted message 28839, cache now has IDs: [28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [PUSH_TRACE] 📦 EXITING cache update queue for message 28839
[10:32:38] [PUSH_EMBED] Fetching evolution data for message 28839 in background
[10:32:38] [PUSH_EMBED] ✅ Fully processed message 28839
[10:32:38] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28839
[10:32:38] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 62 msgs, IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2293 vccs=0
[10:32:38] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28839
[10:32:38] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 0, AnyHashable("timer"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("message_id"): 28839, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): , AnyHashable("thumb_file_name"): , AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:32:36";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "I did baby. But let me do it again";
    "message_id" = 28839;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28838;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("datesent"): 2026-04-23 08:32:36, AnyHashable("message"): I did baby. But let me do it again, AnyHashable("message_type"): 0, AnyHashable("sender_name"): Esra]
[10:32:38] [PUSH_EMBED_VC] Message 28839 already in memory - skipping
[10:32:38] [PUSH] ⚡ Embedded message handled directly in ViewController
[10:32:38] [PUSH] Parsed message_id: 28839
[10:32:38] [PUSH] Parsed operation_type: 0
[10:32:38] [PUSH] Taking direct action: opType=0, messageId=28839
[10:32:38] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28839
[10:32:38] [PUSH] ⚡ Message 28839 already in memory - skipping duplicate notification entirely
[10:32:38] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:32:38] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[10:32:38] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[10:32:38] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[10:32:38] [PUSH_TRACE] 👁️ Received message id=28839, text="I did baby. But let me do it a..."
[10:32:38] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[10:32:38] [PUSH_UI] Message 28839 already in memory - skipping insert
[10:32:38] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[10:32:38] [PUSH] Silent push received
[10:32:38] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:38 +0000, appState=0, message_id=28839, type=nil
[10:32:38] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=61, IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:38 +0000
[10:32:38] [PUSH_TRACE] ⬇️ Processing embedded message_id=28839
[10:32:38] [PUSH_EMBED] 📩 Received embedded message: id=28839, type=0, sender=Esra
[10:32:38] [PUSH_TRACE] ⬇️ Message details: text="I did baby. But let me do it again...", datesent=2026-04-23 08:32:36
[10:32:38] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[10:32:38] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28839
[10:32:38] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28839
[10:32:38] [PUSH_EMBED] ✅ Saved message 28839 to local DB (sync)
[10:32:38] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28839
[10:32:38] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28839
[10:32:38] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28839
[10:32:38] [PUSH_TRACE] 📦 Cache state: valid=true, count=61, IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [PUSH_TRACE] 📦 ⚠️ Message 28839 already in cache, skipping insert
[10:32:38] [PUSH_TRACE] 📦 EXITING cache update queue for message 28839
[10:32:38] [PUSH_EMBED] Fetching evolution data for message 28839 in background
[10:32:38] [PUSH_EMBED] ✅ Fully processed message 28839
[10:32:38] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28839
[10:32:38] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=61, IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830], handled=true
[10:32:38] [PUSH] Embedded message handled instantly from silent push
[10:32:38] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[10:32:38] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28839
[10:32:38] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[10:32:38] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[10:32:38] [PUSH_TRACE] 👁️ Received message id=28839, text="I did baby. But let me do it a..."
[10:32:38] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[10:32:38] [PUSH_UI] Message 28839 already in memory - skipping insert
[10:32:38] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[10:32:38] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 62 msgs, IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2293 vccs=0
[10:32:38] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28839
[10:32:38] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("sender_name"): Esra, AnyHashable("file_name"): , AnyHashable("datesent"): 2026-04-23 08:32:36, AnyHashable("operation_type"): 0, AnyHashable("message_type"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("timer"): 0, AnyHashable("message_id"): 28839, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("thumb_file_name"): , AnyHashable("message"): I did baby. But let me do it again, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:32:36";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "I did baby. But let me do it again";
    "message_id" = 28839;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28838;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE]
[10:32:38] [PUSH_EMBED_VC] Message 28839 already in memory - skipping
[10:32:38] [PUSH] ⚡ Embedded message handled directly in ViewController
[10:32:38] [PUSH] Parsed message_id: 28839
[10:32:38] [PUSH] Parsed operation_type: 0
[10:32:38] [PUSH] Taking direct action: opType=0, messageId=28839
[10:32:38] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28839
[10:32:38] [PUSH] ⚡ Message 28839 already in memory - skipping duplicate notification entirely
[10:32:38] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:32:38] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[10:32:38] [PUSH] Silent push received
[10:32:38] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:38 +0000, appState=0, message_id=28839, type=nil
[10:32:38] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=61, IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:38 +0000
[10:32:38] [PUSH_TRACE] ⬇️ Processing embedded message_id=28839
[10:32:38] [PUSH_EMBED] 📩 Received embedded message: id=28839, type=0, sender=Esra
[10:32:38] [PUSH_TRACE] ⬇️ Message details: text="I did baby. But let me do it again...", datesent=2026-04-23 08:32:36
[10:32:38] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[10:32:38] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28839
[10:32:38] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28839
[10:32:38] [PUSH_EMBED] ✅ Saved message 28839 to local DB (sync)
[10:32:38] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28839
[10:32:38] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28839
[10:32:38] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28839
[10:32:38] [PUSH_TRACE] 📦 Cache state: valid=true, count=61, IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [PUSH_TRACE] 📦 ⚠️ Message 28839 already in cache, skipping insert
[10:32:38] [PUSH_TRACE] 📦 EXITING cache update queue for message 28839
[10:32:38] [PUSH_EMBED] Fetching evolution data for message 28839 in background
[10:32:38] [PUSH_EMBED] ✅ Fully processed message 28839
[10:32:38] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28839
[10:32:38] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=61, IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830], handled=true
[10:32:38] [PUSH] Embedded message handled instantly from silent push
[10:32:38] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[10:32:38] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28839
[10:32:38] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[10:32:38] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[10:32:38] [PUSH_TRACE] 👁️ Received message id=28839, text="I did baby. But let me do it a..."
[10:32:38] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[10:32:38] [PUSH_UI] Message 28839 already in memory - skipping insert
[10:32:38] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[10:32:38] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 62 msgs, IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2293 vccs=0
[10:32:38] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28839
[10:32:38] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("timer"): 0, AnyHashable("thumb_file_name"): , AnyHashable("message_type"): 0, AnyHashable("message"): I did baby. But let me do it again, AnyHashable("message_id"): 28839, AnyHashable("file_name"): , AnyHashable("datesent"): 2026-04-23 08:32:36, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:32:36";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "I did baby. But let me do it again";
    "message_id" = 28839;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28838;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("sender_name"): Esra, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}]
[10:32:38] [PUSH_EMBED_VC] Message 28839 already in memory - skipping
[10:32:38] [PUSH] ⚡ Embedded message handled directly in ViewController
[10:32:38] [PUSH] Parsed message_id: 28839
[10:32:38] [PUSH] Parsed operation_type: 0
[10:32:38] [PUSH] Taking direct action: opType=0, messageId=28839
[10:32:38] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28839
[10:32:38] [PUSH] ⚡ Message 28839 already in memory - skipping duplicate notification entirely
[10:32:38] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:32:38] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[10:32:38] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:32:38] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=62, first5Ids=[28839, 28838, 28837, 28836, 28835]
[10:32:38] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 62 messages
[10:32:38] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [RELOAD_TAB] 📊 Building chatRows from 62 messages
[10:32:38] [SCROLL] wasNearBottom=true, threshold=447, offset=5130, contentH=5577, boundsH=447, forceScroll=true
[10:32:38] [RELOAD_TAB] 📊 Built 64 chatRows, estHeight=0.0
[10:32:38] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=71
[10:32:38] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=5130, currentOffset=5130
[10:32:38] [SCROLL] Scrolling to 5130, animated=false
[10:32:38] [PUSH_EMBED] Got evolution data for message 28839, saving to local DB
[10:32:38] [PUSH_EMBED] Saved evolution data for message 28839
[10:32:38] [PUSH_EMBED] Got evolution data for message 28839, saving to local DB
[10:32:38] [PUSH_EMBED] Saved evolution data for message 28839
[10:32:38] [INCREMENTAL_SYNC] ✅ Found 4 new messages
[10:32:38] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 4 new messages, IDs=[28839, 28838, 28837, 28836]
[10:32:38] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 62 msgs, first 10 IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 62, first 10 IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=4
[10:32:38] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=62
[10:32:38] [INCREMENTAL_SYNC] 🔁 Processing queued retry refresh
[10:32:38] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=62
[10:32:38] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28839, maxMemoryId=28839
[10:32:38] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28839
[10:32:38] [FAST_REFRESH] Incremental sync complete - 62 messages
[10:32:38] [PUSH_EMBED] Got evolution data for message 28839, saving to local DB
[10:32:38] [PUSH_EMBED] Saved evolution data for message 28839
[10:32:38] [INCREMENTAL_SYNC] ✅ No new messages
[10:32:38] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=71
[10:32:38] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=62, first5Ids=[28839, 28838, 28837, 28836, 28835]
[10:32:38] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 62 messages
[10:32:38] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [RELOAD_TAB] 📊 Building chatRows from 62 messages
[10:32:38] [SCROLL] wasNearBottom=true, threshold=447, offset=5130, contentH=5577, boundsH=447, forceScroll=false
[10:32:38] [RELOAD_TAB] 📊 Built 64 chatRows, estHeight=0.0
[10:32:38] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[10:32:38] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:32:38] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:32:38] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:32:38] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:32:38] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:32:38] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:32:38] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=61, IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [PRELOAD_CACHE] Preserving 11 push-inserted messages: [28748, 28747, 28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:32:38] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=11, IDs=[28748, 28747, 28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:32:38] [PUSH_TRACE] 🔀 mergeMessages: merged.count=61, first 10 IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [PUSH_PRELOAD] ⚡ Pre-cached 61 messages for instant display (preserved 11 from push)
[10:32:38] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:32:38] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 62 msgs, IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2294 vccs=0
[10:32:38] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28839
[10:32:38] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28839, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU]
[10:32:38] [PUSH] Parsed message_id: 28839
[10:32:38] [PUSH] Parsed operation_type: 3
[10:32:38] [PUSH] Taking direct action: opType=3, messageId=28839
[10:32:38] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28839
[10:32:38] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:32:38] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=62
[10:32:38] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28835, maxMemoryId=28839
[10:32:38] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28835
[10:32:38] [INCREMENTAL_SYNC] ✅ Found 4 new messages
[10:32:38] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 4 new messages, IDs=[28839, 28838, 28837, 28836]
[10:32:38] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 62 msgs, first 10 IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 62, first 10 IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:38] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=4
[10:32:38] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=62
[10:32:39] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:32:39] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=62, first5Ids=[28839, 28838, 28837, 28836, 28835]
[10:32:39] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 62 messages
[10:32:39] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:39] [RELOAD_TAB] 📊 Building chatRows from 62 messages
[10:32:39] [SCROLL] wasNearBottom=true, threshold=447, offset=5130, contentH=5577, boundsH=447, forceScroll=false
[10:32:39] [RELOAD_TAB] 📊 Built 64 chatRows, estHeight=0.0
[10:32:39] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[10:32:39] [CLIENT_SIG] Event received: type=3 messageId=28839
[10:32:39] [WS_EVENT] Received event: type=3, messageId=28839
[10:32:39] [WS_EVENT] Read receipt for message 28839 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:32:39] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[10:32:39] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[10:32:39] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:39] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:39] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:39] HELLO → sent (cached token, role=query)
[10:32:39] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:39] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:39] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:39] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:39] [CLEANUP] ========================================
[10:32:39] [CLEANUP] Cleaning up all agent connections and views
[10:32:39] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:39] [CLEANUP] Stopped and removed 0 video connections
[10:32:39] [CLEANUP] Removed 0 video views
[10:32:39] [CLEANUP] Removed 0 feed scroll views
[10:32:39] [CLEANUP] Removed 0 status labels
[10:32:39] [CLEANUP] Reset agent query state
[10:32:39] [CLEANUP] Updated page indicator
[10:32:39] [CLEANUP] Rebuilt video layout
[10:32:39] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:39] [CLEANUP] ========================================
[10:32:39] [SERVER] Starting reconnect polling (5s interval)
[10:32:39] [CLEANUP] ========================================
[10:32:39] [CLEANUP] Cleaning up all agent connections and views
[10:32:39] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:39] [CLEANUP] Stopped and removed 0 video connections
[10:32:39] [CLEANUP] Removed 0 video views
[10:32:39] [CLEANUP] Removed 0 feed scroll views
[10:32:39] [CLEANUP] Removed 0 status labels
[10:32:39] [CLEANUP] Reset agent query state
[10:32:39] [CLEANUP] Updated page indicator
[10:32:39] [CLEANUP] Rebuilt video layout
[10:32:39] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:39] [CLEANUP] ========================================
[10:32:39] [SERVER] Starting reconnect polling (5s interval)
[10:32:41] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:41] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:41] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:41] HELLO → sent (cached token, role=query)
[10:32:41] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:41] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:41] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:41] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:41] [CLEANUP] ========================================
[10:32:41] [CLEANUP] Cleaning up all agent connections and views
[10:32:41] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:41] [CLEANUP] Stopped and removed 0 video connections
[10:32:41] [CLEANUP] Removed 0 video views
[10:32:41] [CLEANUP] Removed 0 feed scroll views
[10:32:41] [CLEANUP] Removed 0 status labels
[10:32:41] [CLEANUP] Reset agent query state
[10:32:41] [CLEANUP] Updated page indicator
[10:32:41] [CLEANUP] Rebuilt video layout
[10:32:41] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:41] [CLEANUP] ========================================
[10:32:41] [SERVER] Starting reconnect polling (5s interval)
[10:32:41] [CLEANUP] ========================================
[10:32:41] [CLEANUP] Cleaning up all agent connections and views
[10:32:41] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:41] [CLEANUP] Stopped and removed 0 video connections
[10:32:41] [CLEANUP] Removed 0 video views
[10:32:41] [CLEANUP] Removed 0 feed scroll views
[10:32:41] [CLEANUP] Removed 0 status labels
[10:32:41] [CLEANUP] Reset agent query state
[10:32:41] [CLEANUP] Updated page indicator
[10:32:41] [CLEANUP] Rebuilt video layout
[10:32:41] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:41] [CLEANUP] ========================================
[10:32:41] [SERVER] Starting reconnect polling (5s interval)
[10:32:42] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:42] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:43] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:43] HELLO → sent (cached token, role=query)
[10:32:43] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:43] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:43] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:43] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:43] [CLEANUP] ========================================
[10:32:43] [CLEANUP] Cleaning up all agent connections and views
[10:32:43] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:43] [CLEANUP] Stopped and removed 0 video connections
[10:32:43] [CLEANUP] Removed 0 video views
[10:32:43] [CLEANUP] Removed 0 feed scroll views
[10:32:43] [CLEANUP] Removed 0 status labels
[10:32:43] [CLEANUP] Reset agent query state
[10:32:43] [CLEANUP] Updated page indicator
[10:32:43] [CLEANUP] Rebuilt video layout
[10:32:43] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:43] [CLEANUP] ========================================
[10:32:43] [SERVER] Starting reconnect polling (5s interval)
[10:32:43] [CLEANUP] ========================================
[10:32:43] [CLEANUP] Cleaning up all agent connections and views
[10:32:43] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:43] [CLEANUP] Stopped and removed 0 video connections
[10:32:43] [CLEANUP] Removed 0 video views
[10:32:43] [CLEANUP] Removed 0 feed scroll views
[10:32:43] [CLEANUP] Removed 0 status labels
[10:32:43] [CLEANUP] Reset agent query state
[10:32:43] [CLEANUP] Updated page indicator
[10:32:43] [CLEANUP] Rebuilt video layout
[10:32:43] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:43] [CLEANUP] ========================================
[10:32:43] [SERVER] Starting reconnect polling (5s interval)
[10:32:44] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:44] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:44] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:44] HELLO → sent (cached token, role=query)
[10:32:44] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:44] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:44] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:44] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:44] [CLEANUP] ========================================
[10:32:44] [CLEANUP] Cleaning up all agent connections and views
[10:32:44] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:44] [CLEANUP] Stopped and removed 0 video connections
[10:32:44] [CLEANUP] Removed 0 video views
[10:32:44] [CLEANUP] Removed 0 feed scroll views
[10:32:44] [CLEANUP] Removed 0 status labels
[10:32:44] [CLEANUP] Reset agent query state
[10:32:44] [CLEANUP] Updated page indicator
[10:32:44] [CLEANUP] Rebuilt video layout
[10:32:44] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:44] [CLEANUP] ========================================
[10:32:44] [SERVER] Starting reconnect polling (5s interval)
[10:32:44] [CLEANUP] ========================================
[10:32:44] [CLEANUP] Cleaning up all agent connections and views
[10:32:44] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:44] [CLEANUP] Stopped and removed 0 video connections
[10:32:44] [CLEANUP] Removed 0 video views
[10:32:44] [CLEANUP] Removed 0 feed scroll views
[10:32:44] [CLEANUP] Removed 0 status labels
[10:32:44] [CLEANUP] Reset agent query state
[10:32:44] [CLEANUP] Updated page indicator
[10:32:44] [CLEANUP] Rebuilt video layout
[10:32:44] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:44] [CLEANUP] ========================================
[10:32:44] [SERVER] Starting reconnect polling (5s interval)
[10:32:45] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[10:32:45] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=62, isReloading=false
[10:32:45] [SEND_MESSAGE] ✅ Added optimistic message id=-10 to arrays, newMsgCount=63
[10:32:45] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:32:45] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=63, first5Ids=[-10, 28839, 28838, 28837, 28836]
[10:32:45] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 63 messages
[10:32:45] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-10, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831]
[10:32:45] [RELOAD_TAB] 📊 Building chatRows from 63 messages
[10:32:45] [SCROLL] wasNearBottom=true, threshold=447, offset=5130, contentH=5577, boundsH=447, forceScroll=false
[10:32:45] [RELOAD_TAB] 📊 Built 65 chatRows, estHeight=0.0
[10:32:45] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=73
[10:32:45] [SCROLL] 💓 alive, visible=57...64, rows=65, estHeight=0.0, heightCalls=139
[10:32:45] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:32:45] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[10:32:45] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=5207, currentOffset=5207
[10:32:45] [SCROLL] Scrolling to 5207, animated=true
[10:32:45] [CLIENT_SIG] Event received: type=0 messageId=28840
[10:32:45] [WS_EVENT] Received event: type=0, messageId=28840
[10:32:45] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28840,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 08:32:45"}
[10:32:45] [WS_EVENT] 📨 New message notification (msgId=28840) - triggering incremental refresh, currentMsgCount=63
[10:32:45] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=63
[10:32:45] [CHAT] receive_message.php JSON: ["message_type": 0, "ok": 1, "session_id": ILUIWU, "datesent_utc": 2026-04-23 08:32:45, "message_id": 28840, "file_name": ]
[10:32:45] [DB_UPGRADE] Upgrading message ID: -10 → 28840, preserveOriginalDate=false
[10:32:45] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28839, maxMemoryId=28839
[10:32:45] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28839
[10:32:45] [DB_UPGRADE] ✅ Upgraded -10 → 28840 with send_status=0, 1 row(s) affected
[10:32:45] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -10 → 28840
[10:32:45] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -10 → 28840
[10:32:45] ReloadData 9
[10:32:45] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:32:45] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28840]
[10:32:45] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 63 msgs, first 10 IDs=[28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831]
[10:32:45] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 63, first 10 IDs=[28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831]
[10:32:45] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:32:45] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=63
[10:32:45] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=63
[10:32:45] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=71
[10:32:45] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=63, first5Ids=[28840, 28839, 28838, 28837, 28836]
[10:32:45] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 63 messages
[10:32:45] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831]
[10:32:45] [RELOAD_TAB] 📊 Building chatRows from 63 messages
[10:32:45] [SCROLL] wasNearBottom=true, threshold=447, offset=5207, contentH=5654, boundsH=447, forceScroll=true
[10:32:45] [RELOAD_TAB] 📊 Built 65 chatRows, estHeight=0.0
[10:32:45] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=71
[10:32:45] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=5207, currentOffset=5207
[10:32:45] [SCROLL] Scrolling to 5207, animated=false
[10:32:46] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:46] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:46] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:46] HELLO → sent (cached token, role=query)
[10:32:46] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:46] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:46] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:46] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:46] [CLEANUP] ========================================
[10:32:46] [CLEANUP] Cleaning up all agent connections and views
[10:32:46] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:46] [CLEANUP] Stopped and removed 0 video connections
[10:32:46] [CLEANUP] Removed 0 video views
[10:32:46] [CLEANUP] Removed 0 feed scroll views
[10:32:46] [CLEANUP] Removed 0 status labels
[10:32:46] [CLEANUP] Reset agent query state
[10:32:46] [CLEANUP] Updated page indicator
[10:32:46] [CLEANUP] Rebuilt video layout
[10:32:46] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:46] [CLEANUP] ========================================
[10:32:46] [SERVER] Starting reconnect polling (5s interval)
[10:32:46] [CLEANUP] ========================================
[10:32:46] [CLEANUP] Cleaning up all agent connections and views
[10:32:46] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:46] [CLEANUP] Stopped and removed 0 video connections
[10:32:46] [CLEANUP] Removed 0 video views
[10:32:46] [CLEANUP] Removed 0 feed scroll views
[10:32:46] [CLEANUP] Removed 0 status labels
[10:32:46] [CLEANUP] Reset agent query state
[10:32:46] [CLEANUP] Updated page indicator
[10:32:46] [CLEANUP] Rebuilt video layout
[10:32:46] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:46] [CLEANUP] ========================================
[10:32:46] [SERVER] Starting reconnect polling (5s interval)
[10:32:47] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:47] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:48] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:48] HELLO → sent (cached token, role=query)
[10:32:48] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:48] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:48] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:48] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:48] [CLEANUP] ========================================
[10:32:48] [CLEANUP] Cleaning up all agent connections and views
[10:32:48] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:48] [CLEANUP] Stopped and removed 0 video connections
[10:32:48] [CLEANUP] Removed 0 video views
[10:32:48] [CLEANUP] Removed 0 feed scroll views
[10:32:48] [CLEANUP] Removed 0 status labels
[10:32:48] [CLEANUP] Reset agent query state
[10:32:48] [CLEANUP] Updated page indicator
[10:32:48] [CLEANUP] Rebuilt video layout
[10:32:48] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:48] [CLEANUP] ========================================
[10:32:48] [SERVER] Starting reconnect polling (5s interval)
[10:32:48] [CLEANUP] ========================================
[10:32:48] [CLEANUP] Cleaning up all agent connections and views
[10:32:48] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:48] [CLEANUP] Stopped and removed 0 video connections
[10:32:48] [CLEANUP] Removed 0 video views
[10:32:48] [CLEANUP] Removed 0 feed scroll views
[10:32:48] [CLEANUP] Removed 0 status labels
[10:32:48] [CLEANUP] Reset agent query state
[10:32:48] [CLEANUP] Updated page indicator
[10:32:48] [CLEANUP] Rebuilt video layout
[10:32:48] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:48] [CLEANUP] ========================================
[10:32:48] [SERVER] Starting reconnect polling (5s interval)
[10:32:48] [CLIENT_SIG] Client connected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[10:32:49] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:49] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:49] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:49] HELLO → sent (cached token, role=query)
[10:32:49] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:49] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:49] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:49] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:49] [CLEANUP] ========================================
[10:32:49] [CLEANUP] Cleaning up all agent connections and views
[10:32:49] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:49] [CLEANUP] Stopped and removed 0 video connections
[10:32:49] [CLEANUP] Removed 0 video views
[10:32:49] [CLEANUP] Removed 0 feed scroll views
[10:32:49] [CLEANUP] Removed 0 status labels
[10:32:49] [CLEANUP] Reset agent query state
[10:32:49] [CLEANUP] Updated page indicator
[10:32:49] [CLEANUP] Rebuilt video layout
[10:32:49] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:49] [CLEANUP] ========================================
[10:32:49] [SERVER] Starting reconnect polling (5s interval)
[10:32:49] [CLEANUP] ========================================
[10:32:49] [CLEANUP] Cleaning up all agent connections and views
[10:32:49] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:49] [CLEANUP] Stopped and removed 0 video connections
[10:32:49] [CLEANUP] Removed 0 video views
[10:32:49] [CLEANUP] Removed 0 feed scroll views
[10:32:49] [CLEANUP] Removed 0 status labels
[10:32:49] [CLEANUP] Reset agent query state
[10:32:49] [CLEANUP] Updated page indicator
[10:32:49] [CLEANUP] Rebuilt video layout
[10:32:49] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:49] [CLEANUP] ========================================
[10:32:49] [SERVER] Starting reconnect polling (5s interval)
[10:32:51] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:51] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:51] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:51] HELLO → sent (cached token, role=query)
[10:32:51] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:51] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:51] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:51] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:51] [CLEANUP] ========================================
[10:32:51] [CLEANUP] Cleaning up all agent connections and views
[10:32:51] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:51] [CLEANUP] Stopped and removed 0 video connections
[10:32:51] [CLEANUP] Removed 0 video views
[10:32:51] [CLEANUP] Removed 0 feed scroll views
[10:32:51] [CLEANUP] Removed 0 status labels
[10:32:51] [CLEANUP] Reset agent query state
[10:32:51] [CLEANUP] Updated page indicator
[10:32:51] [CLEANUP] Rebuilt video layout
[10:32:51] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:51] [CLEANUP] ========================================
[10:32:51] [SERVER] Starting reconnect polling (5s interval)
[10:32:51] [CLEANUP] ========================================
[10:32:51] [CLEANUP] Cleaning up all agent connections and views
[10:32:51] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:51] [CLEANUP] Stopped and removed 0 video connections
[10:32:51] [CLEANUP] Removed 0 video views
[10:32:51] [CLEANUP] Removed 0 feed scroll views
[10:32:51] [CLEANUP] Removed 0 status labels
[10:32:51] [CLEANUP] Reset agent query state
[10:32:51] [CLEANUP] Updated page indicator
[10:32:51] [CLEANUP] Rebuilt video layout
[10:32:51] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:51] [CLEANUP] ========================================
[10:32:51] [SERVER] Starting reconnect polling (5s interval)
[10:32:51] [PUSH] Silent push received
[10:32:51] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:51 +0000, appState=0, message_id=nil, type=nil
[10:32:51] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=61, IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:51] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:51 +0000
[10:32:51] [PUSH_EMBED] No embedded message_data in notification
[10:32:51] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:32:51] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=61, IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830], handled=false
[10:32:51] [PUSH] No embedded data, pre-loading messages from server
[10:32:51] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:32:52] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:32:52] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:32:52] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:32:52] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:32:52] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:32:52] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:32:52] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831]
[10:32:52] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=61, IDs=[28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831, 28830]
[10:32:52] [PRELOAD_CACHE] Preserving 12 push-inserted messages: [28749, 28748, 28747, 28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:32:52] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=12, IDs=[28749, 28748, 28747, 28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:32:52] [PUSH_TRACE] 🔀 mergeMessages: merged.count=62, first 10 IDs=[28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831]
[10:32:52] [PUSH_PRELOAD] ⚡ Pre-cached 62 messages for instant display (preserved 12 from push)
[10:32:52] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:32:52] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 63 msgs, IDs=[28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831]
[10:32:52] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2307 vccs=0
[10:32:52] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28840
[10:32:52] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28840, AnyHashable("operation_type"): 3]
[10:32:52] [PUSH] Parsed message_id: 28840
[10:32:52] [PUSH] Parsed operation_type: 3
[10:32:52] [PUSH] Taking direct action: opType=3, messageId=28840
[10:32:52] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28840
[10:32:52] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:32:52] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=63
[10:32:52] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28835, maxMemoryId=28840
[10:32:52] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28835
[10:32:52] [CLIENT_SIG] Event received: type=3 messageId=28840
[10:32:52] [WS_EVENT] Received event: type=3, messageId=28840
[10:32:52] [WS_EVENT] Read receipt for message 28840 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:32:52] [INCREMENTAL_SYNC] ✅ Found 5 new messages
[10:32:52] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 5 new messages, IDs=[28840, 28839, 28838, 28837, 28836]
[10:32:52] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 63 msgs, first 10 IDs=[28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831]
[10:32:52] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 63, first 10 IDs=[28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831]
[10:32:52] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=5
[10:32:52] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=63
[10:32:52] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=71
[10:32:52] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=63, first5Ids=[28840, 28839, 28838, 28837, 28836]
[10:32:52] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 63 messages
[10:32:52] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831]
[10:32:52] [RELOAD_TAB] 📊 Building chatRows from 63 messages
[10:32:52] [SCROLL] wasNearBottom=true, threshold=447, offset=5207, contentH=5654, boundsH=447, forceScroll=false
[10:32:52] [RELOAD_TAB] 📊 Built 65 chatRows, estHeight=0.0
[10:32:52] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=71
[10:32:52] [SCROLL] Async handler: shouldScroll=false (force=false, newMsgs=false, nearBottom=true), maxY=5207, currentOffset=5207
[10:32:53] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:53] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:53] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:53] HELLO → sent (cached token, role=query)
[10:32:53] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:53] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:53] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:53] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:53] [CLEANUP] ========================================
[10:32:53] [CLEANUP] Cleaning up all agent connections and views
[10:32:53] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:53] [CLEANUP] Stopped and removed 0 video connections
[10:32:53] [CLEANUP] Removed 0 video views
[10:32:53] [CLEANUP] Removed 0 feed scroll views
[10:32:53] [CLEANUP] Removed 0 status labels
[10:32:53] [CLEANUP] Reset agent query state
[10:32:53] [CLEANUP] Updated page indicator
[10:32:53] [CLEANUP] Rebuilt video layout
[10:32:53] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:53] [CLEANUP] ========================================
[10:32:53] [SERVER] Starting reconnect polling (5s interval)
[10:32:53] [CLEANUP] ========================================
[10:32:53] [CLEANUP] Cleaning up all agent connections and views
[10:32:53] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:53] [CLEANUP] Stopped and removed 0 video connections
[10:32:53] [CLEANUP] Removed 0 video views
[10:32:53] [CLEANUP] Removed 0 feed scroll views
[10:32:53] [CLEANUP] Removed 0 status labels
[10:32:53] [CLEANUP] Reset agent query state
[10:32:53] [CLEANUP] Updated page indicator
[10:32:53] [CLEANUP] Rebuilt video layout
[10:32:53] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:53] [CLEANUP] ========================================
[10:32:53] [SERVER] Starting reconnect polling (5s interval)
[10:32:54] [CLIENT_SIG] Typing start from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:32:54] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:54] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:54] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:54] HELLO → sent (cached token, role=query)
[10:32:54] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:54] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:54] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:54] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:54] [CLEANUP] ========================================
[10:32:54] [CLEANUP] Cleaning up all agent connections and views
[10:32:54] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:54] [CLEANUP] Stopped and removed 0 video connections
[10:32:54] [CLEANUP] Removed 0 video views
[10:32:54] [CLEANUP] Removed 0 feed scroll views
[10:32:54] [CLEANUP] Removed 0 status labels
[10:32:54] [CLEANUP] Reset agent query state
[10:32:54] [CLEANUP] Updated page indicator
[10:32:54] [CLEANUP] Rebuilt video layout
[10:32:54] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:54] [CLEANUP] ========================================
[10:32:54] [SERVER] Starting reconnect polling (5s interval)
[10:32:54] [CLEANUP] ========================================
[10:32:54] [CLEANUP] Cleaning up all agent connections and views
[10:32:54] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:54] [CLEANUP] Stopped and removed 0 video connections
[10:32:54] [CLEANUP] Removed 0 video views
[10:32:54] [CLEANUP] Removed 0 feed scroll views
[10:32:54] [CLEANUP] Removed 0 status labels
[10:32:54] [CLEANUP] Reset agent query state
[10:32:54] [CLEANUP] Updated page indicator
[10:32:54] [CLEANUP] Rebuilt video layout
[10:32:54] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:54] [CLEANUP] ========================================
[10:32:54] [SERVER] Starting reconnect polling (5s interval)
[10:32:55] [CLIENT_SIG] Typing stop from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:32:55] [CLIENT_SIG] Event received: type=0 messageId=28841
[10:32:55] [WS_EVENT] Received event: type=0, messageId=28841
[10:32:55] [WS_EVENT] 📨 New message notification (msgId=28841) - triggering incremental refresh, currentMsgCount=63
[10:32:55] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=63
[10:32:55] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28840, maxMemoryId=28840
[10:32:55] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28840
[10:32:55] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:32:55] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28841]
[10:32:55] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 63 msgs, first 10 IDs=[28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831]
[10:32:55] [PUSH_TRACE] 📡 INCREMENTAL: Adding new message id=28841
[10:32:55] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 1 new, total 64, first 10 IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:55] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:32:55] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=64
[10:32:55] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=64
[10:32:55] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=71
[10:32:55] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=64, first5Ids=[28841, 28840, 28839, 28838, 28837]
[10:32:55] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 64 messages
[10:32:55] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:55] [RELOAD_TAB] 📊 Building chatRows from 64 messages
[10:32:55] [SCROLL] wasNearBottom=true, threshold=447, offset=5207, contentH=5654, boundsH=447, forceScroll=false
[10:32:55] [RELOAD_TAB] 📊 Built 66 chatRows, estHeight=0.0
[10:32:55] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28840 → 28841
[10:32:55] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=73
[10:32:55] [SCROLL] 💓 alive, visible=59...65, rows=66, estHeight=0.0, heightCalls=140
[10:32:55] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=5284, currentOffset=5284
[10:32:55] [SCROLL] Scrolling to 5284, animated=true
[10:32:56] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:56] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:56] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:56] HELLO → sent (cached token, role=query)
[10:32:56] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:56] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:56] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:56] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:56] [CLEANUP] ========================================
[10:32:56] [CLEANUP] Cleaning up all agent connections and views
[10:32:56] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:56] [CLEANUP] Stopped and removed 0 video connections
[10:32:56] [CLEANUP] Removed 0 video views
[10:32:56] [CLEANUP] Removed 0 feed scroll views
[10:32:56] [CLEANUP] Removed 0 status labels
[10:32:56] [CLEANUP] Reset agent query state
[10:32:56] [CLEANUP] Updated page indicator
[10:32:56] [CLEANUP] Rebuilt video layout
[10:32:56] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:56] [CLEANUP] ========================================
[10:32:56] [SERVER] Starting reconnect polling (5s interval)
[10:32:56] [CLEANUP] ========================================
[10:32:56] [CLEANUP] Cleaning up all agent connections and views
[10:32:56] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:56] [CLEANUP] Stopped and removed 0 video connections
[10:32:56] [CLEANUP] Removed 0 video views
[10:32:56] [CLEANUP] Removed 0 feed scroll views
[10:32:56] [CLEANUP] Removed 0 status labels
[10:32:56] [CLEANUP] Reset agent query state
[10:32:56] [CLEANUP] Updated page indicator
[10:32:56] [CLEANUP] Rebuilt video layout
[10:32:56] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:56] [CLEANUP] ========================================
[10:32:56] [SERVER] Starting reconnect polling (5s interval)
[10:32:56] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[10:32:56] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[10:32:57] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[10:32:57] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 64 msgs, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2312 vccs=0
[10:32:57] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28841
[10:32:57] [PUSH] handlePollEventsNotification userInfo: [:]
[10:32:57] [PUSH] No message_id in userInfo
[10:32:57] [PUSH] No operation_type in userInfo
[10:32:57] [FAST_REFRESH] Evolution disabled - performing incremental sync
[10:32:57] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=62, IDs=[28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831]
[10:32:57] [PUSH_TRACE] 📬 POLL: memory state: count=64, first 10 IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [FAST_REFRESH] Already have 64 messages in memory
[10:32:57] [FAST_REFRESH] maxMemoryId=28841, maxLocalId=28841
[10:32:57] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[10:32:57] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=64
[10:32:57] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[10:32:57] [READBY_OPT] No message IDs to fetch - skipping server call
[10:32:57] [GAP_FIX] Incremental sync will use since_id=28835 (background max=28835, current DB max=28841)
[10:32:57] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=64
[10:32:57] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28835, maxMemoryId=28841
[10:32:57] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28835
[10:32:57] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[10:32:57] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=64
[10:32:57] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:32:57] [PUSH_DEBUG] ⬇️ PUSH RECEIVED at 2026-04-23 08:32:57 +0000 - type: unknown, operation_type: 0, message_id: 28841, session_id: ILUIWU, state: 0
[10:32:57] [PUSH_DEBUG] Full userInfo: [AnyHashable("timer"): 0, AnyHashable("thumb_file_name"): , AnyHashable("session_id"): ILUIWU, AnyHashable("message"): Oki, AnyHashable("operation_type"): 0, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("message_id"): 28841, AnyHashable("datesent"): 2026-04-23 08:32:55, AnyHashable("message_type"): 0, AnyHashable("sender_name"): Esra, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:32:55";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Oki;
    "message_id" = 28841;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28840;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): ]
[10:32:57] [PUSH] App active - suppressing notification UI, posting internal event
[10:32:57] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:57 +0000
[10:32:57] [PUSH_TRACE] ⬇️ Processing embedded message_id=28841
[10:32:57] [PUSH_EMBED] 📩 Received embedded message: id=28841, type=0, sender=Esra
[10:32:57] [PUSH_TRACE] ⬇️ Message details: text="Oki...", datesent=2026-04-23 08:32:55
[10:32:57] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[10:32:57] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28841
[10:32:57] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28841
[10:32:57] [PUSH_EMBED] ✅ Saved message 28841 to local DB (sync)
[10:32:57] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28841
[10:32:57] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28841
[10:32:57] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28841
[10:32:57] [PUSH_TRACE] 📦 Cache state: valid=true, count=62, IDs=[28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832, 28831]
[10:32:57] [PUSH_EMBED] Inserted message 28841 into existing cache (now 63 messages)
[10:32:57] [PUSH_TRACE] 📦 ✅ Inserted message 28841, cache now has IDs: [28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [PUSH_TRACE] 📦 EXITING cache update queue for message 28841
[10:32:57] [PUSH_EMBED] Fetching evolution data for message 28841 in background
[10:32:57] [PUSH_EMBED] ✅ Fully processed message 28841
[10:32:57] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28841
[10:32:57] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 64 msgs, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2312 vccs=0
[10:32:57] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28841
[10:32:57] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("timer"): 0, AnyHashable("thumb_file_name"): , AnyHashable("session_id"): ILUIWU, AnyHashable("message"): Oki, AnyHashable("operation_type"): 0, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("message_id"): 28841, AnyHashable("datesent"): 2026-04-23 08:32:55, AnyHashable("message_type"): 0, AnyHashable("sender_name"): Esra, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:32:55";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Oki;
    "message_id" = 28841;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28840;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): ]
[10:32:57] [PUSH_EMBED_VC] Message 28841 already in memory - skipping
[10:32:57] [PUSH] ⚡ Embedded message handled directly in ViewController
[10:32:57] [PUSH] Parsed message_id: 28841
[10:32:57] [PUSH] Parsed operation_type: 0
[10:32:57] [PUSH] Taking direct action: opType=0, messageId=28841
[10:32:57] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28841
[10:32:57] [PUSH] ⚡ Message 28841 already in memory - skipping duplicate notification entirely
[10:32:57] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:32:57] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[10:32:57] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[10:32:57] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[10:32:57] [PUSH_TRACE] 👁️ Received message id=28841, text="Oki..."
[10:32:57] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[10:32:57] [PUSH_UI] Message 28841 already in memory - skipping insert
[10:32:57] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[10:32:57] [PUSH] Silent push received
[10:32:57] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:57 +0000, appState=0, message_id=28841, type=nil
[10:32:57] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=63, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:57 +0000
[10:32:57] [PUSH_TRACE] ⬇️ Processing embedded message_id=28841
[10:32:57] [PUSH_EMBED] 📩 Received embedded message: id=28841, type=0, sender=Esra
[10:32:57] [PUSH_TRACE] ⬇️ Message details: text="Oki...", datesent=2026-04-23 08:32:55
[10:32:57] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[10:32:57] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28841
[10:32:57] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28841
[10:32:57] [PUSH_EMBED] ✅ Saved message 28841 to local DB (sync)
[10:32:57] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28841
[10:32:57] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28841
[10:32:57] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28841
[10:32:57] [PUSH_TRACE] 📦 Cache state: valid=true, count=63, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [PUSH_TRACE] 📦 ⚠️ Message 28841 already in cache, skipping insert
[10:32:57] [PUSH_TRACE] 📦 EXITING cache update queue for message 28841
[10:32:57] [PUSH_EMBED] Fetching evolution data for message 28841 in background
[10:32:57] [PUSH_EMBED] ✅ Fully processed message 28841
[10:32:57] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28841
[10:32:57] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=63, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832], handled=true
[10:32:57] [PUSH] Embedded message handled instantly from silent push
[10:32:57] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[10:32:57] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28841
[10:32:57] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[10:32:57] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[10:32:57] [PUSH_TRACE] 👁️ Received message id=28841, text="Oki..."
[10:32:57] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[10:32:57] [PUSH_UI] Message 28841 already in memory - skipping insert
[10:32:57] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[10:32:57] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 64 msgs, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2312 vccs=0
[10:32:57] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28841
[10:32:57] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("thumb_file_name"): , AnyHashable("timer"): 0, AnyHashable("message"): Oki, AnyHashable("message_id"): 28841, AnyHashable("message_type"): 0, AnyHashable("sender_name"): Esra, AnyHashable("datesent"): 2026-04-23 08:32:55, AnyHashable("file_name"): , AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:32:55";
    "file_name" = "";
    "is_encrypted" = 0;
    message = Oki;
    "message_id" = 28841;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28840;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("operation_type"): 0]
[10:32:57] [PUSH_EMBED_VC] Message 28841 already in memory - skipping
[10:32:57] [PUSH] ⚡ Embedded message handled directly in ViewController
[10:32:57] [PUSH] Parsed message_id: 28841
[10:32:57] [PUSH] Parsed operation_type: 0
[10:32:57] [PUSH] Taking direct action: opType=0, messageId=28841
[10:32:57] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28841
[10:32:57] [PUSH] ⚡ Message 28841 already in memory - skipping duplicate notification entirely
[10:32:57] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:32:57] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[10:32:57] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:32:57] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=64, first5Ids=[28841, 28840, 28839, 28838, 28837]
[10:32:57] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 64 messages
[10:32:57] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [RELOAD_TAB] 📊 Building chatRows from 64 messages
[10:32:57] [SCROLL] wasNearBottom=true, threshold=447, offset=5284, contentH=5731, boundsH=447, forceScroll=false
[10:32:57] [RELOAD_TAB] 📊 Built 66 chatRows, estHeight=0.0
[10:32:57] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[10:32:57] [PUSH_EMBED] Got evolution data for message 28841, saving to local DB
[10:32:57] [PUSH_EMBED] Saved evolution data for message 28841
[10:32:57] [PUSH_EMBED] Got evolution data for message 28841, saving to local DB
[10:32:57] [PUSH_EMBED] Saved evolution data for message 28841
[10:32:57] [INCREMENTAL_SYNC] ✅ Found 6 new messages
[10:32:57] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 6 new messages, IDs=[28841, 28840, 28839, 28838, 28837, 28836]
[10:32:57] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 64 msgs, first 10 IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 64, first 10 IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=6
[10:32:57] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=64
[10:32:57] [INCREMENTAL_SYNC] 🔁 Processing queued retry refresh
[10:32:57] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=64
[10:32:57] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28841, maxMemoryId=28841
[10:32:57] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28841
[10:32:57] [FAST_REFRESH] Incremental sync complete - 64 messages
[10:32:57] [PUSH] Silent push received
[10:32:57] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:32:57 +0000, appState=0, message_id=nil, type=nil
[10:32:57] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=63, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:32:57 +0000
[10:32:57] [PUSH_EMBED] No embedded message_data in notification
[10:32:57] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:32:57] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=63, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832], handled=false
[10:32:57] [PUSH] No embedded data, pre-loading messages from server
[10:32:57] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:32:57] [INCREMENTAL_SYNC] ✅ No new messages
[10:32:57] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:32:57] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=64, first5Ids=[28841, 28840, 28839, 28838, 28837]
[10:32:57] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 64 messages
[10:32:57] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [RELOAD_TAB] 📊 Building chatRows from 64 messages
[10:32:57] [SCROLL] wasNearBottom=true, threshold=447, offset=5284, contentH=5731, boundsH=447, forceScroll=false
[10:32:57] [RELOAD_TAB] 📊 Built 66 chatRows, estHeight=0.0
[10:32:57] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[10:32:57] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:32:57] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:32:57] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:32:57] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:32:57] [REPLY_LOAD] AppDelegate mid=28752 raw='At least not for me🫠😏😏😏' decoded='At least not for me🫠😏😏😏' rawScalars=[U+41=A, U+74=t, U+20= , U+6C=l, U+65=e, U+61=a, U+73=s, U+74=t, U+20= , U+6E=n, U+6F=o, U+74=t, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+6D=m, U+65=e, U+1FAE0=🫠, U+1F60F=😏, U+1F60F=😏, U+1F60F=😏]
[10:32:57] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:32:57] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=63, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [PRELOAD_CACHE] Preserving 13 push-inserted messages: [28750, 28749, 28748, 28747, 28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:32:57] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=13, IDs=[28750, 28749, 28748, 28747, 28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:32:57] [PUSH_TRACE] 🔀 mergeMessages: merged.count=63, first 10 IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [PUSH_PRELOAD] ⚡ Pre-cached 63 messages for instant display (preserved 13 from push)
[10:32:57] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:32:57] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 64 msgs, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2312 vccs=0
[10:32:57] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28841
[10:32:57] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("message_id"): 28841, AnyHashable("operation_type"): 3, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU]
[10:32:57] [PUSH] Parsed message_id: 28841
[10:32:57] [PUSH] Parsed operation_type: 3
[10:32:57] [PUSH] Taking direct action: opType=3, messageId=28841
[10:32:57] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28841
[10:32:57] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:32:57] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=64
[10:32:57] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28835, maxMemoryId=28841
[10:32:57] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28835
[10:32:57] [INCREMENTAL_SYNC] ✅ Found 6 new messages
[10:32:57] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 6 new messages, IDs=[28841, 28840, 28839, 28838, 28837, 28836]
[10:32:57] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 64 msgs, first 10 IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 64, first 10 IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=6
[10:32:57] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=64
[10:32:57] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:32:57] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=64, first5Ids=[28841, 28840, 28839, 28838, 28837]
[10:32:57] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 64 messages
[10:32:57] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:32:57] [RELOAD_TAB] 📊 Building chatRows from 64 messages
[10:32:57] [SCROLL] wasNearBottom=true, threshold=447, offset=5284, contentH=5731, boundsH=447, forceScroll=false
[10:32:57] [RELOAD_TAB] 📊 Built 66 chatRows, estHeight=0.0
[10:32:57] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[10:32:57] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:57] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:57] [CLIENT_SIG] Event received: type=3 messageId=28841
[10:32:57] [WS_EVENT] Received event: type=3, messageId=28841
[10:32:57] [WS_EVENT] Read receipt for message 28841 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:32:58] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:58] HELLO → sent (cached token, role=query)
[10:32:58] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:58] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:58] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:58] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:58] [CLEANUP] ========================================
[10:32:58] [CLEANUP] Cleaning up all agent connections and views
[10:32:58] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:58] [CLEANUP] Stopped and removed 0 video connections
[10:32:58] [CLEANUP] Removed 0 video views
[10:32:58] [CLEANUP] Removed 0 feed scroll views
[10:32:58] [CLEANUP] Removed 0 status labels
[10:32:58] [CLEANUP] Reset agent query state
[10:32:58] [CLEANUP] Updated page indicator
[10:32:58] [CLEANUP] Rebuilt video layout
[10:32:58] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:58] [CLEANUP] ========================================
[10:32:58] [SERVER] Starting reconnect polling (5s interval)
[10:32:58] [CLEANUP] ========================================
[10:32:58] [CLEANUP] Cleaning up all agent connections and views
[10:32:58] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:58] [CLEANUP] Stopped and removed 0 video connections
[10:32:58] [CLEANUP] Removed 0 video views
[10:32:58] [CLEANUP] Removed 0 feed scroll views
[10:32:58] [CLEANUP] Removed 0 status labels
[10:32:58] [CLEANUP] Reset agent query state
[10:32:58] [CLEANUP] Updated page indicator
[10:32:58] [CLEANUP] Rebuilt video layout
[10:32:58] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:58] [CLEANUP] ========================================
[10:32:58] [SERVER] Starting reconnect polling (5s interval)
[10:32:59] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:59] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:32:59] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:32:59] HELLO → sent (cached token, role=query)
[10:32:59] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:32:59] [WS] Query connection failed - cleaning up all agent connections and views
[10:32:59] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:32:59] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:32:59] [CLEANUP] ========================================
[10:32:59] [CLEANUP] Cleaning up all agent connections and views
[10:32:59] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:59] [CLEANUP] Stopped and removed 0 video connections
[10:32:59] [CLEANUP] Removed 0 video views
[10:32:59] [CLEANUP] Removed 0 feed scroll views
[10:32:59] [CLEANUP] Removed 0 status labels
[10:32:59] [CLEANUP] Reset agent query state
[10:32:59] [CLEANUP] Updated page indicator
[10:32:59] [CLEANUP] Rebuilt video layout
[10:32:59] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:59] [CLEANUP] ========================================
[10:32:59] [SERVER] Starting reconnect polling (5s interval)
[10:32:59] [CLEANUP] ========================================
[10:32:59] [CLEANUP] Cleaning up all agent connections and views
[10:32:59] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:32:59] [CLEANUP] Stopped and removed 0 video connections
[10:32:59] [CLEANUP] Removed 0 video views
[10:32:59] [CLEANUP] Removed 0 feed scroll views
[10:32:59] [CLEANUP] Removed 0 status labels
[10:32:59] [CLEANUP] Reset agent query state
[10:32:59] [CLEANUP] Updated page indicator
[10:32:59] [CLEANUP] Rebuilt video layout
[10:32:59] [CLEANUP] ✅ All agent connections and views cleaned up
[10:32:59] [CLEANUP] ========================================
[10:32:59] [SERVER] Starting reconnect polling (5s interval)
[10:33:01] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:01] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:01] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:01] HELLO → sent (cached token, role=query)
[10:33:01] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:01] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:01] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:01] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:01] [CLEANUP] ========================================
[10:33:01] [CLEANUP] Cleaning up all agent connections and views
[10:33:01] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:01] [CLEANUP] Stopped and removed 0 video connections
[10:33:01] [CLEANUP] Removed 0 video views
[10:33:01] [CLEANUP] Removed 0 feed scroll views
[10:33:01] [CLEANUP] Removed 0 status labels
[10:33:01] [CLEANUP] Reset agent query state
[10:33:01] [CLEANUP] Updated page indicator
[10:33:01] [CLEANUP] Rebuilt video layout
[10:33:01] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:01] [CLEANUP] ========================================
[10:33:01] [SERVER] Starting reconnect polling (5s interval)
[10:33:01] [CLEANUP] ========================================
[10:33:01] [CLEANUP] Cleaning up all agent connections and views
[10:33:01] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:01] [CLEANUP] Stopped and removed 0 video connections
[10:33:01] [CLEANUP] Removed 0 video views
[10:33:01] [CLEANUP] Removed 0 feed scroll views
[10:33:01] [CLEANUP] Removed 0 status labels
[10:33:01] [CLEANUP] Reset agent query state
[10:33:01] [CLEANUP] Updated page indicator
[10:33:01] [CLEANUP] Rebuilt video layout
[10:33:01] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:01] [CLEANUP] ========================================
[10:33:01] [SERVER] Starting reconnect polling (5s interval)
[10:33:02] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:02] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:02] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:02] HELLO → sent (cached token, role=query)
[10:33:03] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:03] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:03] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:03] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:03] [CLEANUP] ========================================
[10:33:03] [CLEANUP] Cleaning up all agent connections and views
[10:33:03] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:03] [CLEANUP] Stopped and removed 0 video connections
[10:33:03] [CLEANUP] Removed 0 video views
[10:33:03] [CLEANUP] Removed 0 feed scroll views
[10:33:03] [CLEANUP] Removed 0 status labels
[10:33:03] [CLEANUP] Reset agent query state
[10:33:03] [CLEANUP] Updated page indicator
[10:33:03] [CLEANUP] Rebuilt video layout
[10:33:03] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:03] [CLEANUP] ========================================
[10:33:03] [SERVER] Starting reconnect polling (5s interval)
[10:33:03] [CLEANUP] ========================================
[10:33:03] [CLEANUP] Cleaning up all agent connections and views
[10:33:03] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:03] [CLEANUP] Stopped and removed 0 video connections
[10:33:03] [CLEANUP] Removed 0 video views
[10:33:03] [CLEANUP] Removed 0 feed scroll views
[10:33:03] [CLEANUP] Removed 0 status labels
[10:33:03] [CLEANUP] Reset agent query state
[10:33:03] [CLEANUP] Updated page indicator
[10:33:03] [CLEANUP] Rebuilt video layout
[10:33:03] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:03] [CLEANUP] ========================================
[10:33:03] [SERVER] Starting reconnect polling (5s interval)
[10:33:04] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:04] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:04] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:04] HELLO → sent (cached token, role=query)
[10:33:04] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:04] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:04] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:04] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:04] [CLEANUP] ========================================
[10:33:04] [CLEANUP] Cleaning up all agent connections and views
[10:33:04] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:04] [CLEANUP] Stopped and removed 0 video connections
[10:33:04] [CLEANUP] Removed 0 video views
[10:33:04] [CLEANUP] Removed 0 feed scroll views
[10:33:04] [CLEANUP] Removed 0 status labels
[10:33:04] [CLEANUP] Reset agent query state
[10:33:04] [CLEANUP] Updated page indicator
[10:33:04] [CLEANUP] Rebuilt video layout
[10:33:04] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:04] [CLEANUP] ========================================
[10:33:04] [SERVER] Starting reconnect polling (5s interval)
[10:33:04] [CLEANUP] ========================================
[10:33:04] [CLEANUP] Cleaning up all agent connections and views
[10:33:04] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:04] [CLEANUP] Stopped and removed 0 video connections
[10:33:04] [CLEANUP] Removed 0 video views
[10:33:04] [CLEANUP] Removed 0 feed scroll views
[10:33:04] [CLEANUP] Removed 0 status labels
[10:33:04] [CLEANUP] Reset agent query state
[10:33:04] [CLEANUP] Updated page indicator
[10:33:04] [CLEANUP] Rebuilt video layout
[10:33:04] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:04] [CLEANUP] ========================================
[10:33:04] [SERVER] Starting reconnect polling (5s interval)
[10:33:06] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:06] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:06] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:06] HELLO → sent (cached token, role=query)
[10:33:06] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:06] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:06] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:06] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:06] [CLEANUP] ========================================
[10:33:06] [CLEANUP] Cleaning up all agent connections and views
[10:33:06] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:06] [CLEANUP] Stopped and removed 0 video connections
[10:33:06] [CLEANUP] Removed 0 video views
[10:33:06] [CLEANUP] Removed 0 feed scroll views
[10:33:06] [CLEANUP] Removed 0 status labels
[10:33:06] [CLEANUP] Reset agent query state
[10:33:06] [CLEANUP] Updated page indicator
[10:33:06] [CLEANUP] Rebuilt video layout
[10:33:06] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:06] [CLEANUP] ========================================
[10:33:06] [SERVER] Starting reconnect polling (5s interval)
[10:33:06] [CLEANUP] ========================================
[10:33:06] [CLEANUP] Cleaning up all agent connections and views
[10:33:06] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:06] [CLEANUP] Stopped and removed 0 video connections
[10:33:06] [CLEANUP] Removed 0 video views
[10:33:06] [CLEANUP] Removed 0 feed scroll views
[10:33:06] [CLEANUP] Removed 0 status labels
[10:33:06] [CLEANUP] Reset agent query state
[10:33:06] [CLEANUP] Updated page indicator
[10:33:06] [CLEANUP] Rebuilt video layout
[10:33:06] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:06] [CLEANUP] ========================================
[10:33:06] [SERVER] Starting reconnect polling (5s interval)
[10:33:07] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:07] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:07] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:07] HELLO → sent (cached token, role=query)
[10:33:08] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:08] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:08] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:08] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:08] [CLEANUP] ========================================
[10:33:08] [CLEANUP] Cleaning up all agent connections and views
[10:33:08] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:08] [CLEANUP] Stopped and removed 0 video connections
[10:33:08] [CLEANUP] Removed 0 video views
[10:33:08] [CLEANUP] Removed 0 feed scroll views
[10:33:08] [CLEANUP] Removed 0 status labels
[10:33:08] [CLEANUP] Reset agent query state
[10:33:08] [CLEANUP] Updated page indicator
[10:33:08] [CLEANUP] Rebuilt video layout
[10:33:08] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:08] [CLEANUP] ========================================
[10:33:08] [SERVER] Starting reconnect polling (5s interval)
[10:33:08] [CLEANUP] ========================================
[10:33:08] [CLEANUP] Cleaning up all agent connections and views
[10:33:08] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:08] [CLEANUP] Stopped and removed 0 video connections
[10:33:08] [CLEANUP] Removed 0 video views
[10:33:08] [CLEANUP] Removed 0 feed scroll views
[10:33:08] [CLEANUP] Removed 0 status labels
[10:33:08] [CLEANUP] Reset agent query state
[10:33:08] [CLEANUP] Updated page indicator
[10:33:08] [CLEANUP] Rebuilt video layout
[10:33:08] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:08] [CLEANUP] ========================================
[10:33:08] [SERVER] Starting reconnect polling (5s interval)
[10:33:09] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:09] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:09] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:09] HELLO → sent (cached token, role=query)
[10:33:09] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:09] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:09] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:09] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:09] [CLEANUP] ========================================
[10:33:09] [CLEANUP] Cleaning up all agent connections and views
[10:33:09] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:09] [CLEANUP] Stopped and removed 0 video connections
[10:33:09] [CLEANUP] Removed 0 video views
[10:33:09] [CLEANUP] Removed 0 feed scroll views
[10:33:09] [CLEANUP] Removed 0 status labels
[10:33:09] [CLEANUP] Reset agent query state
[10:33:09] [CLEANUP] Updated page indicator
[10:33:09] [CLEANUP] Rebuilt video layout
[10:33:09] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:09] [CLEANUP] ========================================
[10:33:09] [SERVER] Starting reconnect polling (5s interval)
[10:33:09] [CLEANUP] ========================================
[10:33:09] [CLEANUP] Cleaning up all agent connections and views
[10:33:09] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:09] [CLEANUP] Stopped and removed 0 video connections
[10:33:09] [CLEANUP] Removed 0 video views
[10:33:09] [CLEANUP] Removed 0 feed scroll views
[10:33:09] [CLEANUP] Removed 0 status labels
[10:33:09] [CLEANUP] Reset agent query state
[10:33:09] [CLEANUP] Updated page indicator
[10:33:09] [CLEANUP] Rebuilt video layout
[10:33:09] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:09] [CLEANUP] ========================================
[10:33:09] [SERVER] Starting reconnect polling (5s interval)
[10:33:11] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:11] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:11] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:11] HELLO → sent (cached token, role=query)
[10:33:11] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:11] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:11] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:11] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:11] [CLEANUP] ========================================
[10:33:11] [CLEANUP] Cleaning up all agent connections and views
[10:33:11] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:11] [CLEANUP] Stopped and removed 0 video connections
[10:33:11] [CLEANUP] Removed 0 video views
[10:33:11] [CLEANUP] Removed 0 feed scroll views
[10:33:11] [CLEANUP] Removed 0 status labels
[10:33:11] [CLEANUP] Reset agent query state
[10:33:11] [CLEANUP] Updated page indicator
[10:33:11] [CLEANUP] Rebuilt video layout
[10:33:11] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:11] [CLEANUP] ========================================
[10:33:11] [SERVER] Starting reconnect polling (5s interval)
[10:33:11] [CLEANUP] ========================================
[10:33:11] [CLEANUP] Cleaning up all agent connections and views
[10:33:11] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:11] [CLEANUP] Stopped and removed 0 video connections
[10:33:11] [CLEANUP] Removed 0 video views
[10:33:11] [CLEANUP] Removed 0 feed scroll views
[10:33:11] [CLEANUP] Removed 0 status labels
[10:33:11] [CLEANUP] Reset agent query state
[10:33:11] [CLEANUP] Updated page indicator
[10:33:11] [CLEANUP] Rebuilt video layout
[10:33:11] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:11] [CLEANUP] ========================================
[10:33:11] [SERVER] Starting reconnect polling (5s interval)
[10:33:12] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[10:33:12] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=64, isReloading=false
[10:33:12] [SEND_MESSAGE] ✅ Added optimistic message id=-11 to arrays, newMsgCount=65
[10:33:12] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:33:12] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=65, first5Ids=[-11, 28841, 28840, 28839, 28838]
[10:33:12] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 65 messages
[10:33:12] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-11, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833]
[10:33:12] [RELOAD_TAB] 📊 Building chatRows from 65 messages
[10:33:12] [SCROLL] wasNearBottom=true, threshold=447, offset=5284, contentH=5731, boundsH=447, forceScroll=false
[10:33:12] [RELOAD_TAB] 📊 Built 67 chatRows, estHeight=0.0
[10:33:12] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=74
[10:33:12] [SCROLL] 💓 alive, visible=60...66, rows=67, estHeight=0.0, heightCalls=142
[10:33:12] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:33:12] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[10:33:12] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=5361, currentOffset=5361
[10:33:12] [SCROLL] Scrolling to 5361, animated=true
[10:33:12] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:12] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:12] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:12] HELLO → sent (cached token, role=query)
[10:33:12] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:12] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:12] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:12] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:12] [CLEANUP] ========================================
[10:33:12] [CLEANUP] Cleaning up all agent connections and views
[10:33:12] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:12] [CLEANUP] Stopped and removed 0 video connections
[10:33:12] [CLEANUP] Removed 0 video views
[10:33:12] [CLEANUP] Removed 0 feed scroll views
[10:33:12] [CLEANUP] Removed 0 status labels
[10:33:12] [CLEANUP] Reset agent query state
[10:33:12] [CLEANUP] Updated page indicator
[10:33:12] [CLEANUP] Rebuilt video layout
[10:33:12] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:12] [CLEANUP] ========================================
[10:33:12] [SERVER] Starting reconnect polling (5s interval)
[10:33:12] [CLEANUP] ========================================
[10:33:12] [CLEANUP] Cleaning up all agent connections and views
[10:33:12] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:12] [CLEANUP] Stopped and removed 0 video connections
[10:33:12] [CLEANUP] Removed 0 video views
[10:33:12] [CLEANUP] Removed 0 feed scroll views
[10:33:12] [CLEANUP] Removed 0 status labels
[10:33:12] [CLEANUP] Reset agent query state
[10:33:12] [CLEANUP] Updated page indicator
[10:33:12] [CLEANUP] Rebuilt video layout
[10:33:12] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:12] [CLEANUP] ========================================
[10:33:12] [SERVER] Starting reconnect polling (5s interval)
[10:33:13] [CLIENT_SIG] Event received: type=0 messageId=28842
[10:33:13] [WS_EVENT] Received event: type=0, messageId=28842
[10:33:13] [WS_EVENT] 📨 New message notification (msgId=28842) - triggering incremental refresh, currentMsgCount=65
[10:33:13] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=65
[10:33:13] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28841, maxMemoryId=28841
[10:33:13] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28841
[10:33:13] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28842,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 08:33:13"}
[10:33:13] [CHAT] receive_message.php JSON: ["message_type": 0, "ok": 1, "session_id": ILUIWU, "datesent_utc": 2026-04-23 08:33:13, "message_id": 28842, "file_name": ]
[10:33:13] [DB_UPGRADE] Upgrading message ID: -11 → 28842, preserveOriginalDate=false
[10:33:13] [DB_UPGRADE] ✅ Upgraded -11 → 28842 with send_status=0, 1 row(s) affected
[10:33:13] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -11 → 28842
[10:33:13] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -11 → 28842
[10:33:13] ReloadData 9
[10:33:13] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:33:13] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28842]
[10:33:13] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 65 msgs, first 10 IDs=[28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833]
[10:33:13] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 65, first 10 IDs=[28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833]
[10:33:13] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:33:13] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=65
[10:33:13] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=65
[10:33:13] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=73
[10:33:13] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=65, first5Ids=[28842, 28841, 28840, 28839, 28838]
[10:33:13] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 65 messages
[10:33:13] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833]
[10:33:13] [RELOAD_TAB] 📊 Building chatRows from 65 messages
[10:33:13] [SCROLL] wasNearBottom=true, threshold=447, offset=5361, contentH=5808, boundsH=447, forceScroll=true
[10:33:13] [RELOAD_TAB] 📊 Built 67 chatRows, estHeight=0.0
[10:33:13] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=73
[10:33:13] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=5361, currentOffset=5361
[10:33:13] [SCROLL] Scrolling to 5361, animated=false
[10:33:14] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:14] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:14] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:14] HELLO → sent (cached token, role=query)
[10:33:14] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:14] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:14] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:14] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:14] [CLEANUP] ========================================
[10:33:14] [CLEANUP] Cleaning up all agent connections and views
[10:33:14] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:14] [CLEANUP] Stopped and removed 0 video connections
[10:33:14] [CLEANUP] Removed 0 video views
[10:33:14] [CLEANUP] Removed 0 feed scroll views
[10:33:14] [CLEANUP] Removed 0 status labels
[10:33:14] [CLEANUP] Reset agent query state
[10:33:14] [CLEANUP] Updated page indicator
[10:33:14] [CLEANUP] Rebuilt video layout
[10:33:14] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:14] [CLEANUP] ========================================
[10:33:14] [SERVER] Starting reconnect polling (5s interval)
[10:33:14] [CLEANUP] ========================================
[10:33:14] [CLEANUP] Cleaning up all agent connections and views
[10:33:14] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:14] [CLEANUP] Stopped and removed 0 video connections
[10:33:14] [CLEANUP] Removed 0 video views
[10:33:14] [CLEANUP] Removed 0 feed scroll views
[10:33:14] [CLEANUP] Removed 0 status labels
[10:33:14] [CLEANUP] Reset agent query state
[10:33:14] [CLEANUP] Updated page indicator
[10:33:14] [CLEANUP] Rebuilt video layout
[10:33:14] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:14] [CLEANUP] ========================================
[10:33:14] [SERVER] Starting reconnect polling (5s interval)
[10:33:16] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:16] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:16] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:16] HELLO → sent (cached token, role=query)
[10:33:16] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:16] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:16] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:16] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:16] [CLEANUP] ========================================
[10:33:16] [CLEANUP] Cleaning up all agent connections and views
[10:33:16] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:16] [CLEANUP] Stopped and removed 0 video connections
[10:33:16] [CLEANUP] Removed 0 video views
[10:33:16] [CLEANUP] Removed 0 feed scroll views
[10:33:16] [CLEANUP] Removed 0 status labels
[10:33:16] [CLEANUP] Reset agent query state
[10:33:16] [CLEANUP] Updated page indicator
[10:33:16] [CLEANUP] Rebuilt video layout
[10:33:16] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:16] [CLEANUP] ========================================
[10:33:16] [SERVER] Starting reconnect polling (5s interval)
[10:33:16] [CLEANUP] ========================================
[10:33:16] [CLEANUP] Cleaning up all agent connections and views
[10:33:16] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:16] [CLEANUP] Stopped and removed 0 video connections
[10:33:16] [CLEANUP] Removed 0 video views
[10:33:16] [CLEANUP] Removed 0 feed scroll views
[10:33:16] [CLEANUP] Removed 0 status labels
[10:33:16] [CLEANUP] Reset agent query state
[10:33:16] [CLEANUP] Updated page indicator
[10:33:16] [CLEANUP] Rebuilt video layout
[10:33:16] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:16] [CLEANUP] ========================================
[10:33:16] [SERVER] Starting reconnect polling (5s interval)
[10:33:17] [REPLY_DEBUG] 📤 didTapSend - Sending message WITHOUT reply
[10:33:17] [SEND_MESSAGE] 📤 Sending message, currentMsgCount=65, isReloading=false
[10:33:17] [SEND_MESSAGE] ✅ Added optimistic message id=-12 to arrays, newMsgCount=66
[10:33:17] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=73
[10:33:17] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=66, first5Ids=[-12, 28842, 28841, 28840, 28839]
[10:33:17] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 66 messages
[10:33:17] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [-12, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:17] [RELOAD_TAB] 📊 Building chatRows from 66 messages
[10:33:17] [SCROLL] wasNearBottom=true, threshold=447, offset=5361, contentH=5808, boundsH=447, forceScroll=false
[10:33:17] [RELOAD_TAB] 📊 Built 68 chatRows, estHeight=0.0
[10:33:17] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=75
[10:33:17] [SCROLL] 💓 alive, visible=61...67, rows=68, estHeight=0.0, heightCalls=144
[10:33:17] [REPLY_DEBUG] ❌ cancelReply called - clearing messageToReplyTo
[10:33:17] [REPLY_DEBUG] ⚠️ sendMessage HTTP BODY - No reply message captured
[10:33:17] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=5413, currentOffset=5413
[10:33:17] [SCROLL] Scrolling to 5413, animated=true
[10:33:17] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:17] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:17] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:17] HELLO → sent (cached token, role=query)
[10:33:17] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:17] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:17] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:17] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:17] [CLEANUP] ========================================
[10:33:17] [CLEANUP] Cleaning up all agent connections and views
[10:33:17] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:17] [CLEANUP] Stopped and removed 0 video connections
[10:33:17] [CLEANUP] Removed 0 video views
[10:33:17] [CLEANUP] Removed 0 feed scroll views
[10:33:17] [CLEANUP] Removed 0 status labels
[10:33:17] [CLEANUP] Reset agent query state
[10:33:17] [CLEANUP] Updated page indicator
[10:33:17] [CLEANUP] Rebuilt video layout
[10:33:17] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:17] [CLEANUP] ========================================
[10:33:17] [SERVER] Starting reconnect polling (5s interval)
[10:33:17] [CLEANUP] ========================================
[10:33:17] [CLEANUP] Cleaning up all agent connections and views
[10:33:17] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:17] [CLEANUP] Stopped and removed 0 video connections
[10:33:17] [CLEANUP] Removed 0 video views
[10:33:17] [CLEANUP] Removed 0 feed scroll views
[10:33:17] [CLEANUP] Removed 0 status labels
[10:33:17] [CLEANUP] Reset agent query state
[10:33:17] [CLEANUP] Updated page indicator
[10:33:17] [CLEANUP] Rebuilt video layout
[10:33:17] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:17] [CLEANUP] ========================================
[10:33:17] [SERVER] Starting reconnect polling (5s interval)
[10:33:17] [CLIENT_SIG] Event received: type=0 messageId=28843
[10:33:17] [WS_EVENT] Received event: type=0, messageId=28843
[10:33:17] [WS_EVENT] 📨 New message notification (msgId=28843) - triggering incremental refresh, currentMsgCount=66
[10:33:17] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=66
[10:33:17] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28842, maxMemoryId=28842
[10:33:17] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28842
[10:33:17] [CHAT] receive_message.php HTTP 200: {"ok":true,"message_id":28843,"session_id":"ILUIWU","message_type":0,"file_name":"","datesent_utc":"2026-04-23 08:33:17"}
[10:33:17] [CHAT] receive_message.php JSON: ["ok": 1, "file_name": , "message_type": 0, "message_id": 28843, "session_id": ILUIWU, "datesent_utc": 2026-04-23 08:33:17]
[10:33:17] [DB_UPGRADE] Upgrading message ID: -12 → 28843, preserveOriginalDate=false
[10:33:17] [DB_UPGRADE] ✅ Upgraded -12 → 28843 with send_status=0, 1 row(s) affected
[10:33:17] [SEND_UPGRADE] ✅ Updated chatMessages[0].id: -12 → 28843
[10:33:17] [SEND_UPGRADE] ✅ Updated allMessagesWithReadBy[0].id: -12 → 28843
[10:33:17] ReloadData 9
[10:33:18] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:33:18] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28843]
[10:33:18] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 66 msgs, first 10 IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:18] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 66, first 10 IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:18] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:33:18] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=66
[10:33:18] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=66
[10:33:18] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=75
[10:33:18] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=66, first5Ids=[28843, 28842, 28841, 28840, 28839]
[10:33:18] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 66 messages
[10:33:18] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:18] [RELOAD_TAB] 📊 Building chatRows from 66 messages
[10:33:18] [SCROLL] wasNearBottom=true, threshold=447, offset=5413, contentH=5860, boundsH=447, forceScroll=true
[10:33:18] [RELOAD_TAB] 📊 Built 68 chatRows, estHeight=0.0
[10:33:18] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=75
[10:33:18] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=5413, currentOffset=5413
[10:33:18] [SCROLL] Scrolling to 5413, animated=false
[10:33:19] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:19] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:19] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:19] HELLO → sent (cached token, role=query)
[10:33:19] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:19] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:19] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:19] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:19] [CLEANUP] ========================================
[10:33:19] [CLEANUP] Cleaning up all agent connections and views
[10:33:19] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:19] [CLEANUP] Stopped and removed 0 video connections
[10:33:19] [CLEANUP] Removed 0 video views
[10:33:19] [CLEANUP] Removed 0 feed scroll views
[10:33:19] [CLEANUP] Removed 0 status labels
[10:33:19] [CLEANUP] Reset agent query state
[10:33:19] [CLEANUP] Updated page indicator
[10:33:19] [CLEANUP] Rebuilt video layout
[10:33:19] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:19] [CLEANUP] ========================================
[10:33:19] [SERVER] Starting reconnect polling (5s interval)
[10:33:19] [CLEANUP] ========================================
[10:33:19] [CLEANUP] Cleaning up all agent connections and views
[10:33:19] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:19] [CLEANUP] Stopped and removed 0 video connections
[10:33:19] [CLEANUP] Removed 0 video views
[10:33:19] [CLEANUP] Removed 0 feed scroll views
[10:33:19] [CLEANUP] Removed 0 status labels
[10:33:19] [CLEANUP] Reset agent query state
[10:33:19] [CLEANUP] Updated page indicator
[10:33:19] [CLEANUP] Rebuilt video layout
[10:33:19] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:19] [CLEANUP] ========================================
[10:33:19] [SERVER] Starting reconnect polling (5s interval)
[10:33:21] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:21] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:21] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:21] HELLO → sent (cached token, role=query)
[10:33:21] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:21] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:21] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:21] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:21] [CLEANUP] ========================================
[10:33:21] [CLEANUP] Cleaning up all agent connections and views
[10:33:21] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:21] [CLEANUP] Stopped and removed 0 video connections
[10:33:21] [CLEANUP] Removed 0 video views
[10:33:21] [CLEANUP] Removed 0 feed scroll views
[10:33:21] [CLEANUP] Removed 0 status labels
[10:33:21] [CLEANUP] Reset agent query state
[10:33:21] [CLEANUP] Updated page indicator
[10:33:21] [CLEANUP] Rebuilt video layout
[10:33:21] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:21] [CLEANUP] ========================================
[10:33:21] [SERVER] Starting reconnect polling (5s interval)
[10:33:21] [CLEANUP] ========================================
[10:33:21] [CLEANUP] Cleaning up all agent connections and views
[10:33:21] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:21] [CLEANUP] Stopped and removed 0 video connections
[10:33:21] [CLEANUP] Removed 0 video views
[10:33:21] [CLEANUP] Removed 0 feed scroll views
[10:33:21] [CLEANUP] Removed 0 status labels
[10:33:21] [CLEANUP] Reset agent query state
[10:33:21] [CLEANUP] Updated page indicator
[10:33:21] [CLEANUP] Rebuilt video layout
[10:33:21] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:21] [CLEANUP] ========================================
[10:33:21] [SERVER] Starting reconnect polling (5s interval)
[10:33:22] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:22] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:22] [CLIENT_SIG] Client connected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[10:33:22] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:22] HELLO → sent (cached token, role=query)
[10:33:23] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:23] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:23] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:23] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:23] [CLEANUP] ========================================
[10:33:23] [CLEANUP] Cleaning up all agent connections and views
[10:33:23] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:23] [CLEANUP] Stopped and removed 0 video connections
[10:33:23] [CLEANUP] Removed 0 video views
[10:33:23] [CLEANUP] Removed 0 feed scroll views
[10:33:23] [CLEANUP] Removed 0 status labels
[10:33:23] [CLEANUP] Reset agent query state
[10:33:23] [CLEANUP] Updated page indicator
[10:33:23] [CLEANUP] Rebuilt video layout
[10:33:23] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:23] [CLEANUP] ========================================
[10:33:23] [SERVER] Starting reconnect polling (5s interval)
[10:33:23] [CLEANUP] ========================================
[10:33:23] [CLEANUP] Cleaning up all agent connections and views
[10:33:23] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:23] [CLEANUP] Stopped and removed 0 video connections
[10:33:23] [CLEANUP] Removed 0 video views
[10:33:23] [CLEANUP] Removed 0 feed scroll views
[10:33:23] [CLEANUP] Removed 0 status labels
[10:33:23] [CLEANUP] Reset agent query state
[10:33:23] [CLEANUP] Updated page indicator
[10:33:23] [CLEANUP] Rebuilt video layout
[10:33:23] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:23] [CLEANUP] ========================================
[10:33:23] [SERVER] Starting reconnect polling (5s interval)
[10:33:24] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:24] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:24] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:24] HELLO → sent (cached token, role=query)
[10:33:24] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:24] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:24] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:24] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:24] [CLEANUP] ========================================
[10:33:24] [CLEANUP] Cleaning up all agent connections and views
[10:33:24] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:24] [CLEANUP] Stopped and removed 0 video connections
[10:33:24] [CLEANUP] Removed 0 video views
[10:33:24] [CLEANUP] Removed 0 feed scroll views
[10:33:24] [CLEANUP] Removed 0 status labels
[10:33:24] [CLEANUP] Reset agent query state
[10:33:24] [CLEANUP] Updated page indicator
[10:33:24] [CLEANUP] Rebuilt video layout
[10:33:24] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:24] [CLEANUP] ========================================
[10:33:24] [SERVER] Starting reconnect polling (5s interval)
[10:33:24] [CLEANUP] ========================================
[10:33:24] [CLEANUP] Cleaning up all agent connections and views
[10:33:24] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:24] [CLEANUP] Stopped and removed 0 video connections
[10:33:24] [CLEANUP] Removed 0 video views
[10:33:24] [CLEANUP] Removed 0 feed scroll views
[10:33:24] [CLEANUP] Removed 0 status labels
[10:33:24] [CLEANUP] Reset agent query state
[10:33:24] [CLEANUP] Updated page indicator
[10:33:24] [CLEANUP] Rebuilt video layout
[10:33:24] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:24] [CLEANUP] ========================================
[10:33:24] [SERVER] Starting reconnect polling (5s interval)
[10:33:25] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[10:33:25] [CLIENT_SIG] Client disconnected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[10:33:26] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:26] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:26] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:26] HELLO → sent (cached token, role=query)
[10:33:26] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:26] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:26] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:26] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:26] [CLEANUP] ========================================
[10:33:26] [CLEANUP] Cleaning up all agent connections and views
[10:33:26] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:26] [CLEANUP] Stopped and removed 0 video connections
[10:33:26] [CLEANUP] Removed 0 video views
[10:33:26] [CLEANUP] Removed 0 feed scroll views
[10:33:26] [CLEANUP] Removed 0 status labels
[10:33:26] [CLEANUP] Reset agent query state
[10:33:26] [CLEANUP] Updated page indicator
[10:33:26] [CLEANUP] Rebuilt video layout
[10:33:26] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:26] [CLEANUP] ========================================
[10:33:26] [SERVER] Starting reconnect polling (5s interval)
[10:33:26] [CLEANUP] ========================================
[10:33:26] [CLEANUP] Cleaning up all agent connections and views
[10:33:26] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:26] [CLEANUP] Stopped and removed 0 video connections
[10:33:26] [CLEANUP] Removed 0 video views
[10:33:26] [CLEANUP] Removed 0 feed scroll views
[10:33:26] [CLEANUP] Removed 0 status labels
[10:33:26] [CLEANUP] Reset agent query state
[10:33:26] [CLEANUP] Updated page indicator
[10:33:26] [CLEANUP] Rebuilt video layout
[10:33:26] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:26] [CLEANUP] ========================================
[10:33:26] [SERVER] Starting reconnect polling (5s interval)
[10:33:27] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:27] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:28] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:28] HELLO → sent (cached token, role=query)
[10:33:28] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:28] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:28] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:28] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:28] [CLEANUP] ========================================
[10:33:28] [CLEANUP] Cleaning up all agent connections and views
[10:33:28] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:28] [CLEANUP] Stopped and removed 0 video connections
[10:33:28] [CLEANUP] Removed 0 video views
[10:33:28] [CLEANUP] Removed 0 feed scroll views
[10:33:28] [CLEANUP] Removed 0 status labels
[10:33:28] [CLEANUP] Reset agent query state
[10:33:28] [CLEANUP] Updated page indicator
[10:33:28] [CLEANUP] Rebuilt video layout
[10:33:28] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:28] [CLEANUP] ========================================
[10:33:28] [SERVER] Starting reconnect polling (5s interval)
[10:33:28] [CLEANUP] ========================================
[10:33:28] [CLEANUP] Cleaning up all agent connections and views
[10:33:28] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:28] [CLEANUP] Stopped and removed 0 video connections
[10:33:28] [CLEANUP] Removed 0 video views
[10:33:28] [CLEANUP] Removed 0 feed scroll views
[10:33:28] [CLEANUP] Removed 0 status labels
[10:33:28] [CLEANUP] Reset agent query state
[10:33:28] [CLEANUP] Updated page indicator
[10:33:28] [CLEANUP] Rebuilt video layout
[10:33:28] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:28] [CLEANUP] ========================================
[10:33:28] [SERVER] Starting reconnect polling (5s interval)
[10:33:29] [CLIENT_SIG] Client connected: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE) on session 'ILUIWU' (my session: 'ILUIWU')
[10:33:29] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:29] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:29] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:29] HELLO → sent (cached token, role=query)
[10:33:29] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:29] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:29] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:29] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:29] [CLEANUP] ========================================
[10:33:29] [CLEANUP] Cleaning up all agent connections and views
[10:33:29] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:29] [CLEANUP] Stopped and removed 0 video connections
[10:33:29] [CLEANUP] Removed 0 video views
[10:33:29] [CLEANUP] Removed 0 feed scroll views
[10:33:29] [CLEANUP] Removed 0 status labels
[10:33:29] [CLEANUP] Reset agent query state
[10:33:29] [CLEANUP] Updated page indicator
[10:33:29] [CLEANUP] Rebuilt video layout
[10:33:29] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:29] [CLEANUP] ========================================
[10:33:29] [SERVER] Starting reconnect polling (5s interval)
[10:33:29] [CLEANUP] ========================================
[10:33:29] [CLEANUP] Cleaning up all agent connections and views
[10:33:29] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:29] [CLEANUP] Stopped and removed 0 video connections
[10:33:29] [CLEANUP] Removed 0 video views
[10:33:29] [CLEANUP] Removed 0 feed scroll views
[10:33:29] [CLEANUP] Removed 0 status labels
[10:33:29] [CLEANUP] Reset agent query state
[10:33:29] [CLEANUP] Updated page indicator
[10:33:29] [CLEANUP] Rebuilt video layout
[10:33:29] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:29] [CLEANUP] ========================================
[10:33:29] [SERVER] Starting reconnect polling (5s interval)
[10:33:31] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:31] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:31] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:31] HELLO → sent (cached token, role=query)
[10:33:31] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:31] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:31] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:31] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:31] [CLEANUP] ========================================
[10:33:31] [CLEANUP] Cleaning up all agent connections and views
[10:33:31] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:31] [CLEANUP] Stopped and removed 0 video connections
[10:33:31] [CLEANUP] Removed 0 video views
[10:33:31] [CLEANUP] Removed 0 feed scroll views
[10:33:31] [CLEANUP] Removed 0 status labels
[10:33:31] [CLEANUP] Reset agent query state
[10:33:31] [CLEANUP] Updated page indicator
[10:33:31] [CLEANUP] Rebuilt video layout
[10:33:31] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:31] [CLEANUP] ========================================
[10:33:31] [SERVER] Starting reconnect polling (5s interval)
[10:33:31] [CLEANUP] ========================================
[10:33:31] [CLEANUP] Cleaning up all agent connections and views
[10:33:31] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:31] [CLEANUP] Stopped and removed 0 video connections
[10:33:31] [CLEANUP] Removed 0 video views
[10:33:31] [CLEANUP] Removed 0 feed scroll views
[10:33:31] [CLEANUP] Removed 0 status labels
[10:33:31] [CLEANUP] Reset agent query state
[10:33:31] [CLEANUP] Updated page indicator
[10:33:31] [CLEANUP] Rebuilt video layout
[10:33:31] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:31] [CLEANUP] ========================================
[10:33:31] [SERVER] Starting reconnect polling (5s interval)
[10:33:32] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:32] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:33] [PUSH] Silent push received
[10:33:33] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:33:33 +0000, appState=0, message_id=nil, type=nil
[10:33:33] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=63, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:33:33] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:33:33 +0000
[10:33:33] [PUSH_EMBED] No embedded message_data in notification
[10:33:33] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:33:33] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=63, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832], handled=false
[10:33:33] [PUSH] No embedded data, pre-loading messages from server
[10:33:33] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:33:33] [PUSH] Silent push received
[10:33:33] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:33:33 +0000, appState=0, message_id=nil, type=nil
[10:33:33] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=63, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:33:33] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:33:33 +0000
[10:33:33] [PUSH_EMBED] No embedded message_data in notification
[10:33:33] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:33:33] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=63, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832], handled=false
[10:33:33] [PUSH] No embedded data, pre-loading messages from server
[10:33:33] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:33:33] [PUSH] Silent push received
[10:33:33] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:33:33 +0000, appState=0, message_id=nil, type=nil
[10:33:33] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=63, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:33:33] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:33:33 +0000
[10:33:33] [PUSH_EMBED] No embedded message_data in notification
[10:33:33] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:33:33] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=63, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832], handled=false
[10:33:33] [PUSH] No embedded data, pre-loading messages from server
[10:33:33] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:33:33] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:33] HELLO → sent (cached token, role=query)
[10:33:33] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:33] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:33] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:33] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:33] [CLEANUP] ========================================
[10:33:33] [CLEANUP] Cleaning up all agent connections and views
[10:33:33] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:33] [CLEANUP] Stopped and removed 0 video connections
[10:33:33] [CLEANUP] Removed 0 video views
[10:33:33] [CLEANUP] Removed 0 feed scroll views
[10:33:33] [CLEANUP] Removed 0 status labels
[10:33:33] [CLEANUP] Reset agent query state
[10:33:33] [CLEANUP] Updated page indicator
[10:33:33] [CLEANUP] Rebuilt video layout
[10:33:33] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:33] [CLEANUP] ========================================
[10:33:33] [SERVER] Starting reconnect polling (5s interval)
[10:33:33] [CLEANUP] ========================================
[10:33:33] [CLEANUP] Cleaning up all agent connections and views
[10:33:33] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:33] [CLEANUP] Stopped and removed 0 video connections
[10:33:33] [CLEANUP] Removed 0 video views
[10:33:33] [CLEANUP] Removed 0 feed scroll views
[10:33:33] [CLEANUP] Removed 0 status labels
[10:33:33] [CLEANUP] Reset agent query state
[10:33:33] [CLEANUP] Updated page indicator
[10:33:33] [CLEANUP] Rebuilt video layout
[10:33:33] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:33] [CLEANUP] ========================================
[10:33:33] [SERVER] Starting reconnect polling (5s interval)
[10:33:34] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:34] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:34] [CLIENT_SIG] Event received: type=3 messageId=28842
[10:33:34] [WS_EVENT] Received event: type=3, messageId=28842
[10:33:34] [WS_EVENT] Read receipt for message 28842 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:33:34] [CLIENT_SIG] Event received: type=3 messageId=28843
[10:33:34] [WS_EVENT] Received event: type=3, messageId=28843
[10:33:34] [WS_EVENT] Read receipt for message 28843 by Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:33:34] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:33:34] [CLIENT_SIG] Typing start from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:33:34] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:33:34] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:33:34] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:33:34] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:33:34] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:34] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=63, IDs=[28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834, 28833, 28832]
[10:33:34] [PRELOAD_CACHE] Preserving 15 push-inserted messages: [28752, 28751, 28750, 28749, 28748, 28747, 28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:33:34] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=15, IDs=[28752, 28751, 28750, 28749, 28748, 28747, 28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:33:34] [PUSH_TRACE] 🔀 mergeMessages: merged.count=65, first 10 IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:34] [PUSH_PRELOAD] ⚡ Pre-cached 65 messages for instant display (preserved 15 from push)
[10:33:34] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:33:34] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 66 msgs, IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:34] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=2 secsSinceLastPong=2349 vccs=0
[10:33:34] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28843
[10:33:34] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28843, AnyHashable("operation_type"): 3]
[10:33:34] [PUSH] Parsed message_id: 28843
[10:33:34] [PUSH] Parsed operation_type: 3
[10:33:34] [PUSH] Taking direct action: opType=3, messageId=28843
[10:33:34] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28843
[10:33:34] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:33:34] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:33:34] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=66
[10:33:34] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28835, maxMemoryId=28843
[10:33:34] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28835
[10:33:34] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:34] HELLO → sent (cached token, role=query)
[10:33:34] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:33:34] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:33:34] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:33:34] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:33:34] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:34] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=65, IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:34] [PRELOAD_CACHE] Preserving 15 push-inserted messages: [28752, 28751, 28750, 28749, 28748, 28747, 28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:33:34] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=15, IDs=[28752, 28751, 28750, 28749, 28748, 28747, 28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:33:34] [PUSH_TRACE] 🔀 mergeMessages: merged.count=65, first 10 IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:34] [PUSH_PRELOAD] ⚡ Pre-cached 65 messages for instant display (preserved 15 from push)
[10:33:34] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:33:34] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 66 msgs, IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:34] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=2 secsSinceLastPong=2349 vccs=0
[10:33:34] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28843
[10:33:34] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 3, AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28842]
[10:33:34] [PUSH] Parsed message_id: 28842
[10:33:34] [PUSH] Parsed operation_type: 3
[10:33:34] [PUSH] Taking direct action: opType=3, messageId=28842
[10:33:34] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28842
[10:33:34] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:33:34] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[10:33:34] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:33:34] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:33:34] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:33:34] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:33:34] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:33:34] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:34] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=65, IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:34] [PRELOAD_CACHE] Preserving 15 push-inserted messages: [28752, 28751, 28750, 28749, 28748, 28747, 28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:33:34] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=15, IDs=[28752, 28751, 28750, 28749, 28748, 28747, 28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:33:34] [PUSH_TRACE] 🔀 mergeMessages: merged.count=65, first 10 IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:34] [PUSH_PRELOAD] ⚡ Pre-cached 65 messages for instant display (preserved 15 from push)
[10:33:34] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:33:34] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 66 msgs, IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:34] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=2 secsSinceLastPong=2350 vccs=0
[10:33:34] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28843
[10:33:34] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 3, AnyHashable("message_id"): 28843, AnyHashable("aps"): {
    "content-available" = 1;
}]
[10:33:34] [PUSH] Parsed message_id: 28843
[10:33:34] [PUSH] Parsed operation_type: 3
[10:33:34] [PUSH] Taking direct action: opType=3, messageId=28843
[10:33:34] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28843
[10:33:34] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:33:34] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[10:33:34] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:34] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:34] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:34] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:34] [CLEANUP] ========================================
[10:33:34] [CLEANUP] Cleaning up all agent connections and views
[10:33:34] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:34] [CLEANUP] Stopped and removed 0 video connections
[10:33:34] [CLEANUP] Removed 0 video views
[10:33:34] [CLEANUP] Removed 0 feed scroll views
[10:33:34] [CLEANUP] Removed 0 status labels
[10:33:34] [CLEANUP] Reset agent query state
[10:33:34] [CLEANUP] Updated page indicator
[10:33:34] [CLEANUP] Rebuilt video layout
[10:33:34] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:34] [CLEANUP] ========================================
[10:33:34] [SERVER] Starting reconnect polling (5s interval)
[10:33:34] [CLEANUP] ========================================
[10:33:34] [CLEANUP] Cleaning up all agent connections and views
[10:33:34] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:34] [CLEANUP] Stopped and removed 0 video connections
[10:33:34] [CLEANUP] Removed 0 video views
[10:33:34] [CLEANUP] Removed 0 feed scroll views
[10:33:34] [CLEANUP] Removed 0 status labels
[10:33:34] [CLEANUP] Reset agent query state
[10:33:34] [CLEANUP] Updated page indicator
[10:33:34] [CLEANUP] Rebuilt video layout
[10:33:34] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:34] [CLEANUP] ========================================
[10:33:34] [SERVER] Starting reconnect polling (5s interval)
[10:33:34] [INCREMENTAL_SYNC] ✅ Found 8 new messages
[10:33:34] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 8 new messages, IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836]
[10:33:34] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 66 msgs, first 10 IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:34] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 66, first 10 IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:34] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=8
[10:33:34] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=66
[10:33:34] [INCREMENTAL_SYNC] 🔁 Processing queued retry refresh
[10:33:34] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=66
[10:33:34] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28843, maxMemoryId=28843
[10:33:34] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28843
[10:33:34] [INCREMENTAL_SYNC] ✅ No new messages
[10:33:35] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=75
[10:33:35] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=66, first5Ids=[28843, 28842, 28841, 28840, 28839]
[10:33:35] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 66 messages
[10:33:35] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:35] [RELOAD_TAB] 📊 Building chatRows from 66 messages
[10:33:35] [SCROLL] wasNearBottom=true, threshold=447, offset=5413, contentH=5860, boundsH=447, forceScroll=false
[10:33:35] [RELOAD_TAB] 📊 Built 68 chatRows, estHeight=0.0
[10:33:35] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=75
[10:33:35] [SCROLL] Async handler: shouldScroll=false (force=false, newMsgs=false, nearBottom=true), maxY=5413, currentOffset=5413
[10:33:36] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:36] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:36] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:36] HELLO → sent (cached token, role=query)
[10:33:36] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:36] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:36] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:36] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:36] [CLEANUP] ========================================
[10:33:36] [CLEANUP] Cleaning up all agent connections and views
[10:33:36] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:36] [CLEANUP] Stopped and removed 0 video connections
[10:33:36] [CLEANUP] Removed 0 video views
[10:33:36] [CLEANUP] Removed 0 feed scroll views
[10:33:36] [CLEANUP] Removed 0 status labels
[10:33:36] [CLEANUP] Reset agent query state
[10:33:36] [CLEANUP] Updated page indicator
[10:33:36] [CLEANUP] Rebuilt video layout
[10:33:36] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:36] [CLEANUP] ========================================
[10:33:36] [SERVER] Starting reconnect polling (5s interval)
[10:33:36] [CLEANUP] ========================================
[10:33:36] [CLEANUP] Cleaning up all agent connections and views
[10:33:36] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:36] [CLEANUP] Stopped and removed 0 video connections
[10:33:36] [CLEANUP] Removed 0 video views
[10:33:36] [CLEANUP] Removed 0 feed scroll views
[10:33:36] [CLEANUP] Removed 0 status labels
[10:33:36] [CLEANUP] Reset agent query state
[10:33:36] [CLEANUP] Updated page indicator
[10:33:36] [CLEANUP] Rebuilt video layout
[10:33:36] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:36] [CLEANUP] ========================================
[10:33:36] [SERVER] Starting reconnect polling (5s interval)
[10:33:36] [CLIENT_SIG] Typing stop from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:33:37] [CLIENT_SIG] Event received: type=0 messageId=28844
[10:33:37] [WS_EVENT] Received event: type=0, messageId=28844
[10:33:37] [WS_EVENT] 📨 New message notification (msgId=28844) - triggering incremental refresh, currentMsgCount=66
[10:33:37] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=66
[10:33:37] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28843, maxMemoryId=28843
[10:33:37] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28843
[10:33:37] [INCREMENTAL_SYNC] ✅ Found 1 new messages
[10:33:37] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 1 new messages, IDs=[28844]
[10:33:37] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 66 msgs, first 10 IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:37] [PUSH_TRACE] 📡 INCREMENTAL: Adding new message id=28844
[10:33:37] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 1 new, total 67, first 10 IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:37] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=1
[10:33:37] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=67
[10:33:37] [WS_EVENT] ✅ Incremental refresh complete, newMsgCount=67
[10:33:37] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=75
[10:33:37] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=67, first5Ids=[28844, 28843, 28842, 28841, 28840]
[10:33:37] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 67 messages
[10:33:37] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:37] [RELOAD_TAB] 📊 Building chatRows from 67 messages
[10:33:37] [SCROLL] wasNearBottom=true, threshold=447, offset=5413, contentH=5860, boundsH=447, forceScroll=false
[10:33:37] [RELOAD_TAB] 📊 Built 69 chatRows, estHeight=0.0
[10:33:37] [EVOLUTION_FILTER] 📝 Updated lastSeenMessageId after marking as read: 28843 → 28844
[10:33:37] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=77
[10:33:37] [SCROLL] 💓 alive, visible=61...68, rows=69, estHeight=0.0, heightCalls=147
[10:33:37] [SCROLL] Async handler: shouldScroll=true (force=false, newMsgs=true, nearBottom=true), maxY=5490, currentOffset=5490
[10:33:37] [SCROLL] Scrolling to 5490, animated=true
[10:33:38] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:38] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:38] [PUSH_DEBUG] 📣 Darwin notification from NSE — posting pollEventsNow
[10:33:38] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 67 msgs, IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=2 secsSinceLastPong=2353 vccs=0
[10:33:38] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28844
[10:33:38] [PUSH] handlePollEventsNotification userInfo: [:]
[10:33:38] [PUSH] No message_id in userInfo
[10:33:38] [PUSH] No operation_type in userInfo
[10:33:38] [FAST_REFRESH] Evolution disabled - performing incremental sync
[10:33:38] [PUSH_TRACE] 📬 POLL: cache state: valid=true, count=65, IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:38] [PUSH_TRACE] 📬 POLL: memory state: count=67, first 10 IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [FAST_REFRESH] Already have 67 messages in memory
[10:33:38] [FAST_REFRESH] maxMemoryId=28844, maxLocalId=28844
[10:33:38] [FAST_REFRESH] About to call reloadMessagesForCurrentTab(), isMainThread=true, viewLoaded=true
[10:33:38] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=67
[10:33:38] [FAST_REFRESH] reloadMessagesForCurrentTab() called successfully
[10:33:38] [READBY_OPT] No message IDs to fetch - skipping server call
[10:33:38] [GAP_FIX] Incremental sync will use since_id=28835 (background max=28835, current DB max=28844)
[10:33:38] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=67
[10:33:38] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28835, maxMemoryId=28844
[10:33:38] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28835
[10:33:38] [FAST_REFRESH] Enriched 0/0 unsettled messages with readBy data
[10:33:38] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=67
[10:33:38] [RELOAD_TAB] ⏳ Already pending, waiting for debounce
[10:33:38] [PUSH_DEBUG] ⬇️ PUSH RECEIVED at 2026-04-23 08:33:38 +0000 - type: unknown, operation_type: 0, message_id: 28844, session_id: ILUIWU, state: 0
[10:33:38] [PUSH_DEBUG] Full userInfo: [AnyHashable("operation_type"): 0, AnyHashable("timer"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("message_id"): 28844, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): , AnyHashable("thumb_file_name"): , AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:33:36";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Yes\Ud83d\Ude25\Ud83d\Ude25\Ud83d\Ude25";
    "message_id" = 28844;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28843;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("datesent"): 2026-04-23 08:33:36, AnyHashable("message"): Yes😥😥😥, AnyHashable("message_type"): 0, AnyHashable("sender_name"): Esra]
[10:33:38] [PUSH] App active - suppressing notification UI, posting internal event
[10:33:38] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:33:38 +0000
[10:33:38] [PUSH_TRACE] ⬇️ Processing embedded message_id=28844
[10:33:38] [PUSH_EMBED] 📩 Received embedded message: id=28844, type=0, sender=Esra
[10:33:38] [PUSH_TRACE] ⬇️ Message details: text="Yes😥😥😥...", datesent=2026-04-23 08:33:36
[10:33:38] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[10:33:38] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28844
[10:33:38] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28844
[10:33:38] [PUSH_EMBED] ✅ Saved message 28844 to local DB (sync)
[10:33:38] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28844
[10:33:38] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28844
[10:33:38] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28844
[10:33:38] [PUSH_TRACE] 📦 Cache state: valid=true, count=65, IDs=[28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835, 28834]
[10:33:38] [PUSH_EMBED] Inserted message 28844 into existing cache (now 66 messages)
[10:33:38] [PUSH_TRACE] 📦 ✅ Inserted message 28844, cache now has IDs: [28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [PUSH_TRACE] 📦 EXITING cache update queue for message 28844
[10:33:38] [PUSH_EMBED] Fetching evolution data for message 28844 in background
[10:33:38] [PUSH_EMBED] ✅ Fully processed message 28844
[10:33:38] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28844
[10:33:38] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 67 msgs, IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=2 secsSinceLastPong=2353 vccs=0
[10:33:38] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28844
[10:33:38] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("operation_type"): 0, AnyHashable("timer"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("message_id"): 28844, AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("file_name"): , AnyHashable("thumb_file_name"): , AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:33:36";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Yes\Ud83d\Ude25\Ud83d\Ude25\Ud83d\Ude25";
    "message_id" = 28844;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28843;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("datesent"): 2026-04-23 08:33:36, AnyHashable("message"): Yes😥😥😥, AnyHashable("message_type"): 0, AnyHashable("sender_name"): Esra]
[10:33:38] [PUSH_EMBED_VC] Message 28844 already in memory - skipping
[10:33:38] [PUSH] ⚡ Embedded message handled directly in ViewController
[10:33:38] [PUSH] Parsed message_id: 28844
[10:33:38] [PUSH] Parsed operation_type: 0
[10:33:38] [PUSH] Taking direct action: opType=0, messageId=28844
[10:33:38] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28844
[10:33:38] [PUSH] ⚡ Message 28844 already in memory - skipping duplicate notification entirely
[10:33:38] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:33:38] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[10:33:38] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[10:33:38] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[10:33:38] [PUSH_TRACE] 👁️ Received message id=28844, text="Yes😥😥😥..."
[10:33:38] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[10:33:38] [PUSH_UI] Message 28844 already in memory - skipping insert
[10:33:38] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[10:33:38] [PUSH] Silent push received
[10:33:38] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:33:38 +0000, appState=0, message_id=28844, type=nil
[10:33:38] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=66, IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:33:38 +0000
[10:33:38] [PUSH_TRACE] ⬇️ Processing embedded message_id=28844
[10:33:38] [PUSH_EMBED] 📩 Received embedded message: id=28844, type=0, sender=Esra
[10:33:38] [PUSH_TRACE] ⬇️ Message details: text="Yes😥😥😥...", datesent=2026-04-23 08:33:36
[10:33:38] [PUSH_TRACE] ⬇️ Session check: msgSession=ILUIWU, currentSession=ILUIWU
[10:33:38] [PUSH_TRACE] ⬇️ About to enter pushMessageQueue.sync for message 28844
[10:33:38] [PUSH_TRACE] ⬇️ INSIDE pushMessageQueue.sync for message 28844
[10:33:38] [PUSH_EMBED] ✅ Saved message 28844 to local DB (sync)
[10:33:38] [PUSH_TRACE] ⬇️ EXITING pushMessageQueue.sync for message 28844
[10:33:38] [PUSH_TRACE] 📦 About to update PreloadedDataCache for message 28844
[10:33:38] [PUSH_TRACE] 📦 INSIDE cache update queue for message 28844
[10:33:38] [PUSH_TRACE] 📦 Cache state: valid=true, count=66, IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [PUSH_TRACE] 📦 ⚠️ Message 28844 already in cache, skipping insert
[10:33:38] [PUSH_TRACE] 📦 EXITING cache update queue for message 28844
[10:33:38] [PUSH_EMBED] Fetching evolution data for message 28844 in background
[10:33:38] [PUSH_EMBED] ✅ Fully processed message 28844
[10:33:38] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - SUCCESS for message 28844
[10:33:38] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=66, IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835], handled=true
[10:33:38] [PUSH] Embedded message handled instantly from silent push
[10:33:38] [PUSH_TRACE] 🔔 SILENT: About to post pollEventsNow notification
[10:33:38] [PUSH_TRACE] 🔔 SILENT: Completed with .newData for message_id=28844
[10:33:38] [PUSH_UI] 🔔 handlePushMessageReceived CALLED
[10:33:38] [PUSH_TRACE] 👁️ handlePushMessageReceived START
[10:33:38] [PUSH_TRACE] 👁️ Received message id=28844, text="Yes😥😥😥..."
[10:33:38] [PUSH_UI_BLACKOUT] blackoutView=false, currentTab=0, senderId=EDAD55A1-003F-415D-AA60-672B34B504FE, myUserId=3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF, type=0
[10:33:38] [PUSH_UI] Message 28844 already in memory - skipping insert
[10:33:38] [PUSH_TRACE] 👁️ handlePushMessageReceived END - already exists
[10:33:38] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 67 msgs, IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=running pings=2 secsSinceLastPong=2353 vccs=0
[10:33:38] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28844
[10:33:38] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("file_name"): , AnyHashable("aps"): {
    alert =     {
        body = "You have received a new message";
        title = Eye;
    };
    badge = 1;
    "content-available" = 1;
    "mutable-content" = 1;
    sound = default;
}, AnyHashable("message_data"): {
    "crypto_version" = 0;
    datesent = "2026-04-23 08:33:36";
    "file_name" = "";
    "is_encrypted" = 0;
    message = "Yes\Ud83d\Ude25\Ud83d\Ude25\Ud83d\Ude25";
    "message_id" = 28844;
    "message_type" = 0;
    "mime_type" = "";
    "plaintext_size" = 0;
    "prev_session_message_id" = 28843;
    "sender_id" = "EDAD55A1-003F-415D-AA60-672B34B504FE";
    "sender_name" = Esra;
    "session_id" = ILUIWU;
    "thumb_file_name" = "";
    timer = 0;
    "upload_status" = 0;
}, AnyHashable("sender_name"): Esra, AnyHashable("sender_id"): EDAD55A1-003F-415D-AA60-672B34B504FE, AnyHashable("message"): Yes😥😥😥, AnyHashable("thumb_file_name"): , AnyHashable("message_type"): 0, AnyHashable("session_id"): ILUIWU, AnyHashable("operation_type"): 0, AnyHashable("message_id"): 28844, AnyHashable("timer"): 0, AnyHashable("datesent"): 2026-04-23 08:33:36]
[10:33:38] [PUSH_EMBED_VC] Message 28844 already in memory - skipping
[10:33:38] [PUSH] ⚡ Embedded message handled directly in ViewController
[10:33:38] [PUSH] Parsed message_id: 28844
[10:33:38] [PUSH] Parsed operation_type: 0
[10:33:38] [PUSH] Taking direct action: opType=0, messageId=28844
[10:33:38] [PUSH] TakeActionFromPush called: OperationType=0, MessageIds=28844
[10:33:38] [PUSH] ⚡ Message 28844 already in memory - skipping duplicate notification entirely
[10:33:38] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:33:38] [INCREMENTAL_SYNC] ⚠️ Already reloading - queuing retry after current completes
[10:33:38] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:38] HELLO → sent (cached token, role=query)
[10:33:38] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:38] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:38] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:38] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:38] [CLEANUP] ========================================
[10:33:38] [CLEANUP] Cleaning up all agent connections and views
[10:33:38] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:38] [CLEANUP] Stopped and removed 0 video connections
[10:33:38] [CLEANUP] Removed 0 video views
[10:33:38] [CLEANUP] Removed 0 feed scroll views
[10:33:38] [CLEANUP] Removed 0 status labels
[10:33:38] [CLEANUP] Reset agent query state
[10:33:38] [CLEANUP] Updated page indicator
[10:33:38] [CLEANUP] Rebuilt video layout
[10:33:38] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:38] [CLEANUP] ========================================
[10:33:38] [SERVER] Starting reconnect polling (5s interval)
[10:33:38] [CLEANUP] ========================================
[10:33:38] [CLEANUP] Cleaning up all agent connections and views
[10:33:38] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:38] [CLEANUP] Stopped and removed 0 video connections
[10:33:38] [CLEANUP] Removed 0 video views
[10:33:38] [CLEANUP] Removed 0 feed scroll views
[10:33:38] [CLEANUP] Removed 0 status labels
[10:33:38] [CLEANUP] Reset agent query state
[10:33:38] [CLEANUP] Updated page indicator
[10:33:38] [CLEANUP] Rebuilt video layout
[10:33:38] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:38] [CLEANUP] ========================================
[10:33:38] [SERVER] Starting reconnect polling (5s interval)
[10:33:38] [PUSH_EMBED] Got evolution data for message 28844, saving to local DB
[10:33:38] [PUSH_EMBED] Saved evolution data for message 28844
[10:33:38] [PUSH_EMBED] Got evolution data for message 28844, saving to local DB
[10:33:38] [PUSH_EMBED] Saved evolution data for message 28844
[10:33:38] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=0
[10:33:38] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=67, first5Ids=[28844, 28843, 28842, 28841, 28840]
[10:33:38] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 67 messages
[10:33:38] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [RELOAD_TAB] 📊 Building chatRows from 67 messages
[10:33:38] [SCROLL] wasNearBottom=true, threshold=447, offset=5490, contentH=5937, boundsH=447, forceScroll=true
[10:33:38] [RELOAD_TAB] 📊 Built 69 chatRows, estHeight=0.0
[10:33:38] [INCREMENTAL_SYNC] ✅ Found 9 new messages
[10:33:38] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 9 new messages, IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836]
[10:33:38] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=75
[10:33:38] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 67 msgs, first 10 IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 67, first 10 IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=9
[10:33:38] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=67
[10:33:38] [INCREMENTAL_SYNC] 🔁 Processing queued retry refresh
[10:33:38] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=67
[10:33:38] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28844, maxMemoryId=28844
[10:33:38] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28844
[10:33:38] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=5490, currentOffset=5490
[10:33:38] [SCROLL] Scrolling to 5490, animated=false
[10:33:38] [FAST_REFRESH] Incremental sync complete - 67 messages
[10:33:38] [INCREMENTAL_SYNC] ✅ No new messages
[10:33:38] [PUSH] Silent push received
[10:33:38] [PUSH_TRACE] 🔔 SILENT PUSH at 2026-04-23 08:33:38 +0000, appState=0, message_id=nil, type=nil
[10:33:38] [PUSH_TRACE] 🔔 SILENT: cache BEFORE: count=66, IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData START at 2026-04-23 08:33:38 +0000
[10:33:38] [PUSH_EMBED] No embedded message_data in notification
[10:33:38] [PUSH_TRACE] ⬇️ handleEmbeddedMessageData END - no message_data
[10:33:38] [PUSH_TRACE] 🔔 SILENT: cache AFTER: count=66, IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835], handled=false
[10:33:38] [PUSH] No embedded data, pre-loading messages from server
[10:33:38] [PUSH_PRELOAD] Fetching messages for instant display cache
[10:33:38] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=75
[10:33:38] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=67, first5Ids=[28844, 28843, 28842, 28841, 28840]
[10:33:38] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 67 messages
[10:33:38] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [RELOAD_TAB] 📊 Building chatRows from 67 messages
[10:33:38] [SCROLL] wasNearBottom=true, threshold=447, offset=5490, contentH=5937, boundsH=447, forceScroll=true
[10:33:38] [RELOAD_TAB] 📊 Built 69 chatRows, estHeight=0.0
[10:33:38] [RELOAD_TAB] ⚡ performReload LAYOUT DONE, heightCalls=75
[10:33:38] [SCROLL] Async handler: shouldScroll=true (force=true, newMsgs=false, nearBottom=true), maxY=5490, currentOffset=5490
[10:33:38] [SCROLL] Scrolling to 5490, animated=false
[10:33:38] [PUSH_PRELOAD] Fetched 50 messages - caching for instant display
[10:33:38] [REPLY_LOAD] AppDelegate mid=28818 raw='Any plans for today baby ?' decoded='Any plans for today baby ?' rawScalars=[U+41=A, U+6E=n, U+79=y, U+20= , U+70=p, U+6C=l, U+61=a, U+6E=n, U+73=s, U+20= , U+66=f, U+6F=o, U+72=r, U+20= , U+74=t, U+6F=o, U+64=d, U+61=a, U+79=y, U+20= , U+62=b, U+61=a, U+62=b, U+79=y]
[10:33:38] [REPLY_LOAD] AppDelegate mid=28817 raw='And you, anyway, don't really need more reliefs, right 😉?' decoded='And you, anyway, don't really need more reliefs, right 😉?' rawScalars=[U+41=A, U+6E=n, U+64=d, U+20= , U+79=y, U+6F=o, U+75=u, U+2C=,, U+20= , U+61=a, U+6E=n, U+79=y, U+77=w, U+61=a, U+79=y, U+2C=,, U+20= , U+64=d, U+6F=o, U+6E=n, U+27=', U+74=t, U+20= , U+72=r]
[10:33:38] [REPLY_LOAD] AppDelegate mid=28810 raw='🤭' decoded='🤭' rawScalars=[U+1F92D=🤭]
[10:33:38] [PUSH_TRACE] 🔀 mergeMessages called: newMessages.count=50, sessionId=ILUIWU
[10:33:38] [PUSH_TRACE] 🔀 mergeMessages: newMessages IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [PUSH_TRACE] 🔀 mergeMessages: existingMessages.count=66, IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [PRELOAD_CACHE] Preserving 16 push-inserted messages: [28756, 28752, 28751, 28750, 28749, 28748, 28747, 28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:33:38] [PUSH_TRACE] 🔀 mergeMessages: preservedMessages.count=16, IDs=[28756, 28752, 28751, 28750, 28749, 28748, 28747, 28746, 28745, 28744, 28743, 28742, 28741, 28740, 28739, 28738]
[10:33:38] [PUSH_TRACE] 🔀 mergeMessages: merged.count=66, first 10 IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [PUSH_PRELOAD] ⚡ Pre-cached 66 messages for instant display (preserved 16 from push)
[10:33:38] [PUSH_PRELOAD] ✅ Pre-load complete with thumbnails
[10:33:38] [PUSH_TRACE] 📬 handlePollEventsNotification START: memory has 67 msgs, IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [CAM_CONN] 📬 handlePollEvents — pushType= tab=0 hasQueryConn=true wsState=completed pings=2 secsSinceLastPong=2353 vccs=0
[10:33:38] [GAP_FIX] maxMessageIdAtBackground=28835, currentMaxLocalId=28844
[10:33:38] [PUSH] handlePollEventsNotification userInfo: [AnyHashable("aps"): {
    "content-available" = 1;
}, AnyHashable("operation_type"): 3, AnyHashable("session_id"): ILUIWU, AnyHashable("message_id"): 28844]
[10:33:38] [PUSH] Parsed message_id: 28844
[10:33:38] [PUSH] Parsed operation_type: 3
[10:33:38] [PUSH] Taking direct action: opType=3, messageId=28844
[10:33:38] [PUSH] TakeActionFromPush called: OperationType=3, MessageIds=28844
[10:33:38] [GAP_FIX] Post-action sync: using background max 28835 to catch coalesced messages
[10:33:38] [INCREMENTAL_SYNC] 🔄 Starting incremental refresh, currentMsgCount=67
[10:33:38] [PUSH_TRACE] 📡 INCREMENTAL: maxLocalId (from DB)=28835, maxMemoryId=28844
[10:33:38] [INCREMENTAL_SYNC] 📡 Fetching messages since ID 28835
[10:33:38] [INCREMENTAL_SYNC] ✅ Found 9 new messages
[10:33:38] [PUSH_TRACE] 📡 INCREMENTAL: Server returned 9 new messages, IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836]
[10:33:38] [PUSH_TRACE] 📡 INCREMENTAL: BEFORE merge, memory has 67 msgs, first 10 IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [PUSH_TRACE] 📡 INCREMENTAL: AFTER merge, added 0 new, total 67, first 10 IDs=[28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [BLACKOUT_DEBUG] blackoutView=nil, newMessages.count=9
[10:33:38] [RELOAD_TAB] 📢 reloadMessagesForCurrentTab (debounced) called, msgs=67
[10:33:38] [RELOAD_TAB] ⚡ performReload ENTER, skip=false, estHeight=0.0, heightCalls=75
[10:33:38] [RELOAD_TAB] 🔄 reloadMessagesForCurrentTab called, allMsgsCount=67, first5Ids=[28844, 28843, 28842, 28841, 28840]
[10:33:38] [PUSH_TRACE] 📺 RELOAD: allMessagesWithReadBy has 67 messages
[10:33:38] [PUSH_TRACE] 📺 RELOAD: First 10 IDs: [28844, 28843, 28842, 28841, 28840, 28839, 28838, 28837, 28836, 28835]
[10:33:38] [RELOAD_TAB] 📊 Building chatRows from 67 messages
[10:33:38] [SCROLL] wasNearBottom=true, threshold=447, offset=5490, contentH=5937, boundsH=447, forceScroll=false
[10:33:38] [RELOAD_TAB] 📊 Built 69 chatRows, estHeight=0.0
[10:33:38] [RELOAD_TAB] ⏭️ Skipping reloadData - row signature unchanged
[10:33:39] [CLIENT_SIG] Event received: type=3 messageId=28844
[10:33:39] [WS_EVENT] Received event: type=3, messageId=28844
[10:33:39] [WS_EVENT] Read receipt for message 28844 by Laurent (3B8A4F00-5ABD-47E5-8C88-F15DA9EF83AF)
[10:33:39] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:39] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:39] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:39] HELLO → sent (cached token, role=query)
[10:33:39] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:39] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:39] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:39] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:39] [CLEANUP] ========================================
[10:33:39] [CLEANUP] Cleaning up all agent connections and views
[10:33:39] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:39] [CLEANUP] Stopped and removed 0 video connections
[10:33:39] [CLEANUP] Removed 0 video views
[10:33:39] [CLEANUP] Removed 0 feed scroll views
[10:33:39] [CLEANUP] Removed 0 status labels
[10:33:39] [CLEANUP] Reset agent query state
[10:33:39] [CLEANUP] Updated page indicator
[10:33:39] [CLEANUP] Rebuilt video layout
[10:33:39] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:39] [CLEANUP] ========================================
[10:33:39] [SERVER] Starting reconnect polling (5s interval)
[10:33:39] [CLEANUP] ========================================
[10:33:39] [CLEANUP] Cleaning up all agent connections and views
[10:33:39] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:39] [CLEANUP] Stopped and removed 0 video connections
[10:33:39] [CLEANUP] Removed 0 video views
[10:33:39] [CLEANUP] Removed 0 feed scroll views
[10:33:39] [CLEANUP] Removed 0 status labels
[10:33:39] [CLEANUP] Reset agent query state
[10:33:39] [CLEANUP] Updated page indicator
[10:33:39] [CLEANUP] Rebuilt video layout
[10:33:39] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:39] [CLEANUP] ========================================
[10:33:39] [SERVER] Starting reconnect polling (5s interval)
[10:33:41] [CLIENT_SIG] Typing start from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:33:41] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:41] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:41] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:41] HELLO → sent (cached token, role=query)
[10:33:41] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:41] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:41] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:41] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:41] [CLEANUP] ========================================
[10:33:41] [CLEANUP] Cleaning up all agent connections and views
[10:33:41] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:41] [CLEANUP] Stopped and removed 0 video connections
[10:33:41] [CLEANUP] Removed 0 video views
[10:33:41] [CLEANUP] Removed 0 feed scroll views
[10:33:41] [CLEANUP] Removed 0 status labels
[10:33:41] [CLEANUP] Reset agent query state
[10:33:41] [CLEANUP] Updated page indicator
[10:33:41] [CLEANUP] Rebuilt video layout
[10:33:41] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:41] [CLEANUP] ========================================
[10:33:41] [SERVER] Starting reconnect polling (5s interval)
[10:33:41] [CLEANUP] ========================================
[10:33:41] [CLEANUP] Cleaning up all agent connections and views
[10:33:41] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:41] [CLEANUP] Stopped and removed 0 video connections
[10:33:41] [CLEANUP] Removed 0 video views
[10:33:41] [CLEANUP] Removed 0 feed scroll views
[10:33:41] [CLEANUP] Removed 0 status labels
[10:33:41] [CLEANUP] Reset agent query state
[10:33:41] [CLEANUP] Updated page indicator
[10:33:41] [CLEANUP] Rebuilt video layout
[10:33:41] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:41] [CLEANUP] ========================================
[10:33:41] [SERVER] Starting reconnect polling (5s interval)
[10:33:43] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:43] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:43] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:43] HELLO → sent (cached token, role=query)
[10:33:43] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:43] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:43] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:43] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:43] [CLEANUP] ========================================
[10:33:43] [CLEANUP] Cleaning up all agent connections and views
[10:33:43] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:43] [CLEANUP] Stopped and removed 0 video connections
[10:33:43] [CLEANUP] Removed 0 video views
[10:33:43] [CLEANUP] Removed 0 feed scroll views
[10:33:43] [CLEANUP] Removed 0 status labels
[10:33:43] [CLEANUP] Reset agent query state
[10:33:43] [CLEANUP] Updated page indicator
[10:33:43] [CLEANUP] Rebuilt video layout
[10:33:43] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:43] [CLEANUP] ========================================
[10:33:43] [SERVER] Starting reconnect polling (5s interval)
[10:33:43] [CLEANUP] ========================================
[10:33:43] [CLEANUP] Cleaning up all agent connections and views
[10:33:43] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:43] [CLEANUP] Stopped and removed 0 video connections
[10:33:43] [CLEANUP] Removed 0 video views
[10:33:43] [CLEANUP] Removed 0 feed scroll views
[10:33:43] [CLEANUP] Removed 0 status labels
[10:33:43] [CLEANUP] Reset agent query state
[10:33:43] [CLEANUP] Updated page indicator
[10:33:43] [CLEANUP] Rebuilt video layout
[10:33:43] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:43] [CLEANUP] ========================================
[10:33:43] [SERVER] Starting reconnect polling (5s interval)
[10:33:44] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:44] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:44] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:44] HELLO → sent (cached token, role=query)
[10:33:45] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:45] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:45] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:45] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:45] [CLEANUP] ========================================
[10:33:45] [CLEANUP] Cleaning up all agent connections and views
[10:33:45] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:45] [CLEANUP] Stopped and removed 0 video connections
[10:33:45] [CLEANUP] Removed 0 video views
[10:33:45] [CLEANUP] Removed 0 feed scroll views
[10:33:45] [CLEANUP] Removed 0 status labels
[10:33:45] [CLEANUP] Reset agent query state
[10:33:45] [CLEANUP] Updated page indicator
[10:33:45] [CLEANUP] Rebuilt video layout
[10:33:45] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:45] [CLEANUP] ========================================
[10:33:45] [SERVER] Starting reconnect polling (5s interval)
[10:33:45] [CLEANUP] ========================================
[10:33:45] [CLEANUP] Cleaning up all agent connections and views
[10:33:45] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:45] [CLEANUP] Stopped and removed 0 video connections
[10:33:45] [CLEANUP] Removed 0 video views
[10:33:45] [CLEANUP] Removed 0 feed scroll views
[10:33:45] [CLEANUP] Removed 0 status labels
[10:33:45] [CLEANUP] Reset agent query state
[10:33:45] [CLEANUP] Updated page indicator
[10:33:45] [CLEANUP] Rebuilt video layout
[10:33:45] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:45] [CLEANUP] ========================================
[10:33:45] [SERVER] Starting reconnect polling (5s interval)
[10:33:46] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:46] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:46] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:46] HELLO → sent (cached token, role=query)
[10:33:46] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:46] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:46] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:46] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:46] [CLEANUP] ========================================
[10:33:46] [CLEANUP] Cleaning up all agent connections and views
[10:33:46] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:46] [CLEANUP] Stopped and removed 0 video connections
[10:33:46] [CLEANUP] Removed 0 video views
[10:33:46] [CLEANUP] Removed 0 feed scroll views
[10:33:46] [CLEANUP] Removed 0 status labels
[10:33:46] [CLEANUP] Reset agent query state
[10:33:46] [CLEANUP] Updated page indicator
[10:33:46] [CLEANUP] Rebuilt video layout
[10:33:46] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:46] [CLEANUP] ========================================
[10:33:46] [SERVER] Starting reconnect polling (5s interval)
[10:33:46] [CLEANUP] ========================================
[10:33:46] [CLEANUP] Cleaning up all agent connections and views
[10:33:46] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:46] [CLEANUP] Stopped and removed 0 video connections
[10:33:46] [CLEANUP] Removed 0 video views
[10:33:46] [CLEANUP] Removed 0 feed scroll views
[10:33:46] [CLEANUP] Removed 0 status labels
[10:33:46] [CLEANUP] Reset agent query state
[10:33:46] [CLEANUP] Updated page indicator
[10:33:46] [CLEANUP] Rebuilt video layout
[10:33:46] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:46] [CLEANUP] ========================================
[10:33:46] [SERVER] Starting reconnect polling (5s interval)
[10:33:46] [LOG] Long press on chat icon detected! Triggering log upload...
[10:33:46] [LOG-PROMPT] ====== promptForLogDescription START ======
[10:33:46] [LOG-PROMPT] presentedVC=nil
[10:33:46] [LOG-PROMPT] isViewLoaded=true, view.window=YES
[10:33:46] [LOG-PROMPT] inputField.isFirstResponder=true
[10:33:46] [LOG-PROMPT] allowKeyboardDismiss BEFORE=false
[10:33:46] [LOG-PROMPT] allowKeyboardDismiss set to TRUE
[10:33:46] [LOG-KB] textViewShouldEndEditing: isInputField=true, allowKeyboardDismiss=true, returning=true, textView=<Eye.PastingTextView: 0x11d03c000; baseClass = UITextView; frame = (44 8; 320 36
[10:33:46] [SCROLL] 💓 alive, visible=58...68, rows=69, estHeight=0.0, heightCalls=0
[10:33:46] [LOG-KB] textViewDidEndEditing: isInputField=true, resetting allowKeyboardDismiss to false
[10:33:46] [LOG-PROMPT] view.endEditing(true) returned true
[10:33:46] [LOG-PROMPT] inputField.isFirstResponder AFTER endEditing=false
[10:33:46] [LOG-PROMPT] allowKeyboardDismiss AFTER endEditing=false
[10:33:46] [LOG-PROMPT] Keyboard was active, waiting for dismiss notification or timeout
[10:33:47] [LOG-PROMPT] keyboardDidHide notification → presenting alert
[10:33:47] [LOG-PROMPT] inputField.isFirstResponder at keyboardDidHide=false
[10:33:47] [LOG-ALERT] ---- presentLogDescriptionAlert about to present ----
[10:33:47] [LOG-ALERT] inputField.isFirstResponder=false, allowKeyboardDismiss=false
[10:33:47] [LOG-ALERT] final endEditing returned=true, inputField.isFirstResponder AFTER=false
[10:33:47] [LOG-ALERT] allowKeyboardDismiss AFTER final endEditing=true
[10:33:47] [LOG-ALERT] presentedVC=nil
[10:33:47] [LOG-PROMPT] 0.7s timeout fired but already presented — ignoring
[10:33:47] [LOG-ALERT] ---- present completion handler fired ----
[10:33:47] [LOG-ALERT] inputField.isFirstResponder=false
[10:33:47] [LOG-ALERT] textView.window=YES
[10:33:47] [LOG-ALERT] textView.canBecomeFirstResponder=true
[10:33:47] [LOG-ALERT] textView.isEditable=true, isUserInteractionEnabled=true
[10:33:47] [LOG-ALERT] textView.frame=(16.0, 64.0, 288.0, 100.0), isHidden=false, alpha=1.0
[10:33:47] [LOG-ALERT] textView.superview=Optional("<_UIAlertControllerPhoneTVMacView: 0x12671d900; frame = (60 373; 320 238); layer")
[10:33:47] [LOG-ALERT] textView.becomeFirstResponder()=true
[10:33:47] [LOG-ALERT] ---- present completion handler done ----
[10:33:47] [SCROLL] 💓 alive, visible=58...64, rows=69, estHeight=0.0, heightCalls=6
[10:33:47] [SCROLL_BTN] Showing button - 308pt from bottom > half 223pt
[10:33:48] [SCROLL_END_DECEL] messagesTable offsetY=5490, insetTop=0, pendingVelocityY=0.0
[10:33:48] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:48] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:48] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:48] HELLO → sent (cached token, role=query)
[10:33:48] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:48] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:48] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:48] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:48] [CLEANUP] ========================================
[10:33:48] [CLEANUP] Cleaning up all agent connections and views
[10:33:48] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:48] [CLEANUP] Stopped and removed 0 video connections
[10:33:48] [CLEANUP] Removed 0 video views
[10:33:48] [CLEANUP] Removed 0 feed scroll views
[10:33:48] [CLEANUP] Removed 0 status labels
[10:33:48] [CLEANUP] Reset agent query state
[10:33:48] [CLEANUP] Updated page indicator
[10:33:48] [CLEANUP] Rebuilt video layout
[10:33:48] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:48] [CLEANUP] ========================================
[10:33:48] [SERVER] Starting reconnect polling (5s interval)
[10:33:48] [CLEANUP] ========================================
[10:33:48] [CLEANUP] Cleaning up all agent connections and views
[10:33:48] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:48] [CLEANUP] Stopped and removed 0 video connections
[10:33:48] [CLEANUP] Removed 0 video views
[10:33:48] [CLEANUP] Removed 0 feed scroll views
[10:33:48] [CLEANUP] Removed 0 status labels
[10:33:48] [CLEANUP] Reset agent query state
[10:33:48] [CLEANUP] Updated page indicator
[10:33:48] [CLEANUP] Rebuilt video layout
[10:33:48] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:48] [CLEANUP] ========================================
[10:33:48] [SERVER] Starting reconnect polling (5s interval)
[10:33:50] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:50] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:50] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:50] HELLO → sent (cached token, role=query)
[10:33:50] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:50] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:50] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:50] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:50] [CLEANUP] ========================================
[10:33:50] [CLEANUP] Cleaning up all agent connections and views
[10:33:50] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:50] [CLEANUP] Stopped and removed 0 video connections
[10:33:50] [CLEANUP] Removed 0 video views
[10:33:50] [CLEANUP] Removed 0 feed scroll views
[10:33:50] [CLEANUP] Removed 0 status labels
[10:33:50] [CLEANUP] Reset agent query state
[10:33:50] [CLEANUP] Updated page indicator
[10:33:50] [CLEANUP] Rebuilt video layout
[10:33:50] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:50] [CLEANUP] ========================================
[10:33:50] [SERVER] Starting reconnect polling (5s interval)
[10:33:50] [CLEANUP] ========================================
[10:33:50] [CLEANUP] Cleaning up all agent connections and views
[10:33:50] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:50] [CLEANUP] Stopped and removed 0 video connections
[10:33:50] [CLEANUP] Removed 0 video views
[10:33:50] [CLEANUP] Removed 0 feed scroll views
[10:33:50] [CLEANUP] Removed 0 status labels
[10:33:50] [CLEANUP] Reset agent query state
[10:33:50] [CLEANUP] Updated page indicator
[10:33:50] [CLEANUP] Rebuilt video layout
[10:33:50] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:50] [CLEANUP] ========================================
[10:33:50] [SERVER] Starting reconnect polling (5s interval)
[10:33:51] [CLIENT_SIG] Typing stop from: Esra (EDAD55A1-003F-415D-AA60-672B34B504FE)
[10:33:51] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:51] [WS] Opening session at ws://crivello.dyndns.org:8081/
[10:33:51] [WS] WebSocket ACTUALLY OPENED - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:51] HELLO → sent (cached token, role=query)
[10:33:51] [WS] Connection failed: The operation couldn’t be completed. Socket is not connected
[10:33:51] [WS] Query connection failed - cleaning up all agent connections and views
[10:33:51] [WS] WebSocket ACTUALLY CLOSED - isQueryOnly=true, connectionStr=iosILUIWU, closeCode=1000
[10:33:51] [WS] Query connection to iosILUIWU closed - cleaning up all agent connections and views
[10:33:51] [CLEANUP] ========================================
[10:33:51] [CLEANUP] Cleaning up all agent connections and views
[10:33:51] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:51] [CLEANUP] Stopped and removed 0 video connections
[10:33:51] [CLEANUP] Removed 0 video views
[10:33:51] [CLEANUP] Removed 0 feed scroll views
[10:33:51] [CLEANUP] Removed 0 status labels
[10:33:51] [CLEANUP] Reset agent query state
[10:33:51] [CLEANUP] Updated page indicator
[10:33:51] [CLEANUP] Rebuilt video layout
[10:33:51] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:51] [CLEANUP] ========================================
[10:33:51] [SERVER] Starting reconnect polling (5s interval)
[10:33:51] [CLEANUP] ========================================
[10:33:51] [CLEANUP] Cleaning up all agent connections and views
[10:33:51] [CLEANUP] Current state: vccs=0, videoViews=0, feedScrollViews=0
[10:33:51] [CLEANUP] Stopped and removed 0 video connections
[10:33:51] [CLEANUP] Removed 0 video views
[10:33:51] [CLEANUP] Removed 0 feed scroll views
[10:33:51] [CLEANUP] Removed 0 status labels
[10:33:51] [CLEANUP] Reset agent query state
[10:33:51] [CLEANUP] Updated page indicator
[10:33:51] [CLEANUP] Rebuilt video layout
[10:33:51] [CLEANUP] ✅ All agent connections and views cleaned up
[10:33:51] [CLEANUP] ========================================
[10:33:51] [SERVER] Starting reconnect polling (5s interval)
[10:33:53] [SCROLL] 💓 alive, visible=58...68, rows=69, estHeight=0.0, heightCalls=7
[10:33:53] [WS] Creating new WebSocket - isQueryOnly=true, connectionStr=iosILUIWU
[10:33:53] [WS] Opening session at ws://crivello.dyndns.org:8081/