Skip to content

Event bus topics ​

The topics protoAgent's core publishes, and the rules for subscribing to them. A plugin reacts to these with registry.on or sdk.react_on, and a console view through the view bridge.

The bus is the only inter-plugin channel — plugins publish topics as their public API and never import one another (ADR 0039). It is also ephemeral: a small ring buffer lets a reconnecting subscriber catch up via since, but there is no durable log. Persist what you need to keep.

Matching ​

Topics are dot-namespaced. A subscription pattern may use two wildcards:

PatternMatchesDoesn't match
#everything—
watch.*watch.metwatch.a.b
watch.#watch, watch.met, watch.a.bgoal.changed
watch.metexactly thatanything else

* matches one segment; # matches the tail. (Verified against topic_matches: watch.* vs watch.a.b → False, watch.# vs watch.a.b → True.)

Core topics ​

Generated by scanning every publish/emit call in the core packages, so this is what the runtime actually emits — not a list someone remembered to update. Payload keys are the union of what the emitting call sites pass; a key may be absent on a given event.

TopicPayload keysEmitted from
activity.messagecontext_id, error, origin, priority, role, state, stimulus, task_id, text, triggerserver/a2a.py
background.completeddescription, error, job_id, origin_session, result, status, subagent_typebackground/manager.py, server/a2a.py
background.progresserror, job_id, output, phase, task_id, tool, tool_call_idbackground/manager.py, server/a2a.py
background.starteddescription, job_id, origin_session, status, subagent_typebackground/manager.py
chat.progresssession_id, task_idserver/a2a.py
chat.resumederror, origin, session_id, state, task_id, text, triggerserver/a2a.py
fs.changedpaths, project, sourcegraph/fs_changes.py
goal.achieved / goal.failedcondition, evidence, reason, session_id, statusgraph/goals/controller.py
goal.changedsession_idgraph/goals/store.py
goal.iterationcondition, iteration, max_iterations, reason, session_idgraph/goals/controller.py
inbox.itemid, priority, source, textoperator_api/console_handlers.py
media.savedid, mime, plugin, urlgraph/plugins/registry.py
memory.hot_writtenchunk_id, preview, source, source_typeknowledge/store.py
model.fallbackfallback_index, fallback_model, primary_errorgraph/agent.py
persona.drift_detectedbaseline_id, baseline_saved_at, rationale, score, signals, thresholdserver/maintenance_loops.py
persona.untooled_action_detectedcount, findings, soul_revision, triggerserver/maintenance_loops.py
plugin.changedscopeserver/settings_apply.py
plugin.updatedby, id, reloaded, resolved_sha, versionserver/maintenance_loops.py
scheduler.completed(varies)server/a2a.py
scheduler.firedjob_id, prompt, schedulescheduler/local.py
turn.finishedok, origin, session_id, task_id, triggerbackground/manager.py, scheduler/local.py
turn.input_requiredcontext_id, prompt, task_idserver/a2a.py
turn.resumedcontext_id, task_idserver/a2a.py
turn.startedorigin, session_id, triggerbackground/manager.py, scheduler/local.py
turn.usagecontext_id, cost_usd, duration_ms, input_tokens, model, output_tokens, soul_rev, state, task_idserver/turn_telemetry.py
ui.navigateplugin, viewgraph/plugins/registry.py
watch.changedidgraph/watches/store.py
watch.expired(varies)graph/watches/controller.py
watch.met(varies)graph/watches/controller.py
watch.stalled(varies)graph/watches/controller.py
watch.value_changed(varies)graph/watches/controller.py

Publishing your own ​

registry.emit("created", {...}) publishes <your-plugin-id>.created — the namespace is forced, so a plugin can only publish under its own id. Declare your topics in the manifest (emits) so other plugins can discover the contract instead of reverse-engineering it, optionally with a payload schema (emits_schemas). Declarations are for discovery only — payloads are never validated at publish time.

Publishing is safe from any thread: an off-loop publish reroutes itself onto the bound event loop, so emitting from a sync middleware hook works. One exception — an off-loop publish before any loop is bound is dropped with a warning.

Related: Plugins ▸ Events · Plugin SDK · Lifecycle events

Part of the protoLabs autonomous development studio.