Rewrite a plain condition tree into the wire format every HTTP Forest agent parses, whatever its
generation. Three differences from the canonical in-memory shape, each measured against
forest-express-sequelize 9.6.10 and forest_liana 9.21.0:
operators are snake_case: a v1 liana answers NoMatchingOperatorError on Equal, and the v2
agent accepts either spelling because it PascalCases what it receives
(agent/src/utils/condition-tree-parser.ts)
aggregators likewise: and, not And
every leaf carries a value key even when its operator takes no operand, or a v1 liana answers
InvalidFiltersFormat. The toolkit's validator allows null for exactly those operators
(MAP_ALLOWED_TYPES_FOR_OPERATOR_CONDITION_TREE), so the key is safe on both generations.
A branch is recognised before a leaf: a node carrying both conditions and field is ambiguous,
and reading it as a leaf would forward its conditions untouched.
Rewrite a plain condition tree into the wire format every HTTP Forest agent parses, whatever its generation. Three differences from the canonical in-memory shape, each measured against
forest-express-sequelize 9.6.10andforest_liana 9.21.0:NoMatchingOperatorErroronEqual, and the v2 agent accepts either spelling because it PascalCases what it receives (agent/src/utils/condition-tree-parser.ts)and, notAndvaluekey even when its operator takes no operand, or a v1 liana answersInvalidFiltersFormat. The toolkit's validator allowsnullfor exactly those operators (MAP_ALLOWED_TYPES_FOR_OPERATOR_CONDITION_TREE), so the key is safe on both generations.A branch is recognised before a leaf: a node carrying both
conditionsandfieldis ambiguous, and reading it as a leaf would forward its conditions untouched.