Skip to content

Widget provider protocol#

A widget contributes typed metadata (or other observe-mode work) without owning the frontend. It is a genuine plugin category.

Transport#

WidgetService exposes only:

RPC Shape
GetCapabilities unary
Configure unary
Describe unary

There is no Attach stream. A widget that wants screen presence calls KernelCallbackService.PublishMetadata on the callback channel — the same path a tool provider uses for a status block. Observe-mode hooks remain available via HookSubscriberService for deriving what to publish.

Capabilities: config schema and supported hook points. There is no region list.

Screen presence#

Publish MetadataBlock values (metadata.v1) with a stable id per logical contribution. Upsert on change; call RetractMetadata (or rely on process-exit disconnect) when the contribution should go gray/disappear — the frontend maps Liveness.DISCONNECTED.

Interactive content#

Clickable transcript content remains ActionNode in a RenderTree (transcript surface). Activation is TriggerAction on the callback channel, not a widget stream. A widget that also needs an operator action SHOULD also be a tool provider (or emit an ActionNode via a tool/model render path), not invent a second action channel.

Error taxonomy#

WidgetError / WidgetErrorCategory on gRPC status details for Configure (and any future unary). REGION_UNSUPPORTED is retired. Remaining: RENDER_FAILED, UNKNOWN.