feat(ui): WebUI modernization PR2 — approval flow as inline decision cards#110
Closed
jkyberneees wants to merge 1 commit into
Closed
feat(ui): WebUI modernization PR2 — approval flow as inline decision cards#110jkyberneees wants to merge 1 commit into
jkyberneees wants to merge 1 commit into
Conversation
…cards Second PR of the WebUI modernization roadmap (Phase 2b: approval UX). Stacked on #109 (feat/webui-modernization-1). Replaces the blocking approval modal with an inline decision card pinned at the bottom of the message stream (position: sticky), so the operator can scroll back through the transcript while deciding. During an approval the agent is mid-turn (busy), so nothing is lost vs the modal; the gate itself is untouched - every decision still goes to the server as an explicit approval_response, and Escape no longer closes the prompt. - Queue: multiple approval requests (parallel tool calls) render one at a time with a "request 1 of N" indicator instead of stacking modals. - approval_ack handling: requests answered from another connected client are dismissed locally (previously the ack event was ignored). - Keyboard operation: a = approve, d = deny, t = trust session (when the class allows it); modifier combos and text inputs are respected, and the friction gate applies to keyboard approvals too. Keys are shown as kbd hints on the buttons and documented in the shortcuts dialog. - Accessibility: role="alertdialog" with aria-labelledby/describedby, focus moves to the card on show; DOM built with textContent throughout (no innerHTML with command data). - Risk badge bug fixed: the server sends the class string (system_write, destructive, ...) but the old CSS keyed on emoji classes (.approval-risk.X), so the badge rendered unstyled. Badges now use data-level attributes (warn/danger/ok) driven by a client-side risk-class map that also provides a plain-language "why this needs approval" line per class. - Friction mode rebuilt with stylesheet classes instead of inline cssText; the dead .approval-dialog fallback branch is gone (it could never fire - the HTML used an id). - Session switches (new/load) clear the approval queue so a stale card can never linger in a wiped message list. - All card content uses the new token scales (--space-*, --r-*, --fs-*). Verified: node --check, go vet, full cmd/odek test suite. UI logic reviewed for queue/ack races (single-threaded ordering guarantees local shift happens before the ack is processed; dismiss is idempotent).
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
odek | a122d29 | Commit Preview URL Branch Preview URL |
Jul 26 2026, 12:32 PM |
This was referenced Jul 26, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
feat(ui): WebUI modernization PR2 — approval flow as inline decision cards
Second PR of the WebUI modernization roadmap (Phase 2b: approval UX).
Stacked on #109 (feat/webui-modernization-1).
Replaces the blocking approval modal with an inline decision card pinned
at the bottom of the message stream (position: sticky), so the operator
can scroll back through the transcript while deciding. During an approval
the agent is mid-turn (busy), so nothing is lost vs the modal; the gate
itself is untouched - every decision still goes to the server as an
explicit approval_response, and Escape no longer closes the prompt.
time with a "request 1 of N" indicator instead of stacking modals.
are dismissed locally (previously the ack event was ignored).
class allows it); modifier combos and text inputs are respected, and
the friction gate applies to keyboard approvals too. Keys are shown as
kbd hints on the buttons and documented in the shortcuts dialog.
focus moves to the card on show; DOM built with textContent throughout
(no innerHTML with command data).
destructive, ...) but the old CSS keyed on emoji classes
(.approval-risk.X), so the badge rendered unstyled. Badges now use
data-level attributes (warn/danger/ok) driven by a client-side
risk-class map that also provides a plain-language "why this needs
approval" line per class.
cssText; the dead .approval-dialog fallback branch is gone (it could
never fire - the HTML used an id).
can never linger in a wiped message list.
Verified: node --check, go vet, full cmd/odek test suite. UI logic
reviewed for queue/ack races (single-threaded ordering guarantees local
shift happens before the ack is processed; dismiss is idempotent).