Commit Graph
2911 Commits
Author SHA1 Message Date
Matthew Meszaros 241c5cc352 Merge pull request #693 from warmbly/feature/deliverability-check
feat: open inbox placement tests to workspaces with campaign-accurate probes, own and Warmbly Cloud seed panels, tracking comparison and scheduled campaign monitors, and default OpenAI models to gpt-6-luna
2026-09-26 04:50:57 +00:00
Matthew Meszaros caf1852217 feat: keep placement seeds out of warmup pools as recipients too, store a probe's Message-ID before the send, hold queued probes against the sender's day and size a test to what is left, claim due monitors so one replica runs each, write comparison halves in one transaction, scan each seed's mail once per tick, keep test history when a mailbox is deleted, default to 20 seeds a minute apart, and render cloud-panel tests without a real lead by default 2026-09-25 21:46:09 -07:00
Matthew Meszaros 989daede3c feat: add the Placement tests dashboard with the test list, detail and comparison views, New test dialog, Seed inboxes tab, campaign step Test inbox placement action and Placement monitor card, live updates over PLACEMENT_TEST_UPDATED with a slow poll only while the socket is down, the two placement notification categories, and seed-aware warmup errors on Mailboxes 2026-09-25 21:03:26 -07:00
Matthew Meszaros 291ed2ae15 feat: document inbox placement tests in a new guide and API reference page, with the endpoints, error codes, realtime event, notification categories, placement settings, Warmbly Cloud seed panel, export and import behavior, CLI commands, assistant tools, admin Seed panel page and sandbox seed inboxes, and add the endpoints to openapi.json 2026-09-25 21:01:58 -07:00
Matthew Meszaros c3e48538d6 feat: record no creator on a placement monitor set by an API key, and refuse a cloud-panel placement test on the linked workspace's allowance or the sender's daily limit before the cloud opens and charges it 2026-09-25 20:58:30 -07:00
Matthew Meszaros d84864a8cb feat: seed six instance placement seed inboxes on their own domains in the sandbox and have the simulator file each placement copy into the seed's Inbox or Junk as a stand-in spam filter, stricter on Microsoft and Yahoo seeds and on tracked copy 2026-09-25 20:57:47 -07:00
Matthew Meszaros d4467ce10e feat: add the admin Seed panel page to manage the instance placement seed inboxes, run operator tests and read every workspace's results, plus the placement allowance and pacing settings on the Configuration page 2026-09-25 20:56:11 -07:00
Matthew Meszaros bbcf8725c3 feat: add warmbly placement CLI commands for overview, test, list, view, cancel, seed inboxes and campaign monitors, the list_placement_tests, get_placement_test and run_placement_test assistant tools, and the placement commands in the warmbly-cli skill 2026-09-25 20:56:02 -07:00
Matthew Meszaros d91b78458b feat: skip placement probes from a suspended workspace the same way warmup sends are skipped 2026-09-25 20:53:52 -07:00
Matthew Meszaros 099233ed08 feat: cast the placement expiry cutoff to timestamptz so Postgres does not read it as an interval, and cover probe matching by Message-ID, expiry, cancellation, daily-budget charging, monitors, seed selection across host families and every create refusal with live and unit tests 2026-09-25 20:52:48 -07:00
Matthew Meszaros 7f324a38ac feat: open inbox placement tests to workspaces with probes rendered like the campaign send and paced as placement tasks, Message-ID matching instead of a subject token and warmup header, instance, workspace and Warmbly Cloud seed panels, a tracking comparison, scheduled campaign monitors with alerts and optional auto-pause, monthly allowances, realtime updates and org transfer registration 2026-09-25 20:48:15 -07:00
Matthew Meszaros 7f1bae8cac feat: default the OpenAI writing, agent and warmup content batch models to gpt-6-luna instead of gpt-4o-mini, gpt-4o and gpt-5-mini, and document the new preset default in the deployment guide 2026-09-25 20:18:26 -07:00
Matthew Meszaros f8c72dbd8c Merge pull request #692 from warmbly/feature/domain-bulk-setup
feat: bulk tracking domain and redirect setup for sending domains, link.<domain> default, per-domain overrides
v0.6.6
2026-09-25 16:59:10 +00:00
Matthew Meszaros 8fda36b3da feat: report a failed bulk sending-domain request as an error on each of its domains and keep running the remaining batches and the redirect half instead of stopping the whole setup 2026-09-25 09:55:29 -07:00
Matthew Meszaros d6e4c42e50 feat: give each domain in a bulk sending-domain setup a 20s deadline and send 25 per request so every batch answers inside the dashboard timeout, send each domain's resolved tracking host and website from the bulk dialog so a kept verified host is not replaced by the base subdomain, and release the CSV export's blob URL after the download starts 2026-09-25 09:44:00 -07:00
Matthew Meszaros 356c215d37 feat: limit Check DNS now on Sending domains to tracking hosts still waiting for DNS so a verified host covering part of a domain is never extended to its other mailboxes 2026-09-25 09:32:05 -07:00
Matthew Meszaros 6b9df08f3e Merge remote-tracking branch 'origin/main' into feature/domain-bulk-setup 2026-09-25 09:30:36 -07:00
Matthew Meszaros 0fedc7abe6 feat: default tracking hosts to link.<domain>, set one tracking subdomain and redirect website for every domain in mailbox imports and on Sending domains with a per-domain dropdown to override each, add POST /emails/domains/bulk that goes through the inbox vendor's API where it can, add multi-select with check DNS, copy records, CSV export, clear tracking and remove redirect to Sending domains, and fix the sandbox seed's deliverability conflict target 2026-09-25 09:30:36 -07:00
Matthew Meszaros c54e6b7fea Merge pull request #691 from warmbly/fix/inbox-tag-gmail-context-and-custom-questions
feat: report the Message-ID Gmail stamps and resolve a reply's campaign through the Gmail thread and In-Reply-To (#682), and add workspace tagging questions and tagging languages (#683)
v0.6.5
2026-09-25 04:26:11 +00:00
Matthew Meszaros 76ba8721dc Merge pull request #690 from warmbly/feat/compose-placement
feat: move the unibox Compose button from the top of the folder rail into the conversation list title row as a ghost sky button with an N key hint
2026-09-25 04:25:00 +00:00
Matthew Meszaros dd98c4b1fe feat: record the campaign an inbox tag verdict was made with (migration 000216) so --recheck-cold-inbound asks only about verdicts made without one and never re-bills, keep the recheck from removing labels when no verdict was stored, let the campaign lookup use the tasks Message-ID index, require the Gmail address tail on the Russian and Japanese quote markers so a proposed meeting time is not cut, keep workspace question labels off notifications, and key and lock tagging question edits by id 2026-09-24 21:21:11 -07:00
Matthew Meszaros c93bf1fcca Merge remote-tracking branch 'origin/main' into feat/compose-placement
# Conflicts:
#	web/src/components/app/unibox/ConversationList.tsx
2026-09-24 21:20:31 -07:00
Matthew Meszaros bc73fc35a9 feat: give the unibox Compose button its visible label as the accessible name (screen-reader only on phones), hide the N key hint from assistive tech, and drop the drafts row's leftover top margin 2026-09-24 21:20:18 -07:00
Matthew Meszaros 6a13fd5238 feat: report the Message-ID Gmail stamps on a send and resolve a reply's campaign through the Gmail thread and In-Reply-To so campaign replies stop tagging as sales pitches (with a warmblyctl --recheck-cold-inbound backfill that clears the stale labels and a tasks thread index), let a workspace add its own yes/no and pick-one tagging questions with plain-word labels and hold/stop/task actions, and add tagging languages (44 named to the classifier; for 27, only once chosen, tagging also cuts their quoted history and reads their away and non-delivery subjects), documented in the inbox tagging guide and the OpenAPI schema 2026-09-24 21:08:35 -07:00
Matthew Meszaros 74bf081d57 feat: move the unibox Compose button from the top of the folder rail into the conversation list title row (and the Scheduled view header) as a ghost sky button with an N key hint on every viewport, keeping compose drafts at the top of the rail, and update the marketing inbox mock and the unibox guide to match 2026-09-24 20:53:37 -07:00
Matthew Meszaros e5e559f5fb Merge pull request #688 from warmbly/feature/unibox-rail-lead-pause
feat: pause and resume a lead from the unibox contact panel and the reply composer (#681)
2026-09-25 03:53:22 +00:00
Matthew Meszaros d9fd7df42b Merge remote-tracking branch 'origin/main' into feature/unibox-rail-lead-pause
# Conflicts:
#	web/src/components/app/contacts/ContactEdit.tsx
2026-09-24 20:39:58 -07:00
Matthew Meszaros 78a742e9f3 Merge pull request #689 from warmbly/fix/inbox-bulk-archive-reappearing
feat: animate unibox rows out in the direction of the action (archive, trash, back to inbox, snooze) with a labelled underlay and in with a fade or grow, keep the list mounted so bulk exits play and give re-entering keys a fresh presence key so a refilling list never strands archived rows, fade new pages in at full height so infinite scroll stops chaining every page, batch bulk archive/read/snooze requests under the 500-id cap, show an all-caught-up state and an animated selection bar, and page the conversation list from the last returned row so no conversation is skipped at a page boundary
2026-09-25 03:36:49 +00:00
Matthew Meszaros 21991ccc6b Merge pull request #686 from warmbly/feature/contact-custom-field-inputs
feat: custom field inputs when adding or editing a contact
2026-09-25 03:27:34 +00:00
Matthew Meszaros 9b310cf0c5 feat: rebase contact custom fields key by key so a teammate's new field is kept instead of saved as a removal, lock stored field names the server refuses and check every key a save sends, keep saved fields visible across tab switches, give new-field rows stable ids, and stop Enter in a field name from submitting the New contact form 2026-09-24 20:25:25 -07:00
Matthew Meszaros 5e49d16e5d feat: animate unibox rows out in the direction of the action (archive, trash, back to inbox, snooze) with a labelled underlay and in with a fade or grow, keep the list mounted so bulk exits play and give re-entering keys a fresh presence key so a refilling list never strands archived rows, fade new pages in at full height so infinite scroll stops chaining every page, batch bulk archive/read/snooze requests under the 500-id cap, show an all-caught-up state and an animated selection bar, and page the conversation list from the last returned row so no conversation is skipped at a page boundary 2026-09-24 20:24:31 -07:00
Matthew Meszaros ed18fad2cd feat: pause nothing from the reply composer when the lead's state cannot be re-read, keep an armed follow-up pause pointed at at least one campaign and clear it after the send, report already-held campaigns apart from ones that could not be paused, word a paused or blocked next step by its reason in the unibox contact panel, and keep Stop disabled while Resume is in flight 2026-09-24 20:20:49 -07:00
Matthew Meszaros 77f0c56e72 Merge pull request #687 from warmbly/feature/automated-mail-routing-and-labels
feat: keep automated mail out of the inbox and rename automatic labels to plain words
2026-09-25 03:19:29 +00:00
Matthew Meszaros c3ef053841 Merge pull request #685 from warmbly/fix/campaign-queued-stall
feat: keep a campaign's pass chain running through every failure (a pass whose hand-off to a worker fails or that errors is followed by another a minute later instead of waiting on the reconciler, retries move their slot, dead-lettered passes replay through the campaign lock), pass over mailboxes no heartbeating worker holds (worker_id now loaded with the sender pool, shown as Reconnecting in the send plan), count a hand-off failure against the lead only when it is the lead's, and try up to 200 due leads per pass with a daily activity line when all are waiting
2026-09-25 03:16:41 +00:00
Matthew Meszaros fe7f416a1e feat: pause and resume a lead from the unibox contact panel, which now lists each campaign with the lead's status and next step or hold, add a Pause follow-ups option to the reply composer that holds the recipient's ticked campaigns once the reply is accepted (counted from a scheduled reply's send time), add Pause lead to the contact Activity tab's campaign cards, end a lead's flow on the router's exclusion and let it decide whether a reply ended it, and stop per-contact send events refetching every other contact's campaign-state preview (issue #681) 2026-09-24 20:13:56 -07:00
Matthew Meszaros ccb4a3a0cd feat: take back a campaign pass the task queue refused so the retry that follows a failed hand-off can seed one that runs 2026-09-24 20:12:29 -07:00
Matthew Meszaros de7a7c9748 feat: take back a replayed campaign pass the task queue refused and keep its dead letter, seed the next pass on a fresh context when the one after a failed hand-off could not be written, resume a campaign whose mailboxes lack a worker at the earliest reopening, and log that wait under its own daily line 2026-09-24 20:09:55 -07:00
Matthew Meszaros 9dee88bcb2 feat: keep conversations the inbox tagger judges automated (security alerts, verification codes, notifications, bounces, auto-replies) out of Inbox, Unread, mailbox and tag views and the unread badge and list them in the Automated view via a new unibox automated filter and overview counts, map no-reply header verdicts to Notification, and rename the automatic labels to plain words (Interested, Meeting, Needs reply, Follow up, Gone quiet and more) with a migration that renames, merges and prunes the old ones 2026-09-24 20:08:45 -07:00
Matthew Meszaros 720faf3acd feat: show every workspace custom field as its own input in the New contact dialog and the contact Details tab (collapsed after six, filterable past twelve), suggest existing fields while naming a new one or a bulk-edit key with Use it for near-matches, validate names and duplicates before saving, and send removed or cleared fields as empty so the merge-on-update endpoint actually drops them 2026-09-24 20:01:21 -07:00
Matthew Meszaros a54e9a3a2f feat: keep a campaign's pass chain running through every failure (a pass whose hand-off to a worker fails or that errors is followed by another a minute later instead of waiting on the reconciler, retries move their slot, dead-lettered passes replay through the campaign lock), pass over mailboxes no heartbeating worker holds (worker_id now loaded with the sender pool, shown as Reconnecting in the send plan), count a hand-off failure against the lead only when it is the lead's, and try up to 200 due leads per pass with a daily activity line when all are waiting 2026-09-24 19:56:14 -07:00
Matthew Meszaros 46341f1a1d Merge pull request #684 from warmbly/fix/collapsed-rail-tooltips
feat: share one tooltip provider across the collapsed sidebar rail so tab names show after 120ms and instantly between rows, and pad the collapsed nav so the Inbox unread badge is no longer clipped at the top
2026-09-25 02:46:40 +00:00
Matthew Meszaros 85e63208a9 feat: share one tooltip provider across the collapsed sidebar rail so tab names show after 120ms and instantly between rows, and pad the collapsed nav so the Inbox unread badge is no longer clipped at the top 2026-09-24 19:43:47 -07:00
Matthew Meszaros cf83a13b6f Merge pull request #678 from warmbly/fix/vendor-authorizing-row-actions
feat: keep mailbox imports live and self-explaining, show vendor authorization progress with faster options, and finish sign-in rows through a later admin grant
v0.6.4
2026-09-24 17:15:19 +00:00
Matthew Meszaros 64627de271 feat: resume a sign-in row through a grant only when the grant lookup confirms it is usable on this instance, so a stored grant whose provider is no longer configured does not requeue its rows every minute 2026-09-24 19:10:02 +02:00
Matthew Meszaros f0861fa129 feat: make the backend drain wait for the import runner itself to stop on the shutdown deadline, resume only sign-in rows an active grant covers (decided in SQL so uncovered rows cannot crowd them out), wait for NATS consumers to close after stopping them, count rows a vendor is authorizing by provider on the import so the admin sign-in button counts and shows only Microsoft rows, keep failed and sign-in imports ahead of connecting ones in the imports menu, and base the pool banner's empty state and warming count on workspace totals only 2026-09-24 18:57:01 +02:00
Matthew Meszaros 755b6155c2 Merge pull request #679 from warmbly/fix/sent-count-and-reply-optout
feat: count only email steps in every sent total (contact drawer, Leads view and statuses, campaign progress, guardrails, org conduct, verification evidence, segments, admin, advisor), keep line breaks in synced body text and strip quoted history in any shape, classify delivery failures before out-of-office and tag them as bounces, record statusless failure notices from X-Failed-Recipients as permanent bounces, limit reply and inbox-tag opt-outs to people answering our outreach (never bounces, auto-replies or list mail), and recheck earlier reply opt-outs, lifting with an audit entry only those the message that wrote them no longer supports
2026-09-24 16:49:03 +00:00
Matthew Meszaros 256010725b feat: count only email steps in every sent total (contact drawer, Leads view and statuses, campaign progress, guardrails, org conduct, verification evidence, segments, admin, advisor), keep line breaks in synced body text and strip quoted history in any shape, classify delivery failures before out-of-office and tag them as bounces, record statusless failure notices from X-Failed-Recipients as permanent bounces, limit reply and inbox-tag opt-outs to people answering our outreach (never bounces, auto-replies or list mail), and recheck earlier reply opt-outs, lifting with an audit entry only those the message that wrote them no longer supports 2026-09-24 09:44:17 -07:00
Matthew Meszaros 561ba07b35 feat: send a deferred import progress event with the latest status and cancel it when a final one goes out, report a hidden import's real status instead of cancelled, rank failed and sign-in rows above authorizing ones in the imports menu and its badge, and count warming and connected mailboxes for the pool banner on the server (warming on the pool plan) rather than from the filtered, paged list 2026-09-24 18:38:47 +02:00
Matthew Meszaros d8e99877b2 feat: let an update finish work in flight instead of cutting it off, by having the import runner stop claiming on shutdown, hand back rows that never started without counting the claim and finish the rows it is connecting on an uncancelled context, the backend wait up to 45 seconds for those rows and for in-flight connects, the event bus finish the message being handled before it stops reading, and node units, the repository compose file and the installer's stack allow 60 seconds before a forced stop, with the grace period documented for Railway, Docker and Kubernetes 2026-09-24 18:31:06 +02:00
Matthew Meszaros ac663093c4 feat: label the faster options on a vendor authorization by what they do, Connect all at once (admin sign-in) for the whole domain and Sign in on a row for that mailbox only 2026-09-24 18:24:50 +02:00