feat: ask_user — structured questions from the agent with web card, channel buttons, and text answers (#109922)

* feat(gateway): add transient question runtime (question.* methods + broadcasts)

* feat(agents): add blocking ask_user question tool with chat prompt delivery and text-reply claim

* feat(ui): interactive in-thread question cards for ask_user

* feat(channels): native tap-to-answer buttons for ask_user on Telegram, Discord, and Slack

* feat(ui): unify codex and gateway question cards with interactive gateway answering

* refactor(agents): collapse ask_user pending state to one registry; docs for ask_user

* fix(agents): include ask_user in normal gateway runs; add question-flow control-ui e2e

* test(ui): avoid credential-shaped fixture in question card test

* refactor(ui): reorder stream-group context keys

* fix(gateway,ui): validate question answers at resolve; reject secret/duplicate-label questions; UI retry and reconnect hardening

* fix(gateway,agents): canonicalize accepted option answers; bound ask_user option labels to 64 chars

* chore(ci): prune unused question exports, allowlist mobile question events, fix discord lint

* chore(ci): regenerate protocol/i18n/docs/tool-display artifacts for question surface

* fix(protocol): flatten QuestionRecord for native codegen; drop TS-only alias from schema registry

* chore(android): regenerate ask-user localization resources

* docs: regenerate docs map after rebase

* fix(ci): avoid stale read-only dependency disks

* test: remove stale reef lint suppression ratchet

* fix(ci): keep source locale drift advisory in release gates

* fix(ci): scope locale advisory handling to parity check
This commit is contained in:
Peter Steinberger
2026-07-17 22:24:17 +01:00
committed by GitHub
parent bab9a5ede7
commit da44d52ac6
143 changed files with 7814 additions and 334 deletions

View File

@@ -32,6 +32,7 @@
"approval-reaction-runtime",
"approval-reply-runtime",
"approval-runtime",
"question-gateway-runtime",
"config-runtime",
"config-contracts",
"config-types",

View File

@@ -214,7 +214,8 @@ export function readPluginSdkSurfaceBudgets(env = process.env) {
// Registry sweep: 77 packages, zero fetch failures; retired dead channel-ingress facade.
// +1: speech-settings keeps agent prompt imports off the synthesis/runtime graph.
// +1: meeting-runtime barrel: browser meeting-bot core behind MeetingPlatformAdapter.
330,
// +1: question-gateway-runtime resolves ask_user choices for channel plugins.
331,
env,
),
// ScopeTree adds six channel-policy exports, mirrored by compat, including three functions.
@@ -262,7 +263,8 @@ export function readPluginSdkSurfaceBudgets(env = process.env) {
// Harvest: retired dual-field plan payload builder -1.
// +23: core channel, envelope, direct-DM, feedback, legacy-payload, and memory contracts.
// +81: meeting-runtime barrel: browser meeting-bot core behind MeetingPlatformAdapter.
8149,
// +3: question-gateway-runtime resolver plus request/result types.
8152,
env,
),
publicFunctionExports: readPluginSdkSurfaceBudgetEnv(
@@ -296,7 +298,8 @@ export function readPluginSdkSurfaceBudgets(env = process.env) {
// Harvest: retired dual-field plan payload builder -1.
// +13: core channel, envelope, direct-DM, feedback, legacy-payload, and memory operations.
// +32: meeting-runtime barrel: browser meeting-bot core behind MeetingPlatformAdapter.
4533,
// +1: question-gateway-runtime resolver.
4534,
env,
),
publicDeprecatedExports: readPluginSdkSurfaceBudgetEnv(

View File

@@ -18,6 +18,8 @@
"voicewake.routing.changed": "iOS only consumes voicewake.changed trigger updates; routing changes are not surfaced.",
"plugin.approval.requested": "Plugin approval prompts are not implemented on iOS.",
"plugin.approval.resolved": "Plugin approval prompts are not implemented on iOS.",
"question.requested": "Interactive question UI ships on web/channels first; mobile apps ignore operator question events until their card UI lands.",
"question.resolved": "Interactive question UI ships on web/channels first; mobile apps ignore operator question events until their card UI lands.",
"openclaw.approval.requested": "OpenClaw system-agent config approvals are a web/desktop operator surface; iOS has no operator-approval prompt.",
"openclaw.approval.resolved": "OpenClaw system-agent config approvals are a web/desktop operator surface; iOS has no operator-approval prompt.",
"terminal.data": "Embedded terminal is a web/desktop surface; iOS has no terminal client.",
@@ -44,6 +46,8 @@
"voicewake.routing.changed": "Android reads voicewake state on demand via voicewake.get; no push consumer yet.",
"plugin.approval.requested": "Plugin approval prompts are not implemented on Android.",
"plugin.approval.resolved": "Plugin approval prompts are not implemented on Android.",
"question.requested": "Interactive question UI ships on web/channels first; mobile apps ignore operator question events until their card UI lands.",
"question.resolved": "Interactive question UI ships on web/channels first; mobile apps ignore operator question events until their card UI lands.",
"openclaw.approval.requested": "OpenClaw system-agent config approvals are a web/desktop operator surface; Android has no operator-approval prompt.",
"openclaw.approval.resolved": "OpenClaw system-agent config approvals are a web/desktop operator surface; Android has no operator-approval prompt.",
"terminal.data": "Embedded terminal is a web/desktop surface; Android has no terminal client.",