v37.0
NousResearch/hermes-agentv37.0Aug 6, 2026by pierre-b
AI Summary
Enhances segment and automation logic with negation, advanced filtering, and real-time counting, plus fixes a critical SQL injection vulnerability.
Key Highlights
- Goal conditions can now be negated (e.g., 'has not purchased').
- Filtering expanded to event properties, names, and custom event types.
- Segment editor now shows live counts while editing conditions.
- Security fix prevents SQL injection in segment/automation filters by binding JSONB keys.
New Features
- Negated goal conditions
- Advanced event property filtering
- Real-time segment counting
- SQL injection security patch
Full Release Notes
- **Feature**: Goal conditions can be negated. A segment or automation filter can now say "has **not** purchased in the last 30 days", which also matches contacts with no matching events at all. This was previously inexpressible: the condition compiles to an aggregate grouped by contact, so a contact with zero events produced no group and could never satisfy it — meaning a "count is 0" condition silently matched nobody, and comparisons like `sum ≤ 1000` silently excluded everyone who had never converted (#399). - **Feature**: Goal conditions can filter on the event name, the goal name and the event's own `properties` payload, instead of only the seven goal types. The goal-name filter was already supported by the API but had no input in the console (#399). - **Feature**: Contact datetime properties gain a "not in the last X days" operator. It deliberately includes contacts whose date was never set — someone who never converted has not converted in the last 30 days either — where a plain negation would silently drop them (#399). - **Feature**: The segment editor counts matching contacts while a condition is still open in its form, instead of only once it has been confirmed. The count refreshes on its own as the condition's inputs change, and keeps the last valid number on screen — dimmed — while a condition is too incomplete to be counted. - **Security**: Segment and automation conditions that filter contact-timeline events by a field value built their SQL by splicing the field name straight into the query text. A crafted `field_name` could close the quote and append arbitrary SQL, and the segment preview count turned that into a boolean oracle — any workspace member could read any table in their workspace database. JSONB keys are now bound as query parameters, and workspace migration v37 recompiles stored segment queries so already-saved segments are repaired without being re-saved.