Skip to content
Merged
Prev Previous commit
Next Next commit
fix(imap): preserve fresh UID after UIDVALIDITY reset in state merge
  • Loading branch information
waleedlatif1 committed Apr 9, 2026
commit 9ed0b82f86a818dda445b912b3fac1fa141babeb
28 changes: 21 additions & 7 deletions apps/sim/lib/webhooks/polling/imap.ts
Original file line number Diff line number Diff line change
Expand Up @@ -192,16 +192,30 @@ async function updateImapState(
uidValidityByMailbox: Record<string, string>
) {
const existingUidByMailbox = config.lastProcessedUidByMailbox || {}
const mergedUidByMailbox = { ...existingUidByMailbox }
const prevUidValidity = config.uidValidityByMailbox || {}

for (const [mailbox, uid] of Object.entries(uidByMailbox)) {
mergedUidByMailbox[mailbox] = Math.max(uid, mergedUidByMailbox[mailbox] || 0)
const resetMailboxes = new Set(
Object.entries(uidValidityByMailbox)
.filter(
([mailbox, validity]) =>
prevUidValidity[mailbox] !== undefined && prevUidValidity[mailbox] !== validity
)
.map(([mailbox]) => mailbox)
)

const mergedUidByMailbox: Record<string, number> = {}

for (const [mailbox, uid] of Object.entries(existingUidByMailbox)) {
if (!resetMailboxes.has(mailbox)) {
mergedUidByMailbox[mailbox] = uid
}
}

const prevUidValidity = config.uidValidityByMailbox || {}
for (const [mailbox, validity] of Object.entries(uidValidityByMailbox)) {
if (prevUidValidity[mailbox] !== undefined && prevUidValidity[mailbox] !== validity) {
delete mergedUidByMailbox[mailbox]
for (const [mailbox, uid] of Object.entries(uidByMailbox)) {
if (resetMailboxes.has(mailbox)) {
mergedUidByMailbox[mailbox] = uid
} else {
mergedUidByMailbox[mailbox] = Math.max(uid, mergedUidByMailbox[mailbox] || 0)
}
}
Comment thread
waleedlatif1 marked this conversation as resolved.

Expand Down