Announce an event
List the events a workflow announces in its emit field, and connect the activity that
announces them to __emit__. That activity is told to call the emit_event tool when it finishes.
"weekly-report": {
"trigger": { "type": "schedule", "cron": "0 16 * * 5" },
"activities": [ { "id": "write", "intent": "Write the weekly revenue report." } ],
"connections": [
{ "from": "__trigger__", "to": "write" },
{ "from": "write", "to": "__emit__" }
],
"emit": ["report.ready"]
} Any activity can also announce an event directly. emit_event is available in every
workflow step.
emit_event(source: "report.ready", payload: { "period": "2026-W39", "total": 18250 }) Nebo adds a producer field to the payload, and sets the event's origin to the session
that emitted it.
How event names are formed
Write the short name, such as report.ready. Nebo prefixes it with the producing
employee's slug, so an event from the bookkeeper becomes bookkeeper.report.ready. A
name that already contains the slug is left alone, and company events keep their bare names.
React to an event
"review-report": {
"trigger": { "type": "event", "sources": ["bookkeeper.report.ready"] },
"activities": [ { "id": "review", "intent": "Review the report in _event_payload and flag anything unusual." } ]
} Sources match exactly or with a trailing .*, such as bookkeeper.*. The run
receives _event_source, _event_payload and _event_origin. A payload of 8 KB or more is shortened to its scalar fields, keeping
email headers and attachment references.
Built-in events
| Event | When |
|---|---|
assignment.done, assignment.blocked, assignment.failed | An assignment finishes, stalls or fails. |
facts_changed, layers_changed | Company facts or the company layer change. |
pack_installed, pack_updated, pack_removed | A company-layer pack changes. |
agent.installed, agent.updated, agent.uninstalling | An employee is hired, updated or removed. |
account.connected, account.disconnected | An account is connected or disconnected. |
neboai.<topic>, neboai.channel, neboai.agent_space.<slug> | Messages from NeboAI. |
Plugin events
A watch trigger with an event emits each line of the plugin's watcher as <plugin>.<event>, such as notes-sync.note.created, so other
workflows can subscribe with an event trigger. Plugins declare their events in plugin.json; see the plugin.json reference.