Skip to content

feat: ask_user follow-ups — harness convergence, channel finalization + reactions, native cards, docked web panel#110372

Merged
steipete merged 27 commits into
mainfrom
feat/ask-user-followups
Jul 18, 2026
Merged

feat: ask_user follow-ups — harness convergence, channel finalization + reactions, native cards, docked web panel#110372
steipete merged 27 commits into
mainfrom
feat/ask-user-followups

Conversation

@steipete

Copy link
Copy Markdown
Contributor

Related: #109922 (base ask_user feature; this PR is the complete follow-up set named there)

What Problem This Solves

The ask_user question system shipped in #109922 with four named gaps: Codex/Copilot harness questions still used the legacy text-only path, channel buttons stayed live after resolution, reaction-only channels (WhatsApp/Signal/iMessage) had no tap answering, and the native apps ignored question events. Separately, the web card sat inside the message stream, replayed after answering, and lacked the stepper interaction of its reference design.

Why This Change Was Made

Four parallel slices, integrated into one branch:

  • Harness convergence: Codex request_user_input and Copilot onUserInputRequest now register gateway questions (shared runner src/agents/harness/gateway-question.ts exposed via openclaw/plugin-sdk/agent-harness-runtime), gaining the same web card, channel buttons, and plain-text claim as ask_user. The feat(codex): surface native questions and goals #109724 token/command answer path (/codex answer, user-input-actions.ts, stream QuestionStatus, composer command submission) is deleted — one canonical model (−525 lines). Secret questions stay on the warned text path and never register.
  • Channel finalization + reactions: Telegram/Discord/Slack edit the delivered message on terminal state — buttons removed, status appended (Answered: <labels> with Discord markdown-inert escaping / Expired / Cancelled) via a core finalization runtime with per-channel message-reference capture. WhatsApp/Signal/iMessage attach 1️⃣–4️⃣ reactions to eligible prompts (single-select, non-secret, ≤4 options); a tap resolves the gateway question by stored option value (robust to caller-reordered presentations); stale taps are consumed quietly.
  • Native cards: one shared SwiftUI question card in OpenClawKit wired into iOS and macOS chat surfaces, and a Compose card for Android — options with descriptions, multiSelect, free-text Other, countdown, answered/answered-elsewhere/expired/cancelled terminal states with 15s grace eviction (including locally-observed expiry), reconnect refresh via question.list, operator.questions scope on fresh pairings. The four protocol-event-coverage allowlist entries are removed — the gate now enforces real handlers.
  • Web redesign (per explicit product direction, modeled on Claude Code's own question overlay): the question panel now docks directly above the composer — the composer visually grows, a gradient fades the scrollable stream beneath, and scroll padding keeps everything reachable. Multi-question prompts step one at a time (1/2 chip, Back/Next), options carry numeric keyboard shortcuts, free-text Other and Skip (= cancel, agent proceeds) are always available, and the panel can collapse to a slim bar. After resolution the panel disappears; the stream keeps only a compact Header: answers summary — the full card never replays.

Codex upstream contract checked directly at sibling ../codex (codex-rs/app-server-protocol/src/protocol/v2/item.rs:1585, codex-rs/app-server/src/bespoke_event_handling.rs:703, :1602, codex-rs/protocol/src/request_user_input.rs:8, codex-rs/app-server/tests/suite/v2/request_user_input.rs:112). Copilot SDK 1.0.5 contract checked in @github/copilot-sdk types/session source. MCP elicitation remains deliberately excluded until the 2026-07-28 MRTR spec revision finalizes.

User Impact

Harness-driven questions look and answer exactly like native ask_user ones on every surface. Channel questions clean up after themselves instead of leaving stale buttons. WhatsApp/Signal/iMessage users answer with a reaction tap. iPhone, Mac, and Android app users get native question cards. On the web, questions feel like part of the composer:

Docked panel above the composer (stepper, numbered options, Skip):
pending
Answered → panel gone, compact summary in stream:
answered
MultiSelect step:
multiselect
Stepper + terminal states (expired / answered elsewhere):
terminal

Evidence

  • Live end-to-end proof on this branch (isolated --dev gateway, anthropic/claude-opus-4-8): agent called ask_user with a single-select + multiSelect pair; the docked panel rendered above the composer, auto-advanced 1/2 → 2/2 on selection, took Integration+E2E toggles, and on Submit the panel disappeared, compact Deploy env: Staging (Recommended) / Smoke tests: Integration, E2E summaries appeared in the stream, and the agent resumed with exactly those answers.
  • Integrated verification (Testbox tbx_01kxs9k5gkqtc7ypcb9ayn9frs + local): UI chat suite 4,385 tests; core question runtime, harness bridges, and all six channel question suites green; Playwright question-flow e2e 3/3 with regenerated screenshots (above); OpenClawKit build + 913 Swift tests; pnpm ios:build BUILD SUCCEEDED; Android unit tests + assemble + lint; protocol coverage 40/40; six tsgo lanes; i18n verify (en.ts only); SDK surface budgets; full pnpm build with no ineffective-dynamic-import findings.
  • Review: seven full-branch autoreview iterations; 12 accepted findings fixed across the rounds (claim/persist ordering, registration-commit gating, reservation-before-request, reaction value addressing, native local-expiry eviction, Discord label escaping, UI retry latch, and more). Conscious rejections, each with in-code evidence: pre-release SDK named exports (never in a release tag; all consumers migrated), Android nativeString composable claim (it is the non-composable accessor; Testbox assemble green), single-select "deselect" claim (code always stores the label), and the buffered-claim acknowledgment ordering (documented tradeoff: the question stays live for re-answer on every surface). The generated Kotlin protocol file was excluded from review bundles via a temp commit because the reviewer's secret scanner false-positives on the schema's boolean isSecret field (scanner fix filed separately); the file is generator-owned and compiled/tested on every platform.

Follow-ups intentionally deferred: MCP elicitation routing (post-2026-07-28 spec), reaction answering beyond 4 options, per-option preview content.

steipete added 20 commits July 17, 2026 19:52
# Conflicts:
#	docs/.generated/plugin-sdk-api-baseline.sha256
# Conflicts:
#	ui/src/pages/chat/chat-view.ts
#	ui/src/pages/chat/components/chat-composer.ts
#	ui/src/pages/chat/components/chat-question-card.test.ts
#	ui/src/pages/chat/components/chat-question-card.ts
# Conflicts:
#	docs/.generated/plugin-sdk-api-baseline.sha256
…; reset terminal retention on replayed pending
# Conflicts:
#	apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatTransport.swift
#	apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatView.swift
#	docs/.generated/plugin-sdk-api-baseline.sha256
#	docs/platforms/mac/webchat.md
#	scripts/plugin-sdk-surface-report.mjs
@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation channel: discord Channel integration: discord channel: imessage Channel integration: imessage channel: signal Channel integration: signal channel: slack Channel integration: slack channel: telegram Channel integration: telegram channel: whatsapp-web Channel integration: whatsapp-web app: android App: android app: ios App: ios app: macos App: macos labels Jul 18, 2026
@clawsweeper clawsweeper Bot added feature: ✨ showcase ClawSweeper spotlight: unusually compelling feature idea for maintainer attention. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. mantis: telegram-visible-proof Mantis should capture Telegram visible proof. P2 Normal backlog priority with limited blast radius. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. labels Jul 18, 2026
@clawsweeper

clawsweeper Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Codex review: needs real behavior proof before merge. Reviewed July 18, 2026, 3:12 AM ET / 07:12 UTC.

Summary
This branch converges harness questions on the gateway runtime, adds channel finalization and reaction answers, introduces Android/iOS/macOS question cards, and redesigns Control UI questions as a docked composer panel.

Reproducibility: not applicable. as an issue reproduction: this is a feature PR, but source-level review establishes two concrete upgrade and reconciliation failures in its proposed implementation.

Review metrics: 1 noteworthy metric.

  • Operator authorization surface: 1 scope added: operator.questions. The new scope reaches fresh pairing/bootstrap profiles but has no demonstrated upgrade path for stored device tokens.

Stored data model
Persistent data-model change detected: serialized state: ui/src/pages/chat/chat-pane.ts, unknown-truncated-pull-files. Confirm migration or upgrade compatibility proof before merge.

Merge readiness
Overall: 🦐 gold shrimp
Proof: 🦐 gold shrimp
Patch quality: 🦐 gold shrimp
Result: blocked until stronger real behavior proof is added.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • [P1] Add a visible upgrade path and focused fresh-versus-existing-pairing coverage for operator.questions.
  • Fetch terminal records before native-card eviction after reconnect or sequence gaps.
  • Attach redacted real behavior proof for at least one button channel, one reaction channel, and each native card surface.

Proof guidance:

  • [P1] Needs stronger real behavior proof before merge: The supplied screenshots and live run credibly show the Control UI panel, but direct after-fix evidence is still needed for channel finalization/reactions and Android, iOS, and macOS cards; redact private details before posting it. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.

Mantis proof suggestion
Telegram Desktop proof would directly validate the proposed terminal finalization behavior beyond the Control UI screenshots. A maintainer can ask Mantis to capture proof by posting this exact PR comment:

@openclaw-mantis telegram desktop proof: verify that a question button is removed and the delivered prompt shows the correct terminal status after answer, expiry, and cancellation.

Risk before merge

  • [P1] Existing paired Android and Apple operators can silently lack operator.questions, leaving the advertised native question flow unavailable after upgrade.
  • [P1] A missed question.resolved event can cause native clients to remove a pending card instead of displaying answered-elsewhere, expired, or cancelled state during the intended grace window.
  • [P1] The current screenshots prove the Control UI dock but not the new channel finalization/reaction paths or the three native client implementations.

Maintainer options:

  1. Add explicit pairing-scope recovery (recommended)
    Before merge, provide and test a visible reauthorization or migration path for existing paired native operators, including fresh and upgraded device behavior.
  2. Deliberately require re-pairing
    Maintainers may accept the compatibility cost only if the release-facing behavior clearly tells existing native users how to regain question access.
  3. Pause the cross-surface rollout
    Split or pause the native scope-dependent slice if the authorization contract cannot be chosen before the rest of the question UX lands.

Next step before merge

  • [P1] A maintainer must choose the stored operator-token authorization contract before a repair can safely preserve existing paired-device access while retaining the new permission boundary.

Maintainer decision needed

  • Question: What upgrade contract should grant operator.questions to already-paired native operators without silently widening an existing device token's authorization?
  • Rationale: The branch adds a new operator permission and needs an intentional compatibility boundary: silently extending stored grants and requiring re-pairing have different security and user-support consequences.
  • Likely owner: steipete — The current and merged question-runtime history places the authorization and client-upgrade boundary with this feature owner.
  • Options:
    • Require visible reauthorization (recommended): Add an in-product re-pair or permission-refresh flow that requests the new scope and keeps the authorization expansion explicit.
    • Treat re-pairing as the upgrade requirement: Document that existing native pairings must be recreated before question cards are available, accepting the temporary feature gap.
    • Extend stored operator grants automatically: Migrate existing device-token scopes to include questions, accepting an implicit expansion of previously granted permissions.

Security
Needs attention: The patch changes the operator authorization boundary by adding operator.questions, but its stored-token upgrade contract is not yet explicit.

Review findings

  • [P1] Preserve question access for existing paired operators — src/shared/device-bootstrap-profile.ts:24
  • [P2] Recover terminal records before evicting native cards — apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatQuestionCard.swift:363-377
Review details

Best possible solution:

Preserve the new unified question runtime, but add an explicit, user-visible reauthorization or migration path for stored operator tokens, reconcile missing records through question.get before card eviction, and attach redacted real-device/channel proof before merge.

Do we have a high-confidence way to reproduce the issue?

Not applicable as an issue reproduction: this is a feature PR, but source-level review establishes two concrete upgrade and reconciliation failures in its proposed implementation.

Is this the best way to solve the issue?

No. The unified gateway question model is the right direction, but the branch needs an explicit stored-token upgrade contract and terminal-record recovery rather than relying on fresh pairing and pending-only refreshes.

Full review comments:

  • [P1] Preserve question access for existing paired operators — src/shared/device-bootstrap-profile.ts:24
    Existing Android and Apple device tokens retain their recorded scopes on reconnect, so adding operator.questions only to fresh bootstrap profiles leaves already-paired users unable to list or resolve the new native questions. Add an explicit reauthorization or migration path and cover both upgrade and fresh pairing behavior.
    Confidence: 0.94
  • [P2] Recover terminal records before evicting native cards — apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatQuestionCard.swift:363-377
    When a client misses question.resolved, question.list omits the now-terminal record; removing the card immediately skips the intended answered-elsewhere, expired, or cancelled grace state. Probe the missing ID with question.get before eviction, as the web path already does.
    Confidence: 0.91

Overall correctness: patch is incorrect
Overall confidence: 0.9

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against cad4e395d21f.

Label changes

Label justifications:

  • P2: This is a high-value cross-surface feature with important upgrade defects, but there is no evidence of an emergency outage, data loss, or security bypass.
  • merge-risk: 🚨 compatibility: Previously paired native clients retain stored scopes and can miss the new question capability after upgrade.
  • merge-risk: 🚨 message-delivery: Question finalization and reaction resolution span multiple transports, while direct after-fix proof is still absent for those paths.
  • merge-risk: 🚨 security-boundary: Adding operator.questions changes the operator-token permission boundary and needs an explicit decision for existing grants.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦐 gold shrimp and patch quality is 🦐 gold shrimp.
  • status: 📣 needs proof: The PR needs real behavior proof before ClawSweeper can clear the contributor ask. Needs stronger real behavior proof before merge: The supplied screenshots and live run credibly show the Control UI panel, but direct after-fix evidence is still needed for channel finalization/reactions and Android, iOS, and macOS cards; redact private details before posting it. After adding proof, update the PR body; ClawSweeper should re-review automatically. If it does not, the PR author or someone with repository write access can comment @clawsweeper re-review.
  • proof: 📸 screenshot: Contributor real behavior proof includes screenshot evidence. The supplied screenshots and live run credibly show the Control UI panel, but direct after-fix evidence is still needed for channel finalization/reactions and Android, iOS, and macOS cards; redact private details before posting it.
  • mantis: telegram-visible-proof: Mantis should capture Telegram visible proof. Telegram button cleanup and terminal-status rendering are user-visible and can be demonstrated in a short Telegram Desktop recording.
Evidence reviewed

Security concerns:

  • [medium] Define stored-token authorization upgrade — src/shared/device-bootstrap-profile.ts:24
    Fresh pairing receives the new question scope while stored native operator-token scopes remain unchanged, leaving maintainers to choose between visible reauthorization, documented re-pairing, or an intentional permission migration.
    Confidence: 0.9

What I checked:

  • Existing-pairing authorization gap: The branch adds operator.questions to fresh bootstrap and pairing scope lists, while the reviewed Android and Apple stored-token paths preserve already-recorded scopes; paired devices created before this change therefore cannot call question.list and do not receive native cards until an explicit upgrade path exists. (src/shared/device-bootstrap-profile.ts:24, 361996d5d378)
  • Terminal-state reconciliation remains incomplete: The supplied review discussion identifies that question.list returns pending records while terminal records remain retrievable with question.get; the native refresh paths remove absent cards instead of fetching the terminal record, so a missed resolution event skips the intended 15-second terminal display. (apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatQuestionCard.swift:363, 361996d5d378)
  • Proof covers only part of the branch: The PR body supplies screenshots and a live Control UI ask_user run, but it does not provide direct after-fix evidence for Telegram/Discord/Slack finalization, reaction answering on WhatsApp/Signal/iMessage, or Android/iOS/macOS card behavior. (ui/src/e2e/question-flow.e2e.test.ts:123, 361996d5d378)
  • Feature provenance: The merged base feature introduced gateway-backed questions and explicitly deferred harness convergence, reactions, channel finalization, and native cards; this branch is the intended follow-up rather than a duplicate implementation. (src/gateway/server-methods/question.ts:105, da44d52ac6c0)

Likely related people:

  • steipete: Authored the merged gateway question feature and the current follow-up series across the gateway, harness, channel, native, and Control UI surfaces. (role: feature owner and recent area contributor; confidence: high; commits: da44d52ac6c0, 2b18ef742648, 361996d5d378; files: src/gateway/server-methods/question.ts, src/shared/device-bootstrap-profile.ts, ui/src/pages/chat/components/chat-question-card.ts)
  • 100yenadmin: The merged Codex-native-question predecessor credits this contributor for the original UI/protocol work that this branch replaces with the gateway-backed presentation path. (role: adjacent UI/protocol contributor; confidence: medium; commits: 2b18ef742648; files: ui/src/app/question-prompt.ts, ui/src/pages/chat/components/chat-question-card.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.
Review history (4 earlier review cycles)
  • reviewed 2026-07-18T03:33:26.641Z sha 03b0a95 :: needs real behavior proof before merge. :: none
  • reviewed 2026-07-18T05:56:06.497Z sha f88e093 :: needs real behavior proof before merge. :: [P1] Preserve question access for existing paired operators
  • reviewed 2026-07-18T06:14:46.995Z sha 73b6709 :: needs real behavior proof before merge. :: [P1] Preserve question access for existing paired operators | [P2] Recover terminal question records before evicting native cards
  • reviewed 2026-07-18T06:56:58.289Z sha 73b6709 :: needs real behavior proof before merge. :: [P1] Preserve question access for existing paired operators | [P2] Recover terminal records before evicting native cards

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 03b0a95ff0

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +1957 to +1959
prompt.status === "pending" &&
prompt.sessionKey !== undefined &&
areUiSessionKeysEquivalent(prompt.sessionKey, props.sessionKey),

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Scope docked questions by agent

When a pending question is registered for a global session, the record carries both sessionKey: "global" and its owning agentId, but this filter only checks the session key. In a global-scope multi-agent UI, switching/splitting the global chat to another agent still renders the first agent's docked prompt, and submitting it calls question.resolve by id only, so the answer can be delivered to the wrong run; include the prompt agent check against currentAgentId here.

Useful? React with 👍 / 👎.

@steipete steipete self-assigned this Jul 18, 2026
@steipete
steipete requested a review from a team as a code owner July 18, 2026 05:52
@openclaw-barnacle openclaw-barnacle Bot added the cli CLI command changes label Jul 18, 2026
@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Jul 18, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f88e093191

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

val existing = current.associateBy { it.record.id }
val nowMs = System.currentTimeMillis()
val listedIds = records.mapTo(mutableSetOf()) { it.id }
val retainedTerminal = current.filter { it.record.id !in listedIds && it.shouldRetainAfterList(nowMs) }

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Fetch missing question records before dropping cards

When this client misses question.resolved during reconnect/seqGap, this reconciliation drops any pending card that is absent from question.list; the Gateway list only returns pending records (src/gateway/question-manager.ts:140-145) while the terminal record remains available via question.get for the 15s cleanup grace (src/gateway/question-manager.ts:321-325). The web path already probes missing pending IDs before removal (ui/src/app/question-prompt.ts:434-480), but Android here (and the Swift mirror in apps/shared/OpenClawKit/Sources/OpenClawChatUI/ChatQuestionCard.swift:363-377) removes the card, so “answered elsewhere”, cancelled, or expired state never renders after a missed event.

Useful? React with 👍 / 👎.

// sessions.patch (model switching); stored tokens keep their granted scopes.
"operator.admin",
"operator.approvals",
"operator.questions",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Migrate existing native tokens to question scope

Adding operator.questions here only helps fresh Android connects; existing paired installs reconnect through operatorConnectScopesForAuth, which returns operatorScopesForStoredDeviceToken(storedOperatorScopes) and preserves the recorded scopes unchanged (apps/android/app/src/main/java/ai/openclaw/app/NodeRuntime.kt:7548-7555, ConnectionManager.kt:55-61). Users paired before this scope existed will keep connecting without operator.questions, question.list is swallowed as unavailable, and native question cards never appear; the iOS device-token path has the same stored-scope bypass in GatewayChannel.swift:826-831, so this needs a stored-token upgrade/migration path.

Useful? React with 👍 / 👎.

@steipete
steipete merged commit d7de67a into main Jul 18, 2026
116 of 117 checks passed
@steipete
steipete deleted the feat/ask-user-followups branch July 18, 2026 07:32
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 19, 2026
… + reactions, native cards, docked web panel (openclaw#110372)

* feat(ask-user): follow-up harness slice

* feat(ask-user): follow-up channels slice

* feat(ask-user): follow-up native slice

* feat(ui): dock question panel above composer with stepper and compact stream summaries

* docs: refresh follow-up integration maps

* test(ui): align terminal summary proof

* fix(infra): echo declared option answers in terminal status when free-text is allowed

* fix(infra): keep reaction answering when display labels are formatter-adjusted

* fix(agents): settle plain-text claims only after question registration commits

* fix(agents,apps): commit-ordered claim persistence, claim-aware prompt delivery, non-blocking question refresh

* fix(harness,infra): reaction-appropriate question copy, caller presentations honored

* fix(native,infra,agents): local-expiry eviction, value-addressed reactions, reserve-before-request

* fix(infra,android): dual-mode question resolver for compact callbacks; reset terminal retention on replayed pending

* fix(harness,discord): claim-aware prompt delivery in run helper; escape finalization labels

* fix(macos): merge transient-content visibility with question cards after main sync

* fix: repair ask user follow-up CI

* test: update limited bootstrap scope expectation

* fix: retain shared question card API

* chore: refresh native i18n inventory
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling app: android App: android app: ios App: ios app: macos App: macos app: web-ui App: web-ui channel: discord Channel integration: discord channel: imessage Channel integration: imessage channel: signal Channel integration: signal channel: slack Channel integration: slack channel: telegram Channel integration: telegram channel: whatsapp-web Channel integration: whatsapp-web cli CLI command changes docs Improvements or additions to documentation extensions: codex extensions: copilot feature: ✨ showcase ClawSweeper spotlight: unusually compelling feature idea for maintainer attention. gateway Gateway runtime maintainer Maintainer-authored PR mantis: telegram-visible-proof Mantis should capture Telegram visible proof. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. merge-risk: 🚨 message-delivery 🚨 May drop, duplicate, misroute, suppress, or wrongly target messages. merge-risk: 🚨 security-boundary 🚨 May affect sandboxing, authorization, credentials, or sensitive data. P2 Normal backlog priority with limited blast radius. proof: 📸 screenshot Contributor real behavior proof includes screenshot evidence. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. scripts Repository scripts size: XL status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant