/docs / workflows/events

Events

Events let one employee's work start another's. An employee announces that something happened; any workflow whose event trigger matches the name runs. Producers and consumers never need to know about each other.

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

EventWhen
assignment.done, assignment.blocked, assignment.failedAn assignment finishes, stalls or fails.
facts_changed, layers_changedCompany facts or the company layer change.
pack_installed, pack_updated, pack_removedA company-layer pack changes.
agent.installed, agent.updated, agent.uninstallingAn employee is hired, updated or removed.
account.connected, account.disconnectedAn 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.