Commit Graph

  • 5146ab5a2c feat: name migration 000258 as the source of the tracking host verification trigger Matthew Meszaros 2026-10-04 03:22:09 -07:00
  • ec77a3e3d2 feat: key unibox snoozes by organization as well as user and thread (migration 000259 backfills from each thread's mailbox organization), scope every snooze read and write and the org-transfer scope to it, and resolve unibox list cursors only within the caller's organization or user Matthew Meszaros 2026-10-04 03:07:37 -07:00
  • 043d877b58 feat: let one organization per instance verify a custom tracking host across mailbox and campaign tracking domains (database trigger plus 409 tracking_domain_taken on save, verify, sending-domain apply and bulk setup; the sweep leaves a held host unverified), and re-verify tracking domains on the destination after a workspace import Matthew Meszaros 2026-10-04 03:07:19 -07:00
  • 9d461ad40e feat: gate advisor apply and undo on view_analytics / READ_ANALYTICS and run the fix as the caller: a member under their org permissions, or an API key or OAuth grant under its own scope mask, with a fix for a mailbox outside the key's allowlist refused Matthew Meszaros 2026-10-04 02:58:19 -07:00
  • e852a106a9 feat: serve every node-only internal route (data keys, message map, sync lookups, worker config, fleet heartbeat) on NODE_BROKER_TOKEN and leave only tracked links, domain redirects, page hits and forms on INTERNAL_API_TOKEN, render nodes only the node token when one is set, and have the installer generate a distinct NODE_BROKER_TOKEN for new installs and its own UPDATER_TOKEN Matthew Meszaros 2026-10-04 02:56:51 -07:00
  • fba5997922 feat: type the mirrored HubSpot deal status parameter once so the deal mirror update prepares, and let the org transfer order check pass references that ResetOnImport blanks Matthew Meszaros 2026-10-04 03:05:26 -07:00
  • eec8e1095e feat: escape Slack's reserved characters in every text field of the automation Slack card, quote backslashes and double quotes in the Close lead lookup, and route Salesforce automation and push writes only through the native Salesforce sync by removing the unused direct SOQL fallback Matthew Meszaros 2026-10-04 03:01:41 -07:00
  • 79510c06a8 feat: render workspace and inviter names on the public invitation preview through displayname with the invitation email's fallbacks, and show a community app's developer name in the directory only when it is displayable Matthew Meszaros 2026-10-04 02:59:40 -07:00
  • e3f21146a4 feat: hold mailbox display names to the person naming rules by refusing a rename that breaks them with invalid_name, replacing one from SMTP/IMAP onboarding and import files with an address-derived name, and sending warmup under a displayable name with an address fallback Matthew Meszaros 2026-10-04 02:58:50 -07:00
  • 3d1e117ea6 feat: show campaign names in auto-pause and provider-refusal notifications through displayname.DisplayableOr with a neutral fallback, and leave an inbound reply's subject out of notification emails while the in-app feed keeps it Matthew Meszaros 2026-10-04 02:56:18 -07:00
  • 12563982cc feat: pass pool-link instance names and CLI device-code client names and hostnames through the workspace naming rules with displayname.CleanOr, falling back to Self-hosted instance and Warmbly CLI, keep only the machine label of a CLI hostname, and clip versions on rune boundaries Matthew Meszaros 2026-10-04 02:54:36 -07:00
  • 147491ed3c feat: disable imported webhook endpoints whose address fails the same https and public-host check a new endpoint must pass, and document it on the workspace export and import page Matthew Meszaros 2026-10-04 02:52:53 -07:00
  • 1c29643ecb feat: re-apply the app and form write rules to workspace imports so imported OAuth apps get displayname-checked names, http(s) websites, valid redirect URIs and webhooks, only their workspace's own logos, and stay suspended when suspended at the source or imported under a developer block, imported forms keep only http(s) redirect URLs, valid designs and embed domains, and the hosted form page navigates only to http(s) redirect targets Matthew Meszaros 2026-10-04 02:52:22 -07:00
  • eff2c14a9d feat: make workspace import write only rows the destination workspace owns by checking every archive key and foreign key against each table's owner scope before a batch lands, scoping overwrite updates to the destination's own rows, warning in the archive check, and documenting the rule Matthew Meszaros 2026-10-04 02:46:56 -07:00
  • 43a9d004f2 feat: bound user-authored templates (range only over data fields, two-deep nesting, no template calls, 1 MiB output, capped compile cache) for campaign and automation rendering, accept only single addresses and single Message-IDs for to/cc/bcc/in_reply_to on every send path with invalid_recipient and invalid_message_id, refuse multi-line headers in the Gmail, Graph and SMTP writers, always apply a no-script CSP and drop non-http(s)/mailto/tel link targets in email previews, treat only single-slash paths as internal Remie links, accept integration OAuth callbacks only from the API origin, and follow only http(s) form redirects and app install links Matthew Meszaros 2026-10-04 03:02:14 -07:00
  • 8d0a281934 feat: name AdminMiddleware as the admin second-factor gate in AGENTS.md and note that the instance-wide Cloud link sits behind it Matthew Meszaros 2026-10-04 03:02:22 -07:00
  • ff54338806 feat: keep every deal in the pipeline its stage belongs to on create and update, validate pipeline stage names and colours in the CRM service for every caller, bound the AI bulk contact edit to MaxContactBatchIDs parsed ids, and start placement tests for API-key callers only through the REST route that applies the key's mailbox limits Matthew Meszaros 2026-10-04 03:02:15 -07:00
  • f9a2e9af10 feat: state dependency floors, the Sentry HTTP client choice and auth cache budgets as the guarantees they hold, with no advisory identifiers or past behaviour in comments Matthew Meszaros 2026-10-04 03:00:56 -07:00
  • 9ff2e71385 feat: cap CLI sign-in keys with the shared role-to-scope mapping models.APIPermissionsFor and accept an OAuth token on the realtime socket only while its holder is still a member of the grant's workspace Matthew Meszaros 2026-10-04 03:00:18 -07:00
  • bf47984cd5 feat: cap every OAuth grant and API key at the delegating member's role (consent narrows scopes and reports the withheld ones, tokens re-check the member's current role at every gate and MCP tool, keys stay within their creator's permissions, mailboxes and IP allowlist), keep OAuth tokens off API key and OAuth app management, require a fresh sign-in to approve an app, revoke a grant whose refresh token is presented twice, count only unexpired grants as installs, seal app webhook secrets under the instance key, name the workspace and flag unverified apps on the consent screen, and let credential managers list and revoke every member's app authorizations Matthew Meszaros 2026-10-04 02:58:32 -07:00
  • 8bb60e9449 feat: accept only Salesforce domains as an org's API host and call it through the SSRF-guarded client, register the Warmbly Cloud link only on self-hosted instances behind the instance admin with a second factor and dial it through safehttp with fixed error text, keep automation signing secrets in the sealed connection config, answer integration service failures with fixed messages, add security headers to the forms, tracking and docs origins and TLS 1.2+ to the nginx template, compare the captcha bypass in constant time, require TLS 1.2 for IMAP probes, and drop the unused RSA helpers Matthew Meszaros 2026-10-04 02:57:46 -07:00
  • 59f6d72d3b feat: bump docs to next 16.3.8, site to patched devalue and http-cache-semantics, and realtime to mint 1.11.0, gate the security workflow on called Go vulnerabilities with a fixed version and on retired or upgradable Hex packages through scripts/govulncheck-gate.sh and scripts/hex-audit-gate.sh with a new Elixir audit job, and keep advisory ids and reachability notes out of .trivyignore, mix.exs and the site pnpm workspace Matthew Meszaros 2026-10-04 02:56:56 -07:00
  • 610d511307 feat: answer every server-side failure in admin, internal, webhook, warmup routing, Stripe webhook, agent tool and MCP handlers with the fixed internal error and log the detail against the request id, keep correctable webhook and routing refusals as typed errors with their own messages, drop the request URL from MillionVerifier transport errors so the API key never reaches a log or response, and redact :code path parameters in the access log Matthew Meszaros 2026-10-04 02:56:51 -07:00
  • 32da32a0a8 feat: mask every revealed secret in session replay by tagging API key, client and signing secrets, inbound webhook URLs, join commands, tester passwords, pairing codes and the TOTP QR, block inputs holding credentials, mask token, session and code URL parameters in dashboard analytics, give the admin panel the same masking with console recording off, and update the privacy page to match Matthew Meszaros 2026-10-04 02:56:45 -07:00
  • 2bc7ef55f1 feat: mount the confirm-it-is-you prompt on the standalone pool link connect page so approving an instance link can complete its required recent confirmation outside the dashboard layout Matthew Meszaros 2026-10-04 02:55:28 -07:00
  • db4fc7b115 feat: require a recent confirmation for 2FA enrollment (a fresh sign-in for accounts with no password or factor), pool link approval, workspace export and import, member invites and role changes, webhook and OAuth app secret reveal and rotation, and the admin fleet join token, admin grant and workspace archive routes, with a confirm-it-is-you dialog and retry in the admin panel Matthew Meszaros 2026-10-04 02:54:15 -07:00
  • 3a2d80b8bf feat: accept realtime API keys and OAuth tokens only in the x-warmbly-token handshake header with the ws ticket alone in the query string, filter token and key params from Phoenix connect logs, refuse realtime keys, OAuth tokens and pool link tokens held by a login-banned user or a suspended app with an uncached key check, and send the key as a header from warmbly events tail Matthew Meszaros 2026-10-04 02:54:09 -07:00
  • 33f99b97e5 feat: end every session on sign-out-everywhere through RevokeOtherSessions with cache eviction after commit, refuse refresh on a revoked session, close a user's realtime sockets on any session revocation via a SESSIONS_REVOKED event, and verify tokens without a purpose claim for no flow Matthew Meszaros 2026-10-04 02:54:02 -07:00
  • 5bd8dbfab9 feat: bind Warmbly Cloud brokered mailbox sign-ins to PKCE, a single-use state and a cloud consent page naming the requesting instance and workspace that sets the browser cookie the callback requires, return only to the instance's registered address, add PKCE and an OIDC nonce to Workspace and Microsoft 365 admin-proof sign-ins, post OAuth callback codes only to a configured dashboard origin, cap CLI-approved keys to the approver's role behind a fresh sign-in, and accept only same-origin login next paths Matthew Meszaros 2026-10-04 02:52:48 -07:00
  • 9f7d45a1fb feat: charge every password, emailed-code and TOTP attempt atomically before comparing it (Redis INCR+expire script) with a per-account TOTP budget across challenges, put the signed-in password change on the reauth budget, set the per-account login limit to 50 per hour, give tester passwords an expiry (users.password_expires_at, migration 000257) and clear them plus every session on revoke, mint warmblyctl reset links with the password-reset purpose, expire fleet join tokens (7 days default, 30 max, reusable inside the window), derive captcha from the resolved Turnstile secret, refuse weak bootstrap argon2id hashes, make registration codes single-use, rate-limit the v1 invitation lookup, and draw RIDs and user codes without modulo bias Matthew Meszaros 2026-10-04 02:51:58 -07:00
  • f0ec39febd feat: scope automation and sequence unsubscribes to the caller's organization, require manage_settings to create, edit, enable or delete automations, run each integration action only on its own provider's connection (400 action_provider_mismatch), refuse org-permission gates when no organization service is wired, read /integrations/bookings like contacts, scope lead claims, research runs and CRM list cursors to the organization, and bind contact note edits to the contact in the path Matthew Meszaros 2026-10-04 02:46:49 -07:00
  • e1c4a91ad1 feat: confirm a Slack link only for the Warmbly member whose email matches the Slack account's confirmed profile email (read via users.info with the new users:read and users:read.email scopes, refused as slack_link_email_mismatch), show the Slack account's name and avatar on the link page and after linking, return the Slack connection in GET /integrations/slack/status only to manage_settings or use_integrations, scope agent-thread lookups by organization, and check a Draft a reply card's conversation belongs to the clicker's workspace before starting the assistant Matthew Meszaros 2026-10-04 02:44:46 -07:00
  • 4cfba5340a feat: verify every HubSpot app request by its v3 signature over the public backend URL, refuse card-fetch query values on the webhook and workflow action routes, take exactly one portalId, userId and userEmail on card routes and act as the matched accepted member holding the matching campaign and contact permissions, route a portal only to its single live HubSpot-mode workspace, delete mirrored deals and tasks only when HubSpot answers the record is gone, and scope the card's permitted fetch to the card routes Matthew Meszaros 2026-10-04 02:41:51 -07:00
  • 585c7ff85a feat: end every credential a login-banned user holds by refusing their API keys, OAuth grants and Slack links at resolution, and run the Slack assistant only for members whose role includes use_ai, matching the dashboard gate Matthew Meszaros 2026-10-04 02:34:01 -07:00
  • 23c57f35c2 Merge pull request #822 from warmbly/feature/integrations-page-redesign v0.6.26 Matthew Meszaros 2026-10-04 08:27:13 +00:00
  • d505508997 feat: audit OAuth app moderation and developer blocks under their own entity types, refuse logo removal on suspended apps, delete a replaced workspace-uploaded app logo once no other app shows it, confirm before revoking every token in the admin panel, open store cards on Space, retry a new logo URL after a failed one, toast only after the clipboard write succeeds, and freeze the listing form baseline while it is open Matthew Meszaros 2026-10-04 01:20:28 -07:00
  • bc9caba267 feat: validate OAuth app names through displayname and websites as http(s), clean dynamically registered client names and stop storing their logo_uri, refuse edits and logo uploads on suspended apps or blocked developers, scope logo deletion to the app's own images, keep hidden listings from being unpublished, count only installs from other aged workspaces toward the directory threshold, refresh integration popularity outside the lock, and count only live connections in the Integrations store Matthew Meszaros 2026-10-04 01:10:32 -07:00
  • 7a785afb94 Merge pull request #824 from warmbly/feat/stripe-no-automatic-tax v0.6.25 Matthew Meszaros 2026-10-04 08:07:40 +00:00
  • 751dd5e08c feat: turn off Stripe automatic tax on subscription and credit checkout, plan changes and proration previews in internal/app/stripe/service.go, keeping required billing address, business name and tax ID collection Matthew Meszaros 2026-10-04 09:59:24 +02:00
  • 2983d3ca1e Merge pull request #823 from warmbly/feat/remie-assistant Matthew Meszaros 2026-10-04 07:59:05 +00:00
  • 6565197a60 feat: close Remie tips through useClickOutside and put them away when a dialog opens, reset hover on close, read Advisor findings only under View analytics, keep a typed draft when a fix is handed to Remie, celebrate only runs that end without an error or a stop, group suggestions with the Advisor's groupFindings, count the tip day in local time, and scope the dev demo to its own approvals Matthew Meszaros 2026-10-04 00:49:08 -07:00
  • 1a483cb27f Merge remote-tracking branch 'origin/main' into feature/integrations-page-redesign Matthew Meszaros 2026-10-04 00:45:48 -07:00
  • b2224b0eb5 feat: add the Remie proof flows in qa/flows/remie.flow.ts recording the floating panel with Advisor suggestions and a scripted run through live status, folded tool steps, approval and the answer Matthew Meszaros 2026-10-04 00:38:51 -07:00
  • 7672924a72 feat: rename the dashboard assistant to Remie with an animated blue blob mark, open it as a floating window by default, show live runs with a shimmering status, elapsed timer, collapsible tool-step trace, streamed text with a blurred tail and a redesigned approval card, and add Remie suggestions and rate-limited tips built from open Advisor findings that Remie fixes through its own approvals Matthew Meszaros 2026-10-04 00:36:27 -07:00
  • 4bc2417618 Merge remote-tracking branch 'origin/main' into feature/integrations-page-redesign Matthew Meszaros 2026-10-04 00:32:54 -07:00
  • 7555f641a5 feat: turn Integrations into an app store with sidebar views, search, sorting and filters, list community apps by link until featured or widely installed, redesign the OAuth app registration dialog, store app logos re-encoded per app like the workspace logo, and add admin suspension, token revocation and developer blocks for OAuth apps Matthew Meszaros 2026-10-04 00:31:52 -07:00
  • 315b19a63a Merge pull request #821 from warmbly/feature/salesforce-native-crm-integration Matthew Meszaros 2026-10-04 07:21:11 +00:00
  • d112657cf2 feat: wire suppression, subscription and hold dependencies into the consumer's Salesforce service, give Salesforce token refreshes their own single-flight keyspace, release the outbox lease in memory after each terminal write so writeback notes land and only on rows with a logged Task, drop stale Salesforce import previews, keep keys from the import row menu from opening the edit dialog, and document the Salesforce callback URL and OAuth variables Matthew Meszaros 2026-10-04 09:10:37 +02:00
  • 6b7e254e56 feat: add native Salesforce sync with Lead and Contact matching and links, a leased activity outbox that logs sends, replies, bounces, opt-outs and meetings as Tasks, Lead Status and Email Opt Out writeback, a pull loop with CRM pause rules, list view and Campaign imports, sandbox and My Domain OAuth that refreshes expired sessions, a Salesforce settings page with contact and inbox cards in web, and docs Matthew Meszaros 2026-10-04 08:49:30 +02:00
  • 6c127df9b0 Merge pull request #820 from warmbly/feature/hubspot-native-integration Matthew Meszaros 2026-10-04 06:24:56 +00:00
  • 900806f328 feat: make HubSpot sync jobs lease-safe with per-claim tokens and one-at-a-time claims, log each email once across retries with the interested-reply outcome as its own job, move merged HubSpot contacts in a transaction, run backfill as one cursor job that skips refused records, rebuild the HubSpot client after a reconnect, accept a single portalId on card requests, and remember the Warmbly property group only after it exists Matthew Meszaros 2026-10-04 08:18:16 +02:00
  • 37e91fc89f feat: add HubSpot CRM mode where HubSpot deals, pipelines, tasks, notes and owners are mirrored and written through, sends and replies log as HubSpot emails, exit rules hold campaigns, list import, sync health, setup wizard in web, HubSpot app project with record card and workflow action, and docs Matthew Meszaros 2026-10-04 07:39:46 +02:00
  • b84d70c31d Merge pull request #818 from warmbly/claude/api-contract-2026-10-04 Matthew Meszaros 2026-10-04 05:31:35 +00:00
  • 71f69f1856 feat: advance campaigns.updated_at in setForCampaignTx when linking segments inserts new campaign_segments rows so the send-plan snapshot is invalidated when an audience grows claude/api-contract-2026-10-04-b Claude 2026-10-04 05:14:34 +00:00
  • de230af27d feat: advance campaigns.updated_at when a segment set change detaches linked segments in setForCampaignTx, including clearing the set, so the send-plan snapshot is invalidated after leads are withdrawn Claude 2026-10-04 05:02:11 +00:00
  • 51482769f5 feat: advance campaigns.updated_at when a campaign's senders are replaced and when a tag or folder-only update runs so the send-plan snapshot keyed on it is invalidated and stops being served with stale false Claude 2026-10-04 04:48:44 +00:00
  • e2911fb01a feat: say in the docs/public/openapi.json CampaignSendPlan stale description that a snapshot older than its maximum age is also served as stale when the campaign has not changed Claude 2026-10-04 02:04:41 +00:00
  • e39ff8318d feat: describe the stored send-plan snapshot in docs/public/openapi.json by adding the required stale flag and computed_at meaning to CampaignSendPlan and noting the background snapshot on GET /campaigns/{id}/send-plan Claude 2026-10-04 02:01:51 +00:00
  • 2032b0492c Merge pull request #817 from warmbly/fix/microsoft-admin-consent v0.6.24 Matthew Meszaros 2026-10-03 18:38:25 +00:00
  • 75840247c8 feat: replace the stored Outlook admin approval link on every Outlook sign-in start in useMailboxOAuth, clearing it when the start response carries none Matthew Meszaros 2026-10-03 20:33:53 +02:00
  • 8883a1df6b feat: connect Microsoft 365 organizations through Microsoft's v2.0 admin consent page followed by a sign-in on the same state, read the approving admin's directory role from the Graph token as well as the ID token, return an organization-wide approval link for single-mailbox Outlook sign-in (admin_consent_url) and show it in the connect panel, and document publisher verification and the admin approval path Matthew Meszaros 2026-10-03 20:17:38 +02:00
  • e43b9e837e Merge pull request #816 from warmbly/docs/agent-qa-pr-video-research Matthew Meszaros 2026-10-03 16:56:27 +00:00
  • efb9d0b433 feat: add the qa/ proof harness that records scripted Playwright flows as 1080p H.264 walkthroughs and stills against an isolated per-worktree stack (lite, full, sandbox) and publishes them to the PR with gh --attach, with before/after follow-up comments, a machine-wide recording lock, idle auto-stop, a qa-ci typecheck job and AGENTS.md rules for when to record Matthew Meszaros 2026-10-03 09:54:59 -07:00
  • 92456279ed Merge remote-tracking branch 'origin/main' into feature/integrations-page-redesign Matthew Meszaros 2026-10-03 09:24:34 -07:00
  • 4957214431 feat: redesign the Integrations page with search, category chips, recommended and popularity-ranked integrations, add a community app directory where OAuth apps are published unverified by link and verified in a new admin review queue, with docs and OpenAPI Matthew Meszaros 2026-10-03 09:24:34 -07:00
  • b9da4a2c40 Merge pull request #815 from warmbly/feat/dark-theme Matthew Meszaros 2026-10-03 16:03:47 +00:00
  • f05bd572d2 feat: repaint dither charts on a theme switch, apply cross-tab theme changes from the current storage value without writing them back, treat HTML colour attributes as designed mail, keep editor dark text to light inline fills, and give the step button spinner its colour Matthew Meszaros 2026-10-03 08:58:36 -07:00
  • 232d226211 Merge remote-tracking branch 'origin/main' into feat/dark-theme Matthew Meszaros 2026-10-03 08:49:37 -07:00
  • f1e3ea5bd9 feat: add a Linear-style dark theme to the dashboard (web/) with Light, Dark and System options in the user menu, Settings > Profile > Appearance and the command palette, light by default, and an Appearance guide in docs Matthew Meszaros 2026-10-03 08:49:37 -07:00
  • 8d9e285a54 Merge pull request #814 from warmbly/feature/slack-assistant-integration v0.6.23 Matthew Meszaros 2026-10-03 14:04:56 +00:00
  • 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 Matthew Meszaros 2026-10-03 15:53:01 +02:00
  • 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 Matthew Meszaros 2026-10-03 15:35:10 +02:00
  • e5b842acf5 Merge pull request #813 from warmbly/claude/slack-session-4pcd0y Matthew Meszaros 2026-10-03 12:38:35 +00:00
  • bbb692e9d6 feat: instrument campaign SendPlan read path with lookup and planner stage timings and retain safe timeout diagnostics in internal/app/campaign/handlers.go Claude 2026-10-03 12:15:32 +00:00
  • e3c5bd24a1 feat: guard campaign send-plan snapshot writes against version regression so a late older planner walk cannot overwrite a newer snapshot Claude 2026-10-03 12:03:49 +00:00
  • 84a5eee5c6 feat: bound campaign send-plan snapshot freshness by age and skip fresh snapshots via jobrun.Loop to avoid redundant cross-replica planner work Claude 2026-10-03 11:22:12 +00:00
  • 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 Claude 2026-10-03 11:04:22 +00:00
  • c3da0d684b Merge pull request #805 from Skylinerffm97/feat/unibox-long-press-menu v0.6.22 Matthew Meszaros 2026-10-03 07:57:35 +00:00
  • 4815f7b43c Merge pull request #809 from warmbly/claude/fix-798-inbound-bounce-errors Matthew Meszaros 2026-10-03 07:01:07 +00:00
  • 77ec1df58b Merge pull request #810 from warmbly/claude/fix-801-scheduler-keyset-paging Matthew Meszaros 2026-10-03 06:59:33 +00:00
  • 6b38dd5e47 Merge pull request #811 from warmbly/claude/fix-796-analytics-accounts-pagination Matthew Meszaros 2026-10-03 06:59:24 +00:00
  • 0c0d2a0223 Merge pull request #808 from warmbly/claude/fix-797-sendplan-coalescing Matthew Meszaros 2026-10-03 06:59:08 +00:00
  • 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 Matthew Meszaros 2026-10-03 08:59:01 +02:00
  • 6799b64b16 Merge pull request #807 from warmbly/claude/fix-799-overview-cache-singleflight Matthew Meszaros 2026-10-03 06:58:03 +00:00
  • 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 Claude 2026-10-03 06:49:24 +00:00
  • 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 Claude 2026-10-03 06:46:20 +00:00
  • 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 Claude 2026-10-03 06:40:38 +00:00
  • 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 Claude 2026-10-03 06:37:35 +00:00
  • c0ac841c3e feat: coalesce concurrent cold-cache send-plan reads onto one planner walk via readCache.getOrCompute in internal/app/campaign Claude 2026-10-03 06:35:46 +00:00
  • 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 Claude 2026-10-03 06:33:57 +00:00
  • a184877cc7 Merge pull request #802 from Skylinerffm97/fix/click-outside-iframe-taps-ios Matthew Meszaros 2026-10-03 05:11:54 +00:00
  • 9ef54798dc Merge pull request #804 from Skylinerffm97/fix/unibox-mark-unread Matthew Meszaros 2026-10-03 05:11:39 +00:00
  • 7286dc216e Merge pull request #806 from warmbly/fix/reply-repair-indexed-lookups v0.6.21 Matthew Meszaros 2026-10-03 04:35:32 +00:00
  • 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 Matthew Meszaros 2026-10-03 06:24:09 +02:00
  • 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 Matthew Meszaros 2026-10-03 06:07:20 +02:00
  • 3f6617000a feat(unibox): open the row menu on a long press on touch screens Skylinerffm97andClaude Opus 5.5 2026-10-02 16:14:35 +02:00
  • 2710f81d86 Merge pull request #803 from warmbly/fix/unibox-tests-wait-for-rows v0.6.20 Matthew Meszaros 2026-10-02 14:03:32 +00:00
  • 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 Matthew Meszaros 2026-10-02 15:57:43 +02:00
  • c433a483ec fix(unibox): make Mark as unread stick, and let it reach a sent-only conversation Skylinerffm97andClaude Opus 5.5 2026-10-02 15:31:48 +02:00
  • df34c9dac6 Merge pull request #800 from warmbly/fix/domain-auth-zone-confirm Matthew Meszaros 2026-10-02 13:23:19 +00:00