Register handlers for model-emitted $action payloads and dispatch them from interactive generative UI components.
API Reference
ActionDispatchContext
Context handed to an ActionHandler when an $action fires.
ActionDispatchContextpayload: ActionThe action payload. For fire-and-forget actions this is the `$action` as the model emitted it. For interactive components (`Select`/`Input`/ `DatePicker`) the user's runtime input is merged in under the reserved `$input` key, so the handler sees both the model payload and what the user did; a model-supplied `value` field is never clobbered.
type: string
ActionHandler
Resolves a single $action.type. Fire-and-forget actions return void or a
promise that resolves to it; human-in-the-loop actions return a value the
runtime uses to resume the run (see IR doc Open question #2 — the resume
value is left as unknown and documented per-action). The return value is
handed back to dispatch's caller as unknown.
type ActionHandler = (
ctx: ActionDispatchContext,
) => unknown | Promise<unknown>;ActionRegistry
The host-provided map from $action.type to ActionHandler. This is
the single dispatch target for $action on web, shared by the model
present renderer, the synthetic present produced from A2A/A2UI, and the
decoded block_actions from Slack. Construct it with
createActionRegistry and pass it to JSONGenerativeUI.
ActionRegistrydispatch: (action: Action) => unknownhas: (type: string) => boolean
createActionRegistry
createActionRegistryhandlers: Readonly<Record<string, ActionHandler>>
emptyActionRegistry
A no-op registry used when no handlers are provided. Dispatch resolves to
undefined and logs a warning in dev for unknown types, so a model-emitted
action with no handler degrades to "does nothing" rather than throwing.
const emptyActionRegistry: ActionRegistry;