GitHub Copilot CLI v1.0.106

GitHub Copilot CLI v1.0.106 was released on .

Summary

Copilot CLI v1.0.106 is here: open sessions straight in VS Code with /code, search every setting from one unified /settings dashboard, and try opt-in session @mentions. Plus a pile of fixes you'll feel. Curious what else snuck in?

Release Context

  • This was the 147th GitHub Copilot CLI release of 2026 tracked by Havoptic.
  • It shipped 9 days after GitHub Copilot CLI v1.0.105 (October 28, 2026).
  • GitHub Copilot CLI: ships every 2 days — 12 releases in the last month.

Why it matters: Open your Copilot session straight in VS Code.

Shipped around the same time

Within 3 days of this release, other AI coding tools also shipped:

Compare GitHub Copilot CLI

Release Notes

2026-11-05 - Rex terminals render inline images using Kitty direct placements. - Add /code command to open the current session in VS Code - Add a Fusion tier setting to copilot config. - Make /settings open the unified dashboard for all users and add global search across settings and local resources. - Interactive CLI reports program status to supporting terminals, including when attention is needed. - Add opt-in session management tools and @mentions for opted-in local sessions - Add COPILOTSESSIONCWD for launching and expanding LSP and local MCP server configs - Add GPT-6.1 Terra as a selectable model under New models when available to your account - Add a Sandbox extensions setting to run extension processes inside the sandbox - Add MATS telemetry for Entra authentication through OneAuth, respecting client telemetry opt-out. - An image removed from the prompt with Ctrl+U, Ctrl+K or Ctrl+W, or replaced by a recalled history entry, is no longer sent with the message, and Ctrl+S can stash the prompt afterwards. - Pasted text containing NEL, Unicode line or paragraph separators now fills separate prompt lines, and pasted DEL and C1 control characters are dropped, instead of being kept in the prompt and cutting characters off the end of the row. - In copilot -p --plan, the agent is no longer told to suggest Shift+Tab to leave plan mode, which only works in the interactive interface, and is asked to include the plan's key points in its reply instead. - copilot --resume <id> no longer waits with no output and no end when the Copilot task service does not respond; the task lookup now gives up after 10 seconds and resolution continues. - Sandboxed grep, rg, and glob now report Windows launch failures instead of silent no-match results - Model picker shows context window size for flat, unpriced, and single-tier models - Sandboxed local MCP servers respect relative filesystem permissions from the session directory, even when configured with a different working directory. - PowerShell commands work on Windows when the CLI is installed in a long directory path - Switching sessions while other sessions are busy no longer crashes the CLI and leaves a blank terminal - Keep readable image attachments when retrying a prompt that contains a corrupt image - MCP Entra authentication now falls back to the VS Code registration when Copilot CLI preauthorization is unavailable. - Sandboxed local MCP servers now start correctly when configured with a relative cwd. - On Windows, sandboxed sessions in nested Git directories can change to and write at the repository root - Autopilot no longer starts implementing its own recommendation after a request that only asked for a review or analysis - Suppress unnecessary MCP reload summaries when plugin servers remain unchanged - A model request that Copilot's service answers with an empty 404 while under load is now retried instead of ending the turn with "Execution failed: 404". - copilot help config now lists every setting the settings catalog offers, including the ones that were missing from its hand-written text, such as askUser, effortLevel, planModel, toolSearch and worktreeBaseRef - ACP clients can switch a session started with --yolo out of autopilot, and allow-all stays on, instead of the switch failing as blocked by policy and a second attempt turning allow-all off. - The @ file picker now underlines a name with a capital dotted I, such as İstanbul.txt, when the query is typed without the dot, and no longer shortens that row's matched folder. - The @ file picker now underlines matches in names stored with decomposed accents or found by a query typed without accents, and no longer shortens such a row's matched folder. - Up and Down in a multi-line prompt keep the column you started from when they pass through a shorter line, instead of leaving the caret near the start of the line. - Ctrl+Y and /share research skip research folder entries that are not readable files, such as a broken link or a folder named like a report, instead of failing or offering them. - Show each agent's selection ID in /agent when multiple agents share a display name. - The edit tool now fails at once on a named pipe, socket or device instead of waiting forever for the other end of a FIFO, which stalled the turn. - An empty plan.md no longer shows the ctrl+y plan hint or Plan: yes in /session, and ctrl+y opens the research report instead, matching /session plan. - The footer keeps the "N scheduled", sandbox, YOLO and CI status items whole on narrow terminals by shortening the directory and branch first, instead of cutting the items off the end of the row. - Pull request, issue and gist details, and their load errors, no longer let escape sequences in titles, names, branches, gist files or server messages restyle the terminal. - Show the saved paused goal and continuation guidance when resuming an autopilot session. - Issues and pull requests picked with are no longer dropped from the message when another one is picked in front of them, and an issue picked twice is sent once. - copilot help billing now says the footer shows the AI credits used in this session (nothing by default on the legacy billing platform), and that the /statusline quota item is off by default and ai-used is on. - copilot help config now says copyOnSelect is on by default on macOS, that /keep-alive changes only the current session, that logLevel is set in the /settings dialog or settings.json rather than copilot config, and that trustedFolders lives in config.json and is filled by the folder-trust prompt. - copilot help environment now says a COPILOTAUTOTIER value of "fast" is ignored with a notice rather than rejected, and that USETGREP=true does not override whether indexed search is available for your account or USEBUILTINRIPGREP=false. - copilot help config, copilot help environment and copilot help acp no longer name the hidden --prefer-version, --server and --stdio options. - copilot help limits shows a status example at the real minimum AI credit limit and says the final-call warning appears when 10% or less of the limit remains - copilot help monitoring now says an http:// OTLP endpoint disables export only when an OTLP CA certificate or client certificate/key variable is set, not for every http:// endpoint. - copilot help permissions now documents glob patterns in write(path) and read(path) rules, lists the read and memory kinds, and explains that an unscoped write rule approves shell output redirection but not the command itself; it no longer says wildcard matching is coming in the future. - copilot --help and copilot help --help now list the acp help topic, and copilot help --help no longer prints its description and topic list with stray indentation. - Form and settings text fields show the control characters of a stored value, such as an MCP server command, instead of letting them recolor or hide its text. - Issue and pull request details on the home screen hide HTML comments from the description, as GitHub does, instead of printing template instructions as text - Issue and pull request details also hide an HTML comment that a blank line splits inside a <details> or other HTML block, instead of showing its opening and its text. - Assistant replies keep angle-bracket words that are not HTML, such as Vec<String>, Set<T> and <file> placeholders, instead of silently dropping them from the sentence. - Removing a local marketplace now refuses while one of its plugins is enabled, --force also clears that plugin, and /plugin marketplace remove accepts --force before the name. - A follow-up sent while an earlier one is pending is no longer rejected with "Submission failed" when it mentions a file with a very long number after a colon (@file:99999999999999999999). - The model picker keeps its Context and Reasoning column labels when a search or scroll hides the first model group. - The /model picker shows token prices in terminals narrower than 64 columns, and the dot leaders start right after each price label. - --no-ask-user and the askUser setting now say they remove the askuser question form, and that the agent can still ask questions in its replies; they no longer say the agent stops asking questions. - The /user switch, environment and /mcp auth pickers, the Run on: status and the Outgoing connections list no longer let escape sequences in names, paths or URLs restyle the terminal. - Plugin rules with alwaysApply: false now stay out of the prompt until you enable them in /instructions; before, every session applied them until /instructions or /plugins was opened. - /pr shows the pull request's title, labels and branch as written, so a title such as Fix init.py exports no longer loses its underscores and turns bold. - /pr shows a closed or merged draft as Closed or Merged, keeps branch names and labels that contain a | intact, and counts a check run that failed to start or is waiting on an action as failing instead of pending. - A repository hook file under .github/hooks that cannot be read, or a hook entry in it that is invalid, is now reported with the file and the reason, at startup and after /cd into the repository, instead of being skipped silently. - /session delete --yes=false and a mistyped --yes=<value> no longer delete the current session, and /session delete --local-only <id> now previews that session. - Completed /ask and /btw answers left open now reappear when you return to their session within the same CLI process. - copilot skill remove and /skills remove now forget the removed skill's disabled state, so a skill added later under the same name no longer starts disabled. - When --ui-server cannot start its server (port already in use or out of range), the session now shows why instead of starting without it silently - Sessions where a tool returned a binary result of a type other than image or resource can be resumed again, instead of failing with "Session file is corrupted". - The SDK's session.workspaces.updateMetadata now renames a session that already has a name, and both it and session.name.set reject names that session creation rejects. - webfetch now decodes an XML document (RSS, Atom or other XML) in the encoding its XML declaration names when the server sends no charset, so ISO-8859-1 and other non-UTF-8 feeds no longer reach the model with their accented characters replaced. - When a Claude model declines a request after it has started a tool call, the fallback retry no longer fails with an unmatched tooluse error and keeps its fallback credit. - Terminal setup configures every Windows Terminal settings file it finds and correctly detects existing Shift+Enter bindings. - copilot login --device-code now refuses a cleartext http:// host, as browser sign-in already did: the device code is exchanged for a bearer token there. Use an https:// host instead. - Keep /diff output intact for Unicode characters like emoji and supplementary symbols. - Quick questions now report an explicit error when the model returns no answer text. - Sandboxed local MCP servers now honor a configured npmconfigcache and can write to that cache when dev-tool access is enabled. - Allow --continue and --resume to send prompts when resuming a session with no recorded model - Model picker leaves more room for choices by budgeting each model's details separately - Show the footer's copy shortcut hint only when copyOnSelect is disabled - Show the MCP reload confirmation after /cd even when a plugin refresh happens at the same time - Avoid false "MCP Servers reloaded" notifications during startup when no servers change - Dismiss the model picker cleanly after resizing the terminal, without leaving stale picker text behind - Keep the footer's model display up to date after a session resync - Reduce the wait for the first prompt when multiple MCP servers are unresponsive - Keep the highlighted microphone selected in /voice devices when refreshing the device list - Show remote MCP servers that return a bare HTTP 401 in the /mcp auth picker so you can sign in - Stopping an npm-installed copilot by signal now cancels the active turn and waits for shutdown instead of leaving it running - Show the MCP reload confirmation after /cd even when a plugin refresh happens at the same time - Sandboxed commands now grant expected dev-tool access when the tool is invoked via a literal quoted path. - /chronicle cost reports count each newly recorded model call once, even when its usage event is received again - Resumed sessions keep shell IDs unique so bash tool calls target the correct shell - The lsp tool's documentSymbol operation no longer fails, losing every symbol, when a language server reports a symbol's children as null; that symbol is now listed without children - The /tasks detail view shows recent output for detached shell tasks while they run and after they finish - MAI-Code-1.1-Flash requests no longer fail with unsupportedapiformodel when the model is missing from the model list (for example as a HydraFusion constituent); they now use the Responses API. - Sandboxed Go builds and tests on Windows reuse the build cache across commands for faster repeat runs. - LSP rename asks for every file's write permission before changing anything, so declining one file leaves all files untouched. It also no longer corrupts a file the language server lists more than once, keeps inserts at the same position in order, preserves bytes that are not valid UTF-8, and says when it skipped a file create, rename or delete - Ctrl+V, Alt+V, and Super+V paste clipboard text into the prompt when no attachment is detected - A HydraFusion turn that cannot retrieve the model catalog now says so, instead of blaming the allowed-model policy - Sessions without required recovery tools continue automatic compaction instead of failing rollover. - Returning to an interactive session keeps pending questions instead of auto-answering after visiting an Autopilot session - applypatch no longer counts one extra line for each file it adds or deletes, so the timeline summary, permission prompt, /usage and exit summary show the real line counts - copilot config now warns when a value of the wrong type makes settings.json ignored, instead of reading every setting as unset and reporting writes into that file as if they took effect - Deleting text in front of Chinese, Japanese or Korean characters in the prompt no longer leaves the line garbled until the next edit. - Markdown output no longer turns colon-delimited text such as file.ts:100:5 or crate::id::Id into emoji. - A top-level SKILL.md in a skills directory now produces a warning in /skills explaining that subdirectories are resources, not separate skills, and how to load them. - A message sent while the agent is working that mentions a file or directory (@path) is no longer rejected with "Submission failed" when an earlier one is still waiting. - /keep-alive busy releases sleep prevention once all tracked sessions finish working, including background turns and standalone local-shell commands - Git URL caches use short paths and diagnose path-length failures. Old caches are copied, not moved, and kept for older CLIs; delete the originals manually when no longer needed. - ACP session/prompt and session/cancel stop only the active turn, keeping background tasks and shell commands running - Long conversations now recover from oversized requests by trimming historical reasoning and retrying. - Prompt before out-of-workspace access through dangling symlinks - Rewinding and resubmitting a prompt now keeps image and file attachments. - Sessions recover from unavailable program endpoints and continue answering prompts - Skill calls explain when model invocation is disabled instead of reporting the skill as not found - /memory now reports when Memory is disabled for the session by an experiment and clarifies /memory on behavior. - Warn on stderr when the agent selected with -p --agent has frontmatter keys Copilot ignores, and log every agent file's warnings - Auto mode falls back to a valid default when a saved Efficiency preference is unavailable. - /fork no longer fails with "Failed to copy fork session database" when the session's session.db cannot be read; the fork is created without the todo list, and a fork that does fail no longer leaves a half-created session directory behind. - Hook config files saved with a UTF-8 byte-order mark, as Windows PowerShell 5 and older Notepad versions write them, are now loaded instead of being skipped with only a log entry. - /share html exports now keep a numbered list's first number and the checkbox and state of task-list items, and both these exports and rich-text copies keep the text inside a raw HTML block such as <details> instead of dropping it. - /ide draws IDE and folder names as plain text, one row each, and keeps its title, highlighted row and key hints on screen with a long workspace list or on a short terminal. - A warning about an invalid entry in an LSP config file now names the server it belongs to, so a file with several servers can be fixed without bisecting it. - A tool call to an HTTP MCP server that fails with a server error or a dropped connection no longer shows an internal Rust type name in front of the reason. - An image or file path pasted into a message that starts with an absolute path, such as /var/log/app.log, is now attached instead of being sent as plain text. - copilot plugin uninstall now removes a plugin that copilot plugin list still shows after its installed files went missing, instead of reporting that it is not installed - Question forms show control characters in a prefilled default answer instead of sending its escape sequences to the terminal. - Pasting two images or documents that share a file name from different folders now attaches both instead of silently sending only the second. - The /tasks dialog draws each task on one row, so a line break in a task description no longer adds a row that looks like another task, and escape sequences no longer restyle it. - A ~/ entry in the skillDirectories setting now loads skills from your home directory instead of a folder named ~ in the current directory. - Model loading now fails faster on unreachable network endpoints and shows connectivity guidance. - ACP sessions now appear in session history, /chronicle, and sessionstoresql results. - PowerShell approval prompts now explain when full-script review is required for valid commands. - Session persistence failures now show one error and one recovery notice instead of repeating on every retry. - copilot plugin install now reports a plugin manifest field it ignored, instead of installing a plugin with no skills in silence. - CLI falls back to direct networking when PAC/WPAD or system proxy resolution fails. - Fix Windows mouse selection copy so pasted text matches the selected content. - Box-drawing and block characters in prompts display as entered in the composer and timeline. - Preserve the draft caret position after command mode so editing continues at the original cursor location - Sandboxed Hugo commands can use Hugo and Go caches when developer-tool access is enabled - Managed sandbox policy errors now tell you to contact your administrator and include the failed sandbox test command when it cannot start. - Sandboxed commands on macOS can read files inside the default Xcode.app bundle. - ACP mode now honors --agent so the selected agent persona, prompt, and tools are applied at startup. - Unchanged cached MCP tools remain callable when another tool refreshes while permission is pending - The Sessions tab and the home tab bar now respond to keys after Ctrl+X / runs /session over a draft with an open slash-command or @ menu, and one Escape closes /ide without clearing that draft. - File diffs in permission prompts and /diff show control characters from the file as visible symbols instead of letting escape sequences restyle or hide lines. - The footer draws a git branch name that holds control characters as plain text, so the branch can no longer recolour the footer or set the terminal window title. - On narrow terminals the footer no longer leaves a stray separator where a hint did not fit or cuts the permission mode mid-name. - A hook's permission message and the reason a hook queues as the next message no longer pass escape sequences to the terminal, so they cannot hide text or start a link in the hook prompt or the queued-message list. - MCP, LSP and plugin.json config files saved with a UTF-8 byte-order mark, as Windows PowerShell 5 and older Notepad versions write them, are now loaded instead of being rejected or ignored. - Command approval prompts and completion notices no longer pass escape sequences from a model-written description to the terminal, so that text cannot be hidden, recolored or made a link. - copilot plugin list and copilot plugin update no longer pass control characters from a plugin's name, marketplace or version through to the terminal. - When a /settings JSON value saved from your editor is not valid JSON, the error now shows any control characters it quotes from the file instead of letting them restyle the dialog. - Changing a setting through /experimental, the status line picker, the subagent or extension pickers and similar commands no longer replaces a settings.json the CLI cannot read with just that one setting. The change is refused with an error and the file is left untouched. - Searching a /share html export or an exported research report now highlights the text you searched for, instead of a shifted span or a broken emoji, when the conversation contains a capital dotted I (İ). - Command output in the timeline no longer passes DEL and 8-bit C1 control characters to the terminal, so a file or command output can no longer change the window title or break the output rows; each one is shown as a space. - Stopping an unknown shell ID fails without stopping a command and directs you to list active shell sessions. - A failed tool call's error text, such as an MCP server's, no longer passes escape sequences to the terminal, so it cannot hide text or start a link in the failure row. - The move of an older $XDGCONFIGHOME/.copilot directory into ~/.copilot now also brings over your MCP servers, language servers, saved folder permissions, personal instructions, custom agents and skills, and no longer replaces a symlink in ~/.copilot whose target is missing. - Copying text on Linux no longer prints "Somebody else owns the clipboard now" over the UI when another app takes the clipboard - Pressing Backspace to cancel command mode now preserves your draft text. - Queue manager stays open when pending updates refresh concurrently - Background Autopilot sessions auto-answer askuser prompts without requiring you to foreground the session - Warn when older messages are dropped for context limits and include compaction/truncation events in JSON output. - /diff uses the active worktree after changing the session working directory - Custom subagents with private MCP connections no longer start inherited servers excluded by their resolved tool list. - Prompt for path access when long-option values like --name=/path reference files outside allowed directories - Keep the Selected marker readable in /settings when screen reader mode is enabled - Prevent /settings external editor save from overwriting concurrent settings changes - Local models added from the /model picker now stay under their provider's section when grouped by vendor, instead of moving to Other models - Unknown root options after a subcommand now suggest moving the option before the subcommand - New files created with create and applypatch now follow repository-declared line endings. - Clicking tool calls in /tasks sub-agent details now expands and collapses their output - SDK extensions.discover() now lists extensions from enabled plugins installed from a local directory marketplace, which sessions already load, and extensions.enable accepts them under plugin-only extension policy. - LSP servers whose fileExtensions keys omit the leading dot (for example "java" instead of ".java") now handle file-based requests instead of reporting that no language server is available. - Fix grouped grep results so files with names like 2024-01-15 stay correctly attributed in assistant responses - Footer text selection highlighting stays aligned while transcript lines change - Shell safety warnings no longer appear twice in the timeline during command approvals. - Nested subagents inherit and can use MCP tools allowed by the session policy. - --yolo and --allow-all now take effect when resuming a local session with --resume or --continue - Expand failed tool-call entries to show complete error output in the timeline. - Prevent over-limit turns from re-running the same tool calls and instead return the existing prompt-budget error - Pressing Escape or Ctrl+G dismisses slash-command argument suggestions in one keypress - Returning from /lsp logs detail keeps the LSP server list visible and preserves the selected server. - Esc in a question form clears the text in the current field instead of discarding the whole form; press Esc again on an empty field, or Ctrl+C, to cancel - Keep /diff comment boxes closed beside the scrollbar, and shorten wide or astral file names in their titles without drawing a replacement character. - In /diff, a mouse click selects the line under the pointer after the view scrolls past wrapped lines, and the scrollbar shows when wrapped lines overflow the view. - When an MCP server fails to connect, the warning now shows the server's error text as plain text, so escape sequences in it can no longer hide or recolor the warning or split it across extra lines. - Question forms show control characters in field titles, descriptions and options, and in the answered question row, instead of letting escape sequences hide or restyle that text. - In /sandbox, pressing Enter right after Tab opens a folder in the add-path picker now keeps that folder, and Esc after Tab on an empty path cancels at once. - The SQL tools no longer hang the session on a query that never finishes: the query stops after 60 seconds with an error, and interrupting it frees the session for the next prompt - Tool rows and the memory prompt no longer let escape sequences in text the model wrote hide words or add links. Search patterns and memory text show their control characters instead. - The web fetch permission prompt shows control characters in the requested URL instead of letting escape sequences hide text, add a link or split the URL across lines. - Commands prefixed with VAR=value or env no longer trigger path-access prompts for non-path API endpoints. - Company announcements no longer appear twice when repo settings keep or override global announcements - Attach @mentioned images in -p prompts and reject --attachment image files whose contents are not a valid image - In copilot -p streaming mode, sub-agent replies now print as complete blocks instead of interleaving mid-token. - Large-file view guidance references your available search tool, and applypatch returns a clear error when deleting a missing file. - Use explicit --model with custom agents unless the agent requires a specific model - Tool results that arrive before their calls are now ordered correctly and no longer duplicated. - Open extension picker updates failed extensions from "starting" to "failed". - Fallback retries now succeed when Claude refusals end with reasoning blocks. - Show one oversized-request warning with the total removed attachments instead of repeated warnings. - Ctrl+C copies selected text in askuser prompts without cancelling the prompt - PowerShell commands that clear the screen with cls or Clear-Host no longer fail on Windows or skip the rest of the command - Fix /cd refusal messages to show only the directory error reason, without internal request names - Keep configured skills available on the first request during startup reconciliation. - includeCoAuthoredBy: false is now honored in ACP mode (copilot --acp), so ACP clients no longer instruct the agent to add a Co-authored-by trailer to commits. - Targeted /settings commands show the selected setting immediately - A telemetry-disabled warning raised while resuming a session is saved to the session history, so later events no longer reference a missing parent. - A BYOK provider key that is not a valid HTTP header value, such as key command output with a status line before the key, is no longer printed in the model error or saved in the session log. - copilot mcp enable now fails with a clear message for a server the repository disables, instead of reporting success and changing nothing - A prompt hook that returns an empty modifiedPrompt or modifiedTransformedPrompt no longer sends the model an empty prompt. A hook value that is ignored because it is empty or not a string now shows a warning naming the field. - copilot sessions import --name "" is now rejected as an invalid name in both --dry-run and a real import, instead of passing the dry run and then failing with a persistence error. - A ~/ directory in skillDirectories, COPILOTSKILLSDIRS or COPILOTCUSTOMINSTRUCTIONSDIRS now resolves to your home directory, so its skills and instructions load. - The .vscode/mcp.json migration notice now appears in repository subdirectories and after /cd into another workspace, and no longer appears for repositories already migrated to .mcp.json. - Skill and background-agent timeline entries now show sanitized, readable errors and results - Allow /mcp enable and /mcp disable for servers granted GitHub auth at startup - Gemini models automatically defer tools behind search when requests exceed the 512-function limit. - Removed repository hook configs no longer block later tool calls in the same session. - In --autopilot, background task completions that arrive after a run stops are delivered with your next message instead of being dropped. - Collect debug logs keeps the active invocation and ignores stale completion results - Resuming a session with an unreadable event log now reports a load error instead of not found - Copying text on native Windows no longer changes your console code page. - Keep the selected task visible in /tasks when long lists exceed terminal height - Signing in to a remote MCP server whose protected resource is a bare origin such as https://mcp.example.com no longer sends the resource with an added trailing slash, which authorization servers that compare it exactly rejected. - Write remote session handoff cleanup failures to the debug log and show a clear error when no remote session is prepared - Keep command-mode drafts after accepted commands so you can continue typing immediately. - Empty sessions no longer flash into the session picker before disappearing - An @file mention written inside parentheses, brackets, braces, angle brackets, quotes or backticks now attaches the file, and expands correctly in ! shell commands, instead of being silently ignored. - Custom agents that share a built-in agent's name are no longer offered to the model as a second agent type, since delegating to that name always runs the built-in agent - The details view in /skills, /plugin and /mcp no longer passes terminal control characters from a skill, plugin or server's metadata through to the terminal; its trust and data blocks now show them escaped. - Wrapped lines in the /ide dialog now continue under their text instead of under the bullet or row number - After choosing Go back on the startup session-in-use prompt, sessions opened later with /resume show the in-use warning again. - Instruction files whose frontmatter is not valid YAML now keep an applyTo or paths list and excludeAgent, instead of applying to every file, to none, or to an agent they exclude - A preToolUse hook that returns "modifiedArgs": null no longer makes the tool call fail with "Expected JSON object but got null"; null now leaves the arguments unchanged, as it does for the hook's other fields. - Escape and Ctrl+G leave Ctrl+R reverse search in one press when it was started from a slash command, /cd path or command-mode draft, instead of clearing the draft. - Pressing Enter on a search with no matches in the session browser or the custom agent picker, or Tab in the agent picker, no longer adds a space to the search text. - Messages such as the /rename confirmation now show 8-bit control characters from the text they echo as spaces instead of sending them to the terminal. - copilot sessions import now reports a second session header as "Only the first record may be a session header." and an unknown record type as unsupported, instead of asking for a record id and timestamp those lines never needed. - When the editor opened with Ctrl+E in /settings saves the file and then exits with an error, the edit is now kept in a recovery file and its path is shown, instead of being deleted with a message saying the editor did not save. - When signed out, the Issues and Pull requests tabs no longer offer a / search that could only fail with "Search failed."; / there now opens the slash-command picker, as on the Gists tab. - Keep the /statusline dialog's preview and toggle descriptions inside its border when the sessions sidebar is open. - The view tool now fails at once on a named pipe, socket or device instead of waiting forever for a FIFO writer, which left non-interactive runs hanging. - Expanding a tool call with Ctrl+O now shows the values of object and array arguments instead of a {…} or [N items] placeholder, so MCP calls that take a nested parameters object can be inspected - Command hooks receive COPILOTHOOKDEPTH so hook-launched sessions can stop recursive agentStop chains - Remote HTTP MCP servers connect through proxies that require Kerberos (Negotiate) authentication. - Reuse valid saved MCP OAuth credentials for anonymous connections and initial challenges without requiring another sign-in - On the colorblind theme, unread sessions in the Sessions sidebar and its legend are marked with \ instead of the same blue dot as finished sessions. - MCP reload now reports one settled connection summary per reconciliation - Copilot Free signup completes when account setup overlaps model refreshes - Resuming an autopilot objective no longer starts a duplicate continuation prompt - /context shows updated usage details after switching models in an active session - Repository disableAllHooks continues suppressing user hooks after trusted-workspace rebuilds - Extensions no longer prompt for permission after their connection closes during initialization - Permission prompts keep your current selection when options update during loading - Entra sign-in uses the VS Code application registration again by default - Preserve typed and pasted typeahead input across later cwd loading gates - Copilot's built-in documentation tool now returns the installed CLI's own commands, flags and help topics instead of an error line about a missing README - /add-dir and /cd now accept a directory wrapped in quotes, such as a path pasted from a shell or file manager, instead of reporting that it does not exist. - Assistant replies, other rendered markdown and the expanded Read, Create, Edit and Search rows no longer pass escape sequences and control characters from their text to the terminal, so a reply or a file cannot restyle the timeline or hide its own lines - The first @ of a session now highlights the first suggested file instead of the working directory, so Tab or Enter inserts that file. A suggestion you pick with the arrow keys still stays highlighted while results update. - The busy indicator shortens a long tool name instead of cutting off its elapsed time and output size - A ! shell command cancelled after it printed output now shows that output once, instead of repeating it above the cancellation message. - Canvas windows no longer reappear or revert to an older URL after being closed or updated while a session is still loading - Code blocks in assistant replies keep their lines and indentation after a line that starts with a triple-backtick code span, a fence line with a language inside another code block, or indented text right after a closing fence, instead of being joined into one line. - Collapsed tool result previews no longer show a replacement character when an emoji falls where the preview is cut, and wide characters no longer overrun the preview width - The autopilot completion check label now matches the decision autopilot acts on: a reviewer verdict with non-English text right after the verdict word no longer shows as passed. - Confirmation dialogs such as "Enable autopilot mode" and "Confirm folder trust" keep their title, highlighted option and key hints on screen in a short terminal - Ctrl+U and Cmd+Backspace at the start of a prompt whose first line is empty no longer add a blank line - The terminal cursor no longer stays in an unfocused pane, such as the /config right pane after returning to the sidebar - A directory name containing escape sequences no longer restyles the session picker Location column, the footer working directory or the /session info Directory row; the path is drawn as plain text - A long name that wraps beside other text in a row, such as in /extensions manage or the /agent picker, no longer loses a character where it wraps. - The Getting started box no longer suggests /model in sessions that use a model from your own provider, where /model is not available. - HTML exports (/export html, /share html, research reports) and rich text copied with /copy keep inline <br> line breaks, including in table cells, instead of joining the lines - The "Agent finished" desktop notification no longer shows a reply from an earlier turn or from another session when a prompt ends without a reply of its own, such as a prompt blocked by a hook. - The /instructions picker no longer lets terminal escape sequences or line breaks in an instruction file name or plugin name restyle the list or draw extra rows. - copilot -p --output-format json and copilot workflow run no longer write 8-bit terminal control characters (C1 and DEL) from model replies, tool output or workflow results raw: they are escaped in the JSON, which parses to the same values, and workflow run failure messages on stderr show them as spaces. - A prompt that starts with a combining accent no longer hides the last typed character or puts the cursor one column too far right; the accent is drawn on the cell before it, as the terminal itself draws it. - --max-ai-credits with NaN, inf or a number too large to represent now fails with an error that names the value you typed, instead of reporting it as "null". - Local MCP servers start once per session when the first credential resolves - An MCP tool title, or tool arguments the model writes, can no longer use 8-bit control characters to erase or redraw the tool approval dialog or the timeline row - The "Agent finished" desktop notification now shows inline code such as src/.ts as written, keeps spaced-out asterisks such as 2 3, and no longer leaves part of a link's address behind when the address contains parentheses. - Permission prompts show the control characters in a directory or file name instead of letting its escape sequences restyle the path or its line feeds split the row - The /permissions picker keeps its title, the highlighted mode, the Assisted Permissions security statement and its key hints on screen on short terminals, such as 80x12 or 60x14, instead of pushing the title and the first modes above the top of the screen. - Plugin rules whose globs is a comma-separated string, such as ".ts,.tsx", now apply to the files those patterns match instead of never applying. - In -p mode, a sub-agent's streamed reply now ends with a line break, so --silent no longer prints it and the main agent's answer as one line and the default output no longer glues it to the front of the task tool's row. - Typing ? in Ctrl+R reverse search or at a permission prompt no longer opens quick help, and pressing it twice no longer leaves a stray ? in the prompt. - /remote on tries again after an earlier attempt failed, instead of reporting "Remote control status: connecting." and doing nothing until the CLI is restarted. - /rename and /session rename refuse a session name with a double quote or a control character, as --name and /fork already do, instead of storing it. - A repository's .github/copilot/settings.json can no longer color, hide or add lines to the startup warning or the /settings Problems explanation that reports its invalid settings: keys and values from the file are shown escaped, and a setting's value containing a line feed is no longer shown in the Problems explanation. - Show unresolved GitHub repositories in /chronicle reindex results when some sessions cannot be synced. - copilot --resume and --continue now fail at once with the permission error when the session store cannot be read, instead of printing nothing and never exiting. - Ctrl+C closes a Ctrl+R history search without clearing the prompt you were typing or arming "ctrl+c again to exit", so pressing it twice no longer quits the CLI. - copilot sandbox ca trust --allow-host '\' now reports an invalid host rule, like other invalid hosts, instead of an unrelated masked-credential error - The /sandbox dialog now fits short terminals: it keeps its title, its tabs, the highlighted setting and its key hints on screen and scrolls the settings instead of cutting them off. - A command scheduled with /after or /every that cannot be scheduled, such as /clear or /exit, now reports in the timeline that it cannot be scheduled when it fires, instead of silently doing nothing. - With --screen-reader, /plugin, /skills and other labelled lists read their rows and their empty message instead of only the list name - Under --screen-reader, the "User message" label on a sent message stays on one row beside the message instead of breaking into a column of two-letter pieces, and the "Search" label in /search and the model picker is now separated from the text you type. - With --screen-reader, the session browser no longer reads the label of its Source tabs twice ("Source: source: current tab"). - With --screen-reader, the home screen no longer goes blank and stops responding in a very small terminal, such as 15 columns by 8 rows. - A search path naming the working directory with a trailing slash is now shown as the current directory instead of an empty path - /session delete refuses an unknown option such as --force with a usage error. Before, an unknown option placed before a session ID consumed the ID, and the command deleted the current session without asking. - With context management tools on, sessionhistory search now matches the conversation text, so a query that contains a line break, a quote or a backslash finds the message it was copied from, and readitem returns the message text instead of its JSON encoding. - Escape sequences in a session name, branch or working directory no longer restyle rows in the Sessions tab and session pickers, or show up as stray text such as [31m on the Sessions sidebar cards; the text is drawn plain - /session prune and /session delete-all reject malformed days, unknown flags and stray arguments instead of deleting sessions - In /settings list editors, an item that wraps onto a second line no longer pulls its text one column left of the other items and against the selection marker - The /settings value picker no longer draws its options over each other or over its border in short terminals, and keeps the highlighted choice on screen. - /share file and /share html list a message's images as [Image: name] instead of leaving an image-only message blank, and the HTML page title comes from the first message with text - Markdown session exports (--share, /share file, /share gist) now show shell commands, search patterns and file paths exactly as they ran: a or init.py no longer turns into italic or bold text, and a heredoc no longer becomes headings, lists or a code block that swallows the sections after it. - /share file and /share html no longer keep the quotes around a pasted output path in the file name - /share research and /share html research add .md or .html to a file path given without an extension, as /share file and /share html already do, and the saved HTML report now carries a link to open it. - Output from ! shell commands that print terminal hyperlinks or window titles, such as ls --hyperlink=always, is shown in full instead of disappearing along with every later shell result. - Shell output that redraws a progress line in place, such as git checkout or curl, now shows the line's final state inside the output once the command finishes, instead of every frame on rows outside it. - Pressing Enter on a slash command whose arguments follow a non-ASCII space, such as the ideographic space a CJK input method types, now runs the command with those arguments instead of dropping them: /allow-all off no longer turns Allow All on. - Tab-indented files keep their indentation in the expanded file view, in expanded grep and glob results, and in the gist details screen, instead of rendering every line at column 0. - copilot workflow run and copilot -p text output now redact --secret-env-vars values and recognized tokens in lines a workflow or extension logs, as the JSON output and the final result already did. - Opening /theme in a terminal 6 columns wide or narrower, or narrowing the terminal while it is open, no longer blanks and freezes the whole session - The /theme picker keeps the highlighted choice visible in short terminals by hiding the sample preview and scrolling the list. - Error messages in the timeline no longer lose their last characters, or a wrapped line ending in a path, when they nearly fill the terminal width - Timeline rows for file tools show the control characters in a file name instead of letting its escape sequences restyle the row or its line feeds split it - Todo timeline entries show the right status for updates whose title or description contains the word where - Text cut to fit the terminal, such as a setting value in /settings, a cell in the subagent table, or a long objective in the pinned goal panel under --screen-reader, now ends in an ellipsis instead of stopping mid-word, so a cut value no longer reads as a complete one. - An unquoted -p or -i prompt that contains a command name such as update, login or help now gets the quoting hint instead of a parser error about an unknown subcommand. - The /usage activity graph now places each month label over its own week in Japanese, Chinese and other locales whose month names use wide characters, instead of shifting each label further right. - In Vim mode, typing an emoji or a math letter in NORMAL mode no longer inserts it into the prompt; it is ignored like any other key that has no command. - In Vim mode, t and dt stop before an emoji or conjunct when the target character is part of it, instead of landing on it and deleting it, and dF deletes the whole emoji instead of splitting it. - When webfetch cuts a page at its 10 MiB limit, the model is now told the page was truncated even when the cut falls inside a script, style sheet or HTML comment. - An invalid server entry in a trusted workspace .mcp.json, or a file that is malformed or unreadable, is now reported as an MCP warning in interactive sessions and in copilot -p (stderr, or a session.warning event with --output-format json) instead of the server silently missing; before, only copilot mcp list said why. - /worktree and /move now run after you answer "Yes" to the folder trust prompt for the current session, instead of being refused as waiting for folder trust until the folder was remembered - Page Up and Page Down move through the settings list again. - Show "Operation cancelled by user" immediately when you press Ctrl+C, without waiting for cancellation cleanup - One-line search fields keep emoji intact when moving the cursor and deleting text - Restart keeps your current /model selection after switching models in-session - /settings unset now directs hidden subagent array keys to /subagents - Resumed handoff and compaction timeline text is sanitized to prevent style injection and extra label rows. - Fix @ file picker match highlighting and path compression for case-expanding Unicode names - Keep Unicode /diff comments and cursor visible in narrow terminal panes - Show files with non-ASCII names in /diff local-changes output - Autopilot says so when it runs with limited permissions because bypass-permissions mode is disabled and assisted approval is not in effect - Tools that embed the CLI now attach to the session requested with --resume <session id> instead of a temporary one while it loads. - Connector authorization stays actionable while plugin inventory is loading - Plugin installs and uninstalls keep unrelated extension processes running in active sessions. - Keep MCP registry forms and review summaries readable by sanitizing labels and truncating on grapheme boundaries - /diff shows each file's own patch when file names include glob characters or start with a colon - Keep @ file completion suggestions open when navigating folders with spaces - Tool calls that finish after you abort now show their final completion status in the timeline - Keep tab bar arrows and visible tabs on one row in narrow ask-user forms - Fix /share messaging for sessions without a GitHub repository to clearly report creator-only access - /context correctly separates custom instructions from the system prompt - Tools run on the first prompt even when ambient GitHub login finishes after the turn starts - Pressing Ctrl+C during startup on Windows now exits cleanly and runs shutdown before the TUI mounts. - Auto model routing now preserves your selected Auto tier when account policy refreshes during startup - copilot help config now says autoUpdate defaults to off in CI environments and that non-interactive -p runs start with memory off unless --enable-memory is passed - Installing plugins from different GitHub or URL sources keeps separate cache directories. - Keep previously approved directories accessible after turning allow-all off and changing cwd - MCP servers no longer reload when plugin activation fingerprints change without changing active plugins or trust. - Retry /voice on after a voice model load failure without toggling /voice off first - Resuming a remote session locally no longer requires a clean working tree: uncommitted changes stay in place, and the branch checkout stops only if it would overwrite them - Enforce listed choices in MCP enum and multi-select prompts so tool calls submit valid values. - Non-vision models now get an explicit note when a tool returns an image that is not sent. - Reopening a settings enum editor keeps the cursor on the saved value - Terminal setup prompt defaults to No so pressing Enter on a first prompt does not change keybindings. - copilot plugin list shows a plugin that managed policy enables as enabled instead of [disabled]. - In cloud sessions, /chronicle standup now checks local history before reporting no recent activity - Browser sign-in lets you press any key to copy the sign-in link and reopen your browser. - Mouse wheel scrolls the timeline while the /ask quick question box is open - Keep Markdown table layout stable while long link URLs stream in replies - Backspace works correctly in Windows console editors opened with Ctrl+G - ACP sessions include skills from live local marketplace plugins in /skills list and available commands. - Ctrl+D while typing an answer in a question form now deletes the character under the cursor instead of declining the form and discarding the answer. - Keep winget launcher symlinks intact when running copilot update on Windows - Fix caret placement after rendering at the terminal's last column - Plugin uninstall on Windows now explains when another app is using a plugin file and how to resolve it. - Rejected prompt submissions are saved to command history so you can press Up Arrow to resend. - Local plugins with matching directory names now install into separate cache directories. - Keep the /settings and /agent search carets at the cursor when long queries wrap, so no query character is hidden. - Rejected working-directory changes now keep tools and shell commands in the current directory - Resuming a session no longer gets stuck as in use after a crashed process PID is reused. - Keep externally edited prompt text in a recovery file when the editor exits with an error - Submitting /ask or /btw while scrolled up keeps your place in the timeline - Pressing Enter on /quit or /exit now exits immediately while a turn is running - Running agents in /workflows now show their current activity in run details. - Install PyPI MCP registry servers with pinned package versions - MCP stdio requests fail immediately when a response exceeds the 16 MiB line limit. - Large pastes saved in the same millisecond on one session now each get their own file instead of overwriting each other. - When the session folder is deleted mid-session, a ! shell command now says the working directory no longer exists instead of reporting GenericFailure, No such file or directory. - Fix URL permission prompts to keep ${VAR} placeholders in extracted URLs - Resumed renamed sessions now show the correct /share heading instead of New session - MCP servers dashboard keeps your active search and selection while startup authentication resolves - A remote session started outside a GitHub repository now says that it is not linked to one, instead of reporting success with no mention of it - Clicking or hovering a timeline entry no longer targets the entry below it when a word-wrapped line above paints more rows than its width divides into - With --screen-reader, failed and rejected tool calls, errors such as an unknown command, and warnings now begin with "Error:" or "Warning:" instead of reading like any other message. - /resume <session-id> foregrounds an already running background session instead of showing it twice on exit - An HTTP MCP server that accepts connections but never answers now holds startup for its connection timeout once, instead of three times over - Saving MCP server changes preserves symlinked mcp-config.json files and updates the symlink target. - Keep /skills add, remove, and reload in sync with session skills and report refresh failures immediately - applypatch keeps the line ending of every line it does not change in a file that mixes LF and CRLF endings, instead of rewriting the whole file to the ending of its first few lines. - COPILOTPROVIDERGHESHOST now accepts the instance's browser address, such as https://ghes.example.com/, instead of failing with a malformed https://https//... URL, and a value that is not a host name fails with an error explaining the expected format. - Text pasted over several lines after /clear, /new, /ask, /delegate or /diagnose keeps its line breaks and indentation instead of reaching the model as one line - A copilot -p run stopped by Ctrl+C or a signal now finishes writing the session's shutdown record (usage and code-change totals) before it exits - A session.resume request whose params are not a JSON object now fails with an error instead of crashing the copilot --server process - webfetch now decodes pages in the character encoding they declare (Content-Type charset or a meta tag), so ISO-8859-1, windows-1252 and other non-UTF-8 pages no longer reach the model with their accented characters replaced. - Session picker closes immediately after a /resume switch commits - Fix clipboard copy on WSL by running clip.exe with compatible cmd.exe arguments - Generated images now save correctly on filesystems without hard-link support - Return the original refusal when an organization disables a Claude fallback model - Blocked MCP server warnings now include the specific registry failure reason. - Rewind keeps turns where agents edit files above the capture size limit - Reopening a recently closed local session no longer stalls for up to 30 seconds - Sources a tool returns for citations are kept with the tool result, so Claude can still cite them after a session is resumed - Directories added with --add-dir or /add-dir now load skills from .agents/skills and .claude/skills, and custom agents from .claude/agents. - Auto mode no longer repeats the same model explanation when routing checks keep the model unchanged. - Detected az commands can access Azure CLI configuration in sandbox when allowDevToolAccess is enabled - Settings array editor keeps the title, active input, and action hints visible in small terminals - Show the device policy warning after token authentication when --yolo is disabled by managed policy - Shell completion for --model suggests the fusion alias - Keep Auto tier details current when provider labels repeat in the model picker. - Linux and macOS ignore Windows-absolute deniedPaths, readonlyPaths, and readwritePaths entries in sandbox policies - Sandbox proxy and runtime checks use allowLocalNetwork only for loopback; private-network destinations follow allowOutbound and host rules - Pressing Enter in path-access prompts now grants one-time access by default - Wrapped text no longer starts the next row with an extra leading space in CLI dialogs - Timeline entries now show running shell calls correctly and summarize compact tool output more clearly. - A recalled prompt stays in the composer when Up is pressed again, instead of being replaced by a prompt that is still queued - Markdown tables render inline <br> tags as line breaks inside cells. - Tool-result image previews appear only when their tool call is expanded - Show Ctrl+C as the default interrupt shortcut in the busy status hint - copilot update and /update persist explicit stable or prerelease channel selections for future update checks - Keep your selected mode during session switches instead of reverting to an older mode - CLI config commands now wait for SDK shutdown before exit and preserve the command exit status. - Recall misspelled slash commands with Up to correct them while the agent is working - Account switching now waits for managed policy checks before sending prompts - Subagents respect includeCoAuthoredBy when composing git commit messages. - Prevent generation-check lock timeouts from permanently breaking /tasks and subagent interactions in long sessions - /add-dir now adds the directory exactly as typed when its name contains repeated spaces or tabs, instead of a similarly named directory with single spaces. - /chronicle reindex skips a saved checkpoint it cannot read and indexes the remaining sessions, instead of silently leaving them out while reporting the reindex as complete. - Tab completion of copilot config keys now works in bash after root options written as --option=value, and in bash and zsh after a bare --sync-session - copilot config allowedUrls and deniedUrls now refuse a URL pattern the CLI cannot apply, as --allow-url and --deny-url do, instead of saving a rule that every start ignores - MCP OAuth dynamic client registration now includes the scope the CLI will request, for authorization servers that limit a client to the scope it registered with - When the session folder is deleted mid-session, bash, glob and grep now say the working directory no longer exists instead of reporting a bare OS error or a ripgrep failure. - /diff now lists new files whose names contain accented or other non-ASCII characters, double quotes or backslashes by their real names, with their added badge, instead of git escape codes such as caf\303\251.md - In the /every schedule manager, x now removes the highlighted schedule even after a one-shot schedule above it fires, instead of removing the next

View original release

Other Recent GitHub Copilot CLI Releases

All GitHub Copilot CLI releases · All AI coding tool releases on Havoptic