Try to extend agent mode in VS Code!

July 2025 (version 1.103)

Release date: August 7, 2025

Downloads: Windows: x64 Arm64 | Mac: Universal Intel silicon | Linux: deb rpm tarball Arm snap


Welcome to the July 2025 release of Visual Studio Code. There are many updates in this version that we hope you'll like, some of the key highlights include:

  • MCP

  • Chat

  • Productivity

    • Check out multiple branches simultaneously with Git worktrees (Show more)
    • Manage coding agent sessions in a dedicated view (Show more)

If you'd like to read these release notes online, go to Updates on code.visualstudio.com.

Insiders: Want to try new features as soon as possible?
You can download the nightly Insiders build and try the latest updates as soon as they are available.
Download Insiders

Chat

GPT 5 availability

Starting today, GPT-5 is rolling out to all paid GitHub Copilot plans. GPT-5 is OpenAI's most capable model yet, bringing new advances in reasoning, coding, and chat. Learn more about the GPT-5 model availability in the GitHub Changelog.

Open the Chat view and choose GPT-5 from the model picker to start using it for your chat conversations in VS Code.

Learn more about using language models in VS Code.

Chat checkpoints

Setting: chat.checkpoints.enabled

We've introduced checkpoints that enable you to restore different states of your chat conversations. You can easily revert edits and go back to certain points in your chat conversation. This can be particularly useful if multiple files were changed in a chat session.

When you select a checkpoint, VS Code reverts workspace changes and the chat history to that point. After restoring a checkpoint, you can redo that action as well!

Checkpoints will be enabled by default and can be controlled with chat.checkpoints.enabled.

Tool picker improvements

We've totally revamped the tool picker this iteration and adopted a new component called Quick Tree to display all the tools.

Screenshot showing the new tool picker using a quick tree, enabling collapsing and expanding nodes.

Notable features:

  • Expand or collapse
  • Configuration options moved to the title bar
  • Sticky scrolling
  • Icon rendering

Let us know what you think!

Tool grouping (Experimental)

Setting: github.copilot.chat.virtualTools.threshold

The maximum number of tools that you can use for a single chat request is currently 128. Previously, you could quickly reach this limit by installing MCP servers with many tools, requiring you to deselect some tools in order to proceed.

In this release of VS Code, we have enabled an experimental tool-calling mode for when the number of tools exceeds the maximum limit. Tools are automatically grouped and the model is given the ability to activate and call groups of tools.

This behavior, including the threshold, is configurable via the setting github.copilot.chat.virtualTools.threshold.

Terminal auto-approve improvements

Setting: chat.tools.terminal.autoApprove

Early terminal auto-approve settings were introduced last month. This release, the feature got many improvements. Learn more about terminal auto-approval in our documentation.

  • We merged the allowList and denyList settings into the chat.tools.terminal.autoApprove setting. If you were using the old settings, you should see a warning asking you to migrate to the new setting.

  • Regular expression matchers now support flags. This allows case insensitivity, for example in PowerShell, where case often doesn't matter:

    "chat.tools.terminal.autoApprove": {
      // Deny any `Remove-Item` command, regardless of case
      "/^Remove-Item\\b/i": false
    }
    
  • There was some confusion around how the sub-command matching works, this is now explained in detail in the setting's description, but we also support matching against the complete command line.

    "chat.tools.terminal.autoApprove": {
      // Deny any _command line_ containing a reference to what is likely a PowerShell script
      "/\\.ps1\\b/i": { approve: false, matchCommandLine: true }
    }
    
  • The auto approve reasoning is now logged to the Terminal Output channel. We plan to surface this in the UI soon.

  • For now auto approve will only be allowed in either User or Remote settings. We do plan to allow their use in workspace settings again in an upcoming release.

Track progress with task lists (Experimental)

Setting: chat.todoListTool.enabled

The great thing about agent mode is that you can give it a high-level task and have it implement it. As it plans the work and breaks it down into smaller tasks, it can be overwhelming to track the progress of all these individual tasks.

This milestone, we are introducing the task/todo list feature in chat to better help you see which tasks are completed and which ones are still pending. You can view the task list at the top of the Chat view, so you always have visibility into the progress being made. As the agent progresses through its work, it updates the task list.

Get started by giving the agent a high-level task and ask it to track its work in a todo list!

This feature is still experimental and you can enable it with the chat.todoListTool.enabled setting.

Improved model management experience

This iteration, we've revamped the chat provider API, which is responsible for language model access. Users are now able to select which models appear in their model picker, creating a more personalized and focused experience.

Screenshot of the model picker showing various models from providers such as Copilot and OpenRouter

We plan to finalize this new API in the coming months and would appreciate any feedback. Finalization of this API will open up the extension ecosystem to implement their own model providers and further expand the bring your own key offering.

Azure DevOps repos remote index support

The #codebase tool now supports remote indexes for workspaces that are linked to Azure DevOps repos. This enables #codebase to search for relevant snippets almost instantly without any initialization. This even works for larger repos with tens of thousands of indexable files. Previously, this feature only worked with GitHub linked repos.

Remote indexes are used automatically when working in a workspace that is linked to Azure DevOps through git. Make sure you are also logged into VS Code with the Microsoft account you use to access the Azure DevOps repos.

We're gradually rolling out support for this feature on the services side, so not every organization might be able to use it initially. Based on the success of the rollout, we hope to turn on remote indexing for Azure DevOps for as many organizations as possible.

Improved reliability and performance of the run in terminal and task tools

We have migrated the tools for running tasks and commands within the terminal from the Copilot extension into the core microsoft/vscode repository. This gives the tools access to lower-level and richer APIs, allowing us to fix many of the terminal hanging issues. This update also comes with the benefit of more easily implementing features going forward, as we're no longer restricted to the capabilities of the extension API, especially any changes that need custom UI within the Chat view.

Warning about no shell integration when using chat

While we strive to allow agent mode to run commands in terminals without shell integration, the experience will always be inferior as the terminal is essentially a black box at that point. Examples of issues that can occur without shell integration are: no exit code reporting and the inability to differentiate between a command idling and a prompt idling, resulting in output possibly not being reported to the agent.

When the run in terminal tool is used but shell integration is not detected, a message is displayed calling this out and pointing at the documentation.

Screenshot of a message in the Chat view saying "Enable shell integration to improve command detection".

Output polling for tasks and terminals

The agent now waits for tasks and background terminals to complete before proceeding by using output polling. If a process takes longer than 20 seconds, you are prompted to continue waiting or move on. The agent will monitor the process for up to two minutes, summarizing the current state or reporting if the process is still running. This improves reliability when running long or error-prone commands in chat.

Task awareness improvement

Previously, the agent could only monitor active tasks. Now, it can track and analyze the output of both active and completed tasks, including those that have failed or finished running. This enhancement enables better troubleshooting and more comprehensive insights into task execution history.

Agent awareness of user created terminals

The agent now maintains awareness of all user-created terminals in the workspace. This enables it to track recent commands and access terminal output, providing better context for assisting with terminals and troubleshooting.

Terminal inline chat improvements

Terminal inline chat now better detects your active shell, even when working within subshells (for example, launching Python or Node from PowerShell or zsh). This dynamic shell detection improves the accuracy of inline chat responses by providing more relevant command suggestions for your current shell type.

Screenshot of terminal inline chat showing node specific suggestions.

Improved test runner tool

The test runner tool has been reworked. It now shows progress inline within chat, and numerous bugs in the tool have been fixed.

Edit previous requests

Setting: chat.editRequests

Last iteration, we enabled users to edit previous requests and rolled out a few different access points. This iteration, we've made inline edits the default behavior. Click on the request bubble to begin editing that request. You can modify attachments, change the mode and model, and resend your request with modified text.

You can control the chat editing behavior with the chat.editRequests setting if you prefer editing via the toolbar hovers above each request.

Open chat as maximized

Setting: workbench.secondarySideBar.defaultVisibility

We added two extra options for configuring the default visibility of the Secondary Side Bar to open it as maximized:

  • maximizedInWorkspace: open the Chat view as maximized when opening a new workspace
  • maximized: open the Chat view always as maximized, including in empty windows

Screenshot that shows the Chat view maximized.

Pending chat confirmation

To help prevent accidentally closing a workspace where an agent session is actively changing files or responding to your request, we now show a dialog when you try to quit VS Code or close its window when a chat response is in progress:

Screenshot of confirmation to exit with running chat.

OS notification on user action

Setting: chat.notifyWindowOnConfirmation

We now leverage the OS native notification system to show a toast when user confirmation is needed within a chat session. Enable this behavior with the chat.notifyWindowOnConfirmation.

Screenshot of toast for confirmation of a chat agent.

We plan to improve this experience in the future to allow for displaying more information and for allowing you to approve directly from the toast. For now, selecting the toast focuses the window where the confirmation originated from.

Math support in chat (Preview)

Setting: chat.math.enabled

Chats now have initial support for rendering mathematical equations in responses:

Screenshot of the Chat view, showing inline and block equations in a chat response.

This feature is powered by KaTeX and supports both inline and block math equations. Inline math equations can be written by wrapping the markup in single dollar signs ($...$), while block math equations use two dollar signs ($$...$$).

Math rendering can be enabled using chat.math.enabled. Currently, it is off by default but we plan to enable it in a future release, after further testing.

Context7 integration for project scaffolding (Experimental)

Setting: github.copilot.chat.newWorkspace.useContext7

When you scaffold a new project with #new in chat, you can now make sure that it uses the latest documentation and APIs from Context7, if you have already installed the Context7 MCP server.

MCP

Server autostart and trust

Setting: chat.mcp.autostart

Previously, when you added or updated an MCP server configuration, VS Code would show a blue "refresh" icon in the Chat view, enabling you to manually refresh the list of tools. In the milestone, you can now configure the auto-start behavior for MCP servers, so you no longer have to manually restart the MCP server.

Use the chat.mcp.autostart setting to control this behavior. You can also change this setting within the icon's tooltip and see which servers will be started:

Screenshot showing the hover of the refresh MCP server icon, enabling you to configure the auto-start behavior.

The first time an MCP server is started after being updated or changed, we now show a dialog asking you to trust the server. Giving trust to these servers is particularly important with autostart turned on to prevent running undesirable commands unknowingly.

Learn more about using MCP servers in VS Code in our documentation.

Client credentials flow for remote MCP servers

The ideal flow for a remote MCP server that wants to support authentication is to use an auth provider that supports Dynamic Client Registration (DCR). This enables the client (VS Code) to register itself with that auth provider, so the auth flow is seamless.

However, not every auth provider supports DCR, so we introduced a client-credentials flow that enables you to supply your own client ID and (optionally) client secret that will be used when taking you through the auth provider's auth flow. Here's what that looks like:

  • Step 1: VS Code detects that DCR can't be used, and asks if you want to do the client credentials flow:

    Screenshot of a modal dialog saying that DCR is not supported but you can provide client credentials manually.

    IMPORTANT: At this point, you would go to the auth provider's website and manually create an application registration. There you will put in the redirect URIs mentioned in the modal dialog.

  • Step 2: From the auth provider's portal, you will get a client ID and maybe a client secret. You'll put the client ID in the input box that appears and hit Enter:

    Screenshot of an input box to provide the client ID for the MCP server.

  • Step 3: Then you'll put in the client secret if you have one, and hit Enter (leave blank if you don't have one)

    Screenshot of an input box to provide the optional client secret for the MCP server.

    At that point, you'll be taken through the typical auth flow to authenticate the MCP server you're working with.

Remove dynamic auth provider from Account menu

Since the addition of remote MCP authentication, there has been a command available in the Command Palette called Authentication: Remove Dynamic Authentication Providers, which enables you to remove client credentials (client ID and, if available, a client secret) and all account information associated with that provider.

We've now exposed this command in the Account menu. You can find it inside of an MCP server account:

Screenshot of the Account menu showing the manage dynamic auth option in an account's submenu.

or at the root of the menu if you don't have any MCP server accounts yet:

Screenshot of the Account menu showing the manage dynamic auth option in the root of account menu.

VS Code now fully supports the latest MCP specification, version 2025-06-18, with support for resource_links and structured output in tool results.

Accessibility

Accessible chat elicitations

When the agent prompts for user input, such as whether to keep waiting for a process, the chat elicitation is now accessible to screen readers. You are alerted when the prompt appears, can navigate to it with the keyboard, and can review the message in the accessible view.

Control file opening for chat edits

A new setting, accessibility.openChatEditedFiles, lets you choose whether files are automatically opened as the agent edits them in chat. Enable this setting for more control over which files appear in your editor.

View all and previous edits commands

The View All Edits and View Previous Edits commands are now available throughout the editor, making it easy to review changes made by the agent. These commands are especially helpful when accessibility.openChatEditedFiles is disabled, allowing you to track edits without opening each file.

Side Bar visibility announcements

When the Primary or Secondary Side Bar is shown or hidden, an ARIA announcement now notifies you of this change. This improves accessibility by ensuring screen reader users are aware of Side Bar visibility updates.

Accessibility testing with Playwright

We have added automated accessibility tests for the editor using Playwright. These tests help us continuously validate that Visual Studio Code meets accessibility standards and best practices, ensuring a better experience for all users.

Editor Experience

Settings search suggestions

The AI search results toggle in the search box of the Settings editor, indicated by a sparkle, is now available for all users. The toggle is enabled when AI search results have loaded and are available. Pressing the toggle switches between the AI and non-AI search results.

The AI settings search results are based on semantic similarity instead of string matching. For example, editor.fontSize appears as an AI settings search result when you search for "increase text size".

Screenshot of AI results in the Settings editor for "increase text size" showing editor.fontSize setting.

Editor tab context menu

We cleaned up the editor tab context menu to group related options for splitting and moving into a submenu:

Screenshot that shows the 'Split and Move' editor tab context menu.

AI statistics (Preview)

Setting: editor.aiStats.enabled

We added an experimental feature for displaying basic AI statistics. Use the editor.aiStats.enabled to enable this feature, which is disabled by default.

This feature shows you, per project, the percentage of characters that was inserted by AI versus inserted by typing. It also keeps track of how many inline and next edit suggestions you accepted during the current day.

Screenshot showing the AI statistic hover information in the Status Bar.

Notebooks

Notebook inline chat with agent tools

Setting: inlineChat.notebookAgent

The notebook inline chat control can now use the full suite of notebook agent tools to enable additional capabilities like running cells and installing packages into the kernel.

To enable agent tools in notebooks, enable the new experimental setting inlineChat.notebookAgent. This also currently requires enabling the setting for inline chat v2 inlineChat.enableV2.

Install dependencies in Virtual Environments created with uv

We now support installing required dependencies when you run Jupyter Notebooks against a Virtual Environment created using uv.

Source Control

Git worktree support

Setting: git.detectWorktrees

To address a long-standing feature request, this milestone we have added Git worktree support. Worktrees let you check out multiple branches at once, making it easy to test changes or work in parallel without switching contexts.

When opening a folder or workspace that contains a git repository, we now automatically detect worktrees and display them in the Source Control Repositories view. You can now view, create, delete, and open worktrees in a new or current window by using commands available from the Command Palette or Source Control Repositories view. You can disable this functionality by toggling the git.detectWorktrees setting.

Screenshot of create worktree command in Source Control view.

Screenshot of open and delete worktree commands in the Source Control view.

Repositories view

The Source Control Repositories view displays all source control providers that were discovered in the current folder/workspace. This milestone, we have updated the rendering of the view in order to visually distinguish between repositories, submodules, and worktrees. We also show the parent-child relationship between repositories, submodules and worktrees.

Screenshot of the Source Control Repositories view showing two repositories and a worktree associated with one of the repos.

Terminal

Documentation support in terminal suggest

Terminal suggestions powered by language servers (LSP) now include inline documentation, similar to what you see in the editor. Starting with the Python REPL, you'll get helpful descriptions and usage details for commands as you type.

You currently need these settings to enable LSP suggestions in the terminal:

Voice dictation

Now that natural language input is supported in terminals, including those enabled by the Gemini and Claude extensions, we have reintroduced voice dictation in the terminal. You can start or stop dictation by using the Terminal: Start Dictation in Terminal and Terminal: Stop Dictation in Terminal commands.

Improved shell integration diagnostics

Shell integration is the foundation that many features in the integrated terminal are built upon such as sticky scroll, quick fixes and agent mode's ability to understand what's happening inside the terminal.

This release features some improved diagnostics when you hover the terminal and select Show Details. You should now see the detected shell type and current working directory:

Screenshot of the detailed terminal tab hover showing the shell type like pwsh and the current working directory.

This is one of the first places to look if one of these rich features isn't working as expected.

Languages

Python

Shell integration support for Python 3.13 and above

We now support shell integration for Python when using version 3.13 or later. When enabled, PyREPL is automatically disabled to ensure compatibility. You can disable shell integration if you prefer to continue using PyREPL.

Screenshot showing the Python shell integration setting in the Settings editor.

Python Environments extension improvements

The Python Environments Extension continued to receive bug fixes and improvements as part of the controlled roll-out to stable users. To use the Python Environments extension during the roll-out, make sure the extension is installed and add the following to your VS Code settings.json file: "python.useEnvironmentsExtension": true.

TypeScript 5.9

VS Code now includes TypeScript 5.9.2. This major update brings a few new language improvements, including support for import defer, along with tooling improvements such as improved docs for many DOM apis.

Check out the TypeScript 5.9 release blog for more details on this update.

Expandable hovers for JavaScript and TypeScript

When you hover over a symbol in JavaScript or TypeScript, VS Code tries to show the most useful IntelliSense type information about that symbol. Types can be very complex, so one challenge for us has been trying to find the right balance between showing enough details to be useful, while not showing so much info that it becomes overwhelming. It's hard to come up with a good one size fits all approach, and also the level of type detail you want might change depending on what you are working on.

That's why this iteration, we've added new UI that gives you more control over how types are shown in hovers. When you hover over a symbol, now you can select the little + icon on the left side of the hover control to expand the interfaces and complex types in the hover into their components. For example, you can use this to see the properties of an interface directly in the hover:

Hovers can be expanded multiple times, which recursively expands types from the previous expansion. If you ever expand too much, just select the - icon to go back to the previous level. Also keep in mind that not every type is expandable and that we still need some limits on just how much expansion we can support. Let us know if there are any cases where expandable hovers aren't working how you'd like.

Contributions to extensions

GitHub Pull Requests

There has been more progress on the GitHub Pull Requests extension, which enables you to work on, create, and manage pull requests and issues.

Review the changelog for the 0.116.0 release of the extension to learn about everything in the release.

Pull request header cleanup

We've simplified the button bar in the pull request description header. The copy actions are now in the right-click context menu of the PR link.

Screenshot of the simplified PR header when opening the PR details.

Show coding agent PRs in chat

Setting: githubPullRequests.codingAgent.uiIntegration

When you start a coding agent session (via #copilotCodingAgent or with the Delegate to coding agent action), the pull request is rendered as a card in the Chat view.

Screenshot of a coding agent PR card in the Chat view.

Enable the githubPullRequests.codingAgent.uiIntegration setting to enable the new Delegate to coding agent button in the Chat view, for repositories that have the agent enabled.

Chat sessions (Experimental)

Coding agent chats

Building off last iteration's Copilot coding agent integration, you can now manage a coding agent session from a dedicated chat editor. This enables you to follow the progress of the coding agent, provide follow-up instructions, and see the agent's responses in a dedicated chat editor.

  • Start a coding agent session from VS Code with the #copilotCodingAgent tool or via the UI controls.

  • Follow the progress of coding agent in an attached chat editor.

    Screenshot showing Coding Agent progress.

  • Provide follow-up instructions directly from chat.

    Screenshot showing providing a followup in chat to coding agent.

Chat sessions view

Setting: chat.agentSessionsViewLocation

Enable the chat.agentSessionsViewLocation setting to try this experimental feature.

  • When set to view, you will see a new Chat Sessions view is shown in the VS Code Side Bar. This view enables you to manage and interact with your local chat sessions, as well as the coding agent sessions.

    Screenshot showing the Coding Agent Sessions view.

  • When set to showChatsMenu, coding agent chat sessions are shown alongside the local chat history.

    Screenshot showing the Coding Agent Sessions Quick Pick.

This integration requires the latest GitHub Pull Request extension and a repository open that supports Copilot coding agent. For more information, see the new documentation on how to use coding agent in VS Code.

Theme: Sharp Solarized (preview on vscode.dev)

Extension Authoring

Terminal activation events

Two new activation events are available for extensions:

  • onTerminal: Triggered when any terminal is opened.
  • onTerminalShellIntegration: Triggered when rich shell integration is activated for a terminal.

You can specify a shellType to target specific shells. For example, onTerminalShellIntegration:bash activates when shell integration is enabled for a Bash terminal.

Proposed APIs

Render custom webviews in chat responses

The Chat Output Renderer API lets extensions take chat responses beyond text and images. With it, your extension can use a webview to render arbitrary HTML content in the chat output. Example use cases include custom visualizations, inline previews, and even interactive controls.

The Chat Output Renderer extension sample shows how this API can be used to render Mermaid diagrams in chat responses. Here's an example of this extension sample in action:

Screenshot showing a mermaid diagram in a chat response.

The neat thing is not that VS Code can render Mermaid diagrams, but that this rendering can be contributed entirely by extensions. With it, you can iterate on the custom outputs in chat:

Screenshot asking chat to generate a modified version of the first diagram.

Here's a quick run down of how the API works:

  1. Register a language model tool that can return custom data as part of its response. We use a mime type to identify this data.
  2. Register a chat output renderer for this mime type.
  3. When a language model calls the tool, invoke the chat output renderer to render it into a webview in the response.

Check out the extension sample for a full end-to-end example of this API in action.

This API has the potential to be very powerful and enable some amazing new chat experiences, so give it a try and let us know what you think!

Chat Session Provider API

The new Chat Session Provider API proposal enables extensions to integrate their own chat backend into VS Code's native chat UI. Using it, your extension can open a new chat session, populate the history for that session, and respond to new user prompts.

This API is still in early stages and is likely to change. However we're already using it to power the new GitHub coding agent session flow, which loads chats from GitHub and allows you to chat with an agent that is controlled entirely by GitHub.

Task execution terminal

Extension authors can now access the terminal associated with a running task via the new taskExecution.terminal property. This makes it easier to identify which terminal is linked to a specific task and interact with it programmatically.

SecretStorage keys() API

If you have ever wanted to get the list of keys that your extension has stored in SecretStorage, you can now do so with the new proposed keys() API:

export async function activate(context: ExtensionContext) {
  await context.secrets.store('mySecret', 'superSecretValue');
  await context.secrets.store('mySecret2', 'superSecretValue2');
  const keys = await context.secrets.keys();
  console.log('All secret keys:', keys); // returns ['mySecret', 'mySecret2']
}

NOTE: This change is dependent on a change to anything that provides an alternative implementation of a Secret Storage, notably https://vscode.dev, which has adopted the new API, and https://github.dev, which will adopt the new API soon. In an environment where it is not supported, this API will throw an exception.

Engineering

packages.microsoft.com key update

packages.microsoft.com has updated their signing key and as a result, Linux users on newer distributions should stop seeing key-related warnings or errors while installing VS Code. Debian-based distributions automatically receive the new key, whereas users on other distributions may have to manually remove the old key before importing the new key.

Electron 37 update

In this milestone, we are promoting the Electron 37 update to users on our Stable release. This update comes with Chromium 138.0.7204.100 and Node.js 22.17.0. We want to thank everyone who self-hosted on Insiders builds and provided early feedback.

Notable fixes

Thank you

Last but certainly not least, a big Thank You to the contributors of VS Code.

Issue tracking

Contributions to our issue tracking:

Pull Requests

Contributions to vscode:

Contributions to vscode-codicons:

Contributions to vscode-copilot-chat:

Contributions to vscode-eslint:

Contributions to vscode-js-debug:

  • @pilaoda (pilaoda)
    • fix watch panel custom string representation. #2252 PR #2253
    • fix toString not work in Local Variables panel until all variables defined in scope #2254 PR #2255

Contributions to vscode-json-languageservice:

Contributions to vscode-vsce:

Contributions to debug-adapter-protocol:

Contributions to language-server-protocol:

Contributions to python-environment-tools: