Karthik Nadig
90d · built 2026-11-10
Performance
What Karthik Nadig shipped in the selected window, measured in ETV, and how it compares with the 90 days before it.
Effective capacity
+57.5engineers
delivers like 58.5 (58.5x pre-AI)
Output (ETV)
29.3ETV
+12095.8% vs 0.2 prior
Features share
41.0%
−0.7 pp vs prior window
Fixes share
6.4%
+6.4 pp vs prior window
Work mix
41% Features3% Maintenance47.3% Tests2.3% Docs6.4% Fixes
34 commits over 90 days, ending 2026-11-10.
Daily performance
Daily ETV, stacked by Features, Maintenance, Tests, Docs and Fixes.
Repository spread
Where this developer's commits land. Concentrated work (top1 > 80%) vs polymath spread (top1 < 30%).
Most impactful commits
Top 10 by ETV in the last 90 days.
- 11.8ETVMake copilot work in any terminal with a native Copilot CLI shim (#341667) * Add native Copilot CLI shim to the Windows installer - Publish the native `copilot` shim to {app}\bin\copilot-shim from the Inno Setup installer and manage its PATH entry. A new wizard page offers to install Copilot CLI now, on first use, or not at all. - Support silent installs (/copilotcli=install|onfirstuse|none), a one-time migration for user installs with Add to PATH, the CopilotCliCommand policy, and uninstall cleanup. Fix the uninstall step guard. - Copy the shim into the Windows package when the build provides it. - Replace the Copilot extension's integrated-terminal script shims with the native shim, resolved next to the `code` command. Refs microsoft/vscode-internalbacklog#9765 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add standalone Copilot CLI shim Add the cross-platform Rust shim, runtime tests, and independent build and signing pipeline validation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Updates * Fix Copilot shim PATH discovery on Windows Opening a directory on Windows requires FILE_FLAG_BACKUP_SEMANTICS, so reading the file identity of every PATH entry failed with ERROR_ACCESS_DENIED and the shim never discovered an installed Copilot CLI. Open with attribute-only access and backup semantics instead. Also keep test thread names, which contain `::`, out of Windows temp file names. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Resolve Copilot shim integration blockers - Add the leading --vscode-shim option namespace: the clear modifier and the info, probe and install setup commands that the Windows installer runs. - Install GitHub's per-user Copilot CLI MSI on Windows (checksum and "GitHub, Inc." Authenticode verification) instead of winget, and search its install folder during discovery. - Fix .cmd/.bat launches: pass cmd switches unquoted and encode the tail for /E:ON /V:OFF. - Make the ConPTY tests work with redirected stdio (as in CI), and fix the Windows and Linux test and lint failures. - Build the shim in the existing CLI jobs and add it to bin/copilot-shim of the client and server builds before they are signed, replacing the separate shim jobs and the Windows shim signing job. - Update REQUIREMENTS.md for these decisions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add the CopilotCliCommand policy to the Copilot shim integration - Declare chat.copilotCliCommand.enabled, controlled by the CopilotCliCommand policy. The Copilot extension stops adding the native shim to integrated terminals, and uses copilot from PATH, when it is off. - The shim reads the policy on Windows for every VS Code quality (a disabled policy in any quality wins). It still launches an installed Copilot CLI but never installs or updates one, and exits with code 10 instead. probe reports the policy and install reports a policy status. - Setup applies the same any-quality rule and no longer reads aiDisabled from the probe. policyData.jsonc still needs `npm run export-policy-data`. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Make the Copilot shim script-friendly without a terminal - Prompts go to stderr, and the shim only prompts when stdin and stderr are terminals. - Without a terminal, a missing Copilot CLI prints a message to stderr and exits with 127 (command not found) instead of printing the prompt to stdout and exiting 0. An old Copilot CLI is launched with a warning, because a script can't answer the update prompt. - Update the Unix tests for the --vscode-shim clear modifier, which they still passed as the removed --clear option. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Drop the Copilot shim's minimum version check and startup probes - Launch the first usable Copilot CLI without running it first. The 1.0.82 minimum and the update prompt are gone; the Copilot CLI keeps itself up to date, and running --version before every launch cost 0.15-1 s (seconds on the first run after an update). - Locate PowerShell only when discovery reaches a .ps1 candidate, instead of starting it on every Windows launch (about 450 ms). - Search only the first 16 MiB of a candidate for the shim marker, instead of reading all of a 150 MB Copilot CLI executable. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Publish the Copilot shim like inno_updater and leave the CLI to Copilot - Setup publishes the shim with inno_updater's three-way rename: stage new_copilot.exe, rename copilot.exe to old_copilot.exe (or old_N_copilot.exe when an older session holds it), rename the new copy into place, and restore the old copy if that fails. Each step is retried for transient locks, and old_* copies still in use are skipped until a later install or update. - Replace the shim only when its embedded file version changes. build.rs writes the version resource directly, with no new dependencies. - Never run the MSI when Copilot CLI is already installed (its file or its MSI registration), and launch the MSI-installed CLI by its full path right after installing, since the terminal's PATH doesn't have it yet. - Soften setup's PowerShell note to a recommendation: Copilot CLI supports Windows PowerShell 5.1. - Document ownership: VS Code owns only the shim; Copilot owns the CLI, its PATH entry, updates, uninstall and data. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Make copilot follow code on PATH unless the user chose otherwise - Without the installer page, an explicit choice (the page earlier or /copilotcli=) is kept; otherwise copilot is added when the Add to PATH task for code is selected. This covers silent installs, silent reinstalls, background updates and interactive installs that skip the page, for user and system installs, including once for existing installs. - A saved policy state isn't a choice, so lifting CopilotCliCommand=0 brings back the default. Policy 1 means the same as not set. - Append the shim folder so that removing it restores the user's PATH exactly, including a trailing separator. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Export the CopilotCliCommand policy data Generated with npm run export-policy-data. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Ship the CopilotCliCommand policy in 1.141 main is now 1.141, so the policy's minimumVersion follows it. policyData.jsonc was regenerated with npm run export-policy-data. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Check revocation of the Copilot CLI MSI's signing chain The shim verified the MSI's Authenticode signature with WTD_REVOKE_NONE, so a revoked GitHub signing certificate would still be accepted. Check revocation for the whole chain except the root. When the revocation server can't be reached, the Windows Authenticode policy decides; by default it accepts. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Don't read large Copilot CLI candidates to look for the shim marker Discovery read the first 16 MiB of every candidate to find the shim marker, so launching an installed Copilot CLI (about 150 MB) read 16 MiB on every run. Only candidates up to 16 MiB are searched now; the shim is under 1 MB. With a signed 30 MB candidate this saves about 60 ms per launch. Most of the remaining startup cost in local builds is Microsoft Defender scanning the unsigned shim on every launch; the same binary signed launches in a few milliseconds. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add verbose Copilot shim diagnostics Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Simplify the installer's Copilot shim code - Detect install progress from the shim's heartbeat instead of converting the UTF-16 progress file through the ANSI code page. - Remove the system installer's HKCU PATH cleanup; VS Code never adds that entry. - Replace the test-only retry override with a preprocessor define and share one retry loop for copying and renaming. - Log the previous shim version, not the new one twice. - Update the documented shim contract. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Remove unneeded Copilot shim code and fix review findings Correctness: - Honor a setup cancel after the download: check before msiexec starts. - Ctrl+C during the first-use Windows install: the install child handles Ctrl+C and stops at its next step, removing the partial MSI, and the parent waits for it instead of killing it after 250 ms. Once msiexec runs, it finishes and reports. - On Unix, exec the Copilot CLI, so killing copilot by PID ends the CLI and signals and exit status are the CLI's. - A PATH entry that can't be inspected no longer blocks installer tool discovery, and a missing current directory only skips relative entries. - A silent install checks the registry PATH for an existing CLI, like probe. - build.rs rejects pre-release versions, which the file version can't carry. Encoding and locale: - Scripts that aren't UTF-8 (OEM .cmd, UTF-16 .ps1) are candidates, not skipped; a UTF-8 prefix cut inside a character still classifies. - WinHTTP errors use winhttp.dll's message text in the user's language, and OS errors use the system's localized message. - The install prompt accepts full-width y from East Asian IMEs. - PowerShell from the Microsoft Store (app execution alias) is usable. Performance: - Look up the four candidate names directly instead of listing every PATH directory, and don't inspect directories. - Read a candidate once for both the marker and legacy checks, and not at all when it's larger than 16 MiB. - Locate ComSpec only for .cmd/.bat candidates. - The probe uses HEAD requests and skips the network when a CLI is found. Removed: the info command, unused probe keys, installed_msi_candidate (discovery already searches the MSI folder), launch adapters, host kinds, unused candidate fields and error payloads, the single-variant Cancellation, the Unix captured-probe path and its tests, the WinHTTP default-proxy fallback, sync_all on the temporary MSI, and trivial tests. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * updates * copilot: use the shipped Copilot shim in terminals (#338927) * Use the Copilot shim that ships with VS Code in terminals The extension had switched to copying a local development build into global storage, so a shipped build ignored its bundled shim and ran copilot from PATH. Use the shim next to the code command again, remove the script shims that earlier versions stored in global storage, and fall back to the development deployment only when the build doesn't ship a shim. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Don't tie the development fallback test to the PATH order The terminal PATH order is changed separately. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Append the Copilot shim to the terminal PATH The extension had switched to prepending the shim's folder to the integrated terminal PATH, so the shim came before the user's own PATH. Append it again, as Windows setup does, so a Copilot CLI already on PATH is found first. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Copilot shim: restore Ctrl+C in the ConPTY cancellation test A test runner started in a new process group ignores Ctrl+C, and the shim under test inherited that, so the cancellation test exited 1 instead of 130. Restore Ctrl+C before starting the shim, as an interactive terminal does. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Copilot setup: say where Copilot CLI was found Setup skips its Copilot page when Copilot CLI is already installed, which looked like a missing page. The probe now reports the path it found, setup logs it, and the Ready page shows "GitHub Copilot CLI: Already installed at <path>". Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Update the Copilot shim post-install notes for the current code SHIM_POST_INSTALL.md described the shim before the installer-only PATH and the official-script install directory fallback existed, and referenced types that were since removed. Keep the investigation (the transcript, why only the legacy shim got the profile prompt, how the script picks a profile) and describe what the shim does now. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * copilot shim: always explain why copilot stopped, and decide verbose mode (#338991) Always explain why the Copilot shim stopped without running the CLI With verbose mode off, several outcomes ended copilot with a nonzero exit and no output: the policy block (10), no terminal (127), a CLI that can't start, unsupported targets, missing installer tools, and failed installs, including the Windows MSI install's reason. Print one line for each of these; keep discovery, probe, and per-attempt detail as verbose diagnostics, and point to verbose mode after a failed install. VSCODE_COPILOT_SHIM_VERBOSE also turns on verbose mode, for scripts and other places where the arguments can't be changed. Malformed --vscode-shim options, which only VS Code passes, stay quiet. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Ship the CopilotCliCommand policy in 1.142 main is now 1.142, so the policy's minimumVersion follows it. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Declare the CopilotCliCommand policy's Agent Host status main now requires every policy to declare how the Agent Host enforces it. Windows setup and the copilot command read CopilotCliCommand themselves, so it applies to shells of every session type, like the other shared editor-owned controls. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Copilot shim: don't create a non-UTF-8 folder in the installer PATH test macOS file systems reject names that aren't valid UTF-8, so the test failed on macOS with "Illegal byte sequence". installer_path keeps PATH entries byte-for-byte whether or not they exist, so the entry no longer needs a folder. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Copilot setup: let the keyboard reach the Learn more link (#340626) The link on the GitHub Copilot CLI page wasn't a tab stop, so keyboard users couldn't reach it. Tab now stops on it, and Space opens it. Fixes microsoft/vscode-internalbacklog#9998 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Copilot shim: rewrite the download line less often (#340627) During the first-use install, copilot rewrote its download line at every percent, and screen readers announced each rewrite. It now shows the line when the download starts and finishes, and otherwise at most every 5 seconds. Fixes microsoft/vscode-internalbacklog#9999 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Copilot setup: say that Install now also adds copilot to PATH (#340760) Only the "when I first run copilot" option said it adds copilot to PATH, so Install now read as if it didn't. Every option's description now starts with what it does to PATH, and Ready to Install says the same. Install now also adds the copilot command to PATH when Copilot CLI installs, not only when the install fails, so both install options end the same way: if Copilot CLI is uninstalled later, copilot offers to install it again instead of disappearing outside VS Code. Fixes microsoft/vscode-internalbacklog#9996 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Copilot setup: read the Copilot page in order with screen readers (#340761) Screen readers follow the window order of a page's controls, and each control setup created was placed above the ones before it, so NVDA read the GitHub Copilot CLI page from the bottom up. Each control now moves to the bottom of the window order when it's created, so the window order matches the page. The Tab order is unchanged. Fixes microsoft/vscode-internalbacklog#10007 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Ship the CopilotCliCommand policy in 1.143 release/1.142 branched without this feature and main is now 1.143, so the policy's minimumVersion follows it. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Copilot shim: keep % literal in Windows script paths cmd.exe expands %VARIABLE% even inside quotes, so a .cmd or .bat Copilot CLI in a folder whose name contains %NAME% was launched from the wrong path. Escape % in the script path the same way as in the arguments. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Copilot shim: only run Copilot CLIs the current user can execute On macOS and Linux, discovery accepted a candidate when any execute bit was set, so a file only another user can execute was chosen and failed with EACCES instead of moving on to the next Copilot CLI on PATH. Check execute access for the current user with faccessat(AT_EACCESS), like a shell's PATH search. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Copilot shim: describe only Copilot CLI's public behavior Remove references to Copilot CLI's private source and packaging internals from the shim's requirements and comments. Keep the shim's own behavior: install only where there is no Copilot CLI, and never run the MSI over one. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Don Jayamanne <don.jayamanne@outlook.com> Co-authored-by: Don Jayamanne <dojayama@microsoft.com>github.com-microsoft-vscode · 25f764ab · 2026-10-15
- 4.9ETVcopilot: apply the CopilotCliCommand policy to Linux packages and the macOS shim (#342101) * linux: expose the Copilot shim in DEB/RPM packages Honor Linux installation policy and preserve the official installer PATH. Manage Stable and Insiders command ownership through guarded package lifecycle hooks. Add native runtime regressions and a focused package lifecycle harness while leaving deferred packaging formats and non-Linux behavior unchanged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * test: fix Copilot package launcher and rendering checks Use a scenario-local profile for root launcher validation and ignore disabled shell comments when checking unresolved package placeholders. Preserve strict helper validation and add focused regressions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * copilot: apply the CopilotCliCommand policy to Linux packages and the macOS shim The Linux DEB/RPM scripts now ask the shim for the CopilotCliCommand policy before managing /usr/bin/copilot, matching Windows setup: a disabled policy removes a link to either edition's shim instead of creating one, and an unreadable policy leaves the entry unchanged. DEB packages add a preseedable <package>/add-copilot-command debconf question (medium priority, default true) that lets an edition opt out; hand-over on removal respects the other edition's answer and the policy. The shim gains `--vscode-shim policy`, which exits 0 when the policy allows the command and 10 when it turns it off, and reads the policy on macOS from the configuration-profile domains of every quality (ported from #341916). Co-authored-by: Don Jayamanne <don.jayamanne@outlook.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * test: drop rendering tests that only exercised the harness validator Keep the checks of the real link helper source and the DEB/RPM templates; the removed cases tested the package-lifecycle harness's own validator rather than product code. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * copilot: bump the shim to 0.1.2 main's #342224 and this branch both changed the shim and bumped it from 0.1.0 to 0.1.1. Windows setup keeps a published shim whose file version matches, so the merged shim needs its own version to replace main's 0.1.1. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Don Jayamanne <don.jayamanne@outlook.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 07f69c55 · 2026-10-19
- 2.0ETVchat: open Copilot CLI sessions from product protocol links (#342120) * chat: open Copilot CLI sessions from product protocol links The Copilot CLI's `/code` and `/code-insiders` commands hand the current CLI session to VS Code with a link such as `vscode://file/<folder>?windowId=_blank&copilotCliSession=<id>`. Insiders needs no separate handling because it registers its own `vscode-insiders` protocol. - Add a `copilotCliSession` link parameter carrying only the CLI session id. The window resolves it to the Copilot CLI chat session provider, so the CLI does not depend on a provider-specific URI. - Open the requested chat session when the link starts VS Code (cold start). The `session` parameter was previously dropped on that path. - When Copilot CLI sessions are unavailable, show an error instead of a new, empty chat. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: open /code links in the Copilot harness When new chats default to the Copilot harness (or the Copilot CLI provider of the Copilot extension is unavailable), a copilotCliSession link imports the CLI session into the agent host and opens it in the Chat view, so the chat continues in the same runtime with the model, effort and modes the CLI left it in. Other cases keep opening the session through the extension provider. - importSession registers a session that discovery has not registered yet, for example one hidden by showExternalSessions or created moments ago, by asking its provider to classify that one session (IAgent.discoverChat). - Before adopting, the provider takes over the default chat (IAgent.importChat). The Copilot provider refuses with a Conflict error when another process holds the session, so two clients never write the same history, then resumes the chat and adopts the permission and agent modes its runtime restored, limited by managed policy, instead of replacing them with the host's defaults on the next turn. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: carry a /code session's selection over and allow taking it over Follow-ups from the Copilot CLI review of the /code handoff: - Same model, effort, context tier and custom agent. Each turn carries the model and agent the client picked, seeded from the chat's draft, and the host applies them before the turn. An imported chat's picker was seeded from the rebuilt history, which records the model without its effort or tier and no custom agent, so the first turn reset the effort and deselected the agent the runtime had restored. IAgent.importChat now returns the selection the runtime continues with (Copilot: rpc.model.getCurrent and rpc.agent.getCurrent, with the agent matched by name to one this host offers), and the host makes it the chat's draft. Values equal to a managed default are still dropped when the turn applies them, so policy decides those. - Taking over a held session. The runtime's in-use record is best effort, and the CLI lets users take over a session when it reports one. Import now takes a takeOver option (vscode/importSession `takeOver`), and the /code link opener asks before retrying with it when the import reports Conflict. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * chat: open /code sessions only through the Copilot agent host The Copilot CLI's /code and /code-insiders hand a session over to Copilot in the agent host. Drop the fallback to the Copilot extension's Copilot CLI chat session provider, and with it the check for whether new chats default to the agent host: a copilotCliSession link always imports the session into the agent host, and reports an error when the agent host can't open it. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * windows: open a link's chat session in the window of the requested path A protocol link's chat session (`session` or `copilotCliSession`) was sent to a window picked from the windows `open` returned. On startup that list also holds windows restored from the previous session (`window.restoreWindows: preserve`): a link whose path doesn't exist sent the session to a single restored window, a folder link with a trailing slash didn't match its normalized window, and a file link never matched. `IOpenConfiguration` now carries the chat session, and `WindowsMainService` sends it to the window that opened the requested path, matched on the resolved path (or the window the files opened in). Nothing is sent when the path didn't open. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: open an imported /code session at the address the host reports The agent host admits a Copilot CLI session's backing (copilotcli:/<id>) under its own address, ahp-session:/<id> for a session it hasn't seen, and lists it under that address. The link opener registered the Chat resource for the backing instead, which conflicts with the listed session's identity, so the session never opened. vscode/importSession now resolves to the session's exact resource, as vscode/moveSession does, and the opener opens that resource. A host that doesn't report it keeps the session at the address it was imported from. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * chat: explain a /code session that can't be found in plain terms When the agent host can't find or adopt a /code session (for example, it was deleted, or another app created it), the notification showed the host's internal reason, such as "not an adoptable legacy chat (reason=...)". Show a plain, localized message instead. The raw error is still logged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: wait for a CLI handing off a /code session to release it The Copilot CLI launches the /code link before it exits, and releases the session's in-use lock only during its teardown, after it has finished writing to the session. If VS Code checked the lock first, importing refused the session and the user was asked to take over a session the CLI was about to release. When the session is in use, importing now checks again every 250ms for up to 5s before refusing. Taking over still doesn't wait. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · be79b94e · 2026-11-03
- 1.7ETVtasks: Release custom callbacks when providers are disposed (#339553) * tasks: Release custom callbacks when providers are disposed Track successful callback ownership separately from active and direct executions. Release disposed registrations and reject their late results without removing another owner or invalidating extension-held task callbacks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * tasks: Preserve custom callbacks during main-thread startup Reserve custom execution callbacks before resolving startup variables and fence provider cleanup on the unregister reply. Cancel reservations at task end and close late PTYs without delivering a stale start. Cover delayed IPC delivery, cancellation, callback failures, newer registrations, and real workbench-initiated execution before extension-host start delivery. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * tasks: format startup regression tests Use the repository formatter to address the Compile & Hygiene failure. Emitted JavaScript is unchanged and all 58 task lifecycle tests pass. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * tasks: preserve accepted custom execution ownership Reserve callbacks before dependency and input waits, and key startup/end ownership by the accepted task instance rather than the shared definition ID. Preserve reserved callbacks through owner cleanup while allowing explicit later discovery. Add real API dependency/concurrent-instance regressions and lifecycle coverage. Refs #339537 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 1a5e38d8 · 2026-10-29
- 0.8ETVchat: avoid redundant prompt timeline updates (#339406) * chat: avoid redundant prompt timeline updates Cache diff statistics per timeline tick and suppress equivalent results. Preserve unchanged gutter rows and ruler marks while keeping live stats, focus, and navigation updates intact. Fixes #337244 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * chat: strengthen timeline rebind and tick update regressions Assert distinct nonempty statistics immediately on session rebind and isolate each compared field in both rails. Verify observed same-position metadata changes without production changes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Check prompt timeline session switches and single-field updates in tests Assert the new session's diff stats right after a switch, using different non-empty values for the old and new sessions, and check that the old session's source is no longer observed. Change one tick field at a time in both rails and check that only that prompt re-renders. Run the same-position rename and timestamp checks for both tick lists. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · ed3c6e8b · 2026-10-29
- 0.8ETVBatch stored shell output lookups when restoring Agent Host chats (#341926) * Batch stored shell output lookups when restoring Copilot sessions Restoring a Copilot session awaited one SQLite query per completed non-PTY shell call to find stored full output, so a 2000-turn session with 8000 shell calls issued 8000 sequential queries. Collect the candidates across the parent and subagent chats and look them up with a single getTerminalOutputSizes query that binds the ids as one JSON array, which keeps large sessions within SQLite's bound-parameter limit. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Batch stored shell output lookups when restoring Claude and Codex chats Claude and Codex restores awaited one getTerminalOutputSize query per restored shell call, like the Copilot path fixed in the previous commit. Look up all of a chat's restored shell calls with one getTerminalOutputSizes query instead. Claude still attaches output only where a row exists, and Codex still reads stored content only for present rows whose replayed output was not retained. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add rootTurnId to Codex restore test fixtures Codex SDK 0.162.0 requires rootTurnId on Turn. The batched-lookup fixtures predate the SDK update, so the rebased branch failed typecheck. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 89a0f6eb · 2026-10-30
- 0.7ETVexplorer: coalesce parent refreshes during bulk moves (#339614) * explorer: coalesce parent refreshes during bulk moves Join multi-file working-copy move completion before refreshing affected Explorer parents. Keep model mutations immediate and cover asynchronous boundaries, overlapping batches, partial failures, cancellation, URI identity, nesting and disposal. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * explorer: preserve tree ownership across multi-source moves Reconcile source parents before final destination refreshes, visiting parents in both roles twice when needed. Preserve error propagation and cover lookup, reveal, focus and selection with the real tree for shared-target, chained and exchanged file/folder moves. Refs #339610 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * explorer: keep interleaved moves reachable Refresh pending source parents before another move reparents an item or ancestor touched by an in-flight batch. Start batch cleanup without delaying working-copy file operation completion. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · a1ff1d6a · 2026-10-16
- 0.7ETVsplitview: avoid intermediate layouts when distributing views (#339450) * splitview: avoid intermediate layouts when distributing views Keep the constraint-solving pass before distribution, but only notify views and save proportions after the final sizes are known. Cover automatic and explicit distribution when adding or removing views, alongside size constraints and deferred layout. Fixes #164200. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * splitview: retain layouts needed by constrained descendants Limit the intermediate-layout shortcut to proportional participants. Preserve minimized and globally non-proportional nested geometry during distribution and removal, with real GridView coverage on both axes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * splitview: skip superseded layouts only for path-independent views View participation in proportional sizing does not describe nested layout state, so restored rows, reoriented grids and centered layouts could still change geometry. Require every direct view to opt in; grid leaves forward the capability, branches and adapters keep the intermediate layout, and editor groups opt in. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · d959e58e · 2026-10-29
- 0.7ETVRun late steering messages as the next turn instead of dropping them (#342373) * Run late steering messages as the next turn instead of dropping them A steering message sent as an Agent Host turn ended was either dropped (the Copilot session skipped the send and cleared the pending row) or left pending on an idle chat, where nothing would ever send it. The Copilot session now hands such a message back unsent, and the queue drain steers the active turn with it or, when the chat is idle, runs it as the next turn ahead of queued messages. Steering the provider still holds keeps waiting, so it is never delivered twice. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Cover several late steering messages in the queue drain tests Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Retry the queue when held steering settles on an idle chat If the agent handed one late steering message back while it still held a second one, the queue waited for the second. When sending the second one then failed, the agent cleared it and reported it handled, but nothing drained the queue again. The handed-back message and any queued messages stayed idle. Now, when a held handoff settles and the chat is idle with steering still pending, the queue drain tries again. Cancellation clears pending steering first, so it still never starts queued work. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Start sent steering as its own turn when the SDK idles before echoing it When the Copilot runtime receives an immediate send while idle, it starts a new run with that message. The host often sees the previous run's idle before the steering echo, so the chat looked idle in between: a pre-echo failure left the steering row stuck, and a turn the user started in that window was completed empty by the late echo. On a normal root idle, promote the earliest dispatched but unechoed steering message to its own running turn right away, and fail that turn if its send later rejects. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Keep steering started at idle correlated with its echo A steering message started as its own turn at idle was removed from the pending set, so its late echo could be matched by content to another pending message with the same text, completing the turn early and consuming that message. Keep the promoted entry until its echo or the end of its turn, and prefer it when matching by content. Also skip promoting steering whose withdrawal is still in flight, so a successful withdrawal no longer leaves a turn running that the SDK will never execute. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Connor Peet <connor@peet.io>github.com-microsoft-vscode · ec26c9f0 · 2026-10-20
- 0.6ETVRelease annotations subscriptions when leaving an agent session (#342239) * Release annotations subscriptions when leaving an agent session The Agents window kept a live annotations subscription for every session opened until the session was deleted, so agent host subscriptions grew by one per session visited. Hold the subscription only while the session is visible and acquire it again when the session is read. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Keep feedback writes and child panes when releasing annotations subscriptions Leaving a session released its annotations subscription even when a feedback write had not reached the agent host yet. Releasing the last reference drops that write, so a reconnect could not resend it and the next snapshot erased the comment. A hidden session now keeps its subscription until the host acknowledges its writes, then releases it. A chat opened in its own pane also lost live feedback updates once its parent pane closed and another session took focus, because only the main session slots were treated as visible. Every rendered pane now counts. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 4183357b · 2026-10-29