Connor Peet
90d · built 2026-07-24
90-day totals
- Commits
- 119
- Grow
- 26.6
- Maintenance
- 19.7
- Fixes
- 17.0
- Total ETV
- 63.2
Where this dev ranks
Percentile against the global top-100 leaderboard (all-time totals).
- By commits
- Top 31 %
- By Growth share
- Top 17 %
30-day trajectory
Last 30 days vs. the 30 days before. Up arrows on Growth and ETV mean improvement; up arrow on Fixes share means more time on fixes (worse).
↓-35.6 %
vs 45 prior
↑+2.7 pp
recent vs prior
↓-2.8 pp
recent vs prior
Daily performance
Daily ETV, stacked by Growth, Maintenance and Fixes.
Work-mix over time
Share of Growth / Maintenance / Fixes over a rolling 7-day window. Reads as 'where is effort flowing right now'.
Repository spread
Where this developer's commits land. Concentrated work (top1 > 80%) vs polymath spread (top1 < 30%).
Most impactful commits
Top 20 by ETV in the 90-day window.
- 3.4ETVFix Copilot AH plugin sync errors on reconnection (#320193) * Fix Copilot AH plugin sync errors on reconnection (#319744) Two-part fix for #319744: 1. AHPFileSystemProvider gets a brief reconnection grace window. Per- authority entries keep a stack of connections (newest = active) and hold open requests across a transient disconnect. Watchers auto-reattach across reconnects via a class-level connection-change event. New tests cover reconnect grace, fallback to prior connection, immediate reject for never-registered authorities, and watch reattach across disconnect / late attach. 2. Plugin controller is split into two: - PluginController (shared, process-wide): host customizations, parsing helpers, and the IAgentPluginManager. - SessionPluginController (per CopilotAgentSession): client customizations, session-discovered on-disk customizations, and per-session enablement overrides. Publishes SessionActions directly via onDidPublish — no more clientId-based cross-session routing. ActiveClient is now Disposable, owns its SessionPluginController, and forwards publish events into the session's progress stream. setCustomizationEnabled fans out to every session controller, matching Claude's per-session model. sendMessage retries any previously-failed client customization sync so a transient connection drop during reconnection doesn't pin the error. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address Copilot review feedback - agentHostFileSystemProvider: fix _getConnection race by re-checking state after subscribing - agentHostFileSystemProvider: explicit void on fire-and-forget reattach() calls in watch() - copilotAgent: remove duplicate JSDoc block on PluginController Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Use timeout(0) instead of setImmediate in browser-runnable tests setImmediate is not available in WebKit, causing macOS / Browser CI unit tests to fail. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · bad33e15 · 2026-06-06
- 3.1ETVAgent host: run `!`-prefixed chat messages as terminal commands (#324270) - Add a "bang command" feature: in any chat agent, a message starting with `!` runs as a terminal command (via the existing agent-host terminal/shell integration) instead of being sent to the model. The host emits a transcript-only tool-call response for the command. - Persist host-injected "local turns" (`!command` and `/rename`) so they survive reload; fork/truncate/rename resolve them to the preceding concrete SDK turn. Handled uniformly per-chat (default, peer and subagent chats). - Refactor local command handling into a pluggable `LocalChatCommandRegistry` with self-contained `AgentHostLocalCommands` dispatcher, extracting the logic out of `AgentSideEffects`. Add `renameLocalCommand` and `bangLocalCommand`. - Extract shared helpers: `shellCommandExecution` (agent-agnostic shell exec core) and `persistSessionMetadata`. - Fix peer-chat truncation routing: `truncateSession` now takes the chat URI and routes peer chats to their own backing session. - Fix truncate no-op after forking into a second peer chat: `SessionDataService` keyed every peer chat of a session onto one data dir/DB (chat id lives in the URI authority, which `AgentSession.id` dropped), so a second fork's `vacuumInto` failed with "output file already exists" and the forked chat never inherited its turn event IDs. Key now includes the authority; both fork copy sites also clear any stale target DB first. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 710b8c0c · 2026-07-04
- 2.4ETVagent-host: add WSL connection support (#319971) * agent-host: add WSL connection support Add WSL-based remote agent host connections as a third connection type alongside SSH and dev tunnels. On Windows, users can pick "WSL..." in the Remote group of the session workspace picker, choose an installed WSL 2 distro, and the agent host is launched inside that distro. Connected distros are persisted as remembered entries and auto-reconnected on startup -- but only when WSL is already running, we never auto-boot a shut-down distro. - New IPC contract `IWSLRemoteAgentHostService` / `IWSLRemoteAgentHostMainService` mirrors the SSH shape. A shared `RelayTransport` base is extracted from `SSHRelayTransport` so SSH and WSL share the IPC relay pump. - Shared-process service spawns `wsl.exe -d <distro> -e bash -lc <bootstrap>`, reuses the SSH CLI install layout helpers verbatim (`~/.vscode-server/cli/...`), parses the `ws://127.0.0.1:PORT?tkn=...` URL the agent host prints, opens a local WebSocket, and pumps frames over IPC. Retries the open on ECONNREFUSED/AggregateError to ride out WSL 2's localhost-forwarding setup delay on first connect. - Contribution layer adds `WSLReconnectState` mirroring `SSHReconnectState` and extracts a shared `_attemptManagedReconnect` template so SSH and WSL share retry-loop logic (status transitions, incompatible short-circuit, cached-session unpublish on failure). WSL retries are gated on `wsl --list --running` so a stopped distro is never auto-booted. - New "WSL..." action gated on `isWindows && chat.remoteAgentHostsEnabled`; surfaces install docs (`aka.ms/vscode-remote/wsl/install-wsl`) when WSL is missing or no WSL 2 distro is installed. The "Select..." button stays enabled even while a distro is stopped -- explicit user click overrides the never-auto-boot rule and boots the distro on demand. - Workspace picker scopes `resolveWorkspace` to the matching connection authority so a folder picked from one agent host is no longer attributed to another. - New `canConnectOnDemand` provider capability keeps `Select...` enabled while disconnected/connecting for providers with a connect-on-demand hook; concurrent on-demand clicks join the in-flight reconnect promise instead of returning early with a misleading toast. - New parser tests for `wsl --list --verbose` / `--running` output and the `wsl.exe` UTF-8 / UTF-16LE decode heuristic. Fixes https://github.com/microsoft/vscode/issues/307568 (Commit message generated by Copilot) * agent-host: fix test URI authorities for resolveWorkspace scoping Tests in remoteAgentHostSessionsProvider.test.ts used hardcoded `vscode-agent-host://auth/...` URIs but the provider's connectionAuthority is derived from the configured address (default `localhost:4321` -> `localhost__4321`). After tightening `resolveWorkspace` to only claim URIs whose authority matches its own (Linux/Browser CI failure on PR #319971), these tests started failing. Update the URI authorities to match the actual default.github.com-microsoft-vscode · f4839fb2 · 2026-06-04
- 2.4ETVAgent-host MCP authentication + accurate/persisted MCP auth state (#323968) * wip on mcp auth through AH * Preserve live MCP server state across customization re-syncs The Agents window showed a connected GitHub MCP server flipping back to 'Starting' when navigating away from and back to a session. A client re-subscribe re-published the session's customizations, and the SessionCustomizationsChanged full-replace reset each MCP entry's state to the 'Starting' default baked into makeMcpServerCustomization. - Skip no-op customization re-syncs in SessionPluginController.sync so an identical re-publish (e.g. navigating back) does no work. - SessionPluginController now overlays live MCP runtime state/channel onto every published customization via _projectForPublish, so a genuine single-customization change no longer resets otherwise-unchanged MCP servers. The overlay is driven by an ISettableObservable kept up to date by the session from McpCustomizationController. - McpCustomizationController._live is now an observable and exposes runtimeStates as a derived; mutations are batched in transactions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Persist agent-host MCP auth and improve auth-required prompts - Key remembered MCP auth on a stable id (session authority + server name + resource URL) instead of the unstable customization id, so grants survive reloads and don't require re-auth. - Record agent-host metadata (authority + host label) on allowed MCP servers and surface agent-host servers in their own section of the Manage Trusted MCP Servers picker instead of filtering them out. - Make the auth-required chat prompt reactive: servers is now an observable so servers whose auth requirement surfaces later join the existing prompt, and the part marks itself used once hidden so later requirements re-prompt. - Show an 'Authenticating <server>...' progress state while each server auths. - Drop the never-serialized mcpAuthenticationRequired part from the serialized response-part unions. - Add unit tests for the stable-id helper, agentHost metadata persistence, and query-service exposure. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address CI failure and Copilot review on MCP auth prompt - Don't emit an empty mcpAuthenticationRequired progress part (was adding a stray part and breaking AgentHostChatContribution tool-progress tests). - Guard the async auth filter with a run id so out-of-order completions can't overwrite a newer server list. - Group agent-host servers in the Manage Trusted MCP Servers picker by stable authority (sorted by label) instead of label, which could collide. - Scope the authenticate link to the #authenticate target and give it button semantics (role=button, cleared href). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 17c6cd48 · 2026-07-02
- 2.2ETVfeat(agent-host): gate inbound filesystem RPCs with a permission service (#314194) * feat(agent-host): gate inbound filesystem RPCs with a permission service Reverse `resource{Read,List,Write,Delete,Move}` from remote agent hosts were routed straight to `IFileService` with no authorization. Add a permission service that gates each reverse RPC, returns typed `PermissionDenied` with `data.request`, handles negotiation via the new `resourceRequest` reverse RPC, and surfaces a Deny / Allow / Always Allow prompt above the chat input. URIs are canonicalized through `IFileService.realpath` before comparison so `..` and symlinks can't escape grants. Implicit read grants are auto-registered for customization URIs the client sends to the host, so plugin sync remains friction-free. Always-Allow grants persist into a new user setting, `chat.agentHost.localFilePermissions`. * comments and testsgithub.com-microsoft-vscode · c30ed7c4 · 2026-05-04
- 2.0ETVagent host: eagerly create sessions when a folder is picked (#313841) * agent host: eagerly create sessions when a folder is picked Previously the agent-host backend session was only created when the user sent their first message. Move creation up to folder-pick time so the new-chat view interacts with a real session URI throughout: model selections, session-config picks, etc. all dispatch against a known session, and the chat handler avoids a duplicate createSession round-trip on the user's first send. This is particularly in advance of support for completions, which necessarily are derived in the context of a workspace, agent customizations, etc. While the work for these new 'provisional sessions' is trending towards gnarly internally, the protocol is kept pretty clean with the only change being semantic guidance that sessions with no messages should be garbage collected. To make eager creation cheap, sessions are ephemeral in the agent until the first message lands — no SDK session, no worktree, no on-disk metadata. Materialization happens inside `sendMessage` and fires `onDidMaterializeSession`, at which point the agent service emits the deferred `notify/sessionAdded` and transitions lifecycle to `Ready`. Switching workspaces or closing the new-chat view disposes the provisional record (`disposeSession` over the wire); a 30s server-side empty-session GC backstops crashes and dropped disconnects. The new-session bookkeeping in the sessions provider previously lived across 11 loose `_currentNewSession*` fields and 4 keyed-by-sessionId maps. Bundle them into a single `NewSession` class held as a `MutableDisposable` — assigning a new value automatically tears down the previous one (subscription release + disposeSession RPC). Subtle wire-ordering note: `NewSession.eagerCreate` awaits `createSession` *before* opening the state subscription. Reversing the order races the wire — the server sees `subscribe` for an unknown session, returns `AHP_SESSION_NOT_FOUND`, and the client subscription enters an unrecoverable error state. New unit tests pin the ordering and the bail-out behaviour for workspace-switch-mid-flight. --- Architecture (provisional → real session): ```mermaid sequenceDiagram participant U as User participant SP as SessionsProvider participant H as ChatHandler participant A as Agent (CopilotAgent) participant S as StateManager U->>SP: pick folder SP->>A: createSession(uri) A->>S: createSession(emitNotification=false) Note over A: provisional record<br/>(no SDK, no worktree, no DB) SP-->>U: session.resource U->>SP: pick model / config (optional) SP->>A: SessionModelChanged / SessionConfigChanged Note over A: updates provisional record U->>H: send first message H->>A: sendMessage() A->>A: _materializeProvisional<br/>(create worktree,<br/> SDK session, persist DB) A->>S: onDidMaterializeSession S-->>U: notify/sessionAdded S->>S: SessionReady U-)SP: switch workspace SP->>A: disposeSession (old uri) Note over A: drops provisional record<br/>cancels worktree creation ``` * reviewgithub.com-microsoft-vscode · 8309b220 · 2026-05-02
- 1.9ETVagentHost: adopt OTEL log channel, support logs from remote agent hosts (#317876) Wires up the new `channels-otlp/` protocol so the agent host's `ILogService` is mirrored over an `ahp-otlp://logs/{level}` channel and surfaced as a per-host Output channel in the workbench. - Add `OtlpLogEmitter` / `OtlpEmitterLogger` (`platform/agentHost/common/otlp/`). `LogService` is constructed with the OTLP logger as a secondary sink in both `agentHostMain.ts` and `agentHostServerMain.ts` so every log call fans out to subscribers. - `ProtocolServerHandler` advertises `telemetry.logs` in `InitializeResult`, routes `subscribe`/`unsubscribe` on `ahp-otlp:` channels through a typed `ChannelSubscription` union, canonicalises the channel URI per-level, and broadcasts `otlp/exportLogs` notifications filtered per subscriber severity. - `RemoteAgentHostProtocolClient` stores the full `InitializeResult`, adds `subscribeStateless` and `onDidReceiveOtlpLogs`. - New `RemoteAgentHostLogForwarder` in the workbench layer registers an `Agent Host (${host})` Output channel via `IOutputChannelRegistry`, subscribes at the workbench's `ILogService` level (re-subscribes on change), and appends decoded records. Constructed from `remoteAgentHost.contribution.ts::_setupConnection` so it covers WebSocket, SSH and tunnel paths. Local agent host IPC logging is unchanged. - Existing remote IPC traffic channel renamed to `Agent Host IPC (${host})` to disambiguate from the new OTLP-derived channel. - Move `UriTemplate` from `workbench/contrib/mcp/common/` to `base/common/` so the forwarder can use it for `{level}` expansion. Tests: 8 unit tests for the emitter, 7 for the server-side OTLP routing (including URI canonicalisation), 3 integration tests for the end-to-end wire flow, and the existing protocol/handshake/reconnect suites. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 3400e0f7 · 2026-05-21
- 1.6ETVagent host: fix blank response after aborting a turn with a queued message (#322228) * agent host: fix blank response after aborting a turn with a queued message When a running turn was aborted while a follow-up message was queued, the Copilot SDK's asynchronous terminal `session.idle` (delivered after the abort teardown) completed the wrong turn: the queued message's send() had already reassigned the session's current turn id, so the stale idle emitted an empty ChatTurnComplete for the freshly-started turn and orphaned its real response and pending permission prompt. Read the SDK's authoritative `IdleData.aborted` flag, and replace the scattered per-turn fields (turn id, usage counter, streaming part-id maps) with a single CopilotTurn object carrying an explicit lifecycle state (pending | running | completed | aborted). A turn is pending between send() and the first SDK event and running thereafter; an abort's idle tears down a running turn (the client's ChatTurnCancelled finalizes it) and leaves a pending queued turn open, so the next turn's response is no longer orphaned. Steering turns are marked running on creation since they are promoted mid-loop. Also assert that cancelling a turn intentionally does not drain queued messages (they stay for manual dequeue), and keep the subagent routing map session-scoped since background subagents can outlive a turn. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agent host: address PR review feedback - Log an error and drop markdown/reasoning deltas emitted with no active turn (previously a no-op set that re-allocated a part per delta). - Split the abort-idle trace message by turn state (running turns are torn down, not left open). - Tidy a test title to sentence case. - Give delta/plan-mode mapping tests an active turn instead of relying on the old emit-without-a-turn behavior; assert the new drop+log behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 0c5ea498 · 2026-06-21
- 1.6ETVagentHost: replace AgentHostEditingSession with direct externalEdit progress part (#318053) The legacy AgentHostEditingSession (844 LOC) only existed to translate completed tool-call file edits into a markdownContent/codeblockUri/textEdit cluster that CollapsedCodeBlock would then re-derive into a diff pill by asking the editing session for stats it had just been handed. The agent host protocol already exposes FileEdit.diff and before/after content URIs up-front, so cut out the round-trip: - New IChatExternalEdit progress part carries uri, editKind, originalUri, beforeContentUri, afterContentUri, and diff stats directly. - stateToProgressAdapter.completedToolCallToEditParts emits one IChatExternalEdit per FileEdit, wrapping every URI via toAgentHostUri so remote sessions resolve through the agent host file system provider. - Extract ChatEditPillElement base class from CollapsedCodeBlock — same DOM / styling, no editing-session coupling. New ChatExternalEditContentPart extends it and renders a static pill from the progress data. - ChatThinkingContentPart.appendItem now accepts IChatExternalEdit metadata directly (via the new ChatThinkingItemMetadata alias); it derives the title (Created/Deleted/Renamed/Edited <filename>) and the pencil icon without any synthesized markdown. Diff stats bubble up through onDidChangeDiff (fired on a microtask so subscribers attach first). - AgentHostSnapshotController (~330 LOC) replaces the legacy editing session: implements IChatEditingSession but only restoreSnapshot, requestDisablement, and snapshot URIs do real work. Everything else is a no-op so the chat-level Restore-to-checkpoint UI keeps working without dragging in the full diff pipeline. - ChatChangesSummaryPart is intentionally skipped for agent host responses — per-file pills already convey the change counts inline. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 5bb22231 · 2026-05-23
- 1.5ETVWire up MCP App support for agent-host sessions (#321016) * working, in theory * finish up * review commentsgithub.com-microsoft-vscode · a3634cd2 · 2026-06-11
- 1.5ETVplugins: support new agent plugin spec (#327032) * plugins: support new agent plugin spec Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * plugins: address review feedback Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · ff4f272b · 2026-07-23
- 1.4ETVagentHost: support attaching virtual resources (untitled, notebook cells) (#320040) * agentHost: support attaching virtual resources (untitled, notebook cells) Consolidates the agent host's permission and virtual-resource services into a single `IAgentHostResourceService` that owns the gated FS surface (`list`/`read`/`write`/`del`/`move`/`copy`/`resolve`/`mkdir`), the permission policy, and an `ITextModelService`-backed fallback for content that isn't on disk. Both the in-process local channel and the remote protocol client's reverse-RPC handler now reduce to a thin wire adapter that dispatches frames to the same service. - Adds a single `IAgentHostResourceService` (platform decorator + types, workbench implementation) replacing `IAgentHostPermissionService` and `IAgentHostVirtualResourceProvider`. - `read`, `write`, and `resolve` (stat) transparently fall back to `ITextModelService` when `IFileService` cannot satisfy the request, so attached untitled documents and notebook cells round-trip end to end. - `AgentHostClientResourceChannel` (local in-process) and `RemoteAgentHostProtocolClient._handleReverseRequest` (remote) shrink to thin adapters that translate JSON-RPC frames into service calls and surface `AgentHostResourcePermissionError` as `PermissionDenied` frames so the host's standard `resourceRequest` -> retry loop still works. - Local agent host short-circuits the permission gate (sentinel address `'local'`): the utility process already has the renderer's FS access, so gating it adds no security and would just produce unprompted denials. - `createAgentHostClientResourceConnection` now exposes `resourceRequest`, completing the local prompt/retry loop. - `agentClientUri` preserves `query` and `fragment` across the round trip and uses a `!` scheme-slot marker to faithfully round-trip opaque-path URIs such as `untitled:Untitled-1`. Fixes https://github.com/microsoft/vscode/issues/319802 (Commit message generated by Copilot) * Address Copilot review and update tests for virtual-resource attachmentsgithub.com-microsoft-vscode · c1c20ad0 · 2026-06-05
- 1.3ETVFix blocked agent host sessions from nested subagent client tools (#323815) * Fix blocked agent host sessions from nested subagent client tools Nested (depth >= 2) subagents were never observed by the renderer, so a client-owned tool called deep in the subagent tree (e.g. the `problems` tool via a subagent-of-a-subagent) never ran and the session hung in "Input Needed" with no visible prompt. Two root causes, fixed on both sides: - Renderer: `tryObserveSubagent` required the subagent-discovery content block before subscribing to a child chat. It now observes as soon as the tool is a known subagent-spawning tool that is running, deriving the child chat URI from the tool id alone — robust and depth-independent. - Agent host: `subagent_started` carried no parent context, so the discovery content block was dispatched on the top-level chat instead of the immediate parent subagent chat (a no-op there). Threaded `parentToolCallId` through the signal (copilot + claude adapters) so the block routes to the immediate parent chat via a flat one-hop lookup at any nesting depth. Also keeps producing the session-level `inputNeeded` state for other clients (with tests), though the renderer no longer consumes it. Fixes #323738 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix test type narrowing and clarify subagent observation comment - Narrow ToolCallState to Running before reading .content in the 3-level nested routing test (fixes Compile & Hygiene TS error). - Reword the tryObserveSubagent comment to frame content-block-less observation as robustness (older/misrouting hosts, restored snapshots) rather than current agent-host behavior, which this PR fixes. Addresses Copilot review feedback. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix flaky wait in nested subagent tests The level-2 and content-block-less nested subagent tests polled for the client tool's local invocation, then immediately asserted its completion was dispatched — but completion lands one or more microtasks later, and deeper nesting adds async hops, so it raced on slower CI (Webkit). Poll for the dispatched ChatToolCallComplete instead (implies invocation already happened). Verified locally with runTests. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 50055f97 · 2026-07-01
- 1.2ETVFix agent host MCP server state and add per-server diagnostics (#326384) * Fix agent host MCP server state and add per-server diagnostics Discovered MCP servers were seeded as `Starting` before any SDK had attempted to start them, and failures were only visible as a coarse status. This corrects the lifecycle state and adds diagnostics. - Seed `makeMcpServerCustomization` as `Stopped` instead of `Starting`; a declared-but-unstarted server has not begun connecting. - The Copilot SDK emits no live "starting" signal on initial connect (servers settle inside a blocking init phase and `rpc.mcp.list` blocks until settled), so drive `Starting` optimistically from the workbench at the two real start triggers: sending a message (`_markEnabledMcpServersStarting`) and the disable->enable flip. Added `McpCustomizationController.markStarting` (skips Ready/AuthRequired/Starting). - Log structured MCP lifecycle records (loaded/statusChanged/inventory) through the agent host's existing OTLP log stream with `OtelData` attributes, deduplicated by SDK status; failures log at error with the failure detail preserved in `McpServerErrorState`. - Give each `(session, MCP server)` its own hidden Output channel that records lifecycle transitions; "Show Output" reveals it. - Encapsulate the channel: `showMcpServerLog(sessionResource, serverId)` resolves and reveals internally; removed `logOutputChannelId` from the public `IAgentHostMcpServer` surface and the now-dead `getLogOutputChannelId` provider plumbing. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address PR review: reliable MCP diagnostics + optimistic Start fixes - Record MCP diagnostics from state-change events over a tracked set of sessions rather than as a side effect of `getMcpServers`, so a failure and a later recovery are both captured even without a UI re-query. - Key the per-server log registry by the full session resource plus the raw customization id (not the UI-facing scoped id, whose authority is empty for Agents-window resources and would mix histories across sessions). - Use an injective, filesystem-safe channel id (SHA1 hex of the composite key) so distinct servers can't collapse onto one logger/dedup entry. - Dispose each session's loggers and Output channel registrations when the session goes away (session dispose / removal / provisional backend swap), fixing the logger/file-handle leak. - Route the explicit Start/Restart (`startMcpServer`) through `markStarting` so it shows Starting during the SDK's blocking reconnect, and always reconcile via a trailing inventory refresh (try/finally) so a rejected enable can't leave the UI stuck at Starting -- same fix applied to the enable path in `_reconcileMcpServerEnablement`. - Add coverage for the explicit-start optimistic Starting behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix CI: stub ILoggerService/IOutputService in customization service test The MCP diagnostics registry now resolves `ILoggerService`/`IOutputService` lazily when `record` runs (via the new eager state recording). The enablement unit test instantiated the abstract service against a bare `TestInstantiationService`, so `getMcpServers` threw `this._loggerService.createLogger is not a function`. Stub both services (NullLoggerService + a minimal IOutputService) in the test harness. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 2a8e7fc4 · 2026-07-17
- 1.2ETVagentHost: fix other cases of client-provided tools getting stuck (#312942) * agentHost: fix other cases of client-provided tools getting stuck * comments and cigithub.com-microsoft-vscode · e78dfbd5 · 2026-04-28
- 1.2ETVFix WSL remote agent host lifecycle (#320498) * Fix WSL remote agent host lifecycle Move WSL agent host providers to in-memory cached distro state, reconnect running distros through a dedicated contribution, and allow recent WSL workspaces to connect on demand with progress. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix WSL reconnect provider indentation Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix workspace picker notification service wiring Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix web workspace picker import order Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · a1ffdd33 · 2026-06-08
- 1.1ETVAdopt response-part input requests (#326203) * Adopt response-part input requests Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address input request review feedback Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Keep input request conversion in adapter Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 77f74446 · 2026-07-16
- 1.0ETVagent-host: stop config pickers flashing during resolveSessionConfig (#317856) * agent-host: stop config pickers flashing during resolveSessionConfig When a user changed a session-config picker (isolation, branch, autoApprove, mode, claude permission mode), all schema-driven pickers visually disappeared and reappeared while the async resolveSessionConfig round-trip ran. Root cause: NewSession.setConfigValue wiped the cached schema to { properties: {} } during the optimistic update, so every well-known mode/autoApprove guard returned false and hid its picker until the new schema arrived ~200-500 ms later. Fix: - Preserve the existing schema in NewSession.setConfigValue. - Introduce an observable isResolvingConfig on NewSession, owned by resolveConfig's finally, with begin/endResolveConfigSync helpers for the synchronous-set-before-event path and the no-connection early- return path. - Expose IObservable<boolean> isSessionConfigResolving(sessionId) on IAgentHostSessionsProvider; constObservable(false) for any session that isn't the in-flight new session. - Distinct from session.loading: the latter also stays true while config is complete-but-required-values-missing, where pickers must remain interactive. Every picker that mutates session config now disables on this observable: generic per-property chips, the mode/claude permission mode enum pickers, the autoApprove permission action item, the mobile bottom-sheet mode picker, and the mobile combined Mode+Model new-session chip. The autoApprove permission picker also gates the delegate's setPermissionLevel on the same observable, because ActionWidgetDropdown opens via Enter/Space directly on its label and CSS pointer-events: none does not block keyboard activation. A defense-in-depth bail in setSessionConfigValue drops second-arrival changes on a new session while a resolve is already in flight. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agent-host: update FakeProvider mocks for isSessionConfigResolving Two unit-test FakeProvider mocks were missing the new isSessionConfigResolving method that the production AgentHostPermissionPickerDelegate and AgentHostSessionEnumPicker (claude permission mode) now call. Add a no-op constObservable(false) implementation to both so the rendered delegate / picker code paths don't TypeError. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agent-host: address Copilot review feedback on PR #317856 Move _isResolvingActiveSessionConfig derived initialization into the constructor so its body safely closes over parameter-property service references (avoids depending on class-field/parameter-property initialization ordering). Split the picker trigger's read-only (permanent: <span> + aria-readonly) state from the resolving state (transient: <a> stays focusable, slot gets .disabled class, aria-disabled is set). Click is blocked at the picker level by an in-flight resolve check in _showPicker. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 650352e6 · 2026-05-21
- 1.0ETVagent host: negotiate protocol version + surface incompatibility in UI (#314262) Adopt the AHP protocol's WebSocket-style version negotiation: clients now send `protocolVersions: string[]` (SemVer) and the server picks one, returning `UnsupportedProtocolVersion` (-32005) with a typed `UnsupportedProtocolVersionErrorData { supportedVersions }` payload when nothing matches. Removes the legacy numeric `PROTOCOL_VERSION` / `MIN_PROTOCOL_VERSION` / `capabilitiesForVersion` API in favor of the generated registry under `state/protocol/version/`. Surface the new error to users in the agents workspace picker: - `RemoteAgentHostConnectionStatus` is now a discriminated union with a new `incompatible` variant that carries the host's rejection message, the versions we offered, and the versions the host advertised. - The picker entry for an incompatible host renders with `Codicon.warning`, an "Incompatible" label, and a hover that includes the host's message. - Clicking the entry opens the management quickpick with a title ("Options for <label> (<address>)") and a sticky `Severity.Warning` validation banner explaining the version mismatch and pointing at how to recover. Other failure states are unchanged. - Auto-reconnect is suppressed only on -32005; network-level failures keep their existing exponential backoff. Manual Reconnect clears the state and retries. WebSocket, SSH, and tunnel paths share one helper (`RemoteAgentHostConnectionStatus.fromConnectError`) so they all surface incompatibility identically. Tests updated to the new wire shape; new server-side test covers the -32005 rejection path, new client-side tests cover the offered SemVer array and the typed error data, new tests cover the picker label, hover, and validation banner.github.com-microsoft-vscode · e1a89568 · 2026-05-04
- 0.9ETVFix agent host client tool stalls (#323526) * Fix agent host client tool stalls Prefer tools from the sending active client when multiple active clients provide the same tool. Ensure client tool failures during prepare invocation and completions from pending confirmation state are reported back so tool calls do not stall. Fixes #323225 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix pending permission cleanup for client tool completion Ensure client tool completions that unblock pending permission requests go through the normal permission response cleanup path so pending edit content and registry entries are removed. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 19c9f45e · 2026-06-29