Commit Graph
924 Commits
Author SHA1 Message Date
Matthew Meszaros eb74b7dafb feat: fix the Steps tab still pointing at /sequences and replace remaining user-facing Sequences with Steps (route page + folder renamed to steps, document title regex, permission labels, not-found hint, campaign count) 2026-06-12 10:03:02 +02:00
Matthew Meszaros aba0878833 feat: replace the per-node amber if-dot with a single output dot that opens a drag-drop create menu (email, action, or condition) on release, and add a Condition router node (kind wait) you can chain into nested decision trees 2026-06-12 09:51:11 +02:00
Matthew Meszaros a7a43e0c4c feat: rename the campaign sequences resource to steps across the API and URL (/campaigns/:id/steps), the JSON fields (target_step_id, step_id/step_name/step_index, analytics steps[], create body steps), the web client/models/route segment/labels, the audit step entity type, and the wire-contract docs; internal Go type names and the Kafka avro schema stay 2026-06-12 09:38:11 +02:00
Matthew Meszaros a69bf78b2c feat: move the full email toolset (template picker, save as template, write with AI, content score) into the shared EmailContentEditor and have the original step composer use it too, so every A/B variant has the identical tools as the main email 2026-06-12 09:09:34 +02:00
Matthew Meszaros e7977d7bdf feat: edit a step's email and its A/B variants in one horizontal tab bar (Original as the first tab plus a tab per variant, each showing its split share), with an embedded SequenceView for the original arm 2026-06-12 08:39:12 +02:00
Matthew Meszaros 2c4b0a07df feat: give A/B variants the same composer as the main email via a shared EmailContentEditor (subject + body + Edit/Preview render + template validation), so a variant is edited and content-checked exactly like the step's own email 2026-06-12 08:32:56 +02:00
Matthew Meszaros 85d5d04afe feat: clarify in the sequences guide that the A/B original is a control arm in the weighted split with a live per-arm share shown in the editor 2026-06-12 08:04:44 +02:00
Matthew Meszaros 8de7e32857 feat: treat a campaign step's own email as the A/B control arm so contacts split across the original plus active variants by weight, and redesign the step variants editor to show the original and variants as one weighted set with live split percentages 2026-06-12 08:04:03 +02:00
Matthew Meszaros 7b34b96b37 feat: keep the per-user realtime connection cap at 10 but reap dead connections via a periodic liveness sweep and process pids, so the count reflects real presence and stale sockets never hold a slot 2026-06-12 07:46:13 +02:00
Matthew Meszaros 5d2882ccf8 feat: strip leaked agent reasoning and select the corrected final draft for campaigns and deliverability reference pages, removing duplicate frontmatter, an em dash, and a Cyrillic placeholder char 2026-06-12 07:39:57 +02:00
Matthew Meszaros bfd67bfa2a feat: correct API key prefix examples to the real wmbly_ format and link the endpoint reference from the API docs index 2026-06-12 07:29:45 +02:00
Matthew Meszaros 54a1aee753 feat: add full per-resource API endpoint reference under docs/api/reference (mailboxes, campaigns, contacts, unibox, crm, analytics, api-keys, webhooks, integrations, deliverability/ops, account/org) with request and response structures 2026-06-12 07:28:19 +02:00
Matthew Meszaros 3cbfc06bc4 feat: add WebSocket intents (selective event-family subscription) and a HELLO-style org join reply advertising heartbeat cadence, and correct realtime docs on connection rejections and at-most-once delivery 2026-06-12 07:17:09 +02:00
Matthew Meszaros 50a134c827 feat: document org team-presence privacy controls in the collaboration guide and realtime API reference 2026-06-12 05:59:02 +02:00
Matthew Meszaros 6e9f2b4807 feat: add a Team presence section to workspace settings with admin-gated Show who's online and Show activity toggles, and make ToggleRow support a controlled persisted mode 2026-06-12 05:59:01 +02:00
Matthew Meszaros 4f1ac8c273 feat: enforce org team-presence privacy in the realtime OrgChannel — gate Presence.track on show_online, strip viewing/editing detail when show_activity is off, and re-track/untrack live on PRESENCE_POLICY_UPDATED 2026-06-12 05:59:01 +02:00
Matthew Meszaros 0fd3d03f55 feat: add org-wide team presence privacy columns (presence_show_online, presence_show_activity) with update plumbing and a PRESENCE_POLICY_UPDATED realtime event so a settings change re-gates connected sockets live 2026-06-12 05:59:01 +02:00
Matthew Meszaros 8547fe97eb feat: scope unibox MarkSeenBulk by organization so a non-owner member opening a thread clears the shared org-wide unread state instead of updating zero rows 2026-06-12 05:14:50 +02:00
Matthew Meszaros 4db027a342 feat: scope unibox GetByThread by organization instead of user_id so non-owner members see the full conversation they already see in the org-scoped inbox list, not an empty thread 2026-06-12 05:10:00 +02:00
Matthew Meszaros 81f81fbe20 feat: normalize automation updated_at to a primitive before comparing it (the API client revives it into a Date, so === compared by reference and the editor always flagged its own save as a teammate change) 2026-06-12 04:58:46 +02:00
Matthew Meszaros ba3ab98e1e feat: bridge realtime events over Redis pub/sub when Google Pub/Sub is unconfigured (RedisBus publisher in backend/consumer plus Realtime.Redis.EventSubscriber and a shared EventBroadcaster) so dashboard live updates and presence-driven collaboration actually fire in local dev 2026-06-12 04:49:58 +02:00
Matthew Meszaros 21f25a5361 feat: use automation updated_at as the remote-version token in AutomationFlow so the editor stops falsely toasting its own save as a teammate change 2026-06-12 04:34:13 +02:00
Matthew Meszaros f6540d9f2f feat: rejoin org/user channels and force isConnected toggle on zombie-socket wake so a backgrounded dashboard tab resumes realtime events and presence without a reload 2026-06-12 04:34:13 +02:00
Matthew Meszaros 48ce9074eb feat: automation presence reflects intent — editors claim 'editing', view-only members claim 'viewing', so the resource viewers stack and online dropdown show accurate activity 2026-06-11 19:55:01 +02:00
Matthew Meszaros c2215a62c1 feat: richer online-presence dropdown — click to pin, profile pictures, a live online + editing count, and clear per-person activity ('Editing an automation', 'Viewing a conversation', 'Replying to a message') with color-coded icons instead of a bare 'editing' 2026-06-11 19:54:44 +02:00
Matthew Meszaros 801c6b8619 fix: faster, research-backed websocket reconnect — replace the slow 1s/2s/4s exponential backoff with a fast-start schedule (first retry ~120ms) plus jitter, lower the heartbeat to 25s/8s for quicker dead-connection detection, retry token-fetch failures on the same fast backoff, and clear a Safari-suspended CONNECTING zombie socket on tab refocus so it reconnects instantly instead of hanging 2026-06-11 19:52:55 +02:00
Matthew Meszaros 9731083ae2 feat: live-collaborate on automations — the builder canvas now reflects a teammate's save in real time instead of only after a reload (re-seeds when you have no unsaved edits, shows a non-destructive 'load their version / keep mine' banner when you do), fixing the seed-once canvas that never reacted to remote changes 2026-06-11 19:51:05 +02:00
Matthew Meszaros 393b683fa2 feat: lock the campaign sequence flow for members without manage-sequences — view-only members can't drag steps, draw branches, or add a step (each attempt pops the permission popup and the Add-step button shows a lock), while pan/zoom/inspect still work 2026-06-11 19:17:20 +02:00
Matthew Meszaros 605583c301 feat: proactively lock the automation builder Save button for members without the integration permission, with a lock icon and permission popup 2026-06-11 19:00:45 +02:00
Matthew Meszaros 384579a36b feat: proactively lock the campaign Start/Pause, settings Save and schedule Save buttons for members without send/manage-campaign permission (lock icon + permission popup before any request) 2026-06-11 19:00:09 +02:00
Matthew Meszaros 9024d6bc21 feat: add proactive write-permission primitives — useWriteGuard (blocks a denied action before any request and pops the permission dialog) and PermissionButton (auto-locks with a lock icon when the member lacks the permission) 2026-06-11 18:51:59 +02:00
Matthew Meszaros fd440627fe fix: portal the sidebar access-locked popup to document.body so it covers the whole screen instead of clipping inside the transformed sidebar aside 2026-06-11 18:49:15 +02:00
Matthew Meszaros a0221dd312 feat: show one clear, app-wide 'you don't have permission' popup whenever a write action (edit/save/delete) is denied with 403, naming the missing permission or plan, instead of silent failures and generic error toasts across the dashboard 2026-06-11 18:30:53 +02:00
Matthew Meszaros 44d7c2a0c1 fix: make the realtime websocket reconnect reliably — reconnect on every unintended close (not just unclean ones), detect silently-dropped connections via a heartbeat watchdog that force-closes to trigger reconnect, and reconnect immediately when the network returns or the tab is refocused 2026-06-11 18:18:24 +02:00
Matthew Meszaros 21b4ba4ea0 fix: let members with the integration permission save automations (write was gated on manage-settings while read used use-integrations, so a manager could open the builder but 403 on save) and surface the backend's real error in the save toast instead of a generic message 2026-06-11 18:15:55 +02:00
Matthew Meszaros 6a3b8ac0eb fix: scope the unibox unread-count endpoint by organization_id so the sidebar Inbox badge counts the workspace's unread mail instead of always showing 0 for non-owner members 2026-06-11 18:05:18 +02:00
Matthew Meszaros 594c696bf6 fix: scope the unibox inbox list and overview by organization_id (via the workspace's email accounts) instead of the logged-in user_id, so every member sees the org's incoming mail; per-user thread labels and snoozes stay personal 2026-06-11 17:57:52 +02:00
Matthew Meszaros 21032a8fce fix: scope the contacts list by organization_id instead of user_id so all members see the workspace's contacts (and per-contact campaign badges); categories badge still user-scoped pending an organization_id column on categories 2026-06-11 17:52:36 +02:00
Matthew Meszaros 88e241d536 fix: scope the analytics dashboard (overall stats, recent activity, top campaigns, daily trend, account health) by organization_id instead of user_id, so every workspace member sees the org's analytics rather than an empty dashboard 2026-06-11 17:49:39 +02:00
Matthew Meszaros a21dc57e07 fix: scope campaign list/detail/count queries by organization_id instead of user_id, so all workspace members see the org's campaigns rather than only the creator 2026-06-11 17:47:04 +02:00
Matthew Meszaros 6ae5e52c4e fix: scope email-account list/detail queries by organization_id instead of the logged-in user_id, so every member of a workspace sees the org's mailboxes (not just the owner who connected them) 2026-06-11 17:43:56 +02:00
Matthew Meszaros 4440613d94 feat: sidebar shows a lock on features the member can't access and pops an explanatory access dialog on click, so a locked feature reads as unavailable instead of an empty page mistaken for 'no data'; align Accounts gate on Manage mailboxes 2026-06-11 17:17:48 +02:00
Matthew Meszaros 70064e9e1d fix: define OrgChannel.handle_out/3 so presence_diff broadcasts are pushed to clients instead of crashing the channel — the missing callback was terminating the org channel and dropping every websocket connection in a reconnect loop 2026-06-11 13:47:11 +02:00
Matthew Meszaros babde3397c feat: apply the explicit no-access message to campaigns, contacts, analytics, and API keys pages too, so every permission-gated tab says which permission is missing instead of showing nothing 2026-06-11 13:21:34 +02:00
Matthew Meszaros 72d2af2c3d feat: inbox and email-accounts pages now show an explicit 'you don't have access' message (with the missing permission) instead of a blank or misleading-empty screen when the member lacks unibox/campaign-view access 2026-06-11 13:19:25 +02:00
Matthew Meszaros b07d21b907 feat: add usePermission hook + a NoAccess surface that explains which permission a member is missing instead of rendering a blank page 2026-06-11 13:19:24 +02:00
Matthew Meszaros 3654ca0809 feat: profile and workspace name fields auto-save ~700ms after typing stops (empty names stay unsaved), replacing manual Discard/Save with the live status indicator 2026-06-11 13:00:27 +02:00
Matthew Meszaros 01e23c7596 feat: notifications settings auto-save instantly on toggle with a Saving/Saved header indicator, replacing the manual Discard/Save buttons 2026-06-11 13:00:27 +02:00
Matthew Meszaros 14837ed959 feat: guard settings tab switches — block in-app navigation (and warn on reload) when a tab has unsaved or failed auto-save changes, with a Stay/Discard/Save-changes dialog 2026-06-11 13:00:27 +02:00
Matthew Meszaros aa9273fe06 feat: add autosave primitives — useAutosave hook (instant for toggles, debounced for text, with dirty/flush/retry status), an unsaved-changes registry context, and a Saving/Saved/retry header indicator 2026-06-11 13:00:18 +02:00