Matthew Meszaros
|
d0aeee95fa
|
feat: use purple for the Switch's selection and active states — selected node ring, decider card active state, context-toggle on-state, and the instruction textarea focus ring all take the step's purple identity instead of the global sky accent
|
2026-07-18 08:12:05 +02:00 |
|
Matthew Meszaros
|
a3f8284ef2
|
feat: give the Switch a restrained purple identity like Condition owns amber — purple border, tinted header, icon chip, wired case dots, and purple case edges on the node, while editor controls (decider cards, context toggles, hint boxes) stay on the standard sky/slate theme and the sparkles-vs-split icon swap is dropped for a constant SplitIcon
|
2026-07-18 08:09:44 +02:00 |
|
Matthew Meszaros
|
30d4277bba
|
feat: harden switch value matching and restyle the decider picker — normalized comparison ignores casing and collapses whitespace, /pattern/ case names become case-insensitive regexes (validated at write time, plain cases checked before regex cases, first match wins, no substring fuzziness so 'not interested' never lands on 'interested'), and the Decided by control becomes two icon cards with descriptions matching the step-type switcher
|
2026-07-18 08:06:26 +02:00 |
|
Matthew Meszaros
|
0f2006f00c
|
feat: list the campaign Switch in the routing group of the canvas menus — beside Condition (branch) in the drag-create menu and right after Send email in the Add-step menu and node-type switcher, out of the Actions list, since it routes rather than performs a side effect
|
2026-07-18 07:24:56 +02:00 |
|
Matthew Meszaros
|
f36c1a5001
|
feat: replace the campaign AI step with a Switch step — a multi-way router whose cases are rows on the canvas node, each with its own draggable source dot (per-case ai_label branches wired by handle, retarget on re-drag, purple case edges with no IF boxes, bottom dot as the otherwise fallback), decided per contact by an AI prompt (1 credit, fenced context, same credit lifecycle) or a free deterministic template-value match, with a mode toggle + case list editor (stale case paths healed on save), drag-to-empty-canvas creating the target and wiring the case, and sequences/ai-credits/automation docs rewritten for the switch
|
2026-07-18 05:42:50 +02:00 |
|
Matthew Meszaros
|
8019ce00fe
|
feat: make every line dragged out of a campaign AI step a new choice path — onConnect routes AI-step sources to addAIPathTo, which saves the branch as an ai_label condition under a unique placeholder name (write-time validation needs one) and opens the connection editor to name the outcome, so you drag as many outcome lines from the step as you need instead of stacking dead always branches
|
2026-07-18 05:22:19 +02:00 |
|
Matthew Meszaros
|
4399bb8e82
|
feat: collapse the campaign AI step to a prompt plus draggable named outcome paths — the connections drawn out of the step are the choice set (outcome names live on the ai_label branch conditions, deduped per step and read at run time), drop the ai_labels/ai_output_fields/ai_actions config and the whole AI action palette (side effects are ordinary action steps placed on the chosen path), and fence the contact's email, profile fields, and automation event data as untrusted content in every campaign and automation AI prompt so injected instructions inside replies are ignored
|
2026-07-18 05:18:24 +02:00 |
|
Matthew Meszaros
|
6b05ca8e48
|
feat: renumber the sequence AI step migration from 000067 to 000068 after merging main, whose email-auth-state migration takes the 000067 slot in the renumbered sequence
|
2026-07-17 18:29:41 +02:00 |
|
Matthew Meszaros
|
273dd7ce33
|
feat: merge main (deliverability auth-state sweep, watch-band cold throttle, research roadmap) plus the 000067 email-auth-state migration renumber into the campaign AI step branch
|
2026-07-17 18:29:06 +02:00 |
|
Matthew Meszaros
|
ad794bb184
|
feat: document the AI step and AI branching — sequences guide (AI steps, AI-picked tag choices, context controls, AI-label paths with inline label creation), automations guides (Ask AI branch, per-label classify routing), and the AI credits cost table entries for campaign AI steps and Ask AI branches
|
2026-07-17 16:26:58 +00:00 |
|
Matthew Meszaros
|
2945974ca7
|
feat: build the campaign AI step editor and canvas routing — instruction with contact variables, label/output-field lists, an AI action palette reusing the extracted ActionConfigFields with per-action when-hints and AI-picked tag/label choice sets with max-pick caps, what-AI-can-see context toggles, and AI-label connection paths with inline new-label creation that writes the label back to the step
|
2026-07-17 16:26:50 +00:00 |
|
Matthew Meszaros
|
fd2994bdd8
|
feat: build the automations builder UI for AI branching — an Ask AI (yes/no) condition field with prompt textarea, event-variable chips and credit note, per-label connection routing on AI classify nodes via a node-editor "Route connections by label" section with purple label edges, and stale label-edge healing on save
|
2026-07-17 16:26:42 +00:00 |
|
Matthew Meszaros
|
b564b227c0
|
feat: add automations Ask AI branch condition and ai_classify per-label edges — a prompt-driven yes/no condition evaluated via the metered provider (fail-safe to the no path, run-history errors, dry-run charged without auto-pause), label:<x> edges validated against the classify node's label set and followed only on the matching verdict, and no credit minting on local-provider refunds
|
2026-07-17 16:26:30 +00:00 |
|
Matthew Meszaros
|
d18c5ebe4a
|
feat: execute campaign AI steps in the scheduler path — one metered completion per contact (SetAI-wired provider + credits with per-step idempotency and refund-on-failure) that labels progress, fills contact custom fields which feed the chosen actions' templates, runs AI-picked pre-configured actions with per-decision campaign logging and tag/label choice resolution, grounds decisions in campaign history and the newest inbound reply via LatestInboundFromContact, and hands instant chains back to the scheduler at AI nodes
|
2026-07-17 16:26:23 +00:00 |
|
Matthew Meszaros
|
27381aa127
|
feat: branch campaign sequences on the AI step verdict — ai_label/"is" conditions validated as a strict pair and evaluated deterministically at schedule time off the stored label, threaded through FindNextRoutedPair, GetContactProgress, and a new RecordAILabel upsert (no model call in the scheduler polling path)
|
2026-07-17 16:26:14 +00:00 |
|
Matthew Meszaros
|
1bf517678a
|
feat: add the campaign sequence AI step data layer — "ai" action config with instruction, label set, output fields, AI-decided action palette (tag/label choice sets, when-hints) and context opt-outs, write-time validation caps, and migration 000067 adding campaign_contact_progress.ai_label
|
2026-07-17 16:26:08 +00:00 |
|
Matthew Meszaros
|
f2a56448fd
|
feat: renumber the email auth state migration from 000051 to 000067 to resolve the duplicate-version collision with 000051_referrals that broke cmd/migrate after merging the deliverability auth-sweep into the ai-platform migration range
|
2026-07-17 18:18:29 +02:00 |
|
Matthew Meszaros
|
cd5e1e9cf7
|
Merge pull request #72 from warmbly/research/warmup-abuse-cold-effectiveness
feat: deliverability research + observe-only SPF/DKIM/DMARC auth state and watch-band cold throttle
|
2026-07-17 05:29:58 +02:00 |
|
Matthew Meszaros
|
3ea2831040
|
feat: annotate the research roadmap with the observe-only auth-state and watch-band cold-throttle work already shipped on this branch
|
2026-07-17 03:24:18 +00:00 |
|
Matthew Meszaros
|
8af92417bd
|
feat: add authDomainOf unit test covering casing, whitespace, subdomains, and malformed addresses for the auth-check sweep domain extraction
|
2026-07-17 03:23:46 +00:00 |
|
Matthew Meszaros
|
7176bbce3c
|
feat: add dnsauth unit tests covering Result.State() classification (unknown on empty/transient-error, passing on SPF+DMARC, DKIM advisory) and DMARC policy parsing
|
2026-07-17 03:22:48 +00:00 |
|
Matthew Meszaros
|
e5a6643e2f
|
feat: apply the warmup watch-band volume multiplier (0.7x) to cold campaign sends via the shared adjustmentFor helper so a watch-state mailbox slows cold volume before it hard-quarantines
|
2026-07-17 03:21:29 +00:00 |
|
Matthew Meszaros
|
c96dc0b47a
|
Merge pull request #71 from warmbly/mobile-half-frame
feat: iOS app showcase on the homepage — half-cut iPhone with 1:1 SwiftUI screens, story switcher, and frosted notifications
|
2026-07-16 18:44:20 +02:00 |
|
Matthew Meszaros
|
3b3fc0fe62
|
feat: show the iOS app showcase on the homepage, slotted between the integrations feature section and the automations centerpiece so the sky band breaks up two light sections
|
2026-07-16 18:43:11 +02:00 |
|
Matthew Meszaros
|
c68ee02a20
|
feat: drive the mobile showcase — scale-to-fit phone stage capped at real-device size, story segments that fill and auto-advance the screens with tap-to-jump, cycling push notifications with long quiet gaps, and an IntersectionObserver lifecycle that pauses everything off-screen
|
2026-07-16 18:43:02 +02:00 |
|
Matthew Meszaros
|
28830a2718
|
feat: style the mobile showcase motion — screen slide transitions, status-bar glyph cross-fade, notification drop-in under the Dynamic Island, health-ring and chart draw-in states, phone entrance reveal, and prefers-reduced-motion fallbacks
|
2026-07-16 18:42:51 +02:00 |
|
Matthew Meszaros
|
cc1a35e835
|
feat: add the MobileAppShowcase section markup — sky band with a story-bar switcher and a bottom-cut iPhone whose Home/Inbox/Campaigns screens recreate the SwiftUI app 1:1 on a 393pt canvas (AirSkyWash hero, gradient-stroke stat chips, health rings, unibox and campaign rows, fixed status bar, frosted notification with the real app icon)
|
2026-07-16 18:42:37 +02:00 |
|
Matthew Meszaros
|
69c634a68c
|
feat: ship the real Warmbly iOS app icon (AppIcon-Light downscaled to a 10KB 128px png) as site/public/brand/app-icon.png for the mobile showcase notification banner
|
2026-07-16 18:42:27 +02:00 |
|
Matthew Meszaros
|
5b7d29c766
|
Merge pull request #70 from warmbly/domain-inbox-placement
feat: deliverability score + per-provider/per-domain inbox placement on the dashboard
|
2026-07-16 18:02:02 +02:00 |
|
Matthew Meszaros
|
1e1e357c06
|
feat: add a 0-100 deliverability score plus per-provider seed placement and per-domain warmup placement breakdowns to GET /analytics/deliverability, surface them on a customizable deliverability dashboard (toggleable sections + persisted view), and document the new fields in the guides and API reference
|
2026-07-16 17:55:34 +02:00 |
|
Matthew Meszaros
|
26b0c47148
|
Merge pull request #69 from warmbly/dev-quick-start
|
2026-07-16 09:54:39 +02:00 |
|
Matthew Meszaros
|
fe6d3769cc
|
feat: document make dev at the top of the AGENTS.md local development targets (readiness waits, seeding, seeded login, Ctrl-C leaves infra up)
|
2026-07-16 09:51:32 +02:00 |
|
Matthew Meszaros
|
968e43cf2d
|
feat: collapse the sandbox quick start from six terminals to four by starting the core stack with make dev instead of infra+run+web
|
2026-07-16 09:51:32 +02:00 |
|
Matthew Meszaros
|
f7ae908439
|
feat: rework the local development docs around make dev - new One command section with SEED/AI_PROVIDER variants, Rust/Elixir moved to optional prerequisites, and the stale manual-env-exports-plus-air native section rewritten around the pre-wired make targets
|
2026-07-16 09:51:32 +02:00 |
|
Matthew Meszaros
|
c8126d945d
|
feat: lead the README quick start with make dev - one command from clone to a seeded running stack with the dev@warmbly.com login, keeping the infra/run/web split and the all-docker make up as noted alternatives
|
2026-07-16 09:51:32 +02:00 |
|
Matthew Meszaros
|
fa3672464a
|
feat: add one-command make dev target - brings up docker infra and polls real readiness (pg_isready plus kafka/schema-registry/localstack init one-shot exit codes, failing loudly with a make logs hint), applies migrations, loads seed fixtures (SEED=false to skip), installs web deps on first run, then runs backend + consumer + both shared workers + dashboard in one terminal with Ctrl-C teardown
|
2026-07-16 09:51:20 +02:00 |
|
Matthew Meszaros
|
b40148c482
|
Merge pull request #68 from warmbly/ai-platform
|
2026-07-16 08:58:47 +02:00 |
|
Matthew Meszaros
|
d0e8bc1c97
|
feat: add one-command MCP OAuth connect on api.warmbly.com/v1/mcp — RFC 7591 dynamic client registration for public PKCE clients (dcr.go), RFC 9728 protected-resource metadata + WWW-Authenticate challenge via MCPAuthMiddleware, /v1/mcp now accepts an API key or OAuth token, public-client auth with no secret and mandatory PKCE reusing the existing OAuth 2.1 server (nullable-org clients, migration 000066), executable-redirect-scheme hardening on the open register endpoint, plus mcp/oauth/authentication/endpoints docs
|
2026-07-16 08:57:19 +02:00 |
|
Matthew Meszaros
|
30e8d3c13a
|
feat: restyle the docs site without decorative sidebar icons (frontmatter icons dropped, lucide source plugin disabled, AGENTS.md conventions updated), add LangTab language-logo code tabs, and document the new agent tools plus panel resize/placement/shortcuts in the assistant guide and MCP reference
|
2026-07-16 07:50:24 +02:00 |
|
Matthew Meszaros
|
e4a391c8a4
|
feat: make the assistant panel fully placeable: drag the inner edge to resize (360-720px, persisted), dock to the left or right screen edge from the header (persisted, dock bar follows), and panel-scoped shortcuts (Cmd/Ctrl+]/[ switch tabs, Alt+N new chat, Alt+W close tab, Alt+M minimize) listed in the shortcuts dialog
|
2026-07-16 07:50:24 +02:00 |
|
Matthew Meszaros
|
fabb1d2a42
|
feat: broaden the agent tool registry: list_campaign_leads (derived lead statuses + totals, the correct source for cold-lead/follow-up questions), set_campaign_status (approval-gated start/stop), get_dashboard_analytics, list_mailboxes (health + warmup), list_pipelines, list_deals, add_contact_note, and a list_threads description that steers the model to list_campaign_leads and to retry unfiltered before concluding the inbox is empty
|
2026-07-16 07:50:24 +02:00 |
|
Matthew Meszaros
|
73c80530c3
|
feat: adapt the OpenAI-compatible provider to the gpt-5.x/o-series request shape at runtime: a 400 naming max_tokens or temperature flips a sticky per-provider flag (max_completion_tokens / omit temperature) and retries, so newer OpenAI models work while Ollama/Groq/OpenRouter keep the legacy params
|
2026-07-16 07:25:08 +02:00 |
|
Matthew Meszaros
|
0b073bbe8a
|
feat: redraw AgentMark as the recognizable AI glyph (large spark + small companion spark, filled) and bump the header assistant icon to w-4 so it reads clearly as the AI agent
|
2026-07-16 07:18:56 +02:00 |
|
Matthew Meszaros
|
fd0be6e5ff
|
feat: log the real provider error (org, session, provider, model) and transcript-persist failures server-side when an agent run fails, instead of swallowing them behind the generic provider_error SSE message
|
2026-07-16 07:18:56 +02:00 |
|
Matthew Meszaros
|
602f0d2d0c
|
feat: animate the notifications dropdown open/close with the house framer-motion pattern (AnimatePresence fade + 4px slide, 120ms) instead of popping in instantly
|
2026-07-16 07:05:06 +02:00 |
|
Matthew Meszaros
|
4830fb9631
|
feat: drop the black tile behind the assistant logomark; the AgentMark spark now renders bare in sky-600 in the panel header, empty state, and minimized dock
|
2026-07-16 07:02:38 +02:00 |
|
Matthew Meszaros
|
619b63715d
|
feat: force the dashboard light-only (theme resolver and ThemeProvider never apply the .dark root class) and drop the dark/system theme commands from the command palette, fixing the palette rendering dark inside the all-white app on a dark-mode OS
|
2026-07-16 07:02:38 +02:00 |
|
Matthew Meszaros
|
c2bd4a7301
|
feat: animate the sidebar READY status with a dedicated status-breathe keyframe (halo swells 0.6x to 1.4x and fades on a 2.2s cycle, honoring prefers-reduced-motion) since animate-pulse on the tiny halo was imperceptible; CONNECTING dot pulses too
|
2026-07-16 07:02:38 +02:00 |
|
Matthew Meszaros
|
b03964ac29
|
feat: give the sidebar READY status a slow breathing emerald glow instead of a static ring and pulse the CONNECTING dot, so a quiet-but-connected workspace visibly reads as alive
|
2026-07-16 06:56:13 +02:00 |
|
Matthew Meszaros
|
d64c1ddcf7
|
feat: give the assistant a serious monochrome AgentMark logomark (panel header, empty state, top bar), center single-line composer text against the send button, add minimize-to-dock with a live bottom-right status bar (working/step count, needs approval, response ready), unseen dots on tabs, and a live status badge on the header spark button
|
2026-07-16 06:52:30 +02:00 |
|