Commit Graph

285 Commits

Author SHA1 Message Date
Matthew Meszaros 5954ac53c2 feat: add automation execution safeguards
Support chained automation execution from native actions, guard automation recursion depth, carry idempotency context through campaign-launched automations, allow team task assignment in backend action execution, and reject deletes while campaign steps still reference an automation.
2026-06-09 10:56:56 +02:00
Matthew Meszaros 3236ffc459 feat: expand product docs and automation references
Restructure the docs navigation into product-focused pages, add automation expression reference content, and refresh related template and personalization surfaces.
2026-06-09 09:07:56 +02:00
Matthew Meszaros 3eb96e33a1 feat: support automation expressions
Adds free-form expression conditions for automation graph branches and shares template helper functions with automation action rendering.
2026-06-08 15:04:59 +02:00
Matthew Meszaros b2c5117eca feat: preview campaign templates
Adds the shared template helper function map, send-path spintax expansion, server-side template preview validation, and the campaign template preview endpoint.
2026-06-08 15:04:53 +02:00
Matthew Meszaros 4013b33008 feat: expose security notification APIs
Wires notification and two-factor services into the backend and consumer, adds the authenticated notification feed/preferences endpoints, and exposes the public 2FA login verification endpoint.
2026-06-08 15:04:47 +02:00
Matthew Meszaros c40a83c22d feat: add two factor auth core
Adds TOTP enrollment state, sealed secrets, recovery codes, pending login challenges, and the auth-service login gate for users with 2FA enabled.
2026-06-08 15:04:36 +02:00
Matthew Meszaros e67ee189a2 feat: add in-app notification core
Adds the persisted notification feed, user preferences, realtime notification events, and advanced-service notification hooks for replies and deliverability health events.
2026-06-08 15:04:29 +02:00
Matthew Meszaros ad7c87acca feat: expand deliverability metrics 2026-06-08 12:03:23 +02:00
Matthew Meszaros 5f7ac801ba feat: execute automation graphs 2026-06-08 12:03:11 +02:00
Matthew Meszaros b28fc9e957 feat: expose automation APIs 2026-06-08 06:55:11 +02:00
Matthew Meszaros 1199a17f7e feat: add automation persistence 2026-06-08 06:55:07 +02:00
Matthew Meszaros e6b2f233a1 feat: expand integration and meeting APIs 2026-06-08 06:25:40 +02:00
Matthew Meszaros 8773b7f7f3 feat: push contacts to integrations 2026-06-07 20:30:52 +02:00
Matthew Meszaros 2579202b65 feat: add crm upsert actions 2026-06-07 20:30:47 +02:00
Matthew Meszaros c724ba59ec feat: expose integration action metadata 2026-06-07 20:30:41 +02:00
Matthew Meszaros fcef5008c4 feat: add CRM task team assignment 2026-06-07 19:32:37 +02:00
Matthew Meszaros 51c99458ad feat: fire instant actions from tracking events 2026-06-07 17:24:32 +02:00
Matthew Meszaros c113cd5646 feat: generalize instant action execution 2026-06-07 17:24:28 +02:00
Matthew Meszaros 025fc65325 feat: match instant branch triggers 2026-06-07 17:24:08 +02:00
Matthew Meszaros 59499ae6a9 feat: track instant action fires per event 2026-06-07 17:24:01 +02:00
Matthew Meszaros add075581c feat: route stop on reply through reply flows 2026-06-07 17:23:39 +02:00
Matthew Meszaros 35ae3efe86 feat: default campaigns to stop on reply 2026-06-07 17:22:46 +02:00
Matthew Meszaros b1518579bb feat: fire reply branch actions instantly 2026-06-07 12:39:27 +02:00
Matthew Meszaros 579b7f8d9c feat: allow CRM deal sequence actions 2026-06-07 11:50:20 +02:00
Matthew Meszaros f5abb8cbb6 feat: add CRM deal sequence actions 2026-06-07 11:48:03 +02:00
Matthew Meszaros f3625ca860 feat: add reply classification branch conditions 2026-06-07 11:47:57 +02:00
Matthew Meszaros 714d316bbe feat: classify inbound campaign replies 2026-06-07 11:47:26 +02:00
Matthew Meszaros 384cf868db feat: store campaign reply classifications 2026-06-07 11:46:38 +02:00
Matthew Meszaros 3117284095 feat: add layered reply classifier 2026-06-07 11:46:31 +02:00
Matthew Meszaros 051ae73fd2 feat: resolve named sender contacts 2026-06-07 07:54:02 +02:00
Matthew Meszaros 5f3940602f feat: add CRM task search summaries 2026-06-07 07:04:16 +02:00
Matthew Meszaros 62da3c3e3d feat: add organization teams API 2026-06-07 07:03:49 +02:00
Matthew Meszaros f9bc1dc40f feat: expose organization member display fields 2026-06-07 07:03:25 +02:00
Matthew Meszaros f19e418a36 feat: seed CRM task and inbox context data 2026-06-07 06:18:44 +02:00
Matthew Meszaros 9885e8b952 feat: create CRM tasks from campaign actions 2026-06-07 06:18:22 +02:00
Matthew Meszaros f4c738de06 feat: add customizable CRM task types 2026-06-07 06:18:01 +02:00
Matthew Meszaros 625b10a5c8 feat: add contact email lookup endpoint 2026-06-07 06:17:24 +02:00
Matthew Meszaros b98283ec2a feat: hydrate pipeline stages in list queries 2026-06-07 05:06:08 +02:00
Matthew Meszaros 3a5774c527 feat: handle missing sessions as token errors 2026-06-07 05:06:05 +02:00
Matthew Meszaros 0ac0ba80ca Merge remote-tracking branch 'origin/main' into feature/crm-system 2026-06-06 19:42:26 +02:00
Matthew Meszaros 050d09c961 feat: add cross-pipeline deals search surface
Replace the client-side, 100-row-capped deals board as the default view
with a server-driven cross-pipeline table so totals stop lying at scale.

- POST /crm/deals/search: faceted filter body (query, status, pipeline,
  stage, owner, campaign, value range, close-date range), whitelisted
  sort, offset pagination, and Contact/Stage/campaign hydrated via JOIN.
- POST /crm/deals/summary: COUNT + SUM(value) per status and per stage
  over the same filter, with a mixed-currency guard, so header and board
  column totals are true server aggregates.
- DealsTable: cross-pipeline default view (infinite scroll, server
  filters/sort, honest summary stats) with a Table|Board toggle; the
  kanban stays as the single-pipeline working view.
- Deal attribution: campaign_id + source_mailbox_id columns + indexes
  (migration 000022) as groundwork for revenue lineage.
2026-06-06 19:42:20 +02:00
Matthew Meszaros 86d7d1f7d3 feat: expose unibox thread label api
Add read and replace endpoints for conversation labels, wire service methods, and route sender/category filtering through the thread-collapsed search path.
2026-06-06 19:37:19 +02:00
Matthew Meszaros 0a611c0250 feat: collapse unibox search by thread
Return one inbox row per conversation, aggregate unread/message counts, join assigned labels, and align overview and unread counters with thread-level totals.
2026-06-06 19:37:19 +02:00
Matthew Meszaros a95a4e206e feat: add unibox thread label models
Add the conversation-label join table and expose thread label fields on the Unibox response models so inbox rows and overview data can carry category metadata.
2026-06-06 19:37:19 +02:00
Matthew Meszaros da82993846 feat: add campaign workflow backend support
Add sequence action-node storage and execution, template conditional rendering, lead progress state, profile updates, webhook fan-out throttling, and supporting repository fixes.
2026-06-06 07:49:52 +02:00
Matthew Meszaros 49f1b28bd1 feat: add campaign lead order api
Wire campaign lead ordering through handlers, service methods, and campaign routes.
2026-06-05 15:44:26 +02:00
Matthew Meszaros 293842c842 feat: expose campaign lead order service contract
Add campaign service method declarations for listing and replacing manual campaign lead order.
2026-06-05 15:42:40 +02:00
Matthew Meszaros c4c27fcc19 feat: add campaign lead ordering backend
Add campaign lead ordering repository methods for manual send order and tighten strict ESP matching so SMTP/IMAP is only a fallback outside strict mode.
2026-06-05 15:42:12 +02:00
Matthew Meszaros 77de336d78 feat: unify campaign sender pools
Resolve campaign senders as the union of explicit accounts and tag-selected mailboxes, with all active mailboxes as the empty-selection fallback. Update readiness checks, active-campaign counts, and rotation cursor handling for the unified pool.
2026-06-05 14:35:52 +02:00
Matthew Meszaros 0e26b9cd00 feat: refine campaign branch scheduling
Evaluate branch conditions relative to the previous send, defer while windows are still undecided, and let the routed pair finder handle deleted targets and loops at schedule time.
2026-06-05 09:10:57 +02:00