Widgets that act: a button or form the agent scaffolds for you — click it, and it dispatches a parameterized prompt back to the agent.
Part of the Modular Dashboard roadmap — see the tracker #101136 (Flagship section). Builds on Wave 1 (#101093; PRs #101094 / #101097 / #101098).
Problem
The dashboard can show everything but the operator still has to walk to chat to do anything. The safe dispatch primitive already exists — the sandbox bridge's sendPrompt shipped in #101098 (capability-gated, operator-confirmed, rate-limited) — but there's no first-party widget that turns "a recurring operation" into a button.
What this adds
How it'd be built
A new builtin via BUILTIN_WIDGET_RENDERERS (ui/src/lib/dashboard/widgets/index.ts) + BUILTIN_KIND_PATTERN (extensions/dashboard/src/schema.ts). Submit routes through the same confirm + rate-limit path as the bridge's sendPrompt (ui/src/components/dashboard-custom-widget.ts wires it today; the builtin host reuses that path) — no new dispatch privilege. Templates are part of the widget's props (operator-visible, schema-validated at write time); field values are typed and length-capped before interpolation, so a form input can't smuggle an arbitrary payload beyond its declared slot.
Security posture
The prompt template is authored into the workspace document (operator-approvable, versioned, provenance-stamped); only the declared fields vary at click time. Dispatch inherits the existing confirmation affordance. This needs an adversarial review before merge (template-injection via field values, cap enforcement) — flagged for it.
References
Flagship — the chat↔dashboard loop, part 2 (acting). Pairs with Living Answers.
Part of the Modular Dashboard roadmap — see the tracker #101136 (Flagship section). Builds on Wave 1 (#101093; PRs #101094 / #101097 / #101098).
Problem
The dashboard can show everything but the operator still has to walk to chat to do anything. The safe dispatch primitive already exists — the sandbox bridge's
sendPromptshipped in #101098 (capability-gated, operator-confirmed, rate-limited) — but there's no first-party widget that turns "a recurring operation" into a button.What this adds
builtin:action-form— a trusted builtin rendering a button or a small typed form (text/number/select fields) whose submit dispatches a prompt template with the field values interpolated: "Deploy {env}", "Triage ticket {id} as {priority}".dashboard_widget_addwith a template prop — operations become one-click playbooks.How it'd be built
A new builtin via
BUILTIN_WIDGET_RENDERERS(ui/src/lib/dashboard/widgets/index.ts) +BUILTIN_KIND_PATTERN(extensions/dashboard/src/schema.ts). Submit routes through the same confirm + rate-limit path as the bridge'ssendPrompt(ui/src/components/dashboard-custom-widget.tswires it today; the builtin host reuses that path) — no new dispatch privilege. Templates are part of the widget's props (operator-visible, schema-validated at write time); field values are typed and length-capped before interpolation, so a form input can't smuggle an arbitrary payload beyond its declared slot.Security posture
The prompt template is authored into the workspace document (operator-approvable, versioned, provenance-stamped); only the declared fields vary at click time. Dispatch inherits the existing confirmation affordance. This needs an adversarial review before merge (template-injection via field values, cap enforcement) — flagged for it.
References
Flagship — the chat↔dashboard loop, part 2 (acting). Pairs with Living Answers.