Matthew Meszaros
8d9e285a54
Merge pull request #814 from warmbly/feature/slack-assistant-integration
...
feat: add Warmbly for Slack with the AI assistant, inbox threads, notification routing and account linking
v0.6.23
2026-10-03 14:04:56 +00:00
Matthew Meszaros
0a95444c2f
feat: send Slack inbox replies once in the background, keep AI drafts only after draft_reply succeeds, refuse thread locks on Redis errors, log Slack delivery failures and keep unreadable Slack connection config
2026-10-03 15:53:01 +02:00
Matthew Meszaros
61d16dfe9a
feat: add Warmbly for Slack with the AI assistant in DMs, mentions and the assistant pane, unified inbox threads with reply, AI draft and lead actions, per-category notification routing and DMs, account linking, dashboard Slack settings, manifest and docs
2026-10-03 15:35:11 +02:00
Matthew Meszaros
e5b842acf5
Merge pull request #813 from warmbly/claude/slack-session-4pcd0y
...
feat: serve campaign send plans from a background snapshot so large-campaign reads stay fast
2026-10-03 12:38:35 +00:00
Claude
bbb692e9d6
feat: instrument campaign SendPlan read path with lookup and planner stage timings and retain safe timeout diagnostics in internal/app/campaign/handlers.go
2026-10-03 12:15:32 +00:00
Claude
e3c5bd24a1
feat: guard campaign send-plan snapshot writes against version regression so a late older planner walk cannot overwrite a newer snapshot
2026-10-03 12:03:49 +00:00
Claude
84a5eee5c6
feat: bound campaign send-plan snapshot freshness by age and skip fresh snapshots via jobrun.Loop to avoid redundant cross-replica planner work
2026-10-03 11:22:12 +00:00
Claude
bb580164e6
feat: compute each active campaign's send plan in a background snapshotter (internal/app/campaign) stored in campaign_send_plan_snapshots so GET /campaigns/:id/send-plan serves a stored snapshot instead of walking the planner on the request
2026-10-03 11:04:22 +00:00
Matthew Meszaros
c3da0d684b
Merge pull request #805 from Skylinerffm97/feat/unibox-long-press-menu
...
feat(unibox): open the row menu on a long press on touch screens
v0.6.22
2026-10-03 07:57:35 +00:00
Matthew Meszaros
4815f7b43c
Merge pull request #809 from warmbly/claude/fix-798-inbound-bounce-errors
...
Make inbound bounce/complaint ingestion distinguish technical failures from genuine no-match
2026-10-03 07:01:07 +00:00
Matthew Meszaros
77ec1df58b
Merge pull request #810 from warmbly/claude/fix-801-scheduler-keyset-paging
...
feat: bound campaign recipient selection with a two-phase ordered-candidate scan
2026-10-03 06:59:33 +00:00
Matthew Meszaros
6b38dd5e47
Merge pull request #811 from warmbly/claude/fix-796-analytics-accounts-pagination
...
feat: paginate and batch account analytics status reads
2026-10-03 06:59:24 +00:00
Matthew Meszaros
0c0d2a0223
Merge pull request #808 from warmbly/claude/fix-797-sendplan-coalescing
...
feat: coalesce cold-cache send-plan reads onto one planner walk
2026-10-03 06:59:08 +00:00
Matthew Meszaros
c84368f2c4
feat: ignore Android's native contextmenu in useAnchoredMenu once a touch press has moved past the 10 px drift, so a scroll that stalls on a unibox row never opens its menu, with a hook test for the moved press
2026-10-03 08:59:01 +02:00
Matthew Meszaros
6799b64b16
Merge pull request #807 from warmbly/claude/fix-799-overview-cache-singleflight
...
fix: bound unibox overview cache to one in-flight computation per scope
2026-10-03 06:58:03 +00:00
Claude
6d9f87e456
feat: run the send-plan coalescing walk on a bounded caller-independent context and let a canceled getOrCompute waiter return its own ctx.Err() promptly without affecting the shared flight
2026-10-03 06:49:24 +00:00
Claude
3288238cc0
feat: paginate and batch GET /analytics/accounts so account status reads are bounded per page and the overflow past 1000 mailboxes is reachable via cursor
2026-10-03 06:46:20 +00:00
Claude
a77f25ce4f
feat: bound campaign recipient selection via a cheap ordered-candidate enumeration plus chunked routedLeadsQuery hydration in FindRoutedPairs, with a campaign_leads(campaign_id,position,contact_id) index
2026-10-03 06:40:38 +00:00
Claude
80594bb120
feat: classify inbound bounce/complaint technical lookup failures as retryable and propagate them from the consumer handlers instead of dropping them as no-match
2026-10-03 06:37:35 +00:00
Claude
c0ac841c3e
feat: coalesce concurrent cold-cache send-plan reads onto one planner walk via readCache.getOrCompute in internal/app/campaign
2026-10-03 06:35:46 +00:00
Claude
fc4832a5b3
feat: bound unibox overview_cache to one in-flight computation per scope by joining active flights regardless of age instead of starting overlapping ones past the freshness window
2026-10-03 06:33:57 +00:00
Matthew Meszaros
a184877cc7
Merge pull request #802 from Skylinerffm97/fix/click-outside-iframe-taps-ios
...
fix(web): close dropdowns on a tap inside the email body on iOS Safari
2026-10-03 05:11:54 +00:00
Matthew Meszaros
9ef54798dc
Merge pull request #804 from Skylinerffm97/fix/unibox-mark-unread
...
fix(unibox): make Mark as unread stick, and let it reach a sent-only conversation
2026-10-03 05:11:39 +00:00
Matthew Meszaros
7286dc216e
Merge pull request #806 from warmbly/fix/reply-repair-indexed-lookups
...
feat: make the incoming reply repair query use its indexes, and fix a dial race in DialSubmission
v0.6.21
2026-10-03 04:35:32 +00:00
Matthew Meszaros
8db2409a81
feat: read dialTCP and smtpsEgress once at the top of DialSubmission and hand them to the dial goroutines and closeLosers, so the 465/587 race's goroutines that outlive the call never read the package variables a later dial or test may be replacing
2026-10-03 06:24:09 +02:00
Matthew Meszaros
45786649c7
feat: let the incoming reply repair query use idx_tasks_message_id and idx_contacts_org_email by matching each In-Reply-To in its bracketed and bare forms against the raw task Message-ID and resolving the mailbox's workspace before the contact address match, so a batch over the 45-day window finishes instead of hitting the statement timeout every minute
2026-10-03 06:07:20 +02:00
Skylinerffm97 and Claude Opus 5.5
3f6617000a
feat(unibox): open the row menu on a long press on touch screens
...
iOS Safari fires no contextmenu on a long press, so the conversation rows and the scope rail had no way to reach the right-click menu on a phone. useAnchoredMenu now opens the same menu after a 500 ms touch hold at the finger, cancels on a move over 10 px, swallows the click and touchend that follow the hold (so the row does not open and no menu item under the finger fires), and ignores Android's native contextmenu after a fired hold. Mouse and pen are unchanged.
Herkunft: [Claude]
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-02 16:14:35 +02:00
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
Skylinerffm97 and Claude Opus 5.5
c433a483ec
fix(unibox): make Mark as unread stick, and let it reach a sent-only conversation
...
useMarkSeen invalidated every ["unibox"] query after an unread, including the body queries ["unibox", "email", id]. A body GET marks the message read server side (GetByID), so the still-mounted reader undid the unread. Bodies never change once synced, so the unread path now skips them.
MarkSeenByThreads skipped every sent copy, so a conversation with no received message could not be marked unread at all. It now falls back to the newest sent copy when nothing was received. Received mail still wins, drafts never turn unread, and explicit ids and folder sweeps keep refusing sent and draft copies.
Herkunft: [Claude]
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-02 15:31:48 +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
Skylinerffm97 and Claude Opus 5.5
a9945e2e7e
[Claude] fix(web): close dropdowns on a tap inside the email body on iOS Safari
...
WebKit does not run parent-registered listeners in a frame sandboxed without allow-scripts, and a tap does not focus the frame, so neither iframe path from #792 fires on an iPhone. While a layer is open, same-page iframes outside it now get pointer-events: none (shared counter per frame, previous inline value restored), so the tap lands on the page and reaches the existing capture-phase pointerdown.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-02 14:37:37 +02: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