Skip to main content
This page is the complete surface of the evoX plugin protocol: events coming from the host to the plugin and host-RPC calls going from the plugin to the host. All names are the real contract in @evox/plugin-protocol; the renderer/plugin payload is not authoritative, identity and context are derived by the host.

Contract rules

  • Each binding instance is valid only for its own bindingInstanceId context. A display call after action.willDisappear is rejected with CONTEXT_EXPIRED.
  • The host-assigned session.plugin.pluginId is the only authoritative identity; no other identity is selected through an event/RPC payload.
  • RPC calls require a capability. A call that is not declared/granted returns CAPABILITY_DENIED (see Capability APIs).
  • Error behavior is fail-closed; for codes see Error codes.

Received events (host → plugin)

Registered with client.on(<event>, handler). Handlers must be registered before the client.start() handshake.

Plugin lifecycle

Device

Action binding

Every event carries actionId and bindingInstanceId in event.context. An actionId the plugin does not recognize must be ignored.

Host-RPC calls (plugin → host)

Called through the SDK client; each returns a Promise and fails closed.

Key/screen display — key.display capability

Raw file paths or external URLs are not accepted.

Settings persistence

Every key you write must be declared in the manifest’s settings schema: the action’s settingsSchema for a call with a context, the plugin-wide settingsSchema for a call without one. A request containing a key that is not declared in the schema is rejected with INVALID_REQUEST (SDK 0.2.0 behavior change; the binding level now follows the same rule as plugin-wide settings). An attempt to write a secret or oauth field through this path returns CAPABILITY_DENIED.
Do not write tokens/passwords/client secrets into normal settings. Use the secret/OAuth APIs for credentials.

Plugin-scoped storage — storage.private capability

Network and credentials — network.fetch / secret.manage / oauth

System and advanced surface

The following calls are defined in the protocol and capability-protected; without a separate SDK shortcut method, they are used through the generic client.request(<rpc>, params) path. Each requires the related permission to be declared in the manifest and a host/user grant.
input.*, clipboard.* and profile.* are high-impact surfaces: they are default-deny, declare them with a narrow scope; in T2 they do not work without a user grant.

Notes

  • This reference reflects the current protocol version; capability names and limits are normative on the Capability APIs page.
  • For the public distribution boundary and T1/T2/T3 differences, see Trust tiers and Distribution status.