[BUG] Regression in 2.1.269: dictation-tool paste (clipboard + simulated Ctrl+V) not inserted in VS Code integrated terminal (WSL2) — 2.1.268 works
Summary
After auto-updating to 2.1.269, text inserted by a voice dictation tool (Wispr Flow — clipboard + simulated Ctrl+V) is no longer inserted into the Claude Code prompt when Claude Code runs in the VS Code integrated terminal (Remote-WSL). Nothing appears in the prompt; the text is silently dropped.
Running 2.1.268 in the exact same terminal works, so this is a regression introduced in 2.1.269.
Environment
- Claude Code: 2.1.269 (native installer, WSL2 Ubuntu)
- Windows 11, VS Code 1.137.0 (Remote-WSL), extension
anthropic.claude-code2.1.269 - Wispr Flow 1.6.827 (inserts text via clipboard + simulated Ctrl+V)
- Linux 6.6.114.1-microsoft-standard-WSL2
Repro matrix (single-variable tests)
| Scenario | Result |
|---|---|
| Claude Code 2.1.269 in VS Code integrated terminal, dictate via Wispr Flow | ❌ text not inserted |
| Claude Code 2.1.268 in the same VS Code integrated terminal (same session of VS Code, extension still 2.1.269) | ✅ works |
| Claude Code 2.1.269 in Windows Terminal (same WSL distro) | ✅ works |
| Plain bash prompt in the same VS Code terminal (no Claude Code), dictate | ✅ works |
| PowerShell in the VS Code integrated terminal, dictate | ✅ works |
So the failure is exactly the intersection 2.1.269 × VS Code integrated terminal; neither factor alone reproduces it.
Ruled out
- VS Code screen-reader mode:
editor.accessibilitySupportexplicitly set to"off", full VS Code restart — no change. (Side note: Wispr Flow triggers VS Code's screen-reader detection, cf. microsoft/vscode#282290, but that is unrelated to this regression.) - Claude Code voice mode:
voice.enabled: false(and legacyvoiceEnabled: false), fresh session — no change. - VS Code extension version: 2.1.268 CLI works while the extension stays at 2.1.269.
- IDE integration: launching with
TERM_PROGRAM=xterm(preventing auto-connect) does not help; neither does disconnecting via/ide. - Wispr Flow version: 1.6.827 was installed a day before the regression and worked fine with 2.1.268 the whole day.
Suspected area
The 2.1.269 changelog includes terminal keyboard-input fixes (F1/F2/F4 in kitty-protocol terminals, Delete in st, Alt+arrows in rxvt-unicode, Shift+punctuation in WezTerm). The regression looks like a side effect of those input-parser changes on how pasted input from xterm.js (VS Code's terminal) is consumed.
Possibly related: #44044 (VS Code bracketed paste falling back to per-keystroke interpretation), #81472 (copy/paste meta).
Workaround
Pin 2.1.268 (ln -sfn ~/.local/share/claude/versions/2.1.268 ~/.local/bin/claude + DISABLE_AUTOUPDATER=1), or run Claude Code in Windows Terminal instead of the VS Code integrated terminal.
5 Comments
Same regression on Windows native (no WSL), adding a data point and an explanation of why Ctrl+V and Ctrl+Shift+V behave differently in the VS Code terminal on Windows.
Environment
terminalShellType == pwsh), extensionanthropic.claude-code2.1.269~/.claude/keybindings.json, no user/extension keybindings on Ctrl+V or Alt+V, noterminal.integrated.sendKeybindingsToShell/commandsToSkipShellSymptom
~/.claude/.last-update-result.json:"version_from":"2.1.268","version_to":"2.1.269"). VS Code 1.137.0 had been installed three days earlier and was fine with 2.1.268.Why Ctrl+V and Ctrl+Shift+V take different routes in a PowerShell terminal
VS Code (Windows only) registers a keybinding rule
workbench.action.terminal.pastePwshon Ctrl+V withwhen: terminalFocus && terminalShellType == 'pwsh' && !accessibilityModeEnabled. Unless the clipboard has no text but has file resources, its handler does not run the clipboard paste; it executesworkbench.action.terminal.sendSequencewith{ text: "\x16" }, i.e. it writes the raw Ctrl+V byte to the pty so that PSReadLine can paste natively. Ctrl+Shift+V is stillworkbench.action.terminal.paste(bracketed paste through xterm.js).So when Claude Code runs inside a PowerShell terminal in VS Code, Ctrl+V reaches it as a legacy
0x16keypress and Claude Code has to read the clipboard itself. That path works on 2.1.268 and does nothing on 2.1.269, while bracketed paste (Ctrl+Shift+V) still works on 2.1.269.Possible link to the kitty keyboard protocol
2.1.269 sends
CSI ? uat startup and enables the kitty keyboard protocol when the terminal answers ("terminals that answer the kitty keyboard query ... now get Shift+Enter and Ctrl+Shift shortcuts" in the changelog). VS Code 1.137 does answer:terminal.integrated.enableKittyKeyboardProtocoldefaults totrueand is passed to xterm.js asvtExtensions.kittyKeyboard. #93718 reports that setting it tofalserestored paste on macOS/VS Code.Result on Windows native with
"terminal.integrated.enableKittyKeyboardProtocol": false(new terminal, freshclaude): Ctrl+V pastes again (setting applied, new terminal, fresh claude, still 2.1.269). So on Windows native the regression is also the intersection of 2.1.269 enabling the kitty keyboard protocol in the VS Code terminal: with the protocol on, the raw 0x16 Ctrl+V keypress that VS Code hands to the app in a pwsh terminal is no longer treated as a paste, while bracketed paste (Ctrl+Shift+V) still is. Disabling the protocol in VS Code, or running 2.1.268, restores it.Third environment on this one, adding two things the thread does not have yet: the regression survives into 2.1.270, and it reproduces under a Git Bash terminal profile, not only
pwsh.Environment
97ecbf7abeb4), Windows 11 Education 26100terminal.integrated.defaultProfile.windows: "Git Bash"), extensionanthropic.claude-code2.1.270terminal.integrated.enableKittyKeyboardProtocolunset (so defaulttrue);commandsToSkipShellholds one unrelated Julia entry; nokeybindings.json;editor.accessibilitySupport: "off"Repro matrix — the OP's matrix with 2.1.270 in place of 2.1.269:
| Scenario | Result |
|---|---|
| 2.1.270, dictate into the Claude Code prompt, VS Code integrated terminal | ❌ not inserted |
| 2.1.268 in the same terminal, extension unchanged | ✅ works |
| Plain Git Bash prompt in the same terminal, no Claude Code | ✅ works |
| VS Code editor tab | ✅ works |
So 2.1.270 does not carry a fix, and the failure is again exactly the intersection of the build with the VS Code integrated terminal.
Why the Git Bash profile may be worth a look. The Windows-native analysis in the comment above turns on VS Code's
workbench.action.terminal.pastePwshrule, whosewhenclause requiresterminalShellType == 'pwsh'; its handler sends the raw0x16byte rather than pasting, so Claude Code has to read the clipboard itself. That rule does not apply to a Git Bash profile, where Ctrl+V staysworkbench.action.terminal.pasteand goes through xterm.js as a bracketed paste. The failure here is identical anyway. If the legacy-0x16route and the bracketed-paste route both fail, whatever 2.1.269 changed is not confined to thepwshpath.Independent bisection of the boundary. Wispr Flow keeps a local history database that records, per dictation, the target application and why its paste-verification ended. That gives a boundary without having to reconstruct it from memory:
2026-09-11 23:07:09 EDT; first failure2026-09-12 08:57:40 EDT; zero successes in between or sincecontentObservationEndReason = dictated_text_not_found— Flow pasted, read the target back, and could not find its own text, which is what raises its fallback "copy it yourself" cardSo the dictation tool is exonerated by its own telemetry on both sides of the boundary. Posting the signature in case it saves someone the same bisection: any tool that verifies its paste by reading the target back will report a not-found rather than a paste error, which makes this look like a dictation-tool bug from the outside.
"terminal.integrated.enableKittyKeyboardProtocol": falseis not yet tested on this Git Bash setup — happy to add the result if it would help distinguish the two paste routes.Follow-up to my comment above, which had only tested 2.1.270. I have now retested the middle build: 2.1.269 fails in the VS Code integrated terminal on this machine too, and works in Windows Terminal. So the boundary here is 2.1.268 → 2.1.269, matching the OP exactly, and 2.1.270 carries no fix.
Updated matrix — Windows native, Git Bash profile:
| Build | VS Code integrated terminal | Windows Terminal |
|---|---|---|
| 2.1.268 | ✅ inserts | — |
| 2.1.269 | ❌ silently dropped | ✅ inserts |
| 2.1.270 | ❌ silently dropped | — |
A 19-second correlation. Claude Code's session transcripts (
~/.claude/projects/*/*.jsonl) carry aversionfield on each turn, so the moment a build first served a turn can be read off directly instead of inferred. Cross-referencing that against Wispr Flow's history database:| | |
|---|---|
| 2.1.269's first session turn on this machine |
2026-09-12T12:57:21.249Z|| First
dictated_text_not_found|2026-09-12T12:57:40Z|| | 19 seconds |
Zero successful inserts into VS Code for the remainder of that day and the next, against a prior baseline of 100–220 dictations/day at roughly 99%.
A bisection trap worth flagging for anyone else reconstructing a boundary. The file date under
~/.local/share/claude/versions/is the download time, not the activation time.2.1.269was written at 2026-09-11 15:22 local but did not serve a turn until 2026-09-12 08:57 local — nearly eighteen hours later, because a running session keeps executing the binary it launched with. I first bisected from those mtimes and put the regression in the wrong window, which is also why my comment above tested 2.1.270 rather than 2.1.269. Theversionfield in the session transcripts is the reliable signal; anyone working from file timestamps will land a day early.OP here — the workaround from the comments above also holds on WSL2, and it survives 2.1.270.
Tested on the machine from the original report (WSL2 Ubuntu, VS Code integrated terminal over Remote-WSL, Wispr Flow). Both directions, with the serving build read off the
versionfield in the session transcript rather than inferred from file timestamps:|
terminal.integrated.enableKittyKeyboardProtocol| build | dictation into the Claude Code prompt ||---|---|---|
|
false| 2.1.269 | ✅ inserted ||
true| 2.1.269 | ❌ silently dropped ||
false| 2.1.270 | ✅ inserted |The control run with the protocol re-enabled failed exactly where it should, so on WSL2 too the regression is the intersection of the build with VS Code's kitty keyboard protocol — the same conclusion
axelboman277reached on Windows native with apwshprofile, now confirmed on a third platform and a fourth terminal path.Practical consequence for anyone hitting this: you do not have to pin the CLI. I had this machine locked to 2.1.268 with
DISABLE_AUTOUPDATER=1; with the VS Code setting turned off I could drop the lock entirely and run current 2.1.270 with dictation working.The cost of the workaround is small but not zero — with the protocol off, the shortcuts 2.1.269 introduced are gone. On this setup that is
Ctrl+Shift+Balone;Shift+Enteris unaffected, because it goes through the VS Code keybinding that sends^[\rrather than through the kitty protocol.Another Windows-native data point, plus confirmation that the
enableKittyKeyboardProtocolworkaround holds on an npm global install with cmd / Git Bash / PowerShell profiles.Environment
C:\nvm4w\nodejs\node_modules\@anthropic-ai\claude-code, nativeclaude.exewrapper), Windows 11 Pro 10.0.26200anthropic.claude-code2.1.270Symptom
Wispr Flow dictation into the Claude Code prompt is silently dropped. Wispr's "paste last transcript" hotkey into the prompt also does nothing. Manual Ctrl+V and right-click paste both work in the same prompt. Wispr works at a plain shell prompt in the same VS Code terminal and in every other application.
Repro matrix (CLI in the VS Code integrated terminal)
| Build | cmd | Git Bash | PowerShell |
|---|---|---|---|
| 2.1.266 | ✅ inserts | ✅ inserts | ✅ inserts |
|---|---|---|---|
| 2.1.266 | ✅ inserts | ✅ inserts | ✅ inserts |
| 2.1.270 | ❌ silently dropped | ❌ silently dropped | ❌ silently dropped |
| 2.1.270 +
"terminal.integrated.enableKittyKeyboardProtocol": false| ✅ inserts | ✅ inserts | ✅ inserts |2.1.267–2.1.269 not tested here; the OP's boundary (2.1.268 → 2.1.269) sits inside my window.
Ruled out (each tested in isolation, none changed anything)
shift+insert→editor.action.clipboardPasteActionbinding removed, no changeWispr Flow telemetry matches @mgkay's signature exactly. Its history DB (
%APPDATA%\Wispr Flow\flow.sqlite, tableHistory) logs every dictation intoapp = "Code"since the regression withcontentObservationEndReason = dictated_text_not_foundandeditDistanceToDictated = NULL, versustrailing_newline_added/ edit distance0on the same Wispr build before it:| Day | Dictations into VS Code | Unverified inserts |
|---|---|---|
| 2026-09-08 | 33 | 5 |
| 2026-09-09 | 19 | 3 |
| 2026-09-10 | 32 | 10 |
| 2026-09-13 | 19 | 18 |
Workaround confirmed:
"terminal.integrated.enableKittyKeyboardProtocol": falsein VS Code user settings, then open a new terminal. Running current 2.1.270 with auto-updates back on and dictation working.