The busy-queue envelope keeps the accept-time row id across an in-place
compaction, but archive_and_compact's concurrent-append path deactivates that
row and clones it to a fresh id; the drain's deactivate_message and the merge's
set_user_message_content then address the dead original, leaving the clone
active beside the replacement (prompt active twice) or the merge a no-op.
Adds SessionDB.resolve_active_row_id (the row itself while active, else the
single clone with same role/content/timestamp, None when ambiguous) and uses
it in both the drain deactivate and the merge update, dropping the envelope's
staged row when no live row remains.
Co-authored-by: Totoro-qaq <Totoro-qaq@users.noreply.github.com>