Focused rich-text composer overrides configurable app keybindings with hardcoded formatting shortcuts
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 48/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- react, typescript
- Ambito
- desktop, developer-experience
Direzione di ricerca
Start with apps/web/src/composer-markdown-source.ts and apps/web/src/shortcuts/dispatcher.ts, then trace how configurable commands such as usage.open are registered and dispatched. Reproduce the Mod+E or Mod+I collision in the focused composer and compare it with sidebar.toggle’s capture-phase handling. Done means configurable chords work reliably in the composer or conflicts are surfaced and rejected, with tests covering both behaviors.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
What happened
Configurable app keybindings can stop working while the rich-text chat composer is focused if their chord collides with a hardcoded editor formatting shortcut.
Verified example on T3 Code Desktop 0.1.9: bind Show Usage (usage.open) to Mod+E or Mod+I. Either binding works outside the composer but does nothing while the composer is focused. The editor consumes the chord for inline-code or italic formatting before the configured app command receives it.
This is not specific to Show Usage. usage.open is the deterministic reproduction. Commands with special capture-phase handlers can behave differently; for example, the default Mod+B sidebar binding still works because sidebar.toggle has explicit conflict handling.
Diagnosis
This is a client-side shortcut precedence defect.
In v0.1.9 (24e77473ecf41bc1f7142529c7911c1c1aae1d76), the rich-text composer inherits Tiptap formatting shortcuts. ComposerMarkdownSourceExtension also hardcodes Mod+B, Mod+I, Mod+Shift+S, and Mod+E outside the configurable keybinding system.
Normal app commands such as usage.open are registered in a non-capture global command scope. The shared dispatcher runs those scopes from a bubbling window listener. A focused Tiptap editor can handle and prevent a colliding key event first, so the configured app command is never reached.
sidebar.toggle on Mod+B is an exception because the codebase gives it a dedicated capture-phase listener plus special rich-text selection handling. That special case explains why the default sidebar shortcut works but does not solve the general collision for other configurable commands or editor-owned chords.
The same hardcoded formatting shortcuts and bubbling global command path remain on main at 5da53f87d9feba9717bca516215aa3dedd0a694a, so no released update currently fixes this.
Steps to reproduce
- Open T3 Code Desktop.
- Open Settings → Keybindings.
- Set Show Usage (
usage.open) toMod+E. - Return to a chat and focus the rich-text composer.
- Press
Mod+E. - Observe that Usage does not open.
- Move focus outside the composer and press
Mod+E. - Observe that Usage opens.
- Repeat with
usage.openbound toMod+I; the same focus-dependent failure occurs.
Expected: the configured app keybinding takes precedence, or the conflict is surfaced and rejected.
Actual: the focused editor silently consumes the configured chord.
Version
0.1.9
Environment
macOS arm64 27.2.0; T3 Code Desktop 0.1.9 connected to local server 0.1.9; Node 26.12.1; triage CLI 0.1.9.
Evidence
v0.1.9 commit:
24e77473ecf41bc1f7142529c7911c1c1aae1d76
apps/web/src/composer-markdown-source.ts:561-566
"Mod-b": toggle("bold")
"Mod-B": toggle("bold")
"Mod-i": toggle("italic")
"Mod-I": toggle("italic")
"Mod-Shift-s": toggle("strike")
"Mod-e": toggle("code")
apps/web/src/shortcuts/dispatcher.ts:82-83
window.addEventListener("keydown", dispatchCaptureKeyDown, true)
window.addEventListener("keydown", dispatchKeyDown)
usage.open is registered in the non-capture global command scope.
sidebar.toggle has separate capture-phase conflict handling.
No server error is expected because the event is consumed entirely in the client.
Related issues
https://github.com/pingdotgg/t3code/issues/34136 — related report about app shortcuts being blocked by terminal focus, but not a duplicate: this report concerns focused rich-text editor shortcuts overriding configured app keybindings.
Fix applied or workaround
No fix was applied. Rebinding affected commands to chords not claimed by the rich-text editor, such as Mod+Alt+E, avoids the collision.
Filed by
Codex (GPT-5) via t3 triage
- Lingua principale
- TypeScript
- Stelle
- 24.8k
- Fork
- 6.4k
- Merge medio
- 10h 56m
- PR unite (30g)
- 226
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di pingdotgg/t3code
-
[Bug]: request_secret file delivery has no trailing newline, and the tool text does not say soForse già presa Una pull request collegata a questa issue è aperta o già unita. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 69/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
I maintainer di solito rispondono entro 1 giorno
-
[Bug]: Changing the sidebar project filter collapses an expanded Settled shelf back to 10 threadsAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
pingdotgg/t3code#34291 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 83/100
I maintainer di solito rispondono entro 1 giorno
-
via-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di pingdotgg/t3code
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
community first-timers-only good first issue hacktoberfest help wanted low hanging fruit up-for-grabs
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 82/100
lingdojo/kana-dojo#33947 · 1 commento · 5 reazioni ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
paperclipai/paperclip#20942 ·
I maintainer di solito rispondono entro 1 giorno
-
area: documentation good first issue package: rule-data status: accepting prs
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
status: needs triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 85/100
mastra-ai/mastra#30109 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno