Reject messages from the previous page and preserve events recorded after navigation.
Include the previous day's overnight hours when checking campaign eligibility.
/health returned true without touching the database, so a deployment
whose Postgres was gone kept reporting healthy (see #654). Ping the
database with a 3s timeout and answer 503 when it fails.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The sidebar dropped the current conversation from the list and, when it
was not among the ten fetched, returned an empty list instead of the
others. The list now mirrors the conversation list on the left: every
conversation of the contact, the open one highlighted.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- Save recipient edits and sender choices with reply drafts.
- Keep CC and BCC open when an address is cleared.
- Allow SMTP without credentials when authentication is off.
- Use the workspace timezone for reports and campaign dates.
- Show CSAT responses without reloading the conversation.
- Block access to attachments from deleted messages.
- Accept conditional email templates and catch missing or repeated replies.
- Explain why choosing another default email template failed.
- Reload stale routes and keep widget image fallbacks working.
- Keep the launcher usable by keyboard and reset host button styles.
Opening a conversation used to mark it read even when the agent never scrolled to the new messages or the tab was in the background. Reply notifications in the bell also stayed unread after the agent read the reply.
Now the browser tells the server which message the agent saw. It only does this when the end of the thread is on screen and the tab has focus. The server moves the agent's last seen time forward to that message and never back.
A reply notification counts as read when the agent's last seen time is at or after the reply. "Mark as unread" marks the old reply notifications read first, so the bell stays the same.
Reply emails and pushes wait a little before sending. They are skipped if the agent already read the message or can no longer see the conversation.
A verification that finished while an inbox was being saved could get lost. One stuck pending for 10 minutes is now marked failed. Replies to alias emails now come back into the same conversation.
Drop the check that blocked one address on two inboxes and simplify sender
lookup, alias verification and IMAP handling. The inbox form now shows the
connected account first, lines up its fields and shows one hint for unsaved aliases.
An upload could send a file type like "image/svg+xml; x". We saved that
type as sent, so it skipped the SVG check and the file opened in the tab
with scripts on. Types ending in +xml had the same hole.
We now clean up the type before saving it and again when serving it,
which also fixes files uploaded before this change. Files served from
libredesk get scripts turned off, except PDFs, because Chrome's PDF
viewer won't load that way. SVG and other XML types always download.
On S3, uploads store the cleaned type and a download or inline header
on the file.
Drop messages from blocked contacts before media downloads or conversation updates. Restore variables in regular replies and add regression tests while preserving Meta template parameters.