Commit Graph
3206 Commits
Author SHA1 Message Date
Matthew Meszaros 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 2026-10-04 02:56:18 -07:00
Matthew Meszaros 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 2026-10-04 02:53:16 -07:00
Matthew Meszaros 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 2026-10-04 02:52:22 -07:00
Matthew Meszaros 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 2026-10-04 02:47:10 -07:00
Matthew Meszaros 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 2026-10-04 02:45:04 -07:00
Matthew Meszaros 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 2026-10-04 02:42:12 -07:00
Matthew Meszaros 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 2026-10-04 02:34:01 -07:00
Matthew Meszaros 23c57f35c2 Merge pull request #822 from warmbly/feature/integrations-page-redesign
feat: turn Integrations into an app store with search, filters and app pages, add a link-only community directory, a new OAuth app registration dialog, per-app re-encoded logos and admin moderation for OAuth apps
v0.6.26
2026-10-04 08:27:13 +00:00
Matthew Meszaros 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 2026-10-04 01:20:28 -07:00
Matthew Meszaros 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 2026-10-04 01:10:39 -07:00
Matthew Meszaros 7a785afb94 Merge pull request #824 from warmbly/feat/stripe-no-automatic-tax
feat: turn off Stripe automatic tax on checkout, plan changes and previews
v0.6.25
2026-10-04 08:07:40 +00:00
Matthew Meszaros 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 2026-10-04 09:59:24 +02:00
Matthew Meszaros 2983d3ca1e Merge pull request #823 from warmbly/feat/remie-assistant
feat: Remie, the dashboard AI assistant: animated blob mark, floating panel, live run UI, and Advisor-driven suggestions and tips
2026-10-04 07:59:05 +00:00
Matthew Meszaros 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 2026-10-04 00:49:08 -07:00
Matthew Meszaros 1a483cb27f Merge remote-tracking branch 'origin/main' into feature/integrations-page-redesign
# Conflicts:
#	internal/app/integration/service.go
#	web/src/app/app/integrations/page.tsx
#	web/src/hooks/useDocumentTitle.ts
2026-10-04 00:45:48 -07:00
Matthew Meszaros 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 2026-10-04 00:38:51 -07:00
Matthew Meszaros 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 2026-10-04 00:36:27 -07:00
Matthew Meszaros 4bc2417618 Merge remote-tracking branch 'origin/main' into feature/integrations-page-redesign
# Conflicts:
#	docs/content/docs/api/error-codes.mdx
#	docs/content/docs/guides/integrations.mdx
#	web/src/app/app/integrations/page.tsx
2026-10-04 00:32:54 -07:00
Matthew Meszaros 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 2026-10-04 00:31:52 -07:00
Matthew Meszaros 315b19a63a Merge pull request #821 from warmbly/feature/salesforce-native-crm-integration
feat: native Salesforce sync with activity logging, writeback, pause rules, imports and in-app Salesforce cards
2026-10-04 07:21:11 +00:00
Matthew Meszaros 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 2026-10-04 09:10:37 +02:00
Matthew Meszaros 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 2026-10-04 08:54:27 +02:00
Matthew Meszaros 6c127df9b0 Merge pull request #820 from warmbly/feature/hubspot-native-integration
feat: HubSpot CRM mode with write-through deals, tasks and notes, email activity logging, exit rules, list import, setup wizard and in-HubSpot card and workflow action
2026-10-04 06:24:56 +00:00
Matthew Meszaros 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 2026-10-04 08:18:16 +02:00
Matthew Meszaros 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 2026-10-04 07:47:51 +02:00
Matthew Meszaros b84d70c31d Merge pull request #818 from warmbly/claude/api-contract-2026-10-04
feat: describe the stored send-plan snapshot in the OpenAPI document (stale flag on CampaignSendPlan)
2026-10-04 05:31:35 +00:00
Claude 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 2026-10-04 05:14:34 +00:00
Claude 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 2026-10-04 05:02:11 +00:00
Claude 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 2026-10-04 04:48:44 +00:00
Claude 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 2026-10-04 02:04:41 +00:00
Claude 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 2026-10-04 02:01:51 +00:00
Matthew Meszaros 2032b0492c Merge pull request #817 from warmbly/fix/microsoft-admin-consent
feat: Microsoft 365 organization grant through the v2.0 admin consent page, and an admin approval link for single-mailbox Outlook sign-in
v0.6.24
2026-10-03 18:38:25 +00:00
Matthew Meszaros 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 2026-10-03 20:33:53 +02:00
Matthew Meszaros 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 2026-10-03 20:17:38 +02:00
Matthew Meszaros e43b9e837e Merge pull request #816 from warmbly/docs/agent-qa-pr-video-research
feat: add the qa/ proof harness that records scripted Playwright flows as 1080p H.264 walkthroughs and stills against an isolated per-worktree stack and publishes them to the PR with gh --attach
2026-10-03 16:56:27 +00:00
Matthew Meszaros 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 2026-10-03 09:54:59 -07:00
Matthew Meszaros 92456279ed Merge remote-tracking branch 'origin/main' into feature/integrations-page-redesign 2026-10-03 09:24:34 -07:00
Matthew Meszaros 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 2026-10-03 09:24:34 -07:00
Matthew Meszaros b9da4a2c40 Merge pull request #815 from warmbly/feat/dark-theme
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
2026-10-03 16:03:47 +00:00
Matthew Meszaros 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 2026-10-03 08:58:36 -07:00
Matthew Meszaros 232d226211 Merge remote-tracking branch 'origin/main' into feat/dark-theme 2026-10-03 08:49:37 -07:00
Matthew Meszaros 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 2026-10-03 08:49:37 -07:00
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