Commit Graph

  • d0a33f74b3 Merge pull request #844 from warmbly/fix/dashboard-config-no-cache Matthew Meszaros 2026-10-05 15:22:57 +00:00
  • d807aa2852 feat: expose typed sender mailbox details in campaign templates, previews and email editor variables Matthew MeszarosandDevin AI 2026-10-05 15:15:12 +00:00
  • e19c55ebd6 feat: match the text/html media type case-insensitively in the dashboard client's web-page guard and cover a mixed-case Content-Type in Client.test.ts Matthew Meszaros 2026-10-05 17:14:41 +02:00
  • 0731a8c788 feat: refuse an HTML page as an API response in the dashboard client (api_url_not_api) so a missing or wrong API_URL falls back to the unreachable login state instead of crashing, and serve config.js with Cache-Control no-store from the dashboard and admin Pages _headers to match the nginx images Matthew Meszaros 2026-10-05 17:04:05 +02:00
  • fc18d8c186 Merge pull request #842 from warmbly/devin/1791201936-google-oauth-frontend-flag v0.6.29 Matthew Meszaros 2026-10-05 13:31:17 +00:00
  • d6c8d9e54c feat: document trusted dashboard origin refusals for Google and Microsoft mailbox OAuth under HTTP 400 errors Matthew MeszarosandDevin AI 2026-10-05 12:58:22 +00:00
  • 849cf18f55 feat: bind password recovery, invitations, mailbox and integration OAuth, referral and billing returns to trusted initiating dashboards Matthew MeszarosandDevin AI 2026-10-05 12:51:37 +00:00
  • b2bde4ed92 Merge pull request #840 from warmbly/devin/1791198671-admin-health-notices Matthew Meszaros 2026-10-05 12:35:00 +00:00
  • 940baf3ebf Merge pull request #841 from warmbly/devin/1791198887-fleet-telemetry Matthew Meszaros 2026-10-05 12:34:44 +00:00
  • caa1633dac feat: verify main and TAC assessment dashboard origins share configurable backend CORS and OAuth routing Matthew MeszarosandDevin AI 2026-10-05 12:24:11 +00:00
  • 6a5d76004a feat: cover Google reauthorization origin rejection and unchanged Microsoft routing with clearer error documentation Matthew MeszarosandDevin AI 2026-10-05 12:20:28 +00:00
  • f58a6c1ff9 feat: control Gmail mailbox OAuth per frontend deployment and bind callbacks to allowlisted dashboard origins Matthew MeszarosandDevin AI 2026-10-05 12:16:34 +00:00
  • 1748ae3765 feat: preserve localhost fleet admin proof with isolated telemetry fixtures, resource-state and analytics assertions Matthew MeszarosandDevin AI 2026-10-05 12:11:35 +00:00
  • f56278488f feat: keep worker farewell heartbeats independent of IP discovery and identify CPU-set resource scope accurately Matthew MeszarosandDevin AI 2026-10-05 11:43:16 +00:00
  • 5ae09e0e15 feat: separate fleet mailbox targets from measured CPU and RAM, report node public egress IPv4 and add workload share analytics Matthew MeszarosandDevin AI 2026-10-05 11:24:32 +00:00
  • ded4e5f700 feat: correct split-host admin health checks and registration notices, distinguish informational context from problems, and add audited expired-invitation cleanup Matthew MeszarosandDevin AI 2026-10-05 11:17:13 +00:00
  • 4e59bfd4d5 Merge pull request #839 from warmbly/feature/admin-redesign v0.6.28 Matthew Meszaros 2026-10-05 10:26:14 +00:00
  • 1de33d9f41 feat: guard configuration tab links against losing unsaved edits, keep the login captcha mounted for resend, confirm warmup appeal decisions by mailbox, show header tabs only on section pages, show the update pill in the mobile drawer, make admin sign-in alerts opt-in per channel, check the admin bit before loading the account, and alert on admin access only when it changes Matthew Meszaros 2026-10-05 03:21:44 -07:00
  • d6533a4aa5 Merge pull request #838 from warmbly/devin/1791190573-release-pages-dashboard Matthew Meszaros 2026-10-05 10:01:26 +00:00
  • e506544119 Merge origin/main into feature/admin-redesign Matthew Meszaros 2026-10-05 03:01:22 -07:00
  • 8910b02198 feat: redesign the admin panel in a black and white dark-first theme with grouped sidebar sections, header tabs, a collapsible animated sidebar and a rebuilt sign-in, alert operators on admin sign-ins and admin access changes through opsnotify, and carry first-touch attribution from the marketing site to every dashboard link Matthew Meszaros 2026-10-05 03:01:22 -07:00
  • 549a0f7293 Merge pull request #833 from warmbly/devin/1791173929-safari-oauth-popups Matthew Meszaros 2026-10-05 10:00:02 +00:00
  • a865db3386 feat: deploy configurable Cloudflare Pages project lists from exact releases with isolated dashboard, admin, site and docs builds Matthew MeszarosandDevin AI 2026-10-05 09:48:40 +00:00
  • 94cd8b1692 feat: reuse Cloudflare Pages production configuration for exact-release dashboard builds and cover safe runtime imports in CI Matthew MeszarosandDevin AI 2026-10-05 09:14:37 +00:00
  • e7b6877ba4 feat: deploy the dashboard to the existing Cloudflare Pages production project only after stable releases with opt-in configuration and cutover docs Matthew MeszarosandDevin AI 2026-10-05 09:00:34 +00:00
  • 01aae25483 Merge pull request #834 from warmbly/devin/1791174213-turnstile-trusted-device Matthew Meszaros 2026-10-05 08:37:40 +00:00
  • ea9b80af1f feat: make integration OAuth popups ignore callbacks whose state does not match the state in the authorization URL they opened, so a stray /oauth-return relay cannot end a pending connect Matthew MeszarosandDevin AI 2026-10-05 06:36:22 +00:00
  • 76ae0fcef2 Merge remote-tracking branch 'origin/main' into devin/1791173929-safari-oauth-popups Matthew Meszaros 2026-10-05 06:10:59 +00:00
  • 1617ced006 fix(auth): offer remember-device only under new_device; AGENTS.md: code confirmation rides the start step's captcha Matthew MeszarosandDevin AI 2026-10-05 05:58:51 +00:00
  • 38f1cdb517 Merge remote-tracking branch 'origin/main' into devin/1791174213-turnstile-trusted-device Matthew Meszaros 2026-10-05 05:58:16 +00:00
  • e8a9dbc810 Merge pull request #837 from warmbly/devin/1791175783-slack-link-auto-and-oidc Matthew Meszaros 2026-10-05 05:56:40 +00:00
  • 53dea06fe1 Merge pull request #835 from warmbly/devin/1791174729-signup-session Matthew Meszaros 2026-10-05 05:56:23 +00:00
  • 8d034059f3 fix(auth): fail revocation when remembered devices can't be forgotten; resend never sends the device token Matthew MeszarosandDevin AI 2026-10-05 05:51:31 +00:00
  • 3ee98f1881 feat: expire unfinished mailbox and admin-grant OAuth states after the ten-minute blocked-popup wait and fall back to reopening the sign-in window by name when navigating the reserved one throws Matthew MeszarosandDevin AI 2026-10-05 05:51:05 +00:00
  • 9eb109559f feat: send OAuth sign-in windows that lost their opener (allowed from a blocked-popup prompt) back to the waiting dashboard tab via a new /oauth-return page and same-origin BroadcastChannel, marking dashboard-started mailbox states so the native app keeps its warmbly:// callback Matthew MeszarosandDevin AI 2026-10-05 05:40:23 +00:00
  • 1d06475e44 feat: add qa/flows/slack-link.flow.ts proof flow for the standalone /slack/link page and raise contrast of its expiry, account labels and footer links, hiding the decorative Slack glyph from the Continue with Slack button name Matthew MeszarosandDevin AI 2026-10-05 05:38:51 +00:00
  • 5e6047198c feat: sign a new account in after signup on its own 10s context detached from the request in sessionForNewAccount (internal/app/auth/registration.go), report a failed post-signup sign-in to Sentry instead of dropping it, and record that session under the email auth provider Matthew MeszarosandDevin AI 2026-10-05 04:45:28 +00:00
  • 55ca24e33a ci: keep a Codecov uploader crash from failing Go CI Matthew MeszarosandDevin AI 2026-10-05 05:31:39 +00:00
  • ce99b9b162 Merge pull request #836 from warmbly/feat/node-heartbeat-update-path Matthew Meszaros 2026-10-05 05:07:07 +00:00
  • 55d1b9a634 feat: link Slack members to Warmbly automatically by matching email, add Continue with Slack (Sign in with Slack) for mismatched emails, and move the Slack link page to a standalone /slack/link screen Matthew MeszarosandDevin AI 2026-10-05 05:00:22 +00:00
  • cbee2d3073 feat: answer a node heartbeat sent with INTERNAL_API_TOKEN where NODE_BROKER_TOKEN is required with the node's desired version only, recording nothing, through NodeHeartbeatAuthMiddleware and fleetnode UpdateOnly, so a node on an older release always updates itself onto the broker token without NODE_ACCEPT_INTERNAL_TOKEN, and say so in the configuration and split-deployment docs Matthew Meszaros 2026-10-05 06:54:31 +02:00
  • 2a964006d7 chore: rerun CI after codecov upload TLS failure Matthew MeszarosandDevin AI 2026-10-05 04:42:46 +00:00
  • 7be5b82568 Merge pull request #832 from warmbly/devin/war-10-fix-security-workflow Matthew Meszaros 2026-10-05 04:38:59 +00:00
  • e77e2dd98b feat: light, input-width Turnstile on the auth screens, one captcha per sign-in instead of a second one on the code step, and an opt-in 30-day remembered device that skips the emailed login code with a random server-hashed account-bound token, revoked on password reset or change and on signing out everywhere or other sessions Matthew MeszarosandDevin AI 2026-10-05 04:32:15 +00:00
  • 5301e79d84 ci: don't fail Go CI when codecov upload crashes Matthew MeszarosandDevin AI 2026-10-05 04:22:42 +00:00
  • 8347d4f94a fix: open OAuth sign-in windows inside the click so Safari stops blocking them, and keep listening when one is blocked Matthew MeszarosandDevin AI 2026-10-05 04:18:49 +00:00
  • 0ea856537e fix(security): drop jwt-go via first-party Apple auth, bump yoke-derive, grant checks:write to rust audit Matthew MeszarosandDevin AI 2026-10-04 18:36:28 +00:00
  • 7e8bad00e6 Merge pull request #830 from warmbly/refactor/dashboard-tanstack-start-spa Matthew Meszaros 2026-10-04 18:21:33 +00:00
  • b54b840bd1 Merge origin/main into refactor/dashboard-tanstack-start-spa Matthew MeszarosandDevin AI 2026-10-04 18:17:21 +00:00
  • 211cf76230 Merge pull request #831 from warmbly/devin/1791136163-skip-onboarding-seeded-accounts Matthew Meszaros 2026-10-04 18:12:49 +00:00
  • 4da11c4933 fix: keep bootstrap provisioning the owner's org and admin when marking onboarding fails Matthew MeszarosandDevin AI 2026-10-04 18:01:53 +00:00
  • b828723889 feat: keep the dashboard unibox loader to a cold cache so opening a thread never reloads the list, retry a dashboard boot that failed, undo optimistic edits only where the cache still holds them, hold blocked navigations during the unsaved-changes confirm, keep shell scroll offsets apart from list offsets, share the label count query, and trim new comments Matthew Meszaros 2026-10-04 10:59:19 -07:00
  • acb5b8f9f4 fix: skip the onboarding wizard for seeded, sandbox, bootstrap, and warmblyctl-created accounts Matthew MeszarosandDevin AI 2026-10-04 17:49:23 +00:00
  • 7980079f3e feat: move the dashboard to TanStack Router with lazy route chunks, hover preloading, route loaders that prefetch each page's data, a parallel session boot behind an app-frame skeleton, self-hosted preloaded Inter to end the load flash, and optimistic updates for frequent mailbox, campaign, CRM, label and template actions Matthew Meszaros 2026-10-04 10:38:14 -07:00
  • 02ada198ea Merge pull request #829 from warmbly/feature/pipedrive-crm-integration v0.6.27 Matthew Meszaros 2026-10-04 17:32:22 +00:00
  • 36149cdebd feat: add Pipedrive CRM mode (migration 000262) with write-through deals, activities and notes, outreach logged as Pipedrive activities, per-connection webhooks, filter import, a Warmbly person panel and modals, a provider registry behind the shared /crm routes, a provider-aware dashboard, and centered popups replacing the integration side drawer Matthew Meszaros 2026-10-04 19:20:48 +02:00
  • bb74f41f86 Merge pull request #828 from warmbly/devin/1791122781-privacy-ico-number Matthew Meszaros 2026-10-04 15:09:38 +00:00
  • ea3341358f Merge pull request #826 from warmbly/feature/slack-app-agent Matthew Meszaros 2026-10-04 14:19:44 +00:00
  • a993c0f97a feat: keep the integration OAuth start request's failure handled when the connect window was closed before it answered Matthew Meszaros 2026-10-04 07:15:08 -07:00
  • 06c2bdb6e1 feat: link the Slack installer in the background so the OAuth callback never waits on Slack, and fail the integration connect popup as soon as its window is closed while the authorization URL is still loading Matthew Meszaros 2026-10-04 07:10:33 -07:00
  • e9430e96d1 feat: add Mindroot Ltd's ICO data protection fee registration reference ZB958997 to the Who we are section of the privacy policy and bump its last updated date Matthew MeszarosandDevin AI 2026-10-04 14:06:30 +00:00
  • f23c04ddd8 Merge remote-tracking branch 'origin/main' into feature/slack-app-agent Matthew Meszaros 2026-10-04 06:54:19 -07:00
  • 2dc7e33da9 Merge pull request #827 from warmbly/chore/casa-al1-reassessment Matthew Meszaros 2026-10-04 12:58:08 +00:00
  • 4bd5c1283c feat: refuse assistant connect links for integrations this instance has no credentials for, give a second OAuth account the first free label so it never replaces another account's connection, open the integration OAuth window inside the click so browsers do not block it, and stub the Slack test repository so link prompts run with APP_URL set Matthew Meszaros 2026-10-04 05:32:44 -07:00
  • f092b71a30 feat: answer a spent confirmation budget with reauth_limited and say so in the dashboard and admin dialogs, keep an open confirmation dialog from timing out under the person, and stop the OAuth app webhook secret reveal from re-prompting after a cancel Matthew Meszaros 2026-10-04 05:25:32 -07:00
  • 4b09d03482 feat: treat the workspace owner as holding every permission when the HubSpot card resolves its matched member Matthew Meszaros 2026-10-04 05:23:49 -07:00
  • fd940d905b feat: answer a click on a Slack approval card that carries no tool call with a private note to ask again or approve in the dashboard Matthew Meszaros 2026-10-04 05:23:36 -07:00
  • c5ff613c5d feat: start the invite-link clipboard write inside the click so Safari keeps the gesture, say that earlier copied links stop working, and show the new link when the copy fails Matthew Meszaros 2026-10-04 05:23:16 -07:00
  • df0949a019 feat: mask invite and next URL parameters in dashboard and admin analytics, clear a copied invite link when the invitation is sent again, and read hex.info's newest stable release without consuming the gate's package list Matthew Meszaros 2026-10-04 05:22:40 -07:00
  • 5083bcbd54 feat: carry webhook and OAuth app signing secrets still stored as whsec_ plaintext into a workspace export as is, so they arrive sealed under the destination key instead of blank Matthew Meszaros 2026-10-04 05:21:56 -07:00
  • 79bf9a15c4 feat: refuse a pasted list of addresses where one recipient address is expected, so no listed recipient is silently dropped Matthew Meszaros 2026-10-04 05:21:36 -07:00
  • 3de01f25b3 feat: gate MCP and /ai/tools per tool for keys and tokens, with AI_AGENT on the web and playbook tools, and require use_ai for member sessions on /ai/tools Matthew Meszaros 2026-10-04 05:21:18 -07:00
  • 8cb5893e37 feat: keep accepting API keys and OAuth tokens in the realtime socket URL as a deprecated fallback for existing clients, preferring the x-warmbly-token header and keeping the value out of logs Matthew Meszaros 2026-10-04 05:20:20 -07:00
  • ab39429e37 feat: send HSTS from the forms service only on FORMS_DOMAIN and strip it in the installer's Caddy block for customer-owned domains, so no customer apex is pinned to HTTPS Matthew Meszaros 2026-10-04 05:19:22 -07:00
  • c178dadf81 feat: keep the key and blob brokers on NODE_BROKER_TOKEN only, and let an operator admit INTERNAL_API_TOKEN on the other node routes with NODE_ACCEPT_INTERNAL_TOKEN=true while nodes joined before the split upgrade Matthew Meszaros 2026-10-04 05:18:01 -07:00
  • a6e72f1a92 feat: keep linking and unlinking Warmbly Cloud and adopting the cloud workspace's mailboxes with the instance administrator, and let members with manage_emails read the link and put their own workspace's mailboxes on it Matthew Meszaros 2026-10-04 05:17:20 -07:00
  • af1c6cdfcd feat: let a workspace import keep references that name another workspace's row by design (warmup partners, placement seeds, third-party OAuth apps) while every other reference must resolve to the importing workspace Matthew Meszaros 2026-10-04 05:16:14 -07:00
  • cbf0667d8f feat: hold every API key to its creator's current workspace role on each gated route and AI tool, and stop a key, including on the realtime socket, once its creator leaves the workspace (api_key_holder_left) Matthew Meszaros 2026-10-04 05:15:30 -07:00
  • 801c87ffe1 feat: make the Warmbly Slack bot a mention-driven agent that DMs the account link, answers the held question once linked, auto-links the installer, reacts while working, lets teammates take over a thread, sets up Slack and links integrations through permission-gated assistant tools with strict approvals in channels, drops the /warmbly slash command, and replaces the integration connect drawer and label field with a connect popup Matthew Meszaros 2026-10-04 05:15:07 -07:00
  • 5d4b0ad6e5 feat: hold the invite_member, update_member_role and rotate_webhook_secret AI tools to the same recent confirmation their REST routes require, answering reauth_required on /ai/tools and refusing them where no confirmed session exists Matthew Meszaros 2026-10-04 05:14:30 -07:00
  • aca1aff4d6 feat: count a completed sign-in as a fresh confirmation for the first five minutes of the session, so accounts with no password or second factor can confirm an action by signing in again Matthew Meszaros 2026-10-04 05:13:23 -07:00
  • b9b13344b4 feat: remember the refresh token each OAuth grant last rotated away from (migration 000261) and revoke the grant when that token is presented again, whether in a race or after the rotation finished Matthew Meszaros 2026-10-04 03:49:13 -07:00
  • 8b842bd6f7 feat: give the mailbox erasure live test's snooze fixture its organization, which unibox_snoozes now requires Matthew Meszaros 2026-10-04 03:48:12 -07:00
  • 663c3013d1 feat: bind each Remie approval to its tool call and run it once, show every argument and the resolved send on dashboard and Slack approval cards, keep always-allow to settings managers with a revocable list and never for tools that start sending or change access, withhold secrets and unpermitted tool results from the assistant and shared conversations, gate /mcp, /ai/tools and the web and playbook tools on AI_AGENT or use_ai, and scope get_mailbox by organization Matthew Meszaros 2026-10-04 03:44:35 -07:00
  • 886756ae0f feat: share one api_key_mailbox_limited code and keyMailboxLimited check across the campaign, AI tool and MCP handlers Matthew Meszaros 2026-10-04 03:43:26 -07:00
  • b9d96825a2 feat: require an admin to hold every admin permission a grant or revoke takes away from another admin, and keep the last super admin through a grant that would replace the role Matthew Meszaros 2026-10-04 03:43:10 -07:00
  • 3a360ad422 feat: list golang.org/x/sync as a direct dependency in go.mod, matching the singleflight import in internal/app/integration Matthew Meszaros 2026-10-04 03:42:48 -07:00
  • 35635afeff feat: refuse to store webhook and OAuth app signing secrets without CREDENTIALS_ENCRYPTION_KEY and never hand out an unreadable sealed secret, require TLS 1.2 on IMAP sync connections, compare the first-run setup token in constant time, and serve customer-owned domains from the installer's Caddy without HSTS Matthew Meszaros 2026-10-04 03:42:36 -07:00
  • 14df35e54c feat: compare OAuth client secrets and PKCE challenges in constant time, draw integration OAuth state and verifiers from crypto/rand with no fallback, and fetch the Salesforce identity URL only from a Salesforce host Matthew Meszaros 2026-10-04 03:40:04 -07:00
  • 3c45c3764c feat: mask token, session, agent_session and code URL parameters in admin panel analytics the same way the dashboard does Matthew Meszaros 2026-10-04 03:38:02 -07:00
  • a6b72299ae feat: store workspace invitation tokens only as SHA-256 digests (migration 000260 converts pending ones), mint a separate link token each time a manager copies an invite link so the emailed link keeps working, and resolve invitations by either digest Matthew Meszaros 2026-10-04 03:37:41 -07:00
  • 89c063e718 feat: state in AGENTS.md that every node-only internal route takes NODE_BROKER_TOKEN and the edge token reaches only tracked links, domain redirects, page hits and forms Matthew Meszaros 2026-10-04 03:25:03 -07:00
  • 497f58bb5a feat: hold a mailbox-limited API key to explicit sender lists of its own mailboxes when it creates, edits or starts a campaign, and refuse it on /ai/tools and /mcp, which act across the workspace, with api_key_mailbox_limited Matthew Meszaros 2026-10-04 03:24:25 -07:00
  • af912e3b8d feat: narrow the unibox overview's per-tag counts for a mailbox-limited key on the message join so every tag still lists, and keep the query's static prefix preparable Matthew Meszaros 2026-10-04 03:20:36 -07:00
  • a70811f56a feat: write the mailbox connect and reauth audit entry under the mailbox's own organization when an OAuth flow finishes, so its spine event reaches that workspace Matthew Meszaros 2026-10-04 03:17:50 -07:00
  • 48c65611b5 feat: require view_contacts / READ_CONTACTS for an AI variable preview rendered against a named contact, matching test sends and template previews Matthew Meszaros 2026-10-04 03:17:30 -07:00
  • 137f7359ff feat: accept an A/B variant's step_id only when the step belongs to the campaign named in the path Matthew Meszaros 2026-10-04 03:17:06 -07:00
  • 1c555934a5 feat: authorize warmup ban status and warmup appeals by the caller's organization and its view_campaigns / manage_emails gates, so any member who manages mailboxes can appeal, answering 404 for a mailbox outside the workspace Matthew Meszaros 2026-10-04 03:16:33 -07:00
  • 6c36be44aa feat: require the actor to hold every permission a role edit, re-role or member removal takes away as well as every one it grants, matching role deletion, with the workspace owner holding all permissions Matthew Meszaros 2026-10-04 03:15:44 -07:00
  • 5f180f5c76 feat: hold an API key with allowed_email_accounts to its mailboxes across the unibox (list, thread, message, count and overview reads; compose with auto pick within the list, drafts, agent-draft approve and discard, seen, folder, labels and snooze writes), campaign sender pools, analytics account statuses and GET /analytics/accounts/:id, and store a compose draft's mailbox only when it belongs to the caller's organization Matthew Meszaros 2026-10-04 03:14:32 -07:00