feat(onboarding): port first-touch hints to the TUI (#16054)
PR #16046 added /busy and /verbose hints to the classic CLI and the gateway runner but skipped the Ink TUI (and therefore the dashboard /chat page, which embeds the TUI via PTY). This extends the same latch to the TUI with TUI-native wording. The TUI's busy-input model is not the /busy knob from the CLI — single Enter while busy auto-queues, double Enter on an empty line interrupts. The new busy-input hint teaches THAT gesture instead of telling the user to flip a config that does not apply. Changes: - agent/onboarding.py — add busy_input_hint_tui() + tool_progress_hint_tui() - tui_gateway/server.py — onboarding.claim JSON-RPC (Ink triggers busy hint on enqueue) + _maybe_emit_onboarding_hint helper hooked into _on_tool_complete for the 30s/tool_progress=all path. Same config.yaml latch so each hint fires at most once per install across CLI, gateway, and TUI combined. - ui-tui/src/gatewayTypes.ts — OnboardingClaimResponse + onboarding.hint event - ui-tui/src/app/createGatewayEventHandler.ts — render the hint event as sys() - ui-tui/src/app/useSubmission.ts — claim busy_input_prompt on first busy enqueue - tests/agent/test_onboarding.py — +3 cases for TUI hint shape - tests/tui_gateway/test_protocol.py — +4 cases for onboarding.claim - website/docs/user-guide/tui.md — new 'Interrupting and queueing' section explaining the TUI's double-Enter model and the hints Validation: scripts/run_tests.sh tests/agent/test_onboarding.py \ tests/tui_gateway/test_protocol.py \ tests/gateway/test_busy_session_ack.py -> 66 passed npm --prefix ui-tui run type-check -> clean npm --prefix ui-tui run lint -> clean npm --prefix ui-tui run build -> clean
This commit is contained in:
@@ -80,6 +80,26 @@ def tool_progress_hint_cli() -> str:
|
||||
)
|
||||
|
||||
|
||||
def busy_input_hint_tui() -> str:
|
||||
"""Hint shown the first time a user sends a message while the TUI is busy.
|
||||
|
||||
The TUI auto-queues messages sent mid-turn and uses double-Enter on empty
|
||||
input as the interrupt gesture. There is no ``/busy`` knob to flip — this
|
||||
hint teaches the keybind instead of a command.
|
||||
"""
|
||||
return (
|
||||
"queued for after the current turn — press Enter twice on an empty "
|
||||
"line to interrupt the current turn instead. This tip only shows once."
|
||||
)
|
||||
|
||||
|
||||
def tool_progress_hint_tui() -> str:
|
||||
return (
|
||||
"that tool ran for a while — use /verbose to cycle tool-progress "
|
||||
"display modes (all → new → off → verbose). This tip only shows once."
|
||||
)
|
||||
|
||||
|
||||
# -------------------------------------------------------------------------
|
||||
# State read / write
|
||||
# -------------------------------------------------------------------------
|
||||
@@ -137,8 +157,10 @@ __all__ = [
|
||||
"TOOL_PROGRESS_FLAG",
|
||||
"busy_input_hint_gateway",
|
||||
"busy_input_hint_cli",
|
||||
"busy_input_hint_tui",
|
||||
"tool_progress_hint_gateway",
|
||||
"tool_progress_hint_cli",
|
||||
"tool_progress_hint_tui",
|
||||
"is_seen",
|
||||
"mark_seen",
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user