Matthew Meszaros
|
ea321ebefb
|
feat: put the AI edit's review selection back after React commits the value rather than before it, since React writes the textarea's value during commit and that write moves the cursor to the end, leaving the rewrite unselected and Undo's restored range never reaching the DOM, and strengthen the Undo test to assert the range a follow-up run targets instead of the restored value, which Undo sets regardless and which therefore pinned none of the behaviour the commit before it fixed
|
2026-09-11 22:22:55 -07:00 |
|
Matthew Meszaros
|
af7256ac85
|
feat: address the third review pass on the Edit with AI fix by recording the range a rewrite replaced instead of working it back out of the lengths afterwards, because the composer's body cap can cut the tail off what was written and the old arithmetic then reconstructed a range that was never selected, so Again re-sent the wrong words and Undo restored the wrong selection, with a test mounting the real textarea host against a small cap to pin both
|
2026-09-11 21:33:46 -07:00 |
|
Matthew Meszaros
|
069ab15194
|
feat: address the second review pass on the Edit with AI fix by reading a markdown destination with balanced parentheses so a link the model normalises out of the angle-bracket form it was given comes back whole instead of truncated at the first paren with a stray one left in the copy, restoring only spaces and tabs around the model's answer so a selection that ran to the start of the next paragraph joins the two the way a paste would rather than gaining a blank paragraph nobody typed, and capping the completion at a flat 4096 tokens, above the 3072 it was and below the smallest completion limit in common use, because a request over a backend's own cap earns a 400 naming max_tokens that openAIProvider.adaptParams latches for the life of the process and degrades every later call
|
2026-09-11 21:21:40 -07:00 |
|
Matthew Meszaros
|
1bdd1da800
|
feat: address the CodeRabbit review on the Edit with AI fix by leaving the caret after text written at a collapsed position instead of in front of it (an insertion maps to itself unless the position associates rightwards, so continuing to type went before the insert), splitting the model's blocks one separator at a time so a blank paragraph the author used as spacing survives a rewrite instead of being swallowed by a greedy newline run, carrying a link destination that holds a paren or a space through in markdown's angle-bracket form rather than dropping the link, putting the author's boundary whitespace back on the model's trimmed answer in both hosts so a selection ending on a space does not glue the rewrite to the next word and "did anything change?" compares exactly what was written, and sizing the completion cap from the passage's own rune count so an 8000-rune CJK body is not truncated by a cap chosen for English
|
2026-09-11 20:23:53 -07:00 |
|
Matthew Meszaros
|
6501cb599c
|
feat: fix the "Edit with AI" rewrite in the campaign body and the unibox composer for issue #432 by running /generation/edit on a new generation.BuildEditRules system prompt through AIProvider.Complete instead of the cold-outreach writer prompt that redefined the model's role, capped it at 80 words and imposed a five-part email skeleton on every instruction, raising the completion cap so a full-body rewrite is no longer truncated at 1024 tokens and counting the request limits in runes rather than bytes, carrying merge variables, AI blocks, conditionals, form links and link destinations through the round trip in web/src/components/app/ai/richTextPassage.ts instead of deleting every atom node via doc.textBetween, replacing the passage with paste semantics so a phrase rewritten inside a sentence stops splitting its paragraph into three, saying "No change" when the model hands the passage back untouched, and clamping the floating AI card to the surface it is editing so it no longer draws outside the step drawer over the flow canvas
|
2026-09-11 20:04:32 -07:00 |
|
Matthew Meszaros
|
a542bb2c9c
|
Merge pull request #427 from chrisedington/feat/cleanmylist-verification
Add CleanMyList email verification integration
|
2026-09-11 06:17:37 -07:00 |
|
Matthew Meszaros
|
a5b0e2c2f3
|
Merge branch 'main' into feat/cleanmylist-verification
|
2026-09-11 06:12:10 -07:00 |
|
Matthew Meszaros
|
87e3f7006d
|
Merge pull request #438 from warmbly/fix/scanner-timing-window
feat: operator-editable automated-engagement windows, and Barracuda in the scanner catalogue (#412 follow-up)
|
2026-09-11 06:09:06 -07:00 |
|
Matthew Meszaros
|
a8c66591ce
|
feat: correct the isInstant comment that claimed a backwards-skewed clock must not mark events human when the code does exactly that, describing the real behaviour instead: an event stamped before its dispatch means the clocks disagree, so the timing rule abstains and leaves the verdict to the user agent and source network
|
2026-09-11 06:04:38 -07:00 |
|
Matthew Meszaros
|
9698052569
|
Merge branch 'main' into feat/cleanmylist-verification
|
2026-09-11 06:03:55 -07:00 |
|
Matthew Meszaros
|
27c5df5072
|
feat: refuse a redirect that downgrades a verification request from https to http in both provider clients, since Go keeps the Authorization header across a redirect that stays on the same host and the pasted API key would go on the wire in the clear, and label the verification action from the connection id rather than the active provider, because a degraded connection reports the built-in checker while still being a connection to manage
|
2026-09-11 05:26:33 -07:00 |
|
Matthew Meszaros
|
6c6a0d1909
|
feat: record a verification provider's failure before marking its connection and serialize both health writes behind a per-connection gate, since the report is a database round trip and a check resolving alongside it compared itself against a failure that had not been cached yet, withdrawing a degraded state raised by a check newer than its own and leaving the connection healthy while the account was empty
|
2026-09-11 04:24:17 -07:00 |
|
Matthew Meszaros
|
2219d764cf
|
feat: stop the tracking window live tests from resetting the instance settings row they run against, snapshotting the real document and restoring it verbatim instead of writing defaults back, and assert the untouched click window against that snapshot rather than against the shipped default, which silently required the database to start at defaults
|
2026-09-11 04:15:19 -07:00 |
|
Matthew Meszaros
|
0e8a05b6df
|
Merge remote-tracking branch 'origin/main' into fix/scanner-timing-window
|
2026-09-11 04:02:06 -07:00 |
|
Matthew Meszaros
|
3bfbb75e8c
|
Merge pull request #435 from rocker1166/fix/invite-mismatch-and-inbox-actions
fix(invite, unibox): mismatched-session invite 403, thread header Archive/Delete/Unread that survives a sync, Add as contact, reply To seed
|
2026-09-11 03:58:24 -07:00 |
|
Matthew Meszaros
|
9f61d070d4
|
feat: give the unibox thread header a way back out of a filing mistake, with Undo on the Archive and Delete toasts, Move to inbox while reading the Trash or Archive folder, and the actions disabled while one is in flight, plus stop the invite page offering Accept before it knows which account the browser is signed in as
|
2026-09-11 03:23:23 -07:00 |
|
Matthew Meszaros
|
da4b89da0b
|
feat: split a unibox message's provider placement into its own provider_folder column (migration 000146) so Archive and Delete in the thread header survive the next sync without the sync losing the ability to follow a real provider move, and narrow PATCH /unibox/folder to inbox/archive/trash behind the unibox feature gate with an audit entry so the move reaches every teammate's list live
|
2026-09-11 03:23:19 -07:00 |
|
Matthew Meszaros
|
623dc7ec61
|
feat: rewind the cooldown deadline as well as the observation time in the exhausted-account test so it fails when the fifteen-minute hold regresses to the ordinary one-minute lookup cache rather than only when the cache stops being deadline-keyed, and ask again next to the write whether a verifier is already connected, since validating the pasted key is a round trip to the provider and is long enough for a second connect to pass the first check
|
2026-09-11 03:12:28 -07:00 |
|
Matthew Meszaros
|
80c3c79a31
|
feat: add live coverage that the machine windows survive the settings document's jsonb round trip and reach the classifier, a guard that every shipped scanner CIDR is written as its own network address since the loader truncates host bits silently, and correct the comments that claimed an edit lands on the very next event when the consumer reads through a thirty second cache in its own process
|
2026-09-11 03:11:35 -07:00 |
|
SUMAN JANA
|
727ddb1482
|
feat: wire the unibox thread header's Mark as unread, Archive and Delete to a new PATCH /unibox/folder, add an Add as contact action for senders outside the CRM, and replace six private From-header parsers with one shared lib/helper/emailAddress that also understands the parenthesised form the IMAP sync stores, which left the reply composer's seeded To failing its own validator
|
2026-09-11 03:10:18 -07:00 |
|
SUMAN JANA
|
73f6bff2ed
|
feat: stop a browser signed in as someone else from being offered Accept on an invite it cannot accept, comparing the signed-in address with the invited one on the invite page and offering Switch account instead, and naming both addresses in the backend's 403 so the cause is visible
|
2026-09-11 03:10:18 -07:00 |
|
Matthew Meszaros
|
c115b44d33
|
feat: correct the docs wording for the automated-engagement windows so the API reference and the campaigns guide name the dispatch-to-worker clock rather than the send, and describe the click window as independently configurable with thirty seconds as its default rather than as a fixed relationship to the open window
|
2026-09-11 03:02:58 -07:00 |
|
Matthew Meszaros
|
4d0f0fb6b6
|
feat: hold an exhausted verification account that publishes no balance for a cooldown instead of re-deriving its health from an account check that cannot see exhaustion, since CleanMyList answers GET /v1/jobs identically whether or not there is allowance left, so the minute-long lookup cache retired every observed 402 and put the whole next batch back on doomed paid calls while Settings reported the service as healthy, and refuse a second verification connection while one is connected rather than letting creation order silently move every check onto a different bill
|
2026-09-11 02:57:08 -07:00 |
|
Matthew Meszaros
|
184a3dc08e
|
feat: make the automated-open and automated-click windows operator-editable under Instance settings and raise their defaults to 60s and 30s, because the ten-second window was anchored on dispatch to the worker rather than on delivery and routinely expired before the recipient-side gateway it was meant to catch had even seen the message, and add Barracuda's published Email Gateway Defense blocks to the scanner catalogue with Proofpoint, Mimecast and Cisco shipped commented out because browser isolation renders a clicked page from the vendor's own network
|
2026-09-11 02:53:34 -07:00 |
|
Matthew Meszaros
|
170c33780a
|
feat: pass ui_host to PostHog in the dashboard, admin panel and marketing site from its own environment variable so a proxied api_host stops breaking toolbar and session-replay links, which the SDK builds against whatever it sends events to and which a reverse proxy does not serve, defaulting to us.posthog.com so an install that does not proxy is unaffected
|
2026-09-11 11:34:02 +02:00 |
|
Matthew Meszaros
|
1866c45c67
|
feat: serve a PostHog reverse proxy at /ingest on the backend so the dashboard, admin panel and marketing site can report analytics and errors through this instance instead of posthog.com, which content blockers drop for a large share of visitors, splitting asset traffic to the bundle host because sending it to the ingestion host 404s, withholding the caller's cookies and Authorization from a third party, and preserving the trailing slash that path cleaning removes and PostHog's capture endpoint needs
|
2026-09-11 06:02:21 +02:00 |
|
Matthew Meszaros
|
853afe458e
|
Merge pull request #430 from warmbly/fix/bootstrap-and-tracking-domain-check
fix: two aws-bootstrap defects, and a check for tracking on your own brand
|
2026-09-10 20:29:46 -07:00 |
|
Matthew Meszaros
|
947ba4f2d0
|
Merge pull request #429 from warmbly/fix/rds-tls-verification
fix: sslmode=verify-full against RDS could never have worked
|
2026-09-10 20:29:35 -07:00 |
|
Matthew Meszaros
|
62903b3806
|
Merge pull request #428 from warmbly/fix/tracking-rustls-provider
fix: the tracking service panics on its first TLS connection
|
2026-09-10 20:29:23 -07:00 |
|
Matthew Meszaros
|
eb21d978a8
|
feat: stop aws-bootstrap from treating a bucket that exists in another region as done, since head-bucket answers globally and a second region silently kept its blobs in the first, stop it printing the database master password to stdout where a terminal, a CI log or an agent transcript keeps it forever, and add an instance check that reports a tracking domain sharing a registered domain with the product's own URLs
|
2026-09-11 05:24:57 +02:00 |
|
Matthew Meszaros
|
a962683511
|
feat: ship AWS's RDS truststore in the backend and consumer images and point the docs at it, because Amazon RDS chains to a root that is in no public trust store so the sslmode=verify-full those docs recommended failed every connection with x509 certificate signed by unknown authority, while deliberately not setting PGSSLROOTCERT by default since an RDS-only store would break a Postgres fronted by a public CA
|
2026-09-11 05:23:23 +02:00 |
|
Matthew Meszaros
|
e7f25890d2
|
feat: install the ring crypto provider at tracking startup so the service can open a TLS connection at all, because rustls 0.23 refuses to choose when both aws-lc-rs and ring are in the tree and panics at the first handshake, which took the whole service down the moment it pointed at a tls:// bus and which plaintext local development never reveals
|
2026-09-11 05:19:52 +02:00 |
|
Chris Edington
|
59122e6c8a
|
feat: add CleanMyList contact verification with API key setup and built-in fallback
|
2026-09-10 20:06:29 +01:00 |
|
Matthew Meszaros
|
1260dff108
|
Merge pull request #426 from warmbly/feature/posthog-error-tracking
feat: PostHog error tracking across every runtime, Sentry kept as an option
v0.4.4
|
2026-09-10 10:28:28 -07:00 |
|
Matthew Meszaros
|
a84ab48729
|
Merge branch 'main' into feature/posthog-error-tracking
|
2026-09-10 10:25:21 -07:00 |
|
Matthew Meszaros
|
3bd9d2a1d7
|
Merge pull request #424 from warmbly/feature/issue-421-implementation
feat: locate every spam-check issue in the subject or body, and analyze campaign copy with AI
|
2026-09-10 10:18:10 -07:00 |
|
Matthew Meszaros
|
84a0ca0b29
|
feat: correct the noteStep guidance comment to match what the callers actually pass, a bounded route pattern rather than a fixed phrase, so the rule a future caller reads is the rule the trail is built on
|
2026-09-10 19:16:13 +02:00 |
|
Matthew Meszaros
|
79127c345d
|
feat: drop a nil error and an empty message at the errs boundary instead of turning them into an issue with nothing in it, which the Sentry SDK used to swallow on its own and the PostHog one would have captured as a titleless exception
|
2026-09-10 19:15:21 +02:00 |
|
Matthew Meszaros
|
2ff350ecf9
|
feat: apply WARMBLY_POSTHOG_ERROR_TRACKING to the public form pages too, by having cmd/forms stamp an empty browser key when it is false, since the page can only act on whether a key arrived and the flag otherwise silenced the dashboard and the admin panel while leaving form pages reporting
|
2026-09-10 19:14:34 +02:00 |
|
Matthew Meszaros
|
f8625b085a
|
Merge remote-tracking branch 'origin/main' into feature/issue-421-implementation
|
2026-09-10 10:12:04 -07:00 |
|
Matthew Meszaros
|
ced741e352
|
feat: make PostHog the default error tracker across every runtime while keeping Sentry fully supported alongside or instead of it, by turning internal/observability/errs into a two-sink fan-out with a local-log fallback, adding $exception capture to the Go services, the Rust tracking service, the Elixir realtime service and the dashboard, admin and form apps, reporting gin panics with their route, request id, workspace and user, attaching that identity plus a route and failed-request trail to browser exceptions, and wiring POSTHOG_ERROR_TRACKING, the node join env, compose, source-map upload and the docs to match
|
2026-09-10 19:11:32 +02:00 |
|
Matthew Meszaros
|
abe9800d5b
|
Merge pull request #425 from warmbly/fix/dockerfile-cache-mount-ids
fix: name every BuildKit cache mount so the images build on hosted builders
|
2026-09-10 10:09:33 -07:00 |
|
Matthew Meszaros
|
4b93e849a1
|
feat: drop the occurrence struct left behind in the round-robin span emitter, which the map of per-term span lists replaced before it was ever used and which golangci-lint's unused check does not flag for an unreferenced type
|
2026-09-10 10:07:18 -07:00 |
|
Matthew Meszaros
|
512451c8d6
|
feat: give every BuildKit cache mount an explicit id so the Dockerfiles build on hosted builders that reject an unnamed one, which is what stopped the backend, consumer, worker, forms, cli, updater and tracking images from building on Railway with 'flag --mount=type=cache is missing an id argument'
|
2026-09-10 19:05:01 +02:00 |
|
Matthew Meszaros
|
77dfefcf88
|
feat: give every occurrence of a repeated trigger term its own span rather than only the first, since pointing at one 'free' out of three sends the writer back to hunt for the other two on the next re-check, and emit the spans round by round so every term shows once in every half before any shows twice, because the list is capped for display and a word written twenty times would otherwise fill it and hide the other terms that are also wrong
|
2026-09-10 10:01:57 -07:00 |
|
Matthew Meszaros
|
d51de7db3a
|
feat: address the CodeRabbit review by quoting a fragment in the copy's own casing rather than the model's retyping of it, extracting the case-fold offset map into internal/pkg/casefold so the AI half gets the same Unicode safety the rules half has, giving a trigger term a span in each half it appears in instead of losing the second one to deduplication, scanning subject links before body anchors so the display cap cannot drop the subject's own, requiring WRITE_TEMPLATES on the credit-spending analyze route so a read-only key cannot spend the workspace balance, refusing to tell a customer their credits came back when the refund is what failed, and no longer letting a stale analysis retire the newer rules request that was about to replace it
|
2026-09-10 09:50:28 -07:00 |
|
Matthew Meszaros
|
5411b1033c
|
feat: say in the analyze endpoint reference that a finding's category is absent when the model named something outside the documented set, matching the enum the response is now held to
|
2026-09-10 09:29:35 -07:00 |
|
Matthew Meszaros
|
e7b9491975
|
feat: drop an AI finding's category when the model returns one outside the closed set the API documents, so a client validating the response against that enum is never handed something outside it, and correct the parse comment that still described an unreadable response as falling back to the rules pass when Analyze now refuses it and refunds
|
2026-09-10 09:28:00 -07:00 |
|
Matthew Meszaros
|
9f2ddc218c
|
feat: correct the content-check guide to describe the badge the editor actually renders, which names both halves when the wording straddles them rather than carrying a line number the rules pass never puts there
|
2026-09-10 09:28:00 -07:00 |
|
Matthew Meszaros
|
427c9ce27c
|
feat: pin the invariant the trigger-span offset map rests on, that foldIndex folds byte-for-byte identically to strings.ToLower and lands every recorded offset on a rune boundary, across Turkish dotted I, the Kelvin sign, ligatures, titlecase runes and invalid UTF-8 where a bad byte becomes a three-byte replacement rune
|
2026-09-10 09:28:00 -07:00 |
|