Declaring one
The floating button
Bottom-right corner, no bar, no background — and deliberately self-contained: an almost-opaque dark pill with its own hairline and shadow, so it stays readable over anything you render, white or black. Three consequences for your layout:- Keep roughly 150×44 px of the bottom-right visually quiet. Kit-built
cards do this automatically (
mode: "confirm"reserves the space); in hand-rolled HTML, leave the padding yourself. - There is no Cancel button. Declining stays on the notch’s normal paths — saying “no”, or dismissing the card. Don’t draw your own cancel affordance; it wouldn’t do anything.
- The corner is cut for you. Confirmations render edge to edge and the
surface rounds them, so anything you paint to the card’s own edge must use
border-radius: var(--k-radius)— see The corner.
Per-invocation values: args
A confirmation is static manifest markup, but it confirms a specific call. The
bridge solves this: a confirmation widget’s init message carries the pending
tool-call arguments.
data-voiceos-key="argName" (or built with vField) receives that argument’s
value on load.
Letting the user edit
Inputs stage edits back through the bridge:textField in a declarative card. Keys must name
properties of the tool’s inputSchema; values are capped at 16 KB.
A worked example
The kit makes the whole thing a few lines — build the card at authoring time, paste the output into the manifest (the Studio does exactly this):Bridge reference
Every message, cap, and validation rule on the wire.

