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

@@ -345,6 +345,31 @@ runs:
;;
esac
sticky_marker="$STICKY_ROOT/.openclaw-deps-fingerprint"
sticky_fingerprint=""
sticky_snapshot_matches="false"
if [ "$STICKY_DISK" = "true" ] && [ -f "$sticky_marker" ]; then
sticky_fingerprint="$(<"$sticky_marker")"
fi
if [ "$STICKY_DISK" = "true" ] && [ -n "$sticky_fingerprint" ] &&
[ "$sticky_fingerprint" = "${OPENCLAW_STICKY_DEPS_FINGERPRINT:?}" ]; then
sticky_snapshot_matches="true"
fi
if [ "$STICKY_DISK" = "true" ] && [ "$STICKY_WRITER" != "true" ] &&
[ "$sticky_snapshot_matches" != "true" ]; then
# Read-only PR clones cannot refresh a stale snapshot. Installing into
# that clone can saturate its ext4 device until short jobs time out.
# Detach only the workspace bind; the action still discards its clone.
sudo umount "$GITHUB_WORKSPACE/node_modules"
rm -rf "$GITHUB_WORKSPACE/node_modules"
mkdir -p "$GITHUB_WORKSPACE/node_modules"
ephemeral_store="${RUNNER_TEMP:?}/openclaw-pnpm-store"
mkdir -p "$ephemeral_store"
export PNPM_CONFIG_STORE_DIR="$ephemeral_store"
echo "PNPM_CONFIG_STORE_DIR=$ephemeral_store" >> "$GITHUB_ENV"
echo "Sticky dependency snapshot is stale; using runner-local storage for this read-only run"
fi
install_args=(
install
--prefer-offline
@@ -374,13 +399,7 @@ runs:
ln -sfn . "$PNPM_CONFIG_MODULES_DIR/node_modules"
export NODE_PATH="$PNPM_CONFIG_MODULES_DIR${NODE_PATH:+:$NODE_PATH}"
fi
sticky_marker="$STICKY_ROOT/.openclaw-deps-fingerprint"
sticky_fingerprint=""
if [ "$STICKY_DISK" = "true" ] && [ -f "$sticky_marker" ]; then
sticky_fingerprint="$(<"$sticky_marker")"
fi
if [ "$STICKY_DISK" = "true" ] && [ -n "$sticky_fingerprint" ] &&
[ "$sticky_fingerprint" = "${OPENCLAW_STICKY_DEPS_FINGERPRINT:?}" ]; then
if [ "$sticky_snapshot_matches" = "true" ]; then
bash "$GITHUB_ACTION_PATH/sticky-importers.sh" restore "$STICKY_ROOT" "$GITHUB_WORKSPACE"
echo "Sticky dependency snapshot matches the install fingerprint; skipping pnpm install"
else

View File

@@ -1301,9 +1301,6 @@ jobs:
name: control-ui-i18n
needs: [preflight]
if: needs.preflight.outputs.run_control_ui_i18n == 'true'
# Source PR drift stays advisory because the post-merge bot owns repair.
# Generated locale PRs and release CI must pass the strict catalog gate.
continue-on-error: ${{ github.event_name != 'workflow_dispatch' && needs.preflight.outputs.strict_control_ui_i18n != 'true' }}
runs-on: ${{ github.event_name == 'workflow_dispatch' && 'ubuntu-24.04' || (github.repository == 'openclaw/openclaw' && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'openclaw/openclaw') && 'blacksmith-4vcpu-ubuntu-2404' || 'ubuntu-24.04') }}
timeout-minutes: 10
steps:
@@ -1320,6 +1317,9 @@ jobs:
use-actions-cache: ${{ github.event_name != 'workflow_dispatch' && github.repository == 'openclaw/openclaw' && (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == 'openclaw/openclaw') && 'false' || 'true' }}
- name: Check Control UI locale parity
# Source-only drift stays advisory because the post-merge bot owns
# repair. Generated locale changes and full release CI remain strict.
continue-on-error: ${{ needs.preflight.outputs.strict_control_ui_i18n != 'true' }}
run: pnpm ui:i18n:check
checks-fast-core: