Matthew Meszaros
2710f81d86
Merge pull request #803 from warmbly/fix/unibox-tests-wait-for-rows
...
feat: make the unibox tests wait for rows instead of a fixed settle
v0.6.20
2026-10-02 14:03:32 +00:00
Matthew Meszaros
ffc505ab03
feat: make the unibox layout, scope-change and scroll tests wait up to 10 seconds for a conversation row, the reply box and the search box through findThreadRow and findBy queries instead of reading them right after a fixed 300 ms settle, so a slow CI runner rendering the list late no longer fails them
2026-10-02 15:57:43 +02:00
Matthew Meszaros
df34c9dac6
Merge pull request #800 from warmbly/fix/domain-auth-zone-confirm
...
feat: confirm a missing SPF or DMARC record with the sending domain's own nameservers and record the verdict when a mailbox manager presses Check
2026-10-02 13:23:19 +00:00
Matthew Meszaros
a09ba27b0c
feat: confirm a missing SPF or DMARC record with the sending domain's own authoritative nameservers before reporting it, look names up fully qualified so a resolver failure is never retried under the host's search domains and read as not found, look up internationalized domains in ASCII, record the verdict when a mailbox manager presses Check in the drawer, and show an unanswered lookup as unverified rather than missing
2026-10-02 06:13:37 -07:00
Matthew Meszaros
50d50d0fbc
Merge pull request #793 from warmbly/fix/inbox-follow-up-sweep-paging
...
feat: page the hourly inbox follow-up sweep through each mailbox newest first in bounded keyset pages that resolve thread state only for the threads on the page, resume each workspace's cycle from a cursor persisted in inbox_follow_up_sweeps under a per-pass time budget, check recently active threads first every pass, and add the unibox_emails (email_id, internal_date, id) index the walk reads
v0.6.19
2026-10-02 06:33:14 +00:00
Matthew Meszaros
0c60be4d88
Merge pull request #782 from warmbly/fix/deploy-railway-single-deployment
...
feat: roll each Railway service with exactly one deployment
2026-10-02 06:21:55 +00:00
Matthew Meszaros
39285173f1
feat: never move the follow-up changed-thread watermark past a page it failed to read, step past a failing page, thread or unreadable mailbox only after three failures spanning at least an hour, fence sweep state saves on the lease owner alone and log a takeover, clear a stale failure count once the walk moves on, and note that imported unibox rows keep their source ingested_at
2026-10-01 23:20:45 -07:00
Matthew Meszaros
0bcbab91ac
Merge remote-tracking branch 'origin/main' into fix/inbox-follow-up-sweep-paging
...
# Conflicts:
# internal/app/orgtransfer/spec.go
2026-10-01 23:20:32 -07:00
Matthew Meszaros
b2310f5d4b
feat: renumber the inbox follow-up sweep migrations from 000243-000247 to 000245-000249 so they follow 000243_campaign_task_subject and 000244_unibox_rail_layout on main instead of colliding with them
2026-10-02 08:15:42 +02:00
Matthew Meszaros
e883e60c3d
Merge pull request #795 from warmbly/fix/worker-465-egress
...
feat: name a worker's own blocked outbound 465 instead of blaming the mailbox's server
2026-10-02 06:12:30 +00:00
Matthew Meszaros
a869099fc8
feat: track the one new deployment a Railway roll starts by id in scripts/deploy-railway.sh, recording existing deployment ids before connecting the image so a rollback never mistakes an older deployment of the same image for the new one, checking once more at the 30-second deadline, and stopping the roll when a deployment list query fails instead of reading it as no deployment and redeploying
2026-10-02 08:09:56 +02:00
Matthew Meszaros
39f780122e
Merge pull request #794 from warmbly/feat/unibox-rail-layout-per-member
...
feat: save the unibox scope rail's favorites, order and hidden rows to the member's account per workspace
2026-10-02 06:04:59 +00:00
Matthew Meszaros
e79551867f
feat: have a worker learn from its own dials when its network blocks outbound 465, dial 587 at once there, tell a mailbox whose server only takes 465 that the block is on the sending side instead of blaming its server, report the block on every heartbeat as the node's last error, rename the admin Workers filter to Has node error, and document the outbound ports a worker needs
2026-10-02 08:02:36 +02:00
Matthew Meszaros
244b2e6613
feat: renumber the unibox rail layout migration to 000244 after main took 000243
2026-10-01 22:59:25 -07:00
Matthew Meszaros
b8a8ec4743
Merge remote-tracking branch 'origin/main' into feat/unibox-rail-layout-per-member
2026-10-01 22:58:31 -07:00
Matthew Meszaros
1aeb45773b
feat: check threads changed since each workspace's last follow-up pass by when the message was stored (new unibox_emails.ingested_at) or its verdict written, behind a persisted watermark, give each workspace's sweep a single leased walker whose saves are conditional on the lease, stop the cursor at the last thread whose label was written and step past a page or thread after three consecutive failures, keep the cycle running when the changed-thread check fails, and accept warmblyctl inbox-tag follow-ups --limit as a deprecated no-op
2026-10-01 22:52:43 -07:00
Matthew Meszaros
945fadb260
Merge pull request #788 from warmbly/fix/ab-variant-thread-subject
...
feat: thread campaign follow-ups on the A/B arm each contact was actually sent by recording every send's rendered subject on campaign_tasks.subject (migration 000243) and reusing it verbatim in ThreadParentForLead, and list the opening step's variant subjects in the follow-up composer
2026-10-02 05:46:33 +00:00
Matthew Meszaros
1e1acef6f4
Merge pull request #791 from warmbly/fix/unibox-refresh-load
...
feat: coalesce and dedupe unibox realtime refreshes in useRealtimeEvents, forward TanStack Query abort signals through every unibox client and the shared Request helper with cancellations kept out of error handling, share one organization-scoped unibox overview computation per second with in-flight dedup and write-time invalidation, bound interactive unibox reads at 30s including pool wait, and log slow pgxpool connection acquisitions
2026-10-02 05:46:17 +00:00
Matthew Meszaros
d12b8090c8
Merge origin/main into fix/ab-variant-thread-subject
2026-10-01 22:41:11 -07:00
Matthew Meszaros
bce968646f
feat: thread campaign follow-ups on the A/B arm each contact was actually sent by recording every send's rendered subject on campaign_tasks.subject (migration 000243) and reusing it verbatim in ThreadParentForLead, and list the opening step's variant subjects in the follow-up composer
2026-10-01 22:41:11 -07:00
Matthew Meszaros
8f89c36756
feat: refresh the open conversation for inbox events that name only a message id, give unibox refresh keys added just before a max-wait flush a trailing flush, cancel a shared unibox overview computation once its last caller leaves and bound it and GET /unibox/overview at 30s, include scheduled sends in the coalesced inbox refresh, and word the slow pgxpool acquire log as acquire time rather than saturation
2026-10-01 22:41:00 -07:00
Matthew Meszaros
596c395cd0
Merge pull request #792 from warmbly/fix/menus-close-on-email-body-tap
...
feat: close every dashboard dropdown on a tap inside a same-origin iframe such as the unibox email body
2026-10-02 05:37:50 +00:00
Matthew Meszaros
478d3ecc7b
Merge remote-tracking branch 'origin/main' into fix/unibox-refresh-load
2026-10-01 22:37:48 -07:00
Matthew Meszaros
7707f6fb02
Merge pull request #789 from warmbly/fix/unibox-unread-latest-received
...
feat: mark only a conversation's newest received message unread on Mark as unread, never a sent or draft copy
2026-10-02 05:37:48 +00:00
Matthew Meszaros
54a05027cc
feat: save the unibox scope rail's favorites, row and section order and hidden rows to the member's account per workspace through a unibox_rail view with a validated layout on /me/views, synced from the dashboard store so every device shows the same rail while folds and widths stay per browser
2026-10-01 22:37:23 -07:00
Matthew Meszaros
4183929b29
feat: note in AGENTS.md that useClickOutside also closes on a tap landing in a same-origin iframe
2026-10-01 22:32:51 -07:00
Matthew Meszaros
b2eba2b566
Merge pull request #786 from warmbly/fix/jobrun-persisted-schedule
...
feat: resume every scheduled job from its stored next_run_at after a restart instead of starting a fresh interval, run a job that came due while the process was down right after its phase offset, and claim each slot with a compare-and-swap on next_run_at so a job hosted by several processes runs once per slot
2026-10-02 05:32:37 +00:00
Matthew Meszaros
b894d8f8b9
Merge pull request #790 from warmbly/fix/unibox-leave-select-mode
...
feat: add a Cancel selection button next to the All box in the unibox list header so Select mode can be left on a phone
2026-10-02 05:29:48 +00:00
Matthew Meszaros
6758bc8035
feat: page the hourly inbox follow-up sweep through each mailbox newest first in bounded keyset pages that resolve thread state only for the threads on the page, resume each workspace's cycle from a cursor persisted in inbox_follow_up_sweeps under a per-pass time budget, check recently active threads first every pass, and add the unibox_emails (email_id, internal_date, id) index the walk reads
2026-10-01 22:29:41 -07:00
Matthew Meszaros
e137530895
feat: run the jobrun scheduler tests on the testing/synctest fake clock and cover a claim that errors with or without its write landing, so each slot still runs exactly once
2026-10-01 22:29:39 -07:00
Matthew Meszaros
f01016c64f
feat: close every dashboard dropdown on a tap inside a same-origin iframe such as the unibox email body by listening on the frame's own document in useClickOutside, re-attaching when the frame reloads, since a tap on a phone never moves focus into the frame
2026-10-01 22:27:45 -07:00
Matthew Meszaros
dc2cffd786
feat: coalesce and dedupe unibox realtime refreshes in useRealtimeEvents, forward TanStack Query abort signals through every unibox client and the shared Request helper with cancellations kept out of error handling, share one organization-scoped unibox overview computation per second with in-flight dedup and write-time invalidation, bound interactive unibox reads at 30s including pool wait, and log slow pgxpool connection acquisitions
2026-10-01 22:25:53 -07:00
Matthew Meszaros
839235069e
feat: add a Cancel selection button next to the All box in the unibox list header so Select mode can be left on a phone without ticking a row or switching folders
2026-10-01 22:25:06 -07:00
Matthew Meszaros
72b332b944
Merge pull request #787 from warmbly/fix/unibox-mark-unread-sticks
...
feat: keep a unibox conversation unread after Mark as unread by skipping the reader's auto-read once the store has moved off its thread
2026-10-02 05:23:09 +00:00
Matthew Meszaros
a84b3bbbf3
feat: mark only a conversation's newest received message unread on Mark as unread, never a sent or draft copy, from the reader, the row menu, the selection bar, PATCH /unibox/seen and the mark_thread_seen AI tool, with the guide and API docs updated
2026-10-01 22:22:56 -07:00
Matthew Meszaros
7841e34119
feat: keep a unibox conversation unread after Mark as unread by skipping the reader's auto-read once the store has moved off its thread, and close the reader when the selection bar marks the open conversation unread
2026-10-01 22:16:59 -07:00
Matthew Meszaros
7c8ed01775
feat: resume every scheduled job from its stored next_run_at after a restart instead of starting a fresh interval, run a job that came due while the process was down right after its phase offset, and claim each slot with a compare-and-swap on next_run_at so a job hosted by several processes runs once per slot
2026-10-01 22:16:16 -07:00
Matthew Meszaros
b488d57534
feat: roll each Railway service with exactly one deployment in scripts/deploy-railway.sh by waiting for the deployment that connecting the image starts, redeploying only when none appears within 30 seconds, and waiting on an already-starting deployment of the target image instead of starting another, so a second deployment can no longer replace a booting backend mid-migration
2026-10-01 19:55:56 +02:00
Matthew Meszaros
bada69a408
Merge pull request #781 from warmbly/fix/workspace-selector-click-outside
...
feat: close every dashboard dropdown through one useClickOutside(open, onClose, refs) hook so a press outside, Escape (innermost first) or another dropdown opening closes it
v0.6.18
2026-10-01 17:27:39 +00:00
Matthew Meszaros
8faefb88be
feat: leave Escape to a confirm or modal opened above an open dropdown in useClickOutside, drop ImageMenu's duplicate Escape guard, and restore the useDismissAdvisorFinding and useDismissMailboxImport mutation names the hook rename caught
2026-10-01 10:14:55 -07:00
Matthew Meszaros
76f43b9796
feat: close every dashboard dropdown through one useClickOutside(open, onClose, refs) hook that the shared PopoverMenu, the old useClickOutside callers and the hand-rolled pickers now all use, so a press outside (including inside a floating dialog card or an email iframe) closes it, Escape closes only the innermost one and returns focus to its trigger, and opening one closes the others
2026-10-01 08:38:57 -07:00
Matthew Meszaros
143afaaa5b
Merge pull request #775 from warmbly/fix/cloud-warmup-stalls
...
feat: make Warmbly Cloud warmup start and explain itself for linked mailboxes
2026-10-01 10:35:19 +00:00
Matthew Meszaros
e920b61371
feat: clear a reported warmup send failure only on a confirmed delivery, word the not-loaded send failure as a possible cause, leave placement seeds out of the adopted-mailbox warmup repair, and describe send_failure as a failure reason in the API schema
2026-10-01 03:20:41 -07:00
Matthew Meszaros
a844c506a0
feat: make Warmbly Cloud warmup start and explain itself for linked mailboxes: apply the instance's warmup settings, start warmup on adopted mailboxes, read the warmup day mask Monday-first, report the last refused warmup send and the partner cap to the instance and dashboard, hand changed SMTP credentials to the cloud, refuse cleartext mailboxes at enrollment, and show cloud warmup with the warming animation and a clear Cloud marker
2026-10-01 03:01:36 -07:00
Matthew Meszaros
e25b31f992
Merge pull request #772 from warmbly/fix/unibox-template-html-body
...
feat: send a unibox template's HTML body as written by giving the compose and reply composers an HTML mode, keep that HTML in compose and reply drafts, and render the text part server-side for HTML-only sends
v0.6.17
2026-10-01 04:22:11 +00:00
Matthew Meszaros
e20efd2544
feat: let a portaled popover inside the unibox composers close itself on Escape instead of the composer closing around it
2026-09-30 21:17:28 -07:00
Matthew Meszaros
2a78dc1a25
Merge remote-tracking branch 'origin/main' into fix/unibox-template-html-body
2026-09-30 21:15:35 -07:00
Matthew Meszaros
cfdc0c3d01
feat: keep the signature editor's own plain-text rendering, reuse the campaign HTML-to-text helper in the composers, leave a synced text part to the server, cap HTML bodies in bytes, refuse a send whose HTML was emptied, and keep Escape and AI drafts from discarding HTML composer work
2026-09-30 21:15:29 -07:00
Matthew Meszaros
a072f2a618
Merge pull request #771 from warmbly/fix/mailbox-switch-back-on
...
feat: let a switched-off mailbox be switched back on from its row menu, warmup menu, drawer, settings and the selection bar, and make the Advisor's stop-cold-sending fixes hold the mailbox from campaigns instead of switching it off
2026-10-01 04:08:07 +00:00
Matthew Meszaros
91130a7102
Merge pull request #773 from warmbly/test/unibox-row-menu-one-open
...
feat: test that unibox conversation row menus stay one at a time across right-clicks and close on a press outside them
2026-10-01 04:04:50 +00:00