Skip to main content
The agent’s plugin host runs an event bus. The host publishes vehicle and lifecycle events on it, and plugins publish their own events. This page covers the agent-side bus. For the methods a GCS half calls on Mission Control, see GCS bridge methods.

Published topics

These are the topics the host itself publishes: Topics are printable ASCII, at most 256 bytes. A subscription pattern can end in .* within your own namespace: plugin.<id>.* matches plugin.<id>.alert but not the bare plugin.<id>. Public host topics are subscribed by exact name.

Subscribe and publish rules

Subscribing needs event.subscribe, and the topic must be one of:
  • your own plugin.<id>. namespace;
  • one of the public host topics: vehicle.armed, vehicle.disarmed, vehicle.mode_changed, vehicle.battery_low, vehicle.geofence_breach, agent.ready, agent.shutdown;
  • a shared topic another plugin declares, when you also hold its subscribe_capability.
Publishing under your own plugin.<id>. prefix needs no capability. Reserved, never publishable: vehicle., mavlink., mission., safety., agent., swarm., gps., vision., telemetry., and any plugin. topic outside your own plugin.<id>. prefix or your declared shared topics. Other topics need event.publish. The host decides from the topic, not from what the plugin claims, and it stamps every event with the publishing plugin’s id. Topics are delivered verbatim; the host adds no prefix.

Telemetry

The Python ctx.telemetry.extend(channel, payload) adds a channel to the node’s heartbeat (gated on telemetry.extend). To read vehicle state, call telemetry.subscribe (gated on telemetry.read). The host pushes the newest vehicle-state snapshot as a telemetry.state event, at most 10 times a second. A node with no flight controller never fires it.
  • Rust: telemetry_subscribe(callback) on the SDK client.
  • Python: subscribe_telemetry() on the IPC client, an async iterator over the same telemetry.state snapshots. For individual MAVLink messages, use ctx.mavlink.subscribe (gated on mavlink.read). See MAVLink extensions.
A GCS half reads telemetry through ctx.telemetry.subscribe, gated on telemetry.subscribe or a per-topic telemetry.subscribe.<topic> grant. See Permissions.

Delivery and back-pressure

Each subscriber has its own queue, 256 events deep. Event payloads are capped at 64 KiB. The bus never blocks a publisher: when a subscriber’s queue is full, events are dropped for that subscriber and the host logs a warning. Treat live events as best-effort; if you need a complete record, persist from a recording instead. Do not block in an event handler. Hand work to a background task and return quickly:

Plugin-to-plugin

A plugin.* event reaches only its publisher unless the publisher declares it in agent.contributes.shared_topics. A shared topic lives under plugin.<leaf>., where <leaf> is the last segment of the publisher’s id, and names the capability a subscriber must hold:
subscribe_capability is either a catalog capability or one the publisher declares itself under agent.declared_capabilities (plugin.<leaf>.<name>). The publisher needs event.publish to publish a shared topic. A subscriber needs event.subscribe plus that capability. Shared topics match exactly: plugin.rangefinder.reading.x gains nothing from the declaration. Plugin topics are derived data on a sandboxed bus. Nothing on the bus commands the vehicle.

Next steps

MAVLink extensions

Read and write MAVLink, register components and re-publish decoded data.

Multi-component plugins

How agent events reach the GCS half.

Permissions

Every capability and its risk level.

GCS bridge methods

Events and RPC on the Mission Control side.
Last modified on October 11, 2026