Skip to content

fix(dashboard): umlauts/dead-key input in xterm (#76233) - #76337

Open
webtecnica wants to merge 1 commit into
NousResearch:mainfrom
webtecnica:fix/76233-xterm-deadkeys
Open

fix(dashboard): umlauts/dead-key input in xterm (#76233)#76337
webtecnica wants to merge 1 commit into
NousResearch:mainfrom
webtecnica:fix/76233-xterm-deadkeys

Conversation

@webtecnica

Copy link
Copy Markdown
Contributor

Closes #76233

@alt-glitch alt-glitch added type/bug Something isn't working comp/dashboard Web dashboard / control panel UI (dashboard/, landing) P3 Low — cosmetic, nice to have needs-decision Awaiting maintainer decision before any implementation sweeper:risk-message-delivery Sweeper risk: may drop, duplicate, misroute, or suppress messages labels Aug 1, 2026
@alt-glitch

Copy link
Copy Markdown
Collaborator

This was generated by AI during triage.

Related: #76257 targets the same dead-key report (#76233), but the live diffs use different fallback predicates: this patch counts only onData during composition, while #76257 defers a pending commit and cancels it when matching terminal data arrives. Please choose the intended xterm composition contract; these are not duplicates.

@teknium1 teknium1 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.

Thanks for addressing a verified gap in the dashboard input path: current main records compositionend only for mobile replacement handling (web/src/pages/ChatPage.tsx:766-771), while PTY input is forwarded from term.onData (web/src/pages/ChatPage.tsx:1182-1212).

Problems

  • web/src/pages/ChatPage.tsx:1256 treats any printable onData event during composition as proof that xterm delivered the composition, and :822 then suppresses the fallback. Unrelated printable input can therefore drop the pending composed text. The related #76257 implementation explicitly keeps pending text unless terminal data matches it.
  • The diff changes only web/src/pages/ChatPage.tsx; it adds no regression coverage for the asynchronous fallback and duplicate-suppression contract.

Suggested changes

  • Keep a pending composition value and cancel only on terminal data correlated to that value, rather than a count of arbitrary printable data.
  • Extract and test that helper for dropped, matching, unrelated, rapid, empty, and disposed compositions.

This is an automated hermes-sweeper review.

// bytes (e.g. DEL from an IME backspace) don't count as delivered
// composition text.
// eslint-disable-next-line no-control-regex -- intentional control-byte test
if (composing && !/[\x00-\x1f\x7f]/.test(data)) {

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.

This predicate counts every printable onData payload during composition, not just the committed value from this composition. Unrelated input can make the counter nonzero and suppress the fallback at line 822, dropping ev.data; retain a pending commit and clear it only when terminal data is correlated to that pending value.

@teknium1 teknium1 added sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades sweeper:blast-moderate Sweeper blast radius: moderate — a subsystem or single platform labels Aug 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp/dashboard Web dashboard / control panel UI (dashboard/, landing) needs-decision Awaiting maintainer decision before any implementation P3 Low — cosmetic, nice to have sweeper:blast-moderate Sweeper blast radius: moderate — a subsystem or single platform sweeper:risk-compatibility Sweeper risk: may break existing users, config, migrations, defaults, or upgrades sweeper:risk-message-delivery Sweeper risk: may drop, duplicate, misroute, or suppress messages type/bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Web Dashboard chat: German umlauts / dead-key input not delivered in xterm.js terminal

3 participants