Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
4563 commits
Select commit Hold shift + click to select a range
ddfbf27
Strengthen skill adherence system prompt with blocking requirement (#…
digitarald Jan 29, 2026
c6c601f
ask questions not in thinking + ux improvements (#291456)
justschen Jan 29, 2026
fd3c4bf
consistent transparency, white background
eli-w-king Jan 29, 2026
9197ab8
fixed chat input buttons foreground
eli-w-king Jan 29, 2026
748751e
Workspace trust - update proposed APIs (#291408)
lszomoru Jan 29, 2026
b6aa349
added color to boolean values
eli-w-king Jan 29, 2026
544e425
Hide tool picker in Agents for contributed sessions (#291473)
DonJayamanne Jan 29, 2026
b498a63
revised inline titles
eli-w-king Jan 29, 2026
7d83ce8
chore: update node-pty@1.2.0-beta.10 (#291471)
deepak1556 Jan 29, 2026
8ca6369
more contrast between selected and highlighted (right click) files
eli-w-king Jan 29, 2026
7357248
added active tab indicator
eli-w-king Jan 29, 2026
f977550
added active tab indicators
eli-w-king Jan 29, 2026
cbd6d81
inactive window indicator
eli-w-king Jan 29, 2026
9f5995d
ci: restore reliability of terrapin check (#291484)
deepak1556 Jan 29, 2026
52c040f
fix: update freeform input handling to always show for single/multi s…
karthiknadig Jan 29, 2026
e4e61e5
Git - dispose untrusted repositories when trust state changes (#291498)
lszomoru Jan 29, 2026
246b74b
Fix VoiceOver announcement for Agent Sessions view (#291320)
Copilot Jan 29, 2026
e7ac236
chat - drop option to hide chat title (#291505)
bpasero Jan 29, 2026
3b09167
better understanding of picker utilization
benibenj Jan 29, 2026
7dc9ccc
chat - use the sentiment property for AI enablement (#291506)
bpasero Jan 29, 2026
a56e5a1
Retry network operations on recoverable server errors (#290046)
dmitrivMS Jan 29, 2026
3b42759
fix #290724 (#291298)
sandy081 Jan 29, 2026
bb1eec4
hide agent session mode actions in stable (#291511)
sandy081 Jan 29, 2026
0a9a500
Merge pull request #291512 from microsoft/benibenj/frightened-bird
benibenj Jan 29, 2026
7e43c30
agent sessions - always take the timings from the provider (#291514)
bpasero Jan 29, 2026
93a1e4f
agent sessions - drop session providers that are not built-in and not…
bpasero Jan 29, 2026
cff94e7
Chat Sessions: Add Mark All Read action (fix #291213) (#291523)
bpasero Jan 29, 2026
715f7ad
Merge pull request #291354 from microsoft/copilot/fix-done-widget-issue
jrieken Jan 29, 2026
f7e2101
Fix inline chat gutter affordance with sticky scroll (#291357)
Copilot Jan 29, 2026
cceba81
fix #291360 (#291528)
sandy081 Jan 29, 2026
7a488d0
In agent session window, layout falls over when opening editors (fix …
bpasero Jan 29, 2026
7bc5a44
Merge pull request #291489 from microsoft/eli/theme-fixes-two
mrleemurray Jan 29, 2026
987f736
fix #291340 (#291532)
sandy081 Jan 29, 2026
c46f0c0
rename to open model picker when in overflow
benibenj Jan 29, 2026
d46d4d9
fix #291133 (#291546)
sandy081 Jan 29, 2026
1872cb3
Add garbage collection for unused content-addressed askpass directori…
Copilot Jan 29, 2026
32c2dd2
Add secondary button border and update related styles and colors
mrleemurray Jan 29, 2026
7a6db87
Merge pull request #291555 from microsoft/benibenj/invisible-butterfly
benibenj Jan 29, 2026
36b24b2
Tweak inline zone styles, make affordance and zone work together bett…
jrieken Jan 29, 2026
fc46ede
fixes https://github.com/microsoft/vscode/issues/248372 (#291551)
jrieken Jan 29, 2026
481bea5
agent sessions - read/unread tracking tweaks (#291539)
bpasero Jan 29, 2026
5181d05
Add telemetry for tree view concurrent refresh (#291540)
alexr00 Jan 29, 2026
452a4c7
Merge pull request #291556 from microsoft/mrleemurray/relevant-indigo…
mrleemurray Jan 29, 2026
35bb52f
fix #290760 (#291558)
sandy081 Jan 29, 2026
2748529
Merge pull request #291414 from microsoft/osortega/damp-viper
osortega Jan 29, 2026
2427fab
Refactor 2026 Dark theme colors and enhance tab styling
mrleemurray Jan 29, 2026
f448b54
Agents welcome view UI fixes
osortega Jan 29, 2026
0f9e720
only hide word suggestions when inline completions are enabled
benibenj Jan 29, 2026
f9b45cc
fix #290769 (#291566)
sandy081 Jan 29, 2026
1b9472f
Move layout out of if
osortega Jan 29, 2026
9bd3edc
inline chat: fix placeholder text and remove unused parameter (#291568)
jrieken Jan 29, 2026
076625e
Merge pull request #291571 from microsoft/mrleemurray/military-bronze…
mrleemurray Jan 29, 2026
acbd49b
agent status and unified agents bar should respect command center set…
benibenj Jan 29, 2026
2218109
Make auto approve rules for flags more speciifc
Tyriar Jan 29, 2026
2a8b28a
better hover color for action list toolbar action
benibenj Jan 29, 2026
f130856
:lipstick:
benibenj Jan 29, 2026
2f13c32
:listick:
benibenj Jan 29, 2026
7624fc3
Fix bug where a format document command results in an unknown detaile…
a-stewart Jan 19, 2026
b488ab4
Fix command palette auto-close when focus was in inline chat (#291560)
Copilot Jan 29, 2026
6655b5f
Merge pull request #291593 from microsoft/benibenj/frozen-lamprey
benibenj Jan 29, 2026
d749f78
Merge pull request #291595 from microsoft/tyriar/288589_2
Tyriar Jan 29, 2026
acc738b
Merge pull request #291597 from microsoft/benibenj/unusual-crayfish
benibenj Jan 29, 2026
653daa0
Chat - implement session picker in the chat panel title (#281051)
lszomoru Jan 29, 2026
144c2e8
disable session type picker when editing input
benibenj Jan 29, 2026
c1ccb4b
Merge pull request #291573 from microsoft/benibenj/moral-snail
benibenj Jan 29, 2026
a0fddd4
Merge pull request #291605 from microsoft/benibenj/naval-turtle
benibenj Jan 29, 2026
16d4fc6
Merge pull request #291572 from microsoft/osortega/running-carp
osortega Jan 29, 2026
b6efe49
Telemetry for welcome page
osortega Jan 29, 2026
e2a9f36
Fix empty hovers due to dom reuse (#291617)
lramos15 Jan 29, 2026
6924e80
change gutter color to be based on editor hover color
benibenj Jan 29, 2026
a103a12
fix: enhance selection validation in InlineChatAffordance (#291622)
jrieken Jan 29, 2026
ea32526
Revert "Chat - implement session picker in the chat panel title" (#29…
joaomoreno Jan 29, 2026
a6f5b3e
Update @vscode/codicons to version 0.0.45-2 and add 'openai' icon to …
mrleemurray Jan 29, 2026
a823d7d
update distro (#291635)
sandy081 Jan 29, 2026
5271ac0
read cached policy data even before fetching the default account (#29…
sandy081 Jan 29, 2026
d944566
Show chat agents/prompts in extension features list (#291643)
aeschli Jan 29, 2026
7ba11de
fix: update theme IDs and labels for consistency
mrleemurray Jan 29, 2026
d9e4d02
https://github.com/microsoft/vscode/issues/289753 (#291644)
jrieken Jan 29, 2026
00b43c8
mcp: update draft typings and announce mcp apps support (#291654)
connor4312 Jan 29, 2026
46308bc
Remove unnecessary log statement in JSON client (#291645)
aeschli Jan 29, 2026
fe90dba
improve new agent.md default empty tool selection (#291647)
aeschli Jan 29, 2026
f94bca2
Merge branch 'main' into benibenj/interested-slug
benibenj Jan 29, 2026
aca1a97
Merge pull request #291646 from microsoft/mrleemurray/thin-chocolate-…
mrleemurray Jan 29, 2026
16ef2c1
Merge pull request #291659 from microsoft/mrleemurray/vocational-amet…
mrleemurray Jan 29, 2026
3699d9f
Merge pull request #291633 from microsoft/benibenj/interested-slug
benibenj Jan 29, 2026
fe1d4cf
chore: update known CSS variabled (#291663)
jrieken Jan 29, 2026
e0e634e
Bump macOS test timeout to 90 minutes (#291664)
alexr00 Jan 29, 2026
12ce890
Update @vscode/codicons to version 0.0.45-4 and add 'claude' icon to …
mrleemurray Jan 29, 2026
57508a1
add missing team members
eleanorjboyd Jan 29, 2026
ede4c00
fix
eleanorjboyd Jan 29, 2026
6f458a1
Browser: make paused state less jarring (#291637)
kycutler Jan 29, 2026
80c02ca
Apply suggestion from @Copilot
rzhao271 Jan 29, 2026
65b61f6
Merge pull request #291674 from microsoft/mrleemurray/moderate-coral-…
mrleemurray Jan 29, 2026
e710e34
refactor - remove unused chat issue reporting command (#291684)
bpasero Jan 29, 2026
148bbfd
fix(stringEdit): prevent _tryRebase from producing non-disjoint edits
ulugbekna Jan 29, 2026
a72cd7b
add wait for command function (#291653)
meganrogge Jan 29, 2026
90d24f7
Chat Sessions: Toggling filter collapses More section (fix #291544) (…
bpasero Jan 29, 2026
bf729fa
strip out git askpass sourcemap footer (#291673)
joaomoreno Jan 29, 2026
9de6a5e
Initial plan
Copilot Jan 29, 2026
4246415
don't prompt if user explicitly set automatic tasks to `off` (#291671)
meganrogge Jan 29, 2026
23415e0
Gate Agent Sessions Welcome page on ChatContextKeys.enabled
Copilot Jan 29, 2026
9081bdd
check output before appending (#291658)
meganrogge Jan 29, 2026
d6d5aec
Adding sandbox pre-reqs to the setting UI for linux (#291670)
dileepyavan Jan 29, 2026
a0b16ae
Merge branch 'main' into close-wombat
eleanorjboyd Jan 29, 2026
82530a3
refactor - simplify auto-expand logic in `AgentSessionsControl` (#291…
bpasero Jan 29, 2026
d1fa3d6
feat - update icon for `Codex` and `Claude` providers (#291706)
bpasero Jan 29, 2026
6579a01
refactor - remove unused diff files indicators (#291707)
bpasero Jan 29, 2026
b3f114a
feat: implement auto-resize for freeform textarea in ask questions (#…
karthiknadig Jan 29, 2026
c026062
chat: add post-approval feedback message (#291712)
connor4312 Jan 29, 2026
2d3b03f
test
eli-w-king Jan 28, 2026
01f18c1
simplified chat questions
eli-w-king Jan 28, 2026
745fd0b
responsive
eli-w-king Jan 28, 2026
e2b7813
fixed close button
eli-w-king Jan 28, 2026
8936d7e
Bump tar from 7.5.6 to 7.5.7 in /build/npm/gyp (#291362)
dependabot[bot] Jan 29, 2026
e5035e9
Merge pull request #291686 from microsoft/close-wombat
eleanorjboyd Jan 29, 2026
7052972
engineering: use tar+zstd for win32 node_modules cache (#291624)
joaomoreno Jan 29, 2026
c534163
update instructions (#291715)
bpasero Jan 29, 2026
9cec1f5
Allow xxd exact command line
Tyriar Jan 29, 2026
fd3565e
Bump tar and dmg-builder in /build (#291331)
dependabot[bot] Jan 29, 2026
acfc362
Bump tar from 7.5.6 to 7.5.7 (#291723)
dependabot[bot] Jan 29, 2026
f7cb28a
Merge branch 'main' into dev/mjbvz/straightforward-flyingfish
mjbvz Jan 29, 2026
9fbb7b8
In sandbox mode for chatUI, the command should be displayed without s…
dileepyavan Jan 29, 2026
218de26
thinking header fix: styling and better generic text (#291462)
justschen Jan 29, 2026
bf05ca8
Merge branch 'main' into dev/mjbvz/straightforward-flyingfish
mjbvz Jan 29, 2026
000e601
Revert "engineering: use tar+zstd for win32 node_modules cache" (#291…
rzhao271 Jan 29, 2026
6b7d765
Fix chat terminal streaming chevron vertical alignment (#291650)
Copilot Jan 29, 2026
07e6e58
Fix excessive padding on terminal tool progress part action bar icons…
Copilot Jan 29, 2026
aa328e0
Ensure we read the observable on the right input part (#291748)
roblourens Jan 29, 2026
9eaa9ff
chat: fix control flow logic in tool invocation state transition (#29…
connor4312 Jan 29, 2026
e83c168
fix #https://github.com/microsoft/vscode-dev/issues/1366 (#291731)
sandy081 Jan 29, 2026
9d43a75
Merge branch 'main' into tyriar/287652_2
pwang347 Jan 29, 2026
3c7595e
mcp: prevent duplicate collection registrations on extension host res…
connor4312 Jan 29, 2026
66fe912
fix scrolling as content expands in thinking (#291750)
justschen Jan 29, 2026
28f29f6
Use correct id for model from subagent (#291757)
roblourens Jan 29, 2026
4ac8b5e
Enable Windows ARM sanity tests on the new pool (#291753)
dmitrivMS Jan 29, 2026
31a01ad
Merge pull request #291725 from microsoft/tyriar/287652_2
Tyriar Jan 29, 2026
946a11c
Clarify that `verification-steps-needed` is for the team, not the ext…
roblourens Jan 29, 2026
dff523f
fix: switch to list-style selection for single and multi-select quest…
karthiknadig Jan 28, 2026
4bc3336
updated tests
eli-w-king Jan 29, 2026
9bc1596
fix: fallback to title when question message is not provided
karthiknadig Jan 29, 2026
f1b439a
Fix chat terminal streaming editor height when there is only one line…
Copilot Jan 29, 2026
2534a0d
updated styling
eli-w-king Jan 30, 2026
be2a52e
Fixes https://github.com/microsoft/vscode/issues/291242 (#291760)
hediet Jan 30, 2026
a148fff
Merge branch 'main' into dev/mjbvz/straightforward-flyingfish
mjbvz Jan 30, 2026
a5cfde1
Merge pull request #291454 from mjbvz/dev/mjbvz/straightforward-flyin…
mjbvz Jan 30, 2026
830c548
Don't log full renderData (#291767)
roblourens Jan 30, 2026
d9bb11e
associate spinner text with tool call or reasoning block (#291762)
justschen Jan 30, 2026
1664edf
fix: tests
karthiknadig Jan 30, 2026
b17f5e9
fix css mismatch between spinner and thinking header (#291773)
justschen Jan 30, 2026
543804d
Disable question tool for subagent (#291780)
roblourens Jan 30, 2026
b9bd16f
Clamp terminal timeout to save values
Tyriar Jan 30, 2026
40e01fc
Merge pull request #291795 from microsoft/tyriar/290972
Tyriar Jan 30, 2026
968b908
Don't log tool cancellation as error (#291797)
roblourens Jan 30, 2026
2d23946
Move `Collapse All` action in SCM to leftmost position (#291474)
dmitrivMS Jan 30, 2026
a84bfab
Agent status indicator: Do not show unread on empty workspace (#291696)
joshspicer Jan 30, 2026
a1728b9
Revert "Bump tar and dmg-builder in /build" (#291808)
alexr00 Jan 30, 2026
e32b95e
Merge pull request #291621 from microsoft/osortega/mean-warbler
osortega Jan 30, 2026
c725a4c
Merge branch 'main' of https://github.com/microsoft/vscode into copil…
osortega Jan 30, 2026
d0b0734
Fallback to welcome page if AI disabled
osortega Jan 30, 2026
faf04ff
Whitespace
osortega Jan 30, 2026
afb4b52
feat: enhance ChatModelsWidget with hover support for managed entitle…
cwebster-99 Jan 30, 2026
e4949cf
Review comments
osortega Jan 30, 2026
ea08404
oss tool (#291826)
jrieken Jan 30, 2026
04bfcaa
Close editor on AI disablement
osortega Jan 30, 2026
58da0af
Remove chat welcome from chat editors when core agent exists (#291722)
Copilot Jan 30, 2026
4d48941
update version to 1.110.0 (#291832)
jrieken Jan 30, 2026
75507a1
provide completions when copilot extension is not installed
benibenj Jan 30, 2026
963958a
Fixes invariant violation in tryRebase (#291840)
hediet Jan 30, 2026
cfb2e3e
Merge pull request #291697 from microsoft/copilot/fix-agent-sessions-…
osortega Jan 30, 2026
dc1437b
Agent sessions - Session grouping doesn't seem to always account for …
bpasero Jan 30, 2026
5201505
fix: update button secondary styles for improved theming consistency
mrleemurray Jan 30, 2026
7b86cfc
Remove commented-out z-index adjustments for iframe containers in sty…
mrleemurray Jan 30, 2026
539f216
Merge pull request #291844 from microsoft/benibenj/uniFix
benibenj Jan 30, 2026
ff791db
Merge pull request #291848 from microsoft/mrleemurray/characteristic-…
mrleemurray Jan 30, 2026
837a066
Merge pull request #291849 from microsoft/mrleemurray/ancient-green-c…
mrleemurray Jan 30, 2026
f727611
Wait until active editor change to close welcome view
osortega Jan 30, 2026
5ac2d22
Update activity bar and title bar background colors to improve theme …
mrleemurray Jan 30, 2026
f905cf4
Add CLI DevTunnel sanity test (#291813)
dmitrivMS Jan 30, 2026
68cd1d5
Merge branch 'main' into fix-267766
jrieken Jan 30, 2026
a51a89d
Merge pull request #291855 from microsoft/mrleemurray/cloudy-jade-cougar
mrleemurray Jan 30, 2026
73c1955
Enhance notebook overlay styles with z-index and improved shadow effects
mrleemurray Jan 30, 2026
0da4260
Merge pull request #267787 from gjsjohnmurray/fix-267766
jrieken Jan 30, 2026
aafde1d
Merge pull request #291869 from microsoft/mrleemurray/nearby-plum-stoat
mrleemurray Jan 30, 2026
086eda1
fix #291851 (#291862)
sandy081 Jan 30, 2026
37ac613
Implements https://github.com/microsoft/vscode/issues/271133 (#290036)
hediet Jan 30, 2026
f8e5529
Add ARIA role and label to welcome view content (#291639)
benibenj Jan 30, 2026
b41f50f
update distro (#291881)
sandy081 Jan 30, 2026
3fb76ca
fix #290501 (#291876)
sandy081 Jan 30, 2026
609f17a
Update grammars (#291900)
alexr00 Jan 30, 2026
da5a231
Replace `infer` with `disable-model-invocation` and `user-invokable` …
aeschli Jan 30, 2026
fca41f4
Add sendSignal to commandsToSkipShell defaults
Tyriar Jan 30, 2026
2b17889
targetted fix for agent status widget with multiple windows open (#29…
joshspicer Jan 30, 2026
6aa8b5a
Merge pull request #291914 from microsoft/tyriar/291913
Tyriar Jan 30, 2026
34e727e
Add `workbench.activityBar.autoHide` setting to hide activity bar wit…
Copilot Jan 30, 2026
b779571
update distro (#291921)
sandy081 Jan 30, 2026
f9cc5a2
The 'excludeAgent' attribute must be an array (#291924)
aeschli Jan 30, 2026
7baa2ba
Update built ts versions
mjbvz Jan 30, 2026
e1d0a27
Lower data event threshold for showing output (#291929)
meganrogge Jan 30, 2026
7c5e247
Browser: Fix searchbox length (#291806)
jruales Jan 30, 2026
60a106e
chore: remove legacy context menu from system setup (#291938)
deepak1556 Jan 30, 2026
481b139
Have usage be on the stream rather than on result (#291944)
lramos15 Jan 30, 2026
0d9a2ef
Add explicit rootDirs
mjbvz Jan 30, 2026
0403a60
tools: fix tools in toolsets not disabling on `when` clause (#291957)
connor4312 Jan 30, 2026
c7a00be
prevent first 10 lines from being clipped in terminal output (#291941)
meganrogge Jan 30, 2026
17969fb
fix cursor being clipped in embedded terminal (#291942)
meganrogge Jan 30, 2026
f3c9ef1
Merge branch 'main' into international-orca
digitarald Jan 30, 2026
bae3238
Git - add the ability to disable commit signing (#291822)
lszomoru Jan 30, 2026
65662d8
base: support multiple MIME types per file extension
connor4312 Jan 30, 2026
d0201bc
Add symlinked CLAUDE.md file (#291967)
TylerLeonhardt Jan 30, 2026
c77003e
Merge pull request #291969 from microsoft/connor4312/291962
connor4312 Jan 30, 2026
fb1e3d2
chore: exclude more files from BinSkim (#291946)
rzhao271 Jan 30, 2026
b2d9fe5
address comments from copilot
karthiknadig Jan 30, 2026
3569fa6
fix regression after merge
karthiknadig Jan 30, 2026
ee01088
Update roots
mjbvz Jan 30, 2026
9b3393b
chat: clean up some debt around session timings (#291976)
connor4312 Jan 30, 2026
f10e8f3
Merge branch 'main' into international-orca
eli-w-king Jan 30, 2026
0584618
Merge branch 'main' into international-orca
digitarald Jan 30, 2026
17f3b16
fix terminal output position (#291964)
meganrogge Jan 30, 2026
88dc2db
Fix auto-approved terminal commands triggering notification and sound…
meganrogge Jan 30, 2026
91a2659
updated styling and moved buttons
eli-w-king Jan 30, 2026
6a20442
ignore()
eli-w-king Jan 30, 2026
e0bf14a
Merge branch 'main' into international-orca
eli-w-king Jan 30, 2026
b428b97
chore: bump vscode/ripgrep to 1.17.0 (#272744)
rzhao271 Jan 30, 2026
0632563
Browser: fix undo, redo, select all on Mac (#291775)
kycutler Jan 30, 2026
f2d4d1c
fixing tests
karthiknadig Jan 30, 2026
a8a719a
another bug in summary
karthiknadig Jan 30, 2026
cffc62c
Merge pull request #291351 from microsoft/international-orca
eli-w-king Jan 30, 2026
56391d0
chat: fix screen cheese in sensitive file overflow (#291996)
connor4312 Jan 31, 2026
9c2578b
chat: enhance compare block diff actions and accessibility (#292005)
connor4312 Jan 31, 2026
993c5c0
fix: restore freeform support and summary (#292003)
karthiknadig Jan 31, 2026
04a2899
tools: clean up auto-approved post-approval state (#291998)
connor4312 Jan 31, 2026
906d61a
Merge pull request #291852 from microsoft/osortega/vivacious-peafowl
osortega Jan 31, 2026
81cd59d
agent sessions - always render the badge if we have it (#292046)
bpasero Jan 31, 2026
e86a8ae
agent sessions window - add auto-hide setting for activity bar (#292047)
bpasero Jan 31, 2026
4fd19cc
Fix alignment in terminal inline chat widget
Tyriar Jan 31, 2026
00e0d96
Merge pull request #292063 from microsoft/tyriar/291952
Tyriar Jan 31, 2026
d219100
agent sessions - restore ability to hide sidebar when chat maximised …
bpasero Jan 31, 2026
b31c729
Add smoke test for anonymous chat access (#291953)
Copilot Jan 31, 2026
306d939
Fix panel alignment command breaking with maximized auxiliary bar (#2…
Copilot Jan 31, 2026
984af6f
Better wording for Claude agent description (#292076)
TylerLeonhardt Jan 31, 2026
e6f0ffd
Merge pull request #291937 from mjbvz/dev/mjbvz/severe-buzzard
mjbvz Jan 31, 2026
c6cdeb1
fix bad styling in attachments for images (#292099)
justschen Feb 1, 2026
084facb
agent sessions - only render non-default session icons (#292116)
bpasero Feb 1, 2026
377e7d2
Fix Monaco scroll offset buffer use after destroy
Tyriar Feb 1, 2026
77c18b8
Merge pull request #292151 from microsoft/tyriar/291991
Tyriar Feb 1, 2026
6a07da9
Merge vscode/main - synced with upstream VS Code
Feb 1, 2026
6459db0
Fix remaining merge conflict in build/filters.ts
Feb 1, 2026
487dbaa
Bump cortexVersion to 0.0.11
Feb 1, 2026
e42cf84
Fix TypeScript nullish expression error in terminalToolService
Feb 2, 2026
7ad6f90
Fix TypeScript nullish error with explicit conditional checks
Feb 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
1 change: 1 addition & 0 deletions .claude/CLAUDE.md
1 change: 0 additions & 1 deletion .eslint-ignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,6 @@
**/src/typings/**/*.d.ts
**/src/vs/*/**/*.d.ts
**/src/vs/base/test/common/filters.perf.data.js
**/src/vs/loader.js
**/test/unit/assert.js
**/test/automation/out/**
**/typings/**
Expand Down
13 changes: 8 additions & 5 deletions .eslint-plugin-local/code-amd-node-module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@
*--------------------------------------------------------------------------------------------*/

import * as eslint from 'eslint';
import type * as ESTree from 'estree';
import { readFileSync } from 'fs';
import { join } from 'path';


export = new class ApiProviderNaming implements eslint.Rule.RuleModule {
export default new class ApiProviderNaming implements eslint.Rule.RuleModule {

readonly meta: eslint.Rule.RuleMetaData = {
messages: {
Expand All @@ -21,7 +23,8 @@ export = new class ApiProviderNaming implements eslint.Rule.RuleModule {
const modules = new Set<string>();

try {
const { dependencies, optionalDependencies } = require(join(__dirname, '../package.json'));
const packageJson = JSON.parse(readFileSync(join(import.meta.dirname, '../package.json'), 'utf-8'));
const { dependencies, optionalDependencies } = packageJson;
const all = Object.keys(dependencies).concat(Object.keys(optionalDependencies));
for (const key of all) {
modules.add(key);
Expand All @@ -33,13 +36,13 @@ export = new class ApiProviderNaming implements eslint.Rule.RuleModule {
}


const checkImport = (node: any) => {
const checkImport = (node: ESTree.Literal & { parent?: ESTree.Node & { importKind?: string } }) => {

if (node.type !== 'Literal' || typeof node.value !== 'string') {
if (typeof node.value !== 'string') {
return;
}

if (node.parent.importKind === 'type') {
if (node.parent?.type === 'ImportDeclaration' && node.parent.importKind === 'type') {
return;
}

Expand Down
5 changes: 3 additions & 2 deletions .eslint-plugin-local/code-declare-service-brand.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@
*--------------------------------------------------------------------------------------------*/

import * as eslint from 'eslint';
import type * as ESTree from 'estree';

export = new class DeclareServiceBrand implements eslint.Rule.RuleModule {
export default new class DeclareServiceBrand implements eslint.Rule.RuleModule {

readonly meta: eslint.Rule.RuleMetaData = {
fixable: 'code',
Expand All @@ -14,7 +15,7 @@ export = new class DeclareServiceBrand implements eslint.Rule.RuleModule {

create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
return {
['PropertyDefinition[key.name="_serviceBrand"][value]']: (node: any) => {
['PropertyDefinition[key.name="_serviceBrand"][value]']: (node: ESTree.PropertyDefinition) => {
return context.report({
node,
message: `The '_serviceBrand'-property should not have a value`,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
*--------------------------------------------------------------------------------------------*/

import * as eslint from 'eslint';
import { Node } from 'estree';
import type * as estree from 'estree';

export = new class EnsureNoDisposablesAreLeakedInTestSuite implements eslint.Rule.RuleModule {
export default new class EnsureNoDisposablesAreLeakedInTestSuite implements eslint.Rule.RuleModule {

readonly meta: eslint.Rule.RuleMetaData = {
type: 'problem',
Expand All @@ -18,15 +18,15 @@ export = new class EnsureNoDisposablesAreLeakedInTestSuite implements eslint.Rul
};

create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
const config = <{ exclude: string[] }>context.options[0];
const config = context.options[0] as { exclude: string[] };

const needle = context.getFilename().replace(/\\/g, '/');
if (config.exclude.some((e) => needle.endsWith(e))) {
return {};
}

return {
[`Program > ExpressionStatement > CallExpression[callee.name='suite']`]: (node: Node) => {
[`Program > ExpressionStatement > CallExpression[callee.name='suite']`]: (node: estree.Node) => {
const src = context.getSourceCode().getText(node);
if (!src.includes('ensureNoDisposablesAreLeakedInTestSuite(')) {
context.report({
Expand Down
12 changes: 6 additions & 6 deletions .eslint-plugin-local/code-import-patterns.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ import * as eslint from 'eslint';
import { TSESTree } from '@typescript-eslint/utils';
import * as path from 'path';
import minimatch from 'minimatch';
import { createImportRuleListener } from './utils';
import { createImportRuleListener } from './utils.ts';

const REPO_ROOT = path.normalize(path.join(__dirname, '../'));
const REPO_ROOT = path.normalize(path.join(import.meta.dirname, '../'));

interface ConditionalPattern {
when?: 'hasBrowser' | 'hasNode' | 'hasElectron' | 'test';
Expand All @@ -31,15 +31,15 @@ interface LayerAllowRule {
type RawOption = RawImportPatternsConfig | LayerAllowRule;

function isLayerAllowRule(option: RawOption): option is LayerAllowRule {
return !!((<LayerAllowRule>option).when && (<LayerAllowRule>option).allow);
return !!((option as LayerAllowRule).when && (option as LayerAllowRule).allow);
}

interface ImportPatternsConfig {
target: string;
restrictions: string[];
}

export = new class implements eslint.Rule.RuleModule {
export default new class implements eslint.Rule.RuleModule {

readonly meta: eslint.Rule.RuleMetaData = {
messages: {
Expand All @@ -55,7 +55,7 @@ export = new class implements eslint.Rule.RuleModule {
};

create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
const options = <RawOption[]>context.options;
const options = context.options as RawOption[];
const configs = this._processOptions(options);
const relativeFilename = getRelativeFilename(context);

Expand Down Expand Up @@ -217,7 +217,7 @@ export = new class implements eslint.Rule.RuleModule {
configs.push(testConfig);
}
} else {
configs.push({ target, restrictions: <string[]>restrictions.filter(r => typeof r === 'string') });
configs.push({ target, restrictions: restrictions.filter(r => typeof r === 'string') as string[] });
}
}
this._optionsCache.set(options, configs);
Expand Down
8 changes: 3 additions & 5 deletions .eslint-plugin-local/code-layering.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@

import * as eslint from 'eslint';
import { join, dirname } from 'path';
import { createImportRuleListener } from './utils';
import { createImportRuleListener } from './utils.ts';

type Config = {
allowed: Set<string>;
disallowed: Set<string>;
};

export = new class implements eslint.Rule.RuleModule {
export default new class implements eslint.Rule.RuleModule {

readonly meta: eslint.Rule.RuleMetaData = {
messages: {
Expand All @@ -38,8 +38,7 @@ export = new class implements eslint.Rule.RuleModule {

const fileDirname = dirname(context.getFilename());
const parts = fileDirname.split(/\\|\//);
const ruleArgs = <Record<string, string[]>>context.options[0];

const ruleArgs = context.options[0] as Record<string, string[]>;
let config: Config | undefined;
for (let i = parts.length - 1; i >= 0; i--) {
if (ruleArgs[parts[i]]) {
Expand Down Expand Up @@ -91,4 +90,3 @@ export = new class implements eslint.Rule.RuleModule {
});
}
};

15 changes: 8 additions & 7 deletions .eslint-plugin-local/code-limited-top-functions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@
import * as eslint from 'eslint';
import { dirname, relative } from 'path';
import minimatch from 'minimatch';
import type * as ESTree from 'estree';

export = new class implements eslint.Rule.RuleModule {
export default new class implements eslint.Rule.RuleModule {

readonly meta: eslint.Rule.RuleMetaData = {
messages: {
Expand All @@ -28,11 +29,11 @@ export = new class implements eslint.Rule.RuleModule {
};

create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
let fileRelativePath = relative(dirname(__dirname), context.getFilename());
let fileRelativePath = relative(dirname(import.meta.dirname), context.getFilename());
if (!fileRelativePath.endsWith('/')) {
fileRelativePath += '/';
}
const ruleArgs = <Record<string, string[]>>context.options[0];
const ruleArgs = context.options[0] as Record<string, string[]>;

const matchingKey = Object.keys(ruleArgs).find(key => fileRelativePath.startsWith(key) || minimatch(fileRelativePath, key));
if (!matchingKey) {
Expand All @@ -43,8 +44,8 @@ export = new class implements eslint.Rule.RuleModule {
const restrictedFunctions = ruleArgs[matchingKey];

return {
FunctionDeclaration: (node: any) => {
const isTopLevel = node.parent.type === 'Program';
FunctionDeclaration: (node: ESTree.FunctionDeclaration & { parent?: ESTree.Node }) => {
const isTopLevel = node.parent?.type === 'Program';
const functionName = node.id.name;
if (isTopLevel && !restrictedFunctions.includes(node.id.name)) {
context.report({
Expand All @@ -53,10 +54,10 @@ export = new class implements eslint.Rule.RuleModule {
});
}
},
ExportNamedDeclaration(node: any) {
ExportNamedDeclaration(node: ESTree.ExportNamedDeclaration & { parent?: ESTree.Node }) {
if (node.declaration && node.declaration.type === 'FunctionDeclaration') {
const functionName = node.declaration.id.name;
const isTopLevel = node.parent.type === 'Program';
const isTopLevel = node.parent?.type === 'Program';
if (isTopLevel && !restrictedFunctions.includes(node.declaration.id.name)) {
context.report({
node,
Expand Down
11 changes: 6 additions & 5 deletions .eslint-plugin-local/code-must-use-result.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,30 @@
*--------------------------------------------------------------------------------------------*/

import * as eslint from 'eslint';
import type * as ESTree from 'estree';
import { TSESTree } from '@typescript-eslint/utils';

const VALID_USES = new Set<TSESTree.AST_NODE_TYPES | undefined>([
TSESTree.AST_NODE_TYPES.AwaitExpression,
TSESTree.AST_NODE_TYPES.VariableDeclarator,
]);

export = new class MustUseResults implements eslint.Rule.RuleModule {
export default new class MustUseResults implements eslint.Rule.RuleModule {
readonly meta: eslint.Rule.RuleMetaData = {
schema: false
};

create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {

const config = <{ message: string; functions: string[] }[]>context.options[0];
const config = context.options[0] as { message: string; functions: string[] }[];
const listener: eslint.Rule.RuleListener = {};

for (const { message, functions } of config) {
for (const fn of functions) {
const query = `CallExpression[callee.property.name='${fn}'], CallExpression[callee.name='${fn}']`;
listener[query] = (node: any) => {
const cast: TSESTree.CallExpression = node;
if (!VALID_USES.has(cast.parent?.type)) {
listener[query] = (node: ESTree.Node) => {
const callExpression = node as TSESTree.CallExpression;
if (!VALID_USES.has(callExpression.parent?.type)) {
context.report({ node, message });
}
};
Expand Down
8 changes: 5 additions & 3 deletions .eslint-plugin-local/code-must-use-super-dispose.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,20 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/

import { TSESTree } from '@typescript-eslint/utils';
import * as eslint from 'eslint';
import type * as ESTree from 'estree';

export = new class NoAsyncSuite implements eslint.Rule.RuleModule {
export default new class NoAsyncSuite implements eslint.Rule.RuleModule {

create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
function doesCallSuperDispose(node: any) {
function doesCallSuperDispose(node: TSESTree.MethodDefinition) {

if (!node.override) {
return;
}

const body = context.getSourceCode().getText(node);
const body = context.getSourceCode().getText(node as ESTree.Node);

if (body.includes('super.dispose')) {
return;
Expand Down
2 changes: 1 addition & 1 deletion .eslint-plugin-local/code-no-any-casts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import * as eslint from 'eslint';
import { TSESTree } from '@typescript-eslint/utils';

export = new class NoAnyCasts implements eslint.Rule.RuleModule {
export default new class NoAnyCasts implements eslint.Rule.RuleModule {

create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
return {
Expand Down
7 changes: 4 additions & 3 deletions .eslint-plugin-local/code-no-dangerous-type-assertions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,16 @@
*--------------------------------------------------------------------------------------------*/

import * as eslint from 'eslint';
import type * as ESTree from 'estree';
import { TSESTree } from '@typescript-eslint/utils';

export = new class NoDangerousTypeAssertions implements eslint.Rule.RuleModule {
export default new class NoDangerousTypeAssertions implements eslint.Rule.RuleModule {

create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
return {
// Disallow type assertions on object literals: <T>{ ... } or {} as T
['TSTypeAssertion > ObjectExpression, TSAsExpression > ObjectExpression']: (node: any) => {
const objectNode = node as TSESTree.Node;
['TSTypeAssertion > ObjectExpression, TSAsExpression > ObjectExpression']: (node: ESTree.ObjectExpression) => {
const objectNode = node as TSESTree.ObjectExpression;

const parent = objectNode.parent as TSESTree.TSTypeAssertion | TSESTree.TSAsExpression;
if (
Expand Down
8 changes: 4 additions & 4 deletions .eslint-plugin-local/code-no-deep-import-of-internal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

import * as eslint from 'eslint';
import { join, dirname } from 'path';
import { createImportRuleListener } from './utils';
import { createImportRuleListener } from './utils.ts';

export = new class implements eslint.Rule.RuleModule {
export default new class implements eslint.Rule.RuleModule {

readonly meta: eslint.Rule.RuleMetaData = {
messages: {
Expand All @@ -28,8 +28,8 @@ export = new class implements eslint.Rule.RuleModule {

create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
const patterns = context.options[0] as Record<string, boolean>;
const internalModulePattern = Object.entries(patterns).map(([key, v]) => v ? key : undefined).filter(v => !!v);
const allowedPatterns = Object.entries(patterns).map(([key, v]) => !v ? key : undefined).filter(v => !!v);
const internalModulePattern = Object.entries(patterns).map(([key, v]) => v ? key : undefined).filter((v): v is string => !!v);
const allowedPatterns = Object.entries(patterns).map(([key, v]) => !v ? key : undefined).filter((v): v is string => !!v);

return createImportRuleListener((node, path) => {
const importerModuleDir = dirname(context.filename);
Expand Down
2 changes: 1 addition & 1 deletion .eslint-plugin-local/code-no-global-document-listener.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import * as eslint from 'eslint';

export = new class NoGlobalDocumentListener implements eslint.Rule.RuleModule {
export default new class NoGlobalDocumentListener implements eslint.Rule.RuleModule {

create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {
return {
Expand Down
11 changes: 7 additions & 4 deletions .eslint-plugin-local/code-no-in-operator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
*--------------------------------------------------------------------------------------------*/

import * as eslint from 'eslint';
import type * as ESTree from 'estree';
import { TSESTree } from '@typescript-eslint/utils';

/**
* Disallows the use of the `in` operator in TypeScript code, except within
Expand All @@ -15,7 +17,7 @@ import * as eslint from 'eslint';
* Exception: Type predicate functions are allowed to use the `in` operator
* since they are the standard way to perform runtime type checking.
*/
export = new class NoInOperator implements eslint.Rule.RuleModule {
export default new class NoInOperator implements eslint.Rule.RuleModule {

readonly meta: eslint.Rule.RuleMetaData = {
messages: {
Expand All @@ -26,9 +28,10 @@ export = new class NoInOperator implements eslint.Rule.RuleModule {

create(context: eslint.Rule.RuleContext): eslint.Rule.RuleListener {

function checkInOperator(inNode: any) {
function checkInOperator(inNode: ESTree.BinaryExpression) {
const node = inNode as TSESTree.BinaryExpression;
// Check if we're inside a type predicate function
const ancestors = context.sourceCode.getAncestors(inNode);
const ancestors = context.sourceCode.getAncestors(node as ESTree.Node);

for (const ancestor of ancestors) {
if (ancestor.type === 'FunctionDeclaration' ||
Expand All @@ -45,7 +48,7 @@ export = new class NoInOperator implements eslint.Rule.RuleModule {
}

context.report({
node: inNode,
node,
messageId: 'noInOperator'
});
}
Expand Down
Loading
Loading