mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-08 03:01:47 +00:00
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:
parent
1e37ddc929
commit
ffd2621039
8 changed files with 291 additions and 2 deletions
|
|
@ -570,6 +570,17 @@ export function createGatewayEventHandler(ctx: GatewayEventHandlerContext): (ev:
|
|||
sys(`error: ${message}`)
|
||||
setStatus('ready')
|
||||
}
|
||||
|
||||
return
|
||||
case 'onboarding.hint': {
|
||||
const text = String(ev.payload?.text || '').trim()
|
||||
|
||||
if (text) {
|
||||
sys(`(tip) ${text}`)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import { type MutableRefObject, useCallback, useRef } from 'react'
|
|||
import { attachedImageNotice } from '../domain/messages.js'
|
||||
import { looksLikeSlashCommand } from '../domain/slash.js'
|
||||
import type { GatewayClient } from '../gatewayClient.js'
|
||||
import type { InputDetectDropResponse, PromptSubmitResponse, ShellExecResponse } from '../gatewayTypes.js'
|
||||
import type { InputDetectDropResponse, OnboardingClaimResponse, PromptSubmitResponse, ShellExecResponse } from '../gatewayTypes.js'
|
||||
import { asRpcResult } from '../lib/rpc.js'
|
||||
import { hasInterpolation, INTERPOLATION_RE } from '../protocol/interpolation.js'
|
||||
import { PASTE_SNIPPET_RE } from '../protocol/paste.js'
|
||||
|
|
@ -218,6 +218,22 @@ export function useSubmission(opts: UseSubmissionOptions) {
|
|||
composerActions.pushHistory(full)
|
||||
|
||||
if (getUiState().busy) {
|
||||
// First-touch onboarding: teach the TUI's auto-queue + double-Enter
|
||||
// interrupt pattern the first time the user hits it. Claim is
|
||||
// atomic server-side (config.yaml latch), shared with CLI + gateway.
|
||||
gw.request<OnboardingClaimResponse>('onboarding.claim', { flag: 'busy_input_prompt' })
|
||||
.then(raw => {
|
||||
const r = asRpcResult<OnboardingClaimResponse>(raw)
|
||||
const text = r?.hint
|
||||
|
||||
if (typeof text === 'string' && text.trim()) {
|
||||
sys(`(tip) ${text.trim()}`)
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
// Onboarding is best-effort — never block the enqueue path.
|
||||
})
|
||||
|
||||
return composerActions.enqueue(full)
|
||||
}
|
||||
|
||||
|
|
@ -229,7 +245,7 @@ export function useSubmission(opts: UseSubmissionOptions) {
|
|||
|
||||
send(full)
|
||||
},
|
||||
[appendMessage, composerActions, composerRefs, interpolate, send, sendQueued, shellExec, slashRef]
|
||||
[appendMessage, composerActions, composerRefs, gw, interpolate, send, sendQueued, shellExec, slashRef, sys]
|
||||
)
|
||||
|
||||
const submit = useCallback(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue