Commit Graph

  • b06be51783 feat: raise the shared tooltip layer from z-50 to z-150 so hover tooltips (like the AI caret's Write with AI hint) render above the docked compose window at z-70 instead of hiding behind it, while staying under the confirm dialog at z-200 Matthew Meszaros 2026-07-19 10:21:25 +02:00
  • f333260b0f feat: derive unibox search params synchronously from the URL scope (lazy initial state plus a render-phase reset keyed on scope and resolved tag accounts) instead of a post-paint effect, so reloading a scoped URL no longer fires and paints the default all-mail query first and then flashes the thread list over to the scoped result Matthew Meszaros 2026-07-19 10:02:43 +02:00
  • 17635a99cc feat: restore the app store's mailbox and tag slices by syncing them in DataSyncProvider (paged /emails directory query under the audit-spine-invalidated ['emails','list'] key plus profile tag definitions), un-breaking every surface that resolves mailbox-to-tag membership from the store: the compose From picker's tag filter chips, the unibox filter sheet's tag resolution, and the tag scope in the rail Matthew Meszaros 2026-07-19 10:02:43 +02:00
  • 018ce89b79 feat: make the recipient autocomplete category-aware in both composers: suggestion rows show each contact's category chips with their colors, typing a category name offers it as a filter row (enter or click applies it as a removable chip in the field, backspace or escape clears it), and an active category narrows the suggestions to that group via the search endpoint's category_ids Matthew Meszaros 2026-07-19 09:26:02 +02:00
  • c3977d30d4 feat: give the reply composer's To/Cc/Bcc fields the same contact autocomplete as compose by swapping the plain chip editor for the shared ContactRecipientField (type to search existing contacts by name, email, or company; raw addresses still commit with Enter) and delete the now-unused local RecipientField Matthew Meszaros 2026-07-19 09:22:17 +02:00
  • 1da0a932fa feat: shrink the From mailbox menu into a compact searchable list: single-line h-8 rows (auth dot, address, history count, sent/limit budget, best marker) with the name and score reasons moved into the tooltip, a search box that filters as you type, tag filter chips built from the org's mailbox tags (only tags actually in use are offered), an inline Auto row, and a no-match empty state Matthew Meszaros 2026-07-19 09:22:17 +02:00
  • eb1c707dcb feat: teach the dashboard assistant (cmd+I agent) to ask before it guesses: when asked to write or draft something and the purpose or audience is genuinely unclear after checking its tools, it asks one short clarifying question in chat instead of inventing a generic draft Matthew Meszaros 2026-07-19 09:16:55 +02:00
  • 4bbbf57bb2 feat: serialize the AI draft bar's phase transitions with AnimatePresence mode wait so the clarifying-question card no longer enters beside the exiting busy pill, gets shoved off-center, and jumps back when the pill unmounts Matthew Meszaros 2026-07-19 09:16:55 +02:00
  • 22fddad234 feat: stop the dashboard-wide reload flashing: the reconnect catch-up invalidated every query on any socket RE-connect, so a flapping websocket refetch-stormed the whole app; now it only fires after a real outage (over 5s down) and at most once every 30s Matthew Meszaros 2026-07-19 09:16:55 +02:00
  • a3339fe0b3 feat: update the reply composer's layout doc comment to describe the new target strip and row order Matthew Meszaros 2026-07-19 08:56:21 +02:00
  • 50701af000 feat: align the reply composer's horizontal rhythm: body textarea and signature preview blocks share the px-4 left edge with the header rows instead of drifting between px-5 and mx-3/mx-5 Matthew Meszaros 2026-07-19 08:56:08 +02:00
  • 3c4738e065 feat: rebuild the reply composer header rows in the compose window's language: To first with quiet Cc/Bcc toggles on its right, plain inline labels with hairlines instead of the uppercase label lane and vertical divider column, the From mailbox as calm text without the boxed mono chip, and an unlabelled slightly heavier subject line Matthew Meszaros 2026-07-19 08:55:40 +02:00
  • 5c3b6aab10 feat: replace the reply composer's target-message preview card (round icon badge, uppercase kicker, three stacked lines) with the compose window's quiet single-line bar: Reply/Forward to name and subject on a slate-100 strip with a muted corner icon (violet when forwarding) and a ghost close button Matthew Meszaros 2026-07-19 08:54:35 +02:00
  • 6f8db3ae05 feat: de-template the cold-email humanizer (drop the quotable example asks and subject that models parroted verbatim, add a VARIATION section mandating a fresh skeleton per email and capping punchy standalone lines at one) and add compose drafts: autosaved per-user working copies (client-generated ids, idempotent PUT on a 1.2s debounce, migration 000072) with Saving/Saved in the window header, close-keeps-draft instead of the discard confirm, delete on send or when emptied, and a Drafts list under the rail Compose button to resume or delete, documented in the guide and endpoints scope map Matthew Meszaros 2026-07-19 08:52:56 +02:00
  • e6b11f8d07 feat: fix compose draft quality and review chrome: a compose-specific humanizer frame (BuildComposeRules) that bans copywriting rhythm outright (no standalone punch lines, no problem-agitate-pitch, no market generalizations, 40-70 words, plain first sentence) and gives no example phrasings for the model to parrot, clear the grounding report and voice-profile nudge when the draft flow ends instead of lingering after Keep, restructure the Draft ready card into breathing rows (title plus usage, grounding line, right-aligned action row), and portal the From mailbox menu to the body with viewport-aware flip so the compose window's overflow clipping can't cut it off Matthew Meszaros 2026-07-19 08:45:47 +02:00
  • 6ce5ebe900 feat: make compose AI drafting grounded and agentic: POST /unibox/compose/draft assembles the recipient's contact 360, the full correspondence history with the address, and the org voice profile into the prompt (2-credit minimum, reason compose_draft, usage settle, refund on provider failure), and when the purpose is genuinely unknowable the model returns a clarifying question instead of inventing a pitch; the draft bar gains a question phase (answer inline and it writes), the review card reports exactly what the draft was grounded in, and the composer nudges to Settings > Workspace with a link when no voice profile is set; docs cover the endpoint, credits row, and guide behavior Matthew Meszaros 2026-07-19 08:37:39 +02:00
  • 0c4e63ab01 feat: make the compose window behave like a real docked draft: minimize to a compact corner bar (draft state stays mounted while you browse other pages, header click or chevron restores, n or any openCompose restores instead of clobbering the draft), a serious single-icon header that reads New email to <name>, <company> as the recipient resolves, and the body textarea aligned to the same horizontal padding as the subject and header rows Matthew Meszaros 2026-07-19 08:31:53 +02:00
  • a5982808fd feat: stop the inbox flashing on scope and route switches by keeping previous unibox search pages as placeholder data while the new key loads (no more full-pane skeleton flash) and holding overview counts in cache for 30 minutes so the header stats stop rolling up from zero, and flatten the compose header to a quiet single-line bar that shows just the recipient (or New email) with the icon chip and subtitle removed Matthew Meszaros 2026-07-19 08:25:06 +02:00
  • 112f75a23d feat: fix the in-composer AI layers rendering behind the docked compose window by raising the portaled sparkle/pill/menu z-indexes above window chrome (still under the confirm layer), give the compose header a proper identity (sky pen chip plus two-line title with the recipient or draft state), add the Template picker and booking-link tools to the compose action bar by extracting TemplatePickerContent and InsertBookingLink out of ReplyComposer into shared unibox components, and make Compose the house primary sky button in the rail and mobile header Matthew Meszaros 2026-07-19 08:22:26 +02:00
  • 26bb5a1746 feat: soften the compose chrome from black-on-white to grayish: the window header becomes a slate-50 bar with a hairline and muted controls, the rail and mobile Compose buttons become white bordered buttons with a sky pen icon, and the History panel's active tab uses a slate-200 fill instead of the inverted slate-900 pill Matthew Meszaros 2026-07-19 08:17:33 +02:00
  • 8260094d46 feat: redesign the compose window chrome: dark slate header bar with icon-only history/close, Gmail-style header rows (quiet inline labels and hairlines instead of the uppercase label lane and vertical divider), unlabelled heavier subject line, Cc/Bcc toggles on the To row, calmer AI presence (neutral auto chip on the From picker with the reason kept in the dropdown, contextual Suggest ghost that only appears when the subject is empty and a body exists, plain body placeholder), plus a proper Compose button at the top of the unibox scope rail with the header button kept as the mobile-only entry Matthew Meszaros 2026-07-19 07:56:04 +02:00
  • 3f85803cfa feat: document the compose feature: unibox guide gains a Composing a new email section (docked window, contact search, suppression blocking, Auto mailbox selection with scoring rationale, History panel, in-composer AI and subject suggestion), and the API endpoints scope map adds /unibox/compose + /unibox/compose/candidates plus the new address and direction filters on GET /unibox Matthew Meszaros 2026-07-19 07:40:05 +02:00
  • 6790eabd74 feat: wire compose entry points: mount the window globally in the app layout, add the Compose button with an n shortcut tooltip to the unibox header, register the global n key (and update the shortcuts modal entry), and add an Email action to the contact drawer that opens compose prefilled with the contact's address Matthew Meszaros 2026-07-19 07:38:48 +02:00
  • 5e2d4ae832 feat: build the compose window: a docked bottom-right popup with an Auto mailbox picker that shows the backend's pick and reason plus per-mailbox budget bars, history badges, and auth dots, a contact-autocomplete recipient field, AI subject suggestion, the full in-composer AI experience (caret menu, selection edit, sheen + typewriter draft bar grounded in the recipient's contact record), suppression blocking before send, schedule presets, signature status, and a slide-out History panel with Conversations/Sent tabs, subject search, and mailbox-affinity line that opens real threads in the unibox Matthew Meszaros 2026-07-19 07:38:48 +02:00
  • 44bfe7840f feat: add the compose web API layer (candidates + send clients, hooks with unibox invalidation, address/direction params on unibox search), a global useComposeStore zustand store so any surface can open the composer, and configurable draft row label/cost on TextareaAICaret so compose can say Draft this email with AI instead of the reply wording Matthew Meszaros 2026-07-19 07:38:48 +02:00
  • 097664b673 feat: add a direction filter to unibox search (?direction=sent|received) resolved against the org's own mailbox addresses so the dashboard can show a real Sent view and the compose history panel can split sent mail from replies Matthew Meszaros 2026-07-19 07:28:38 +02:00
  • cf58c6d1d2 feat: add the compose backend: POST /unibox/compose sends a brand-new outbound email with org-wide recipient suppression enforced and optional auto mailbox selection, GET /unibox/compose/candidates scores every active mailbox for a recipient (conversation affinity from unibox history plus queued email tasks, remaining daily budget from daily_email_counts, domain-auth health) with human-readable reasons, a recommended pick, contact resolution, and suppression state Matthew Meszaros 2026-07-19 07:27:23 +02:00
  • 666a137cd8 feat: add an address filter to unibox search that matches either side of the exchange (from_addr OR to_addr) so the compose history panel can show every conversation with a contact, exposed as ?address= on GET /unibox, with a GIN index on to_addr (migration 000071) mirroring the existing from_addr index Matthew Meszaros 2026-07-19 07:27:23 +02:00
  • 4a9ae5514b Merge pull request #73 from warmbly/feature/ai-automation-steps Matthew Meszaros 2026-07-18 17:08:54 +02:00
  • 527f1f95a1 feat: upgrade the iOS unibox AI writing and label experience to web parity: thread-grounded Draft reply with staged shimmer status, typewriter reveal, and a Keep/Adjust/Retry/Discard review bar, selection and whole-draft rewrites through the fenced generation/edit endpoint with parity quick actions and a custom Editing selection mode, insert-at-cursor prompt generation, usage chips and 402/429 handling, plus a search-or-create label picker sheet with instant optimistic saves, removable chips, row context-menu labeling, and a bulk Label action with progress and toast Matthew Meszaros 2026-07-18 17:00:56 +02:00
  • 47232aef3c feat: fix the draft review card to a fixed width so the Adjust input spans it fully with the send button flush right, make the header credits meter foresight-first (ring plus plan left/allowance, or spent/limit today|wk|mo when a spend limit is configured, plus a +N for purchased credits, all without opening the panel), and surface keybindings across the AI flow: the selection pill shows an inline mod+J kbd chip and mod+J with a selection actually opens the editor, the caret companion keeps mod+J for the collapsed caret, and both popovers show enter/esc hints including esc-to-cancel while generating Matthew Meszaros 2026-07-18 16:40:07 +02:00
  • ea85dbc1cf feat: seed labels into the sandbox org (folders/tags/categories for sandbox@warmbly.test bound to mailboxes, campaigns, contacts, and four inbox threads, idempotent with a dedicated UUID namespace) and restyle the thread label dropdown to the house picker language: assigned labels show as colored chips right in the trigger with a +N overflow, the panel gets a search-or-create header, a removable assigned-chips row, color-dotted checkbox rows with an assigned marker, a friendly empty state, and a footer noting the shared category registry and the c shortcut Matthew Meszaros 2026-07-18 16:35:36 +02:00
  • 1823f03a80 feat: live usage-based credit feedback — every fresh debit publishes BILLING_CREDITS_CHANGED through the creditwatch monitor so the header meter counts down in real time (AnimatedNumber tween, plus client-side invalidation on write/edit/draft success), generation responses now return the real credits_charged and tokens_used from the usage settle and every AI surface shows the true cost instead of flat labels, and the composer AI became overlay-based: the draft bar floats over the body instead of pushing layout, a sky sheen sweeps the input while the model writes, and the selection being rewritten is painted with pulsing highlight rects that grow as the rewrite types in Matthew Meszaros 2026-07-18 16:30:05 +02:00
  • cb6b58d462 feat: add a reusable ShortcutTooltip (themed tooltip with a platform-aware kbd chip, mod renders as cmd on Apple and Ctrl elsewhere) and use it on the caret AI sparkle (mod+J) and the header assistant button (mod+I) so fast keys are discoverable instead of hiding in native title attributes Matthew Meszaros 2026-07-18 15:31:59 +02:00
  • 09bb526a6c feat: move the inbox composer's AI to the cursor — remove the Draft reply and Write with AI buttons from the action bar and replace them with a caret companion: a faint sparkle rides the line you're typing on (or press cmd+J) and opens a menu at the caret to ask AI to write and insert there, draft a full reply from the thread, or continue writing, with typewriter insertion plus Undo/Again/Done and the unibox guide updated to match Matthew Meszaros 2026-07-18 12:11:14 +02:00
  • c03cf37716 feat: seed the dev org as a mid-flight workspace: new internal/seed dev_org.go + dev_history.go give dev@warmbly.com 4 warmed premium-pool mailboxes, folders/tags/categories with real bindings (email_tags, campaign_folders, contact_categories, unibox thread labels), ~30 contacts with suppression states, an active 3-step campaign with 24 leads on a deterministic funnel and NOW()-relative sends including today, 14d campaign/warmup/daily stats rollups, a 13-message unified inbox that always resolves a dev-org sending mailbox, CRM pipeline with deals/tasks/notes/activity, reply templates, notifications, AI credit ledger history, and idempotent campaign logs Matthew Meszaros 2026-07-18 11:59:31 +02:00
  • ec53089232 feat: document the in-composer AI editing — selection-edit cost row in the AI credits guide, the unibox guide now covers the draft review bar (Keep/Adjust/Retry/Discard) and the Edit with AI selection pill, and the billing usage/transaction views label the new writing_edit reason Matthew Meszaros 2026-07-18 11:59:18 +02:00
  • c075a74ad5 feat: agent panel motion polish — streaming assistant text ends in a blinking caret, the Working indicator becomes a pulsing agent mark with shimmer text, user bubbles and tool-step chips spring in, done checkmarks pop, and the minimized dock's response-ready dot pings Matthew Meszaros 2026-07-18 11:57:37 +02:00
  • 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 Matthew Meszaros 2026-07-18 11:55:37 +02:00
  • 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 Matthew Meszaros 2026-07-18 11:30:07 +02:00
  • 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 Matthew Meszaros 2026-07-18 09:35:43 +02:00
  • 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 Matthew Meszaros 2026-07-18 09:20:24 +02:00
  • 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 Matthew Meszaros 2026-07-18 08:52:16 +02:00
  • 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 Matthew Meszaros 2026-07-18 08:42:08 +02:00
  • 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 Matthew Meszaros 2026-07-18 08:39:41 +02:00
  • 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 Matthew Meszaros 2026-07-18 08:12:05 +02:00
  • 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 Matthew Meszaros 2026-07-18 08:09:44 +02:00
  • 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 Matthew Meszaros 2026-07-18 08:06:26 +02:00
  • 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 Matthew Meszaros 2026-07-18 07:24:56 +02:00
  • 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 Matthew Meszaros 2026-07-18 05:42:50 +02:00
  • 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 Matthew Meszaros 2026-07-18 05:22:19 +02:00
  • 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 Matthew Meszaros 2026-07-18 05:18:24 +02:00
  • 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 Matthew Meszaros 2026-07-17 18:29:41 +02:00
  • 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 Matthew Meszaros 2026-07-17 18:29:06 +02:00
  • 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 Matthew Meszaros 2026-07-17 16:26:58 +00:00
  • 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 Matthew Meszaros 2026-07-17 16:26:50 +00:00
  • 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 Matthew Meszaros 2026-07-17 16:26:42 +00:00
  • 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 Matthew Meszaros 2026-07-17 16:26:30 +00:00
  • 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 Matthew Meszaros 2026-07-17 16:26:23 +00:00
  • 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) Matthew Meszaros 2026-07-17 16:26:14 +00:00
  • 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 Matthew Meszaros 2026-07-17 16:26:08 +00:00
  • 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 Matthew Meszaros 2026-07-17 18:18:29 +02:00
  • cd5e1e9cf7 Merge pull request #72 from warmbly/research/warmup-abuse-cold-effectiveness Matthew Meszaros 2026-07-17 05:29:58 +02:00
  • 3ea2831040 feat: annotate the research roadmap with the observe-only auth-state and watch-band cold-throttle work already shipped on this branch Matthew Meszaros 2026-07-17 03:24:18 +00:00
  • 8af92417bd feat: add authDomainOf unit test covering casing, whitespace, subdomains, and malformed addresses for the auth-check sweep domain extraction Matthew Meszaros 2026-07-17 03:23:46 +00:00
  • 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 Matthew Meszaros 2026-07-17 03:22:48 +00:00
  • 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 Matthew Meszaros 2026-07-17 03:21:29 +00:00
  • c96dc0b47a Merge pull request #71 from warmbly/mobile-half-frame Matthew Meszaros 2026-07-16 18:44:20 +02:00
  • 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 Matthew Meszaros 2026-07-16 18:43:11 +02:00
  • 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 Matthew Meszaros 2026-07-16 18:43:02 +02:00
  • 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 Matthew Meszaros 2026-07-16 18:42:51 +02:00
  • 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) Matthew Meszaros 2026-07-16 18:42:37 +02:00
  • 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 Matthew Meszaros 2026-07-16 18:42:27 +02:00
  • 5b7d29c766 Merge pull request #70 from warmbly/domain-inbox-placement Matthew Meszaros 2026-07-16 18:02:02 +02:00
  • 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 Matthew Meszaros 2026-07-16 17:55:34 +02:00
  • 26b0c47148 Merge pull request #69 from warmbly/dev-quick-start Matthew Meszaros 2026-07-16 09:54:39 +02:00
  • 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) Matthew Meszaros 2026-07-16 09:51:32 +02:00
  • 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 Matthew Meszaros 2026-07-16 09:51:32 +02:00
  • 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 Matthew Meszaros 2026-07-16 09:51:32 +02:00
  • 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 Matthew Meszaros 2026-07-16 09:51:32 +02:00
  • 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 Matthew Meszaros 2026-07-16 09:51:20 +02:00
  • b40148c482 Merge pull request #68 from warmbly/ai-platform Matthew Meszaros 2026-07-16 08:58:47 +02:00
  • 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 Matthew Meszaros 2026-07-16 08:57:19 +02:00
  • 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 Matthew Meszaros 2026-07-16 07:50:24 +02:00
  • 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 Matthew Meszaros 2026-07-16 07:50:24 +02:00
  • 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 Matthew Meszaros 2026-07-16 07:50:24 +02:00
  • 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 Matthew Meszaros 2026-07-16 07:25:08 +02:00
  • 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 Matthew Meszaros 2026-07-16 07:18:56 +02:00
  • 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 Matthew Meszaros 2026-07-16 07:18:56 +02:00
  • 602f0d2d0c feat: animate the notifications dropdown open/close with the house framer-motion pattern (AnimatePresence fade + 4px slide, 120ms) instead of popping in instantly Matthew Meszaros 2026-07-16 07:05:06 +02:00
  • 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 Matthew Meszaros 2026-07-16 07:02:38 +02:00
  • 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 Matthew Meszaros 2026-07-16 07:02:38 +02:00
  • 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 Matthew Meszaros 2026-07-16 07:02:38 +02:00
  • 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 Matthew Meszaros 2026-07-16 06:56:13 +02:00
  • 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 Matthew Meszaros 2026-07-16 06:52:30 +02:00
  • e87adf1251 feat: add agentMinimized and per-tab unseen state to agentSlice and make Cmd+I dock-aware (restores a minimized panel instead of closing it) Matthew Meszaros 2026-07-16 06:52:30 +02:00
  • a913e73837 feat: seed the sandbox org's AI-credit ledger (plan monthly allowance + a 5000-credit purchased top-up with idempotent grant transactions) so the assistant never reports out-of-credits in the demo; re-seeding refills both pools Matthew Meszaros 2026-07-16 06:52:30 +02:00
  • e64b0b161d feat: sweep stale OPENAI_API_KEY/AI_LOCAL_MODEL mentions out of comments, the provider-not-configured and warmup-admin error strings, env.example, and the deployment guide now that AI_* is the only config surface Matthew Meszaros 2026-07-16 06:39:07 +02:00
  • 29e3bb3a64 feat: drop the legacy OPENAI_*/ANTHROPIC_API_KEY/AI_LOCAL_MODEL env fallbacks (no prod deployments exist): AI_PROVIDER/AI_API_KEY/AI_MODEL/AI_BASE_URL/AI_FREE are the only AI vars, empty provider means openai, the anthropic preset and writing client key off AI_API_KEY, and the warmup Batch generator runs only when the selected provider is OpenAI Matthew Meszaros 2026-07-16 06:39:06 +02:00
  • d0e8daf763 feat: fix agent panel interaction bugs: stick-to-bottom scrolling with a Latest pill, per-tab drafts, IME-safe Enter, double-send guard, send lock during history hydration, inert+Escape when closed, autoresizing composer, editor-style tabs (middle-click close, active scroll-into-view, tablist a11y), focus management, memoized turns, centered transcript in expanded mode Matthew Meszaros 2026-07-16 06:28:29 +02:00