Commit Graph
1416 Commits
Author SHA1 Message Date
Matthew Meszaros 5178acd874 feat: in-composer AI writing experience — select text in the unibox reply textarea or the campaign TipTap editor and a floating Edit-with-AI pill opens quick actions (improve, shorten, expand, fix grammar, friendlier, more formal) plus free instructions backed by a new fenced /generation/edit endpoint (1 credit, idempotent, refund on failure, prompt-injection fencing around the passage), rewrites type themselves in with undo/again/done review, and Draft reply now runs through an inline draft bar with staged shimmer status and Keep/Adjust/Retry/Discard instead of a toast 2026-07-18 11:55:37 +02:00
Matthew Meszaros ac3a904d8c feat: restyle the header CreditsMeter to blend with the chrome — no pill background or blue tint, just a neutral slate ring gauge and count that matches the search/bell controls, coloring amber/red only when low or empty, with a number-forward panel (big balance, slate progress bars, status dot, quieter auto top-up note) instead of the sky-tinted card look 2026-07-18 11:30:07 +02:00
Matthew Meszaros 79029ad2d9 feat: upgrade the top-bar credits pill into a full CreditsMeter — a ring-gauge trigger showing remaining vs monthly allowance plus a click-open panel with plan pool fill and next reset, purchased credits, today/week/month spend against configured limits with warning bars, auto top-up status, and a link to usage & spend controls 2026-07-18 09:35:43 +02:00
Matthew Meszaros d832453b2d feat: show the remaining AI credit balance in the top bar — a CreditsPill beside the plan badge (sky normally, amber under the org's low-balance threshold, red at zero, compact 12.4k formatting) linking to Settings/Billing, rendered only for members with manage_billing and refreshed by the realtime spine 2026-07-18 09:20:24 +02:00
Matthew Meszaros 4f9e6e6282 feat: full attribution on every AI credit charge — new actor_user_id + context jsonb columns on the transaction log (migration 000070), a typed models.CreditContext carried via request context (models.WithCreditMeta) so base charges, usage settles, web-search fees, and refunds all inherit it without signature churn, wired at every spend site (campaign switches record campaign/step/contact, automation nodes and Ask AI record automation/node/run and the question asked, reply drafts and inbox agent record the thread, the dashboard agent records the session, research records contact/run, and manual features record the triggering user), rendered as a detail line with token counts in the billing transaction log with corrected reason labels, and documented in the AI credits guide 2026-07-18 08:52:16 +02:00
Matthew Meszaros 163d3057de feat: add web-search and extended-thinking capabilities to the campaign switch AI decider — a per-step web lookup about the contact's company (query derived from contact fields only, results fenced as untrusted, +1 credit charged only when results land, wired through a new tasks SetAISearch) and a thinking toggle that routes to the stronger model tier with a 2048-token budget priced through usage metering, with editor toggles under Capabilities and sequences/ai-credits docs 2026-07-18 08:42:08 +02:00
Matthew Meszaros 053ca6a71d feat: usage-based AI credit system — every AI call reserves its flat minimum then settles the real token cost per model (light 1500/standard 400 tokens per credit, drain-to-zero overage settle wired into writing assistant, reply drafts, dashboard agent, inbox agent, research, automation nodes, and campaign switches), org spend controls in a new org_ai_settings table (day/week/month hard limits enforced in Consume, low-balance alert threshold, auto top-up config), a credit-watch monitor hook that fires BILLING_CREDITS_LOW realtime alerts once per day and buys the configured pack off-session via a new Stripe AutoTopUpCredits (idempotent on the PaymentIntent, bounded per month, Redis-locked), GET /subscription/credits/usage + GET/PATCH settings endpoints, and an AI usage & spend controls billing card (spend vs limits, 30-day chart, per-feature and per-model breakdowns, limits/reminder/auto-top-up form) with a realtime low-credit toast 2026-07-18 08:39:41 +02:00
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