From ac33da3c73ffaece43aea2195935ba91cbbd5cce Mon Sep 17 00:00:00 2001 From: Teknium <127238744+teknium1@users.noreply.github.com> Date: Wed, 9 Sep 2026 03:47:47 -0700 Subject: [PATCH] fix(tui): hide the composer while the password-manager unlock card is open Live Ink TUI repro: with the unlock card mounted, keystrokes reached BOTH the masked prompt and the still-focused composer, so the master password echoed in clear text in the composer row and was queued as a message. `$isBlocked` (which unmounts the composer for approval/sudo/secret cards) did not list the new overlay; the pet's awaiting-input predicate had the same gap. After the fix the raw PTY stream no longer contains the typed password. Also tightens the classic-CLI panel copy to fit an 80-column box. --- hermes_cli/cli_tui_mixin.py | 4 ++-- ui-tui/src/app/overlayStore.ts | 2 ++ ui-tui/src/app/usePet.ts | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/hermes_cli/cli_tui_mixin.py b/hermes_cli/cli_tui_mixin.py index 935ee2ad85..7e762c6d4d 100644 --- a/hermes_cli/cli_tui_mixin.py +++ b/hermes_cli/cli_tui_mixin.py @@ -692,8 +692,8 @@ class CLITuiMixin: return self._render_sudo_style_panel( f'🔐 Unlock {backend}', [f'The agent wants to sign into a site with a login saved in {backend}.', - 'Enter your master password below (hidden) to unlock it for this session, or press Enter to keep it locked.', - 'The password never reaches the model; only a session token is kept in memory.']) + 'Type your master password (hidden) to unlock it for this session.', + 'Enter on an empty line keeps it locked. The model never sees the password.']) return self._render_sudo_style_panel( '🔐 Sudo Password Required', ['Enter password below (hidden), or press Enter to skip']) diff --git a/ui-tui/src/app/overlayStore.ts b/ui-tui/src/app/overlayStore.ts index 48258a0c0e..437d16d139 100644 --- a/ui-tui/src/app/overlayStore.ts +++ b/ui-tui/src/app/overlayStore.ts @@ -45,6 +45,7 @@ export const $isBlocked = computed( skillsHub, subscription, sudo, + vaultUnlock, widget }) => Boolean( @@ -63,6 +64,7 @@ export const $isBlocked = computed( skillsHub || subscription || sudo || + vaultUnlock || widget ) ) diff --git a/ui-tui/src/app/usePet.ts b/ui-tui/src/app/usePet.ts index 595d9a37b1..b4ae6fb3d2 100644 --- a/ui-tui/src/app/usePet.ts +++ b/ui-tui/src/app/usePet.ts @@ -50,7 +50,7 @@ export function derivePetState({ busy, toolRunning, reasoning, awaitingInput }: function isAwaitingInput(): boolean { const o = getOverlayState() - return Boolean(o.clarify || o.approval || o.sudo || o.secret || o.confirm) + return Boolean(o.clarify || o.approval || o.sudo || o.secret || o.vaultUnlock || o.confirm) } // A kitty Unicode-placeholder frame set: a static placeholder grid (painted by