- Don't trim whitespace on input to has_pattern test
- Fix migration of the @step.attacthments array in legacy expressions
- Merge result infos by key so caller doesn't have to know how to do that
- Fix migration of datetime + time in legacy expressions
- Fix migration of legacy flows that don't have entry set
- Change random router to return raw random value as result value
- Return results as list of name/key objects during flow validation
- Order nodes by y during flow migration
- Convert attachment URLs to absolute during flow migration
- Migrate name only legacy label and group references
- Add more tests for has_pattern
- Fix tests
- Flow name shouldn't be required (matches any other asset type)
- Use presence of flow_type to determine if flow is in legacy format and handle legacy flows with missing metadata section
- Allow flow validation without assets
- Store a map of result keys to result names in a validated flow definition
- call_resthook action should generate result even if there are no subscribers
- If a resthook call returns a success and a 410, use the success as the result
- Validating flow should add dependencies and result_names to definition
- Rework flow validation so dependency checking happens centrally and not in each action
- Add util methods for enumerating and rewriting templats in group and label references
- Allow conversion of numbers to times
- Migrate datetime+time to a minutes addition expression
- Add tools.RefactorTemplate and tools.FindContextRefsInTemplate
- Fix title to work with text which is uppercase
- Change implementation of remove_first_word so that punctuation is preserved
- Anything + TIME should migrate to replace_time(..)
- Fix migration of datevalue+time
- length(nil) == 0
- Arrays should stringify as CSV
- Maps should stringify as new line separated key: value pairs
- Wrap results of date arithmetic in format_date
- Fix calling length on a complex object that needs to be reduced
- Fix migration of DAYS()
- add accessor for msg in MsgResume
- DATEVALUE should migrate to date() so it returns a date rather than a datetime
- Add date() conversion function
- Change datetime_from_parts to date_from_parts
- fix resolving @parent or @child when they are nil
- Add utils.Date and types.XDate
- Don't localize fields not localized in legacy engine
- Rework time parsing to accept hour only and more ISO8601 formats
- allow single tls renegotiation
- Allow looping back into a flow that wasn't started in this sprint
- Rename from_epoch to datetime_from_epoch
- Add time functions and has_time router test
- Remove support for .0 indexing in excellent
- Remove gomobile dependency
- Don't treat identifiers as special case, parse them like all other expressions
- When migrating expressions like flow.2factor, wrap non-name keys in ["..."]
- Add better flow spec version handling and ability to peek at definitions to determin if they are legacy
- Don't fake an ignored response body but record it in the event as ignored
- If a webhook call doesn't return a content-type header, try to detect type
- Verify parsed numbers in has_phone are valid
- update contact PreferredChannel and PreferredURN to resolve first sendable destination
- add country to mobile.NewEnvironment
- move NewSession and ReadSession into Engine
- engine.EngineBuilder -> engine.Builder because gofmt doesn't like stuttering
- remove webhook mocking and reading engine coonfig from JSON
- Fix migration of weekday() to add 1
- Add resthook_called event
- simplify reading environments from JSON
- rename .Environment() to .Build()
- Add max_value_length to environment and apply in name and field change modifiers
- Add type to sessions (the type of the flow it was triggered with)
- Update modifier loading so missing assets are reported
- Remove logrus logging
- Rework all session objects to record missing assets
- Ensure error events are logged to sprint as well as run
- Include status code in webhook events
- Fix renderEventDoc to properly render JSON in markdown
- Add full constructor for sprint
- Remove flow server components which are no longer used
- Simpler trigger constructors
- Fix unmarshalling legacy say actions
- New IVR events
- Fix time-filling bug
- Convert to go module to be used as library
- Migrate api actions so that URL expressions are wrapped in url_encode()
- Don't url encode msg attachment expressions automatically
- Fix not being to read contact_field_changed events where value is null
- Add default country to environment and use for has_phone tests
- Fix add_contact_urn so that URN is normalized and trimmed before being added
- Fix legacy_extra so it can handle root-level arrays
- Replace contact_urn_added event with contact_urns_changed and fix tracking of channel affinity on URNs
- Fix not supporting dymnamic groups based on name
- Change send_msg to always send a message even if it can't resolve channel/URN
- Fix 410 resthook response becoming result with no category
- Switch to codecov
- Validate all flows which are referenced in the current flow
- Use new status of subscriber_gone when resthook call returns 410
- Require exit UUIds to be unique across the entire flow
- Improve number parsing
- Move input from run to session
- Make contact.name .language .timezone omitted in JSON when empty
- Make contact.created_on required
- Simplify un/marshaling of typed objects
- Allow waits to skip themselves, and have the msg wait skip itself if it's the first thing after a msg trigger
- Improve flowrunner cmd to display more event types
- Add new terminal option to start_flow actions
- Ensure arguments to date router tests are migrated
- Create new static asset source type for simpler testing
- Add channel event trigger type
- Rework transferto action to generate result like a webhook call
- Add results from run summary on flow_action triggers to @legacy_extra
- Fix migration of @flow by itself
- Fix migration of calls to HOUR(...)
- Support formatting/parsing of decimal values with configurable digit separators
- Re-evaluate and correct contact groups at the start/resume of a session
- Add run.modified_on
- Change sigature of ReevaluateDynamicGroups to not require a session
- Fix language selection for flow localization
- Fix run expirations
- Rename webhook_called.time_taken -> elapsed_ms
- Replace caller events with resumes
- Record time taken in webhook_called events
- Only generate a contact_field_changed event if a value has actually changed
- Fix blowing up when contact doesn't have a value for a contact field
- Add missing regex_match func and migration of string literals in legacy flows
- Allow contacts to be loaded in a mode that ignores missing groups or fields
- Disallow creating contacts with empty field values
- Generate a JSON listing of functions
- Cleanup field value code so that we no longer need empty values
- Fix group reevaluation when contact has no value for a text field
- Cleanup function docstrings and fix from_epoch
- Use default value for router on migrated webhook ruleset in case resthook didn't have any subscribers
- Add resthook slug to webhook_called events if it exists
- Generate a groups changed event when dynamic groups are re-evaluated
- Contact field changed events should have the entire value objects
- Non-caller events should only ever be added to runs and not applied
- Merged contact_groups_add/removed into contact_groups_changed
- Only generate events when state has actually changed
- Move event functiionality into the actions that generate them
- Use result name when populating @legacy_extra instead of just .webhook
- Remove Connection Error as a separate exit for webhook routers
- call_webhook and call_resthook now save a result and run.Webhook is removed
- @input and @results as shortcuts to @run.input and @run.results
- Router tests can now return extra to be added to the result
- Remove "Connection Error" as a separate exit for webhook routers
- call_webhook and call_resthook now save a result and run.Webhook is removed
- @input and @results as shortcuts to @run.input and @run.results
- Router tests can now return extra to be added to the result
- Adds @legacy_extra to context to mimic @extra in legacy flows
- Fix determining whether asset serversource supports a particular type
- Fix parsing of numbers when string contains uppercase letters
- Fill in current time when parsing dates during tests
- Add ui config options for composed split migrations
- Great assets refactor
- Replicate channel matching logic from RP
- Don't strip URN params when parsing
- Migrate legacy webhook calls to POST if they don't have a method set
- Simplify string tokenization and add more tests
- Fix message attachment expressions not being URL encoded
- Fix parsing of locations
- Small refactor of how we migrate rules to cases/exits that fixes an ordering bug and add option to not collapse exits
- Fix sentry integration
- Fix FIELD() blowing up when using space as separator
- Documentation improvements and make language required in flow definition
- Add flow type and validate that actions only occur in supported flow types
- Fix scanner treating parentheses inside string literals as expression boundaries
- Fix not correctly scanning excellent identifiers followed by periods
- Add migrate tab to flowserver index page for easy flow migration testing
- Refactor assets functionality
- to_epoch() becomes epoch() and returns fractional seconds
- Improved docuentation
- Add Heroku deployment support
- Wrap multiple asset responses in a results object
- Update UI node type names
- Add all trigger types to docs so that we test parsing of the examples
- Add campaign as a trigger type
- Improve error messages when trigger can't be read due to asset load failure
- Migrate flows individually
- Rework assets so whether or not they are managed as sets is configured at the type level
- LocationHiearchy assets should be managed like a set like other asset types
- Migrate empty flows
- TransferTo airtime transfer action
- Simplify server handler methods and improve validation errors involving fields on composed types
- Dynamic type for actions, events, routers etc
- Make func names more consistent and implement same typing system for waits
- Tweak resthook_called events so the event itself has status=success for HTTP 410 responses
- Migrate ruleset_types to editor types in _ui
- Use a sequential time source for flow tests instead of replacing time values with placeholders
- Add call_resthook action type and migrate from legacy resthook rulesets
- Improve error message when switch router test function returns error
- Add support for making expressions evaluate to themselves on error
- Migrate "" escape sequences in string literals in legacy expressions to "
- Add support for \n " sequences in Excellent string literals
- Add format_date function which only takes date (non-time) formatting chars
- Fix encoding of contact name in webhook payloads
- Fix logging of panics to sentry
- Encode spaces as %20 in URL expressions
- Match legacy behavior for @contact
- Add proper migrations for when word_* functions have final by_spaces param, and also collapse decremented values if they are literals (e.g. 2- 1)
- Update word(), word_slice() and word_count() to take a final optional param called delimiters
- Don't throw validation error if add_input_labels or add_contact_groups has zero groups/labels
- Don't log 400 responses to sentry
- Migrate expressions in webhook header values
- Allow dynamic searches to query language and created_on
- Expose contact.created_on in expressions
- Migrate rulesets where there is an explicit Other category
- Fix @contact.id not being migrated in legacy flows
- Migrate @contact. expressions to @(format_urn(contact.urns.)) so there's no error if such a URN doesn't exist
- Fix not saving a result when router takes default exit
- Merge pull request #308 from nyaruka/mock_webhooks
- Add webhook mocks to engine config and check when making webhook calls if there is a matching mock
- Fix migration of @extra.flow in legacy expressions
- Fix mapping of @flow.contact in legacy expressions
- Don't log errors twice
- Add all_groups flag to remove_contact_groups action
- Add sentry for reporting errors
- Fix migrating legacy @flow.foo.text/time expressions
- Handle legacy flows where things which are supposed to be translation dicts aren't
- Expose flow.revision in context and webhook payloads
- Fix panic when field value is nil
- Implement redacting URNs
- Add numeric ID to contacts
- run.input.text should be optional
- Allow webhook calls to be mocked and add tests
- Don't blow up if legacy stickies have floating point positions
- Update CLEAN() to match legacy behaviour
- More fixes when evaluating migrated legacy template tests
- Drop requirement for input.uuid to be a valid UUIDv4 since it comes from msg.uuid which isn't always valid UUID4
- Improve parser error messages and add tests for error messages
- Update to latest gocommon which fixes tel URN which are shortcodes failing validation
- Empty/blank values should clear name/fields/language/timezone
- Split SetContactAProperty into new actions for name, language and timezone
- Improve error messages from struct validation
- Result input should be nullable if there is no input
- Timeout rule should use timeout as value
- Result input should be nullable if there is no input
- Fix HasWaitTimedOut test
- Waits should retain their timeout value
- Use fuzzy number parsing for tests, stricter for type conversion
- Migrate endpoint of flowserver can take include_ui param
- Add migration of notes
- Include contact name on migration of contact references
- Fix goreleasing from travis
- Migrate contact.groups to be a CSV list
- Support channels with UUIDs which aren't UUID4
- Migrate templates in legacy HasState and HasWard tests
- Fix migration of has_email tests
- Add JSON util functions for marshalling without HTML escaping
- Add support for searching for locations by path
- Router test docstring examples should always include use of .match
- Use left,top instead of x,y