Skip to content

Events & Actions Syntax

Syntax patterns for event handlers and actions.

Event Handlers

API Event (Public)

flow
on :event_name from @actor (api)
  // actions

The (api) suffix marks this event as externally accessible (e.g., via HTTP endpoint).

Internal Event

flow
on :event_name from @actor
  // actions

Without Source Filter

flow
on :event_name
  // accepts from any sender

Actions

Actions are lines without prefix.

State Transitions

flow
order moves to #state
order transitions to #state
order enters #state
order becomes #state

Context Updates

flow
$variable becomes value
$variable: type becomes value
$variable increases by amount
$variable decreases by amount
$variable adds item
$variable removes item
$variable clears

Event Emission

flow
emit :event to @actor

emit :event to @actor
  with $var1, $var2

emit :event to @actor
  with:
    | field | value |
    | key1  | val1  |
    | key2  | val2  |

emit :event to @actor
  with:
    | field | type   | value |
    | key1  | string | val1  |
    | key2  | number | val2  |

Broadcasting Events

Send an event to all instances of a machine:

flow
// Basic broadcast
emit :event to all @machine

// With state filter
emit :event to all @machine in #state

// Multiple states
emit :event to all @machine in #state1, #state2

// With data
emit :event to all @machine
  with $var1, $var2

// Combined: state filter + data
emit :event to all @machine in #state
  with:
    | field | value |
    | key1  | val1  |

See Broadcasting Events for semantics and best practices.

Custom Actions

flow
send confirmation email
process the payment
validate cart contents
notify warehouse team

API Responses

Basic Reply

flow
reply STATUS with:
  | field | value |

reply STATUS MEANING with:
  | field | value |

Examples:

flow
reply 201 with:
  | id     | $order_id     |
  | status | current_state |

reply 400 bad request with:
  | error | "CART_EMPTY" |

Named Response

flow
reply STATUS with response_name

Example:

flow
reply 201 with order_created
reply 404 with order_error

Binding Transformer

flow
reply STATUS with ^transformer_name

Example:

flow
reply 200 with ^order_report

Nested Fields (Dot Notation)

flow
reply 200 with:
  | customer.name  | $customer_name  |
  | customer.email | $customer_email |
  | shipping.address | $ship_address |

Conditional Fields

flow
reply 200 with:
  | field    | value        | condition                   |
  | id       | $order_id    |                             |
  | tracking | $tracking_no | when order is in #shipped   |

Async Response

flow
reply STATUS async for :event_name:
  | field | value |

With options:

flow
reply 202 async for :generate_report:
  callback: webhook
  url: $callback_url
  | report_id | $report_id |

Async Callback

flow
send callback for :event_name:
  | field | value |

Example:

flow
send callback for :generate_report:
  | report_id | $report_id  |
  | status    | "completed" |

Named Response Definition

flow
response: response_name
  | field | from  |
  | key1  | val1  |
  | key2  | val2  |

Example:

flow
machine: @order

response: order_created
  | field  | from          |
  | id     | $order_id     |
  | status | current_state |
  | total  | $total        |

Scheduled Events

flow
on :event_name
  triggered: schedule expression

  for each item in #state
    ? guard condition
      // actions

Schedule Expressions

flow
triggered: every day at 00:00
triggered: every hour
triggered: every 30 minutes
triggered: every monday at 09:00
triggered: every month on 1st at 00:00

Data Tables

flow
table_name:
  | column1 | column2 | column3 |
  | value1  | value2  | value3  |
  | value4  | value5  | value6  |

With validation:

flow
with:
  | field | value | validation                       |
  | id    | $id   | required, string, valid uuid     |
  | count | $cnt  | required, number, greater than 0 |

Released under the MIT License.