vscode — Engineering Performance
89 engineers all time · Jan 2025 – Sep 2026 · built 2026-09-30 · GitHub
Performance snapshot
Today's rolling 90-day reading for vscode, compared with the start of the series. Pick a window to move that comparison point.
Avg. perf / dev / mo
+488.3%
1.94 → 11.42 ETV
Active engineers
+21.7%
46.0 → 56.0
Features
−8.5pp
40.2% → 31.7%
vs. Microsoft
1.7x
1.4x → 1.7x · +72% above
vscode vs. Microsoft
Per-engineer ETV for vscode against Microsoft as a whole. Both lines are 90-day rolling averages scaled to a 30-day month, so they share one axis and can be read against each other at any point. Pick a window to zoom the chart to it.
Performance Composition
Each month's output split by type of work: Features (new value), Maintenance (sustaining systems), Tests, Docs, and Fixes (rework). The yellow line is output per engineer, so when it rises each engineer is delivering more, whatever the team size did. Unit: Engineering Throughput Value (ETV).
Engineering capacity
Effective engineers behind vscode, against its pre-AI baseline. Each subject has its own: vscode's is 1.94 ETV / dev / mo, its first reading in Q1 2025. Per-engineer ETV divided by that gives a capacity multiple, and that multiple applied to the engineers active in the trailing 90 days turns it into engineer-equivalents. The line is the real headcount, so the gap between line and area is what the leverage is worth. Because each baseline is its own, every subject opens at 1.0x on its first day: multiples measure improvement and are not comparable between subjects.
Knowledge concentration
How dependent is this repo on a small number of engineers? Higher top-1 share = higher key-person risk.
roblourens owns 6.9 % of commits.
Behind the numbers
Written summary of the work completed each month.
No monthly reports available yet.
Top engineers
Most impactful commits
Top 10 by ETV in the all-time window.
- 17.5ETVagentHost: make the orchestrator own session enumeration and chat lifecycle (#329633) * agentHost: relocate Session ownership into the orchestrator (T2/T4) Make the orchestrator (AgentService + AgentHostStateManager) own the Session concept - identity, lifecycle, and grouping - so the agent harness talks only in chats. Session provisioning stays agent-specific but is now invoked through the chat surface instead of a Session-typed method, honoring "represent, don't orchestrate". - Create: `_provisionSessionViaDefaultChat` allocates the session URI and drives `chats.createChat(defaultChatUri, { provisionSession })`; the agent's provisioning runs inside creating the default chat and returns `IAgentCreateChatResult.provision`. - Dispose: routes to `chats.disposeChat(defaultChatUri)`. - Enumerate: `_enumerateProviderSessions` groups `listConversations()` into sessions via the default-chat URI convention. Gated per harness by `IAgent.orchestratorOwnsSession` (Codex, Claude, Copilot all opt in). Storage-preserving: session URIs and the derived `sdkSessionId == session raw id` (I3) are unchanged, agents read/write the same SDK stores, and providerData / PEER_CHATS_METADATA_KEY / protocol types are untouched. The legacy createSession/disposeSession/listSessions remain as the delegated fallback. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: drop orchestratorOwnsSession opt-in; chat surface is the single path Address review feedback: the agent should not declare an orchestration policy, and the interface should not carry an optional flag that splits behavior. The opt-in was transitional scaffolding for a per-agent rollout; all harnesses have migrated, so remove it and make the orchestrator drive the chat surface unconditionally. - Remove `IAgent.orchestratorOwnsSession`; make `listConversations` required. - `AgentService` always provisions (non-fork/import) / disposes / enumerates through the chat surface; no per-agent branch. - Drop the flag from Claude/Copilot/Codex. - Make both test mocks first-class chat-surface agents (provisionSession bridge, default-chat disposeChat, listConversations) so their existing createSession/ disposeSession assertions still hold via the bridge. - Update the routing test to assert session create/dispose now also flow through the chat surface; refresh the architecture doc. Storage-preserving; no protocol/data change. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: trim verbose comments on the T2/T4 session-ownership code Shorten the JSDoc/inline comments added for the session-ownership relocation to 1-2 sentences per the coding guidelines; drop obvious per-field comments. No behavior change. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: drop redundant session-typed methods from IAgent (Category C) Remove `listSessions` and `getSessionMessages` from the IAgent contract - they are superseded by `listConversations` and `chats.getMessages`. Reroute the one remaining internal caller (the restore metadata catalog fallback) to `_enumerateProviderSessions` (which uses `listConversations`). The harnesses keep those methods privately as the implementation their chat/conversation bridges delegate to. `createSession`/`disposeSession` stay on IAgent as the session-lifecycle provisioning primitives the chat-surface bridge delegates to; `createSession` is also still used directly for fork/import, whose session id is minted server-side (sessions.fork) and so cannot fit the orchestrator-allocates-URI seam - left as a documented follow-up. No behavior change; storage-preserving. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: rename IAgent.getSessionMetadata to getConversationMetadata Align the single-item metadata lookup with the chat-addressed conversation surface: the method is now keyed by a chat URI and returns IAgentConversationMetadata, mirroring listConversations. All five implementers (Copilot, Claude, Codex, and both test mocks) derive the session from the chat URI and return chat-keyed metadata; the orchestrator maps the default-chat URI back to a session when hydrating restore metadata. Also reframe the fork/import createSession path in MULTI_CHAT_ARCHITECTURE.md from a deferred follow-up into a permanent, by-design exception (the fork id is minted server-side by the SDK, so the orchestrator cannot pre-allocate the URI). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: clarify IAgentConversationMetadata._meta is session-generic by design Document why the field keeps the SessionMeta alias rather than a conversation-specific type: _meta is the protocol's open property bag on SessionState / SessionSummary, carried through verbatim. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: clarify Claude disposeSession takes the agent's own SDK session URI Document that the session parameter is the provider's own SDK session (the SDK's terminology), NOT the AH-level Session grouping - that grouping lives in the orchestrator and the agent only ever deals in chats. The URI backs the default chat (invariant I3), so chats.disposeChat routes here when a default chat is disposed; peer chats go to _disposeChat. Teardown disposes that SDK session plus the peer-chat backings the agent parents under it. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: document the AH-session vs SDK-session terminology convention Add a 'session is overloaded' convention table to the Mental Model section: in the protocol/orchestrator 'session' means the AH grouping; inside an agent harness it means the provider's own SDK session (Codex: thread); at the IAgent seam the session URI is a shared identity (AH-minted, SDK-session-id raw id per I3). Explains why we do not rename the provider-internal 'session' symbols. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: make IAgent enumeration session-keyed (orchestrator owns session->chat) Revert the chat-keyed enumeration surface (listConversations / getConversationMetadata) back to session-keyed listSessions / getSessionMetadata on IAgent. Chat-keyed enumeration forced every harness to derive default-chat URIs via buildDefaultChatUri for cold (SDK-discovered) sessions it never created in-process - re-deriving the session<->default-chat encoding that belongs to the orchestrator/protocol. Now each agent returns its own SDK-session identity (AgentSession.uri: provider scheme + SDK id, no protocol-chat knowledge) and the orchestrator owns the session->chat mapping. Drops the orchestrator's _conversationToSessionMetadata bridge (the enumeration/restore round-trip) and deletes the now-unused IAgentConversationMetadata type. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: stop agents synthesizing default-chat URIs at runtime Agents no longer call buildDefaultChatUri. Outbound events, default-vs-peer comparisons, and session-or-chat normalizers now reuse the chat URI the agent was already given - read back from the session entry's stored defaultChatKey (new getter on AgentSessionEntry) or the live session's stored chat channel, or tested with isDefaultChatUri - instead of re-deriving it from the session URI. The one irreducible conversion (a session URI first born inside the agent: a freshly forked SDK-assigned id, or a cold-restore/create seed) is centralized in a single node-layer helper, defaultChatUriForSession, in agentPeerChats.ts. This is creation-time only; no runtime routing/event path derives chat URIs anymore. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agents: reuse orchestrator default-chat URI on the provision path The provision (create) path already hands the agent the orchestrator-allocated default-chat URI via createChat(defaultChatUri, { provisionSession }). Claude and Codex decoded it to a session and then re-derived the identical URI inside createSession. Thread the supplied chat URI straight through (createSession's new optional defaultChat argument) so the agent seeds its entry with the URI it was handed instead of re-deriving the session-to-default-chat mapping itself. Copilot has no synchronous create seed (it stores a provisional session and seeds the default-chat key at materialize/resume), so it has no provision round-trip to thread; its derivations are the restart-lazy category. The remaining defaultChatUriForSession callers are the restart-lazy paths (cold resume, peer-send provisional default, fork/restore materialize) where the orchestrator supplies no chat URI in-call; documented as the single sanctioned, irreducible conversion. Behavior is unchanged (the mapping is deterministic); two Claude tests that deep-equal the emitted URI object are aligned with the file's toString-based convention since keying now populates the URI's cache. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: flatten provider chat bindings Make Agent Host own chat membership and pass contextual data only for individual operations. Providers route exact chats to their SDK conversations without deriving default or peer roles. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: make chat lifecycle exact and retry-safe Post-merge repairs and review follow-ups for the AH-owned multi-chat architecture, keeping providers on exact chat-to-SDK bindings: - Make `IAgentChats.releaseChat` mandatory so AgentService has one exact-chat release path with no optional legacy fallback; Claude, Copilot, Codex, and the test agents implement it explicitly. - Copilot chat disposal now propagates SDK deletion failures (preserving routing/state for retry) but tolerates an already-deleted session via an O(1) `getSessionMetadata` recheck, keeping a partially-completed multi-chat teardown retry-safe. - Claude: gate materialization on post-await cancellation, abort every live session's controller on dispose, and restore session-addressed resume without inferring chat membership from the URI. - Rename `IAgentCreateChatOptions.provisionSession` to `newSession` to state intent (this createChat creates the owning session). Verified typecheck, transpile, AgentService/Claude/Copilot/Codex unit suites, valid-layers, and hygiene. * agentHost: restore subagent transcripts via the chat-surface getMessages Copilot's `chats.getMessages` routes to `_getChatMessages`, which lacked the subagent-session-URI branch that only lived in the now-orphaned `getSessionMessages`. On the persisted replay/restore path the orchestrator loads a subagent's turns through the chat surface, so reopening a session rebuilt an empty subagent transcript — failing the "reopening a session keeps sub-agent messages out of the parent transcript (replay path)" E2E test on all platforms. Extract a shared `_getSubagentMessages` helper and route subagent URIs through it from both `_getChatMessages` and `getSessionMessages` (matching Claude, which already shares one path). Also address PR review feedback: - `AgentService._releaseSession` releases every catalog chat even if one rejects, then propagates the first error (idle eviction has already dropped the session state, so a skipped leaf would stay resident indefinitely). - `CopilotAgentSession` stores the host-supplied `IAgentChatContext.resource` as its persistence scope instead of re-deriving it from the mutable chat channel via `isDefaultChatUri`, so an explicitly chosen resource survives a later `bindChatChannel`. - MULTI_CHAT_ARCHITECTURE.md: correct the flat `IClaudeChatBinding` shape (`{ sdkSessionId, model? }`, no retained session/storageUri). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: orchestrator owns session provisioning; agents only create chats Removes the `newSession` seam so an agent no longer distinguishes "a chat for a new session" from "a chat for an existing session". Session provisioning now always goes through the agent's dedicated `createSession` + `chats.bindSessionChat` (the same path fork/import already used), and `chats.createChat` has exactly one meaning: add an additional chat to an already-provisioned session. Contract: - Delete `IAgentProvisionSession`, `IAgentCreateChatOptions.newSession`, `IAgentProvisionResult`, and `IAgentCreateChatResult.provision`. - Add `IAgentCreateChatOptions.inheritedContext` ({ workingDirectory, config }): the orchestrator supplies the owning session's resolved context when creating an additional chat, so the agent never reads it back from the parent session. Orchestrator: - `_createProviderSession` always provisions via `createSession` + `bindSessionChat`; delete `_provisionSessionViaDefaultChat`. - `_buildInheritedChatContext` resolves the AH-owned worktree/folder + session config values and passes them to `chats.createChat`/`fork`. Agents (Claude, Copilot, Codex): - Drop the `if (options.newSession)` branch and the `_provisionChat` method; the chat surface handles additional chats only. - Claude/Copilot consume `inheritedContext` for the additional-chat working directory (and Claude for its permission mode) instead of resolving the parent session; remove the now-dead `_createSession(target)` plumbing where the provision path was its only caller. Tests/docs: - Rewrite the AgentService routing test to assert provisioning via createSession + bindSessionChat. - Update MULTI_CHAT_ARCHITECTURE.md §2/§7 to the new seam. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: enable multi-chat for Codex (base for I3-removal branch) Adds Codex multi-chat support (parity with Claude/Copilot): the `multipleChats: { fork: true }` capability, `chats.createChat`/`chats.fork` minting a fresh backing Codex thread per chat, `materializeChat` restore, and a providerData codec. This is committed as the base of the dedicated I3-removal branch (it is intentionally not on the PR branch). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: add orchestrator-owned session registry (I3 removal stage 1) Introduce AgentSessionRegistry, a durable, orchestrator-owned index of the sessions that exist, keyed by session URI and persisted as a JSON blob in a reserved session database with serialized read-modify-write. Wire it into AgentService: register on every createSession success and on restoreSession, unregister on true delete (disposeSession). Add a Stage 1 validation surface (getRegisteredSessions) plus component and parity unit tests. This is additive and does NOT yet drive enumeration; listSessions still uses the provider-derived path. It is the foundation for switching enumeration off invariant I3 in stage 2. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: enumerate sessions from the registry, not providers (I3 removal stage 2) Switch AgentService.listSessions to iterate the orchestrator-owned session registry instead of unioning each provider's listSessions(). Per-session metadata still comes from the agent's direct getSessionMetadata lookup (I3 keeps the default chat's SDK id == session id, so it resolves), then flows through the existing DB and state-manager overlays unchanged. This decouples AH enumeration from the agents' SDK stores: peer-chat backings and subagent sessions never enter the registry (so they cannot leak as top-level entries), and a provider that transiently drops a session from its own snapshot no longer evicts it. Idle provisional sessions are suppressed explicitly via a new state-manager predicate (isIdleProvisionalSession), preserving #321269 now that the registry — not the provider snapshot — is the session source. A one-time, marker-gated backfill seeds the registry from the legacy provider enumeration so hosts created before the registry keep their on-disk sessions. I3 is unchanged; agents are untouched. Adds backfill and transient-drop tests. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: clarify Codex is already I3-decoupled (I3 removal stage 3a) Codex's default chat does not actively satisfy I3: a fresh session's raw id is an AH-minted provisional UUID while its backing thread id is app-server-assigned, with the real mapping persisted in the per-session metadata overlay. The residual sessionId == threadId uses (_readSession's ?? sessionId fallback and listSessions' thread->URI mapping) are legacy-compat shims for pre-existing sessions whose persisted identity is the thread id; they cannot be removed without a data migration (disallowed), so Codex is treated as already I3-satisfied. Comment/doc-only: clarifies the two shim sites and adds a per-agent nuance note to the I3 invariant in MULTI_CHAT_ARCHITECTURE.md. No behavior change. The active I3 removal targets are Claude and Copilot. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: collapse fresh-session provisioning into chats.createSessionChat (I3 removal stage 4, step 1) Add an optional chat-surface entry, chats.createSessionChat, that provisions a session AND binds its session-backed (default) chat in one call — the replacement for the IAgent.createSession + bindSessionChat provisioning pair. The agent reuses the session id as its SDK id (id-reuse kept; no storage change, no I7 for the default chat). The orchestrator mints the session URI, derives the default-chat URI, and calls createSessionChat; agents that don't implement it fall back to the create-then-bind pair. Claude implements it via its existing { kind: 'chat' } provisioning path (also used by truncate), so routing state is identical to create-then-bind. Only fresh sessions collapse: fork and import mint a fresh SDK-assigned session id inside the agent, so the orchestrator can't know the default-chat URI up front and keeps them on the create-then-bind pair. bindSessionChat is now documented as the restore-time counterpart. Additive and always-green: Copilot/Codex still use createSession. Validated typecheck, layers, eslint, hygiene; Claude units 206, AgentService 140, Claude E2E replay 8. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: implement chats.createSessionChat in Copilot and Codex (I3 removal stage 4, step 2) Both agents now provision a fresh session and bind its session-backed (default) chat through the collapsed chats.createSessionChat entry, delegating to their existing _createSession and then binding the default chat (id-reuse; no storage change, no I7 for the default chat). The orchestrator already prefers this path for fresh sessions across all providers; fork/import still use createSession. Validated typecheck, layers, eslint, hygiene; Copilot 347, Codex 47, AgentService 140 units; E2E replay Copilot 15 / Codex 6 / Claude 8. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: enable Codex multi-chat capability Advertise Codex multiple-chat and fork support now that the exact chat binding, model-provider forwarding, and registry-owned enumeration paths are complete. Keep provider-owned side chats disabled for Codex. Add replay-only parity gating for Codex model-backed peer/fork tests. Host-only capability checks and conformance catalog/lifecycle coverage remain enabled; recording mode still runs the gated tests once the documented live Codex recording defect is fixed. No capture files are fabricated or hand-edited. Validated typecheck, layers, ESLint, Agent Host unit suites, and Claude/Copilot/Codex strict replay. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: allow recording gated multi-chat E2E tests Keep Codex model-backed peer/fork tests skipped in strict replay while permitting both focused recording modes to execute them and generate fixtures. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: harden session registry and chat lifecycle Make registry load/write mutations durable and retryable, require successful provider enumeration before marking backfill complete, and unregister before irreversible deletion. Dispose every peer and always run provider-level session finalization before surfacing the first error. Harden Codex workspace-less peer/fork managed-directory ownership across create, release, restore, and disposal; refresh an empty model catalog before validating restored provider-qualified models. Remove unsupported multi-chat capability from ScriptedMockAgent and add regression coverage for every reported failure/retry path. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: remove Claude default-chat URI inference Use exact chat state routing and retain only the legacy bare-session compatibility path.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: make chat backings session-neutral Give every provider an exact default-chat backing, keep Agent Host authoritative for membership and lifecycle, and isolate provider enumeration to legacy discovery.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: dispose legacy Claude sessions Retain exact default-chat disposal while falling back to an unbound same-ID SDK conversation for direct legacy provider callers.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: route peer session events to owners Normalize session-scoped progress from exact chat resources, keep Codex peer lifecycle off backing session URIs, and resolve peer configuration through the owning AH session.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: restore Codex peer chat history Resume cold Codex peer threads before reading their turns and honor the persisted replacement thread ID. Share concurrent resume work with the first send and suppress idle usage notifications emitted during restore.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * test: update AgentService worktree deletion stub Use the current prepare/remove worktree deletion contract so durable registry retry coverage reaches the expected cleanup path.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: fork the exact Copilot source chat Pass the orchestrator-owned default chat channel through session forks so Copilot resolves independent SDK backings. Preserve refork support when imported protocol turn IDs already match provider event IDs.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: clarify btw command input Document that selecting the slash command consumes the command token, so the remaining input must contain only the side question.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Restore persisted subagent chats Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Store orchestrator state separately Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Attach restored peer rejection eagerly Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Cancel session cleanup before revival Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Enforce Agent Host routing channels Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Use plural session working directories Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Apply provider feedback consistently Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Clarify provider chat backing terminology Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Stop inferring chat role from resource Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Simplify provider chat resolution Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Require exact source chat for forks Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Let providers observe session config Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Restore subagent transcripts lazily Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Complete chat-only provider ownership Route provider provisioning, restore, lifecycle, configuration, and active-client behavior through exact chat-addressed seams. Preserve additive legacy default-chat migration across Claude, Copilot, and Codex and remove obsolete session compatibility paths. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix chat test field initialization Avoid directly reading the overridden chat surface from subclass field initializers so define-class-fields compilation remains safe. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Keep session chat roles in Agent Host Move legacy backing selection and session-versus-peer materialization filtering into Agent Host. Providers now recover or materialize exact opaque chat backings without retaining session/peer classifications. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Make provider chat creation uniform Remove provider-visible chat role classification and collapse runtime initialization and additional chat creation into one createChat operation. Document and test the registry backfill's idempotent, coalesced migration behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Flatten provider chat creation Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Remove session ownership from agent chats Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address active clients by chat Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Make agent provider seams chat-only Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Organize agent provider contract Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Group legacy chat recovery APIs Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Document agent capability optionality Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Separate agent provider model Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix cold peer-chat fork to read source chat's own persistence resource Cold peer-chat fork previously read the shared configurationResource overlay instead of the source chat's own persistence resource, so inherited model/agent/permissionMode came from the wrong scope for any non-default source chat. _chatConfigScopes now records both the configurationResource and the exact resource (IChatScopeBinding) for each chat, and _bindInheritedConversation reads the source overlay by the source's own resource. Also adds a backing-model fallback for a source that was created but never materialized. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add regression tests for cold peer-chat fork scope inheritance Covers two scenarios for the claudeAgent.ts fix (commit aabdead86d7): - a peer chat materialized before a cold restart forks with its own model/agent/permissionMode/workingDirectories, not the session-wide decoy overlay - a peer chat never materialized before a cold restart still recovers its model via the _chatBackings fallback Also adds a per-resource-aware ISessionDataService test double, since the shared sessionTestHelpers.ts fake ignores the resource argument and returns one flat database for all resources, which would otherwise mask the session-vs-peer overlay bug. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Complete Agent Host chat ownership migration Make session registry migration durable, preserve exact chat backings across provider restore and lifecycle paths, and harden deletion and rollback behavior. Rename the architecture spec and add regression coverage across providers, migration, concurrency, and protocol restore. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Restore Agent Host checkpoint lifecycle * Fix Agent Host CI test portability --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>Sandeep Somavarapu · 150119bd · 2026-08-12
- 17.0ETVSessions exploration (#294912)Benjamin Pasero · b1009c98 · 2026-02-17
- 13.9ETVagent bakeoff (#335498) * sessions: add agent attempt comparisons Add a multi-harness comparison workflow with isolated child sessions, provider-owned shared-model resolution, visible judging, evidence review, synthesis, and explicit cleanup.\n\nFixes #335085\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: address agent comparison feedback Preserve comparison configuration and provenance, make comparison evidence and controls accessible, normalize worktree changes, and add lifecycle regression coverage. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: fix agent comparison CI Format comparison sources, preserve provider option shapes when provenance is absent, and compare persisted creation references through their public URI representation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: register comparison service in fixture Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: refresh comparison fixture modules Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: invalidate comparison fixture cache Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: stabilize comparison fixtures Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: update comparison screenshots Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: remove fixture cache diagnostics Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: add agent comparison attempt setup Represent comparisons as uniquely identified attempts with provider-local model selection. Add a focused setup dialog, shared-context and usage disclosures, and keep synthesis explicit. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: refine agent attempt comparisons Improve the parallel-attempt setup and comparison hierarchy, add structured Judge evidence and verdict tools, and record provider-neutral token usage with OTel correlation.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: add post-judge review flow Make the Judge review every attempt and record validation provenance, then surface a recommendation-first result with explicit human review routing. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: tile comparison attempts while running Open live attempt sessions in an adaptive grid while work is active, then return to the standard comparison editor when all attempts are terminal. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: refine comparison review completion Load Judge instructions from a packaged prompt, open the comparison when judging completes, and present a winner-focused result with deterministic synthesis evidence. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: polish comparison progress and actions Keep comparison participants visually connected, preserve progress visibility, hide stale details on participant navigation, and place winner/synthesis actions at the end of completed results. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: move comparison results into judge Replace the standalone comparison editor with a participant grid and a Judge-owned result card. Keep custom dialog controls in the keyboard focus loop so attempt agent and model selectors are operable without a mouse.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: use tmux-style comparison grid layouts Choose comparison grid columns from the number of active attempts so four sessions form a 2x2 grid, six form 3x2, and nine form 3x3. Keep phone layouts in a single column. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: prioritize comparison review sessions Show Judge and synthesis before attempt sessions in both the list and tiled grid. Keep group connector decoration limited to implementation attempts.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: fix comparison attempt scrolling Constrain the element measured by DomScrollableElement so additional attempt rows activate the custom scrollbar.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: improve comparison accessibility Ensure setup groups, result actions, and compact comparison attempts expose names that match their visible presentation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: improve comparison judge reliability Make attempt validation use authoritative worktrees, represent inapplicable validation explicitly, and allow rejected verdicts to be corrected. Repair the affected test and fixture infrastructure exposed by CI. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: use stable attempt numbers in judge verdicts Prevent verdict submission failures caused by models mistyping or combining participant and session UUIDs. Map manifest attempt numbers back to internal participant IDs when persisting the verdict. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: fix parallel agents action label Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: refine comparison progress UI Keep the parallel-agent workflow discoverable when the selected workspace cannot create isolated worktrees, and rely on progress indicators instead of redundant working/completed labels. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: add customizable synthesis plans Let the Judge identify semantic implementation decisions, allow users to choose an attempt per section, and pass the persisted plan to the isolated synthesis session. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: simplify synthesis option labels Show only the agent and model in synthesis approach selectors while keeping stable attempt numbers in the Judge contract. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: remove visible attempt number prefixes Show comparison attempts by agent and model across session titles, pane headers, sidebar rows, and Judge results. Migrate untouched legacy generated titles while retaining stable attempt numbers in the Judge protocol. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: hide editor when opening comparison grid Give parallel participant chats the full Sessions area by hiding the editor only after the comparison grid opens successfully. Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: fix comparison tool CI Format the comparison evidence mapping and make its worktree path assertion platform-native. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: harden comparison lifecycle Reject unusable comparison launches, preserve frozen permissions for Judge and synthesis sessions, restore telemetry coverage, and remove comparison APIs without production callers. Fix the comparison setup regression test so it exercises an eligible session. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: type comparison launch results Keep concurrent attempt results widened to the persisted participant contract so launch-threshold checks typecheck. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: open comparison setup before config resolves Fall back to the selected workspace repository branch when Agent Host creation config has not resolved yet, so Execute Parallel Agents opens its setup dialog instead of refocusing the workspace picker. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: add close affordance to tiled headers Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: refine comparison grid focus Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: keep comparison selection border visible Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: configure models per comparison participant Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: refine comparison navigation Hide comparison setup when the selected folder cannot support isolated attempts, and route comparison group activation to the latest active stage. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agent host: strip unsupported Codex service tier The Codex app server marks fast models with service_tier=priority, but the Copilot Responses endpoint rejects that request field. Remove it at the proxy boundary while preserving the fast model identifier. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agent host: avoid duplicate Codex fast mode VS Code exposes fast CAPI variants as distinct model IDs. Disable Codex's native Fast Mode so it does not also send the unsupported service_tier field, and remove the broader proxy rewrite. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: make comparison setup resizable Allow the comparison setup dialog to be resized with pointer or keyboard controls, and restore its profile-scoped size across openings.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: let comparison content fill dialog Keep the comparison setup content aligned with the resized dialog instead of retaining its intrinsic width.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: add exact comparison permissions Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: refine comparison setup controls Add a modal-owned branch picker and present attempts in a compact, accessible table with consistent agent and model controls. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: remove stale comparison permission state Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: add workspace picker to comparison setup Reuse the new-session workspace picker in the modal and refresh comparison defaults when its workspace changes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: fix comparison rebase integration Reconcile comparison grid and composer behavior with the latest Sessions APIs after rebasing onto main. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: refine comparison evaluator setup Add independent Judge and Synthesizer defaults and keep the comparison setup dialog responsive and scrollable. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: isolate active comparison Judge Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: refine comparison evaluation and synthesis Add evaluator defaults and permissions, Git repository validation, custom synthesis decisions, stage telemetry, semantic Judge evidence, and protected comparison grouping. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: address comparison review feedback Preserve comparison context for evaluation, make verdicts immutable, clean up deleted comparison groups, and hash session telemetry identifiers. Keep dialog focus handling feature-local and remove unrelated Codex, dialog, prompt packaging, and learnings changes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 6634f44b-98ed-4183-b012-093cee87cfa3 * sessions: preserve bulk permissions for new attempts Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: isolate Judge without closing sessions Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: refine parallel comparison experience * sessions: simplify comparison setup flow Split comparison setup into Attempts and Evaluation steps, keep evaluator controls together, and remove persisted evaluator defaults. Keep navigation actions aligned outside the scrollable content. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: refine evaluator guidance and focus Move Judge and Synthesizer descriptions behind accessible information buttons while keeping the optional synthesis state visible. Ensure comparison focus handling runs before the generic dialog fallback so Tab and Shift+Tab preserve the custom control order. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: inset comparison dialog actions Reserve bottom and right space around the custom action row so focused button borders are not clipped by the dialog edge. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: add comparison stop controls * sessions: default inactive comparison inputs on * sessions: make comparison stop controls red * sessions: fix comparison stop styling * sessions: hide permissions in comparison titles * sessions: structure comparison verdict rationale * sessions: refine comparison result actions Render Judge output as safe Markdown, keep custom synthesis compact and scrollable, and hide redundant synthesis choices for a single decision. Add direct navigation to alternate attempts and resolve comparison UI hygiene failures. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: identify comparison attempt telemetry Include bounded provider, agent, and resolved model identifiers on attempt completion and Judge outcome events so attempt latency and recommendation rates can be analyzed without cross-event joins. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: add synthesis instructions * sessions: refine comparison results and telemetry Add collapsed per-attempt timing and token details, open comparison groups in the attempts grid, and correlate elapsed/model telemetry with provider-native OTel token spans. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: make comparison results scrollable * sessions: gate comparisons on resolved git remote Propagate Agent Host remote metadata into draft workspaces and only use repository state from the currently selected folder before showing Run and Compare Agents. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: use reported comparison duration Use the producer-measured first-turn duration instead of subtracting timestamps from different clocks. Preserve accurate telemetry and show unavailable timing when the provider has not supplied it.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: refine multi-panel comparisons Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: link comparison attempt titles Let users reveal winner and alternate sessions directly from their names in Judge results, with native link semantics and accessible focus styling.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: fix comparison follow-up flows Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: show inputs and archive comparisons Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: refine comparison result experience Expand Judge results to the chat width, add an accessible view and clearer rationale and metric hierarchy, and preserve custom synthesis selections in the synthesis prompt. Keep recommended synthesis available for single-decision comparisons. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: test mixed synthesis selections Verify that selections from different attempts remain present both before synthesis creation completes and in the generated prompt. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: refine comparison scrolling and model picker Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: stabilize comparison setup layout Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: refine comparison validation and synthesis Prevent Judge sessions from rerunning reported validation or substituting unrelated checks when worktree artifacts are unavailable. Rename the primary synthesis action to describe synthesizing the attempts. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: restore Claude comparison effort Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: preserve comparison model configuration Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: restore single-decision custom synthesis Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa * sessions: fix comparison review issues Gate comparison tools on the experiment, preserve configured attempt ordinals across launch failures, and provide the synthesizer with a bounded mapped Judge verdict. Model validation evidence as consistent state/source pairs and align rationale and attachment contracts. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: fix comparison CI checks Apply the repository formatter to the comparison tool and accept the Linux screenshot hashes introduced by the merged upstream new-session fixtures.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: clean up abandoned comparison sessions Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e8da91a2-46e1-4b3b-bb45-520dade3cb8d * sessions: gate compare action on confirmed git remote Hide Run and Compare Agents unless the selected folder matches the active draft and the folder is confirmed to have a git remote. Add regression tests for mismatched folders, remote=false, and unresolved remote metadata states. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: fix compare-action nullability guard Fix compile-time strict nullability by guarding session access in compare action visibility logic. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: harden comparison launch and cancellation flows Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Polish comparison attempt connectors Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4b4fd325-2a19-486a-aa6f-33c4d9d1b58b * Show Auto optimization in comparison attempts Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 3f21994c-2ebb-47ca-9997-5269a2ea36a2 * Fix comparison session chat fixture Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e8da91a2-46e1-4b3b-bb45-520dade3cb8d * sessions: persist comparison launch metadata for host Record bounded launch metadata on comparison attempts so Agent Host can recover\ncomparison lifecycle orchestration after client disconnects. Also extend\nmetadata validation tests and update Session Comparisons architecture notes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: recover comparison judge after attempt deletion Treat missing attempt sessions as explicit launch failures so comparison\norchestration does not stall when a participant is deleted or disappears.\nAlso add a regression test that verifies Judge launch still proceeds when at\nleast two completed attempts remain. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: recover session comparison judge launch after client disconnect Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: launch comparison synthesis fallback after disconnect Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: fix comparison fallback compile and telemetry tests Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: use tabbed model picker in comparison setup Force the comparison setup dialog to use the experimental provider-tab model picker for both Attempts and Evaluation controls, and keep dialog-hosted model pickers anchored below their invoking row so top-row dropdowns stay aligned. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * chat: fix model picker IActionListOptions import Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: clarify comparison start action warning Rename the evaluation action to 'Start N sessions in parallel' and add a warning codicon with hover guidance that token usage applies per session. Also update related accessibility/help and fixture copy. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: fix comparison CI regressions Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix agent comparison review findings Keep comparison orchestration client-owned, preserve successful attempts and archived results, scope tools and UI behavior, and bound lifecycle persistence work. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix agent comparison CI regressions Update Sessions test fixtures for archived comparisons, preserve scoped pane styling expectations, and refresh the generated component screenshot hash. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Use Autopilot for comparison allow-all Keep Manual and Assisted permissions interactive while mapping Copilot Allow all to Autopilot with automatic tool approval. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Limit Copilot comparison permissions Expose only Manual and Allow all for comparison sessions, with Allow all mapped to Autopilot. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Scope Autopilot to bakeoff toggle Keep ordinary Copilot permission choices unchanged while applying Autopilot only when Agent Bakeoff bulk-selects Allow all. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: fix comparison result scrolling * sessions: fix comparison navigation and list actions Report whether comparison grid navigation committed before hiding panes. Resolve comparison-wide actions from complete participant membership and allow archived participants to be regrouped without losing historical lookup.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: dedupe picker test imports Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Anthony Kim <anthonykim@microsoft.com> Copilot-Session: ae987bcc-580a-4ea6-8789-828cf5d1d6fa Copilot-Session: 6634f44b-98ed-4183-b012-093cee87cfa3 Copilot-Session: e8da91a2-46e1-4b3b-bb45-520dade3cb8d Copilot-Session: 4b4fd325-2a19-486a-aa6f-33c4d9d1b58b Copilot-Session: 3f21994c-2ebb-47ca-9997-5269a2ea36a2Megan Rogge · d838bdb2 · 2026-09-23
- 11.3ETVagentHost: scope changesets to chat working folders (#337263) * agentHost: scope changesets to chats Publish independent changeset catalogues for each chat and route changes, Git state, repository operations, and review state through the owning chat workspace while preserving session-wide checkpoints, summaries, and mutation safety. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: harden chat changeset ownership Refresh chat and aggregate Git state concurrently, prevent session Git fallback for chats, evict removed-chat Git state, and preserve the legacy session catalogue fallback when chat catalogues are unavailable. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: scope focused changes to active chat Read focused changes, changesets, operations, review state, and status pills from the owning chat without falling back to aggregate session state. Preserve session-wide catalogues for lists, lifecycle reporting, telemetry, and draft-session repository preparation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: move selectable changesets to chats Make each chat the sole catalogue owner from draft creation onward while sessions retain only aggregate change summaries. Route chat-rooted subscriptions and operations through the containing session without duplicating selectable state. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: restore session changes alongside chat changes Publish cumulative session changes separately from chat-owned changesets, scope picker visibility and ordering to the active chat, and keep last-turn changes accurate across peer chat databases. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: clarify changeset catalogue ownership Document the final split between session-wide and chat-owned selectable changesets. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: fix changeset test fixtures Align session test doubles and catalogue expectations with the restored session-owned Session Changes entry.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: update changeset catalogue snapshots Record the expected chat changeset catalogue notification in provider AHP traffic after restoring session-owned changesets.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: scope changesets to working folders Share Branch Changes across chats that use the same folder while retaining checkpoint-based active-chat changes. Route Git operations, blob reads, reviews, summaries, and monitoring through the owning folder and preserve the Sessions changes UI behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: harden folder-scoped changesets Restore non-Git chat changes, folder-owned operation refreshes, stable summaries and catalogues, and multi-root review-ref lifecycle behavior. Keep changes pills and session workflow operations aligned with the active chat scope. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: harden changeset recomputation Keep coalesced full recomputes from inheriting incremental turn state, and distinguish non-Git scopes from transient Git failures so incomplete worktree summaries are not persisted. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: restore chat changes across host versions Resolve restored peer state before computing chat changes and preserve compatibility with legacy session-owned changeset catalogues. Avoid duplicate operation refreshes and remove the obsolete Branch computation path. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: restore session changes across chats Keep Session Changes session-owned and project it into every chat while preserving chat-scoped repository and turn changesets. Remove the obsolete host-side Chat Changes production path. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Merge origin/main into sessions chat changeset ownership Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: address changeset review and CI failures Remove the unused session-level changeset publication and obsolete Chat Changes identity so every chat consumes the provider-projected Session Changes catalogue. Harden the affected cross-platform and asynchronous CI tests by using platform-native paths and waiting for the observable completion conditions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * sessions: update fixtures for chat-owned changes Component fixtures still mocked the removed session-level changes and changesets. Provide main-chat changes to session list fixtures and implement getChatChanges on agent feedback service mocks so the fixtures render again. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>Sandeep Somavarapu · a8c1541d · 2026-09-23
- 10.7ETVagentHost: centralize session and chat catalog metadata (#332410) * agentHost: centralize session list metadata Add a backward-compatible sessions_v2 catalog, legacy-first synchronization receipts, reconciliation, shadow validation, central fallback reads, and durable chat metadata while retaining open-only content in per-session databases.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: migrate sessions directly to v2 Make sessions_v2 an independent current registry, import directly from current, legacy, and provider sources, mirror runtime identities for downgrade compatibility, and reconcile cross-version changes with durable exclusions and versioned markers.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: extract session catalog helpers Move catalog source resolution and downgrade-compatible peer chat persistence out of AgentService into focused helpers without changing migration or runtime behavior.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: simplify session catalog persistence Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: remove live compatibility test harness Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: make catalog payload rebuildable Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: centralize session chat membership Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: address catalog review feedback Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: bridge session catalog migration collision Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: migrate catalog after first listing Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: preserve titles during catalog migration Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: bound catalog summaries Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: address catalog persistence feedback Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: reuse keyed catalog sequencer Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: harden central catalog synchronization Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: persist unloaded session flags centrally Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: harden peer chat catalog lifecycle Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: preserve peer backing during recovery Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: harden catalog reconciliation Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: avoid claiming unopened legacy sessions Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: preserve catalog fallback metadata Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: fence catalog sync during deletion Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: avoid title metadata reads on restore Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * build: raise class fields checker heap limit Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: stabilize passive metadata restart test Ensure the test performs an actual read-state transition and waits for the corresponding fresh summary notification before restarting. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: avoid redundant peer metadata writes Only rewrite chat-local compatibility metadata for added or changed peers on normal mutations, while retaining full repair for legacy imports and stale mirrors. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: preserve pre-release session database schemas Recreate the released turn-delegation table alongside the catalog snapshot so databases produced by the earlier catalog-only v10 migration converge after updating. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: avoid claiming untitled legacy sessions Keep unadopted legacy sessions out of Agent Host title generation so list-only migration cannot create local session storage and prematurely transfer provider ownership. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: coalesce background catalog writes Keep one active synchronization and one merged trailing projection per session so summary bursts do not build an unbounded SQLite write backlog. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: fix catalog ESLint warnings Use type-safe property access in the payload decoder and the database sequencing test so full-repository ESLint passes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: bound catalog reconciliation work Publish passive metadata without awaiting full catalog synchronization, batch discovery timestamp and dirty-marker updates, and rotate persisted bounded verification samples instead of rescanning every catalog row on each startup. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: bulk insert central chat catalogs Batch parameterized chat inserts within the existing revision-checked transaction. Cover bounded SQLite statement counts and atomic rollback after a later batch fails. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: keep legacy runtime discovery central-only Avoid creating local session storage for adoptable legacy chats discovered after migration is enabled. Directory creation makes the legacy provider hide sessions before explicit adoption. Preserve existing compatibility synchronization for locally stored sessions and non-legacy discovery. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: skip catalog sync for transient summary changes Compare summary status deltas against the notifier's previous snapshot and only queue catalog persistence when persisted fields change. Activity-only and transient status updates avoid database work while read/archive changes and explicit field clears remain synchronized. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: drain catalog writes before shutdown Stop reconciliation scheduling and drain accepted dispatches and catalog synchronization before shutting down providers and closing the central database. This preserves read/archive updates already published to clients across an immediate host restart without blocking normal passive notifications on catalog work. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: finish Copilot tool results before idle Wait for asynchronous tool completions before normal SDK idle clears the active turn. Preserve immediate abort handling and original tool-result attribution when a replacement turn starts while file-edit persistence is pending. Add deterministic delayed-completion, abort, and replacement-turn regressions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * chat: resolve provisional sessions before subscribing input pills Do not subscribe to untitled UI identities when Back returns to the new-chat input. Wait for the existing provisional-session service to publish a backend and follow its mapping changes, releasing obsolete subscriptions. Cover Back, provisioning, replacement, retirement, and return to a started session. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: defer automatic catalog repair until startup settles Gate automatic reconciliation scheduling and discovery-driven verification until host startup and the first listing complete, then start deferred periodic maintenance. Preserve explicit refreshes and immediate durable mutations. Cover zero pre-startup maintenance I/O and replacement-turn completion independent of an aborted edit. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: settle startup before title reconciliation test Establish host startup and the first listing before waiting for background catalog repair in the persisted-title test, matching the startup-gated maintenance contract. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: skip local storage for unresolvable catalog sources Check provider availability before taking the per-session exclusive open, so periodic reconciliation of sessions whose provider is not registered no longer opens their local database on every pass. Retry semantics are unchanged. Also un-nest the startup-gating test, which was defined inside another test and therefore never ran. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: add session catalog rollback switch Add chat.agentSessions.sessionCatalog.enabled, defaulting to true and frozen at its first read so the store backing the session list cannot change while the host runs. When disabled the host skips catalog import and background repair and lists from provider metadata and per-session storage, while registry identity and compatibility writes continue unchanged. Clear the verification marker while disabled so the next enabled start re-verifies every cached payload. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: report comparable listing metrics in both catalog modes Emit the catalog mode, the catalog-served and provider-fallback row counts, and the resolve phase duration on every listing, so a run with the session catalog enabled can be compared directly against one with it disabled. Catalog-served rows cost no provider or session-database read; fallback rows cost both. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: release a settled session listing instead of pinning it `listSessions()` attaches a trailing refresh to an in-flight listing so that concurrent callers share the hand-off instead of each starting their own recomputation, and `clear()` keeps the entry reachable while that hand-off is attached. Nothing released the entry once the hand-off itself settled, so it stayed in `_inFlightListSessions` as a permanently settled result: every later listing was served from it and the host never recomputed again. A later epoch bump does not free it either -- `listSessions()` takes the `if (!inFlight.trailing)` = false path and returns the settled trailing verbatim -- so the only escape is a host restart. Release the entry once the trailing hand-off settles, which is the point after which no caller can join it. `clear()` and `_startSessionListComputation` are untouched, so the starvation fix from #333646 still holds, and `startTrailing()` replaces the map entry with its own computation, so the identity check leaves that fresh entry alone. This regression was introduced by this pull request, in e1bc2e30576 ("agentHost: harden catalog reconciliation"), which added an epoch short-circuit to the trailing hand-off: - inFlight.trailing = inFlight.promise.then(startTrailing, startTrailing); + inFlight.trailing = inFlight.promise.then( + result => inFlight.epoch === epoch ? result : startTrailing(), + startTrailing, + ); Before that change `startTrailing` ran on every settle, and because `_startSessionListComputation` replaces the map entry, the pinned entry was always displaced by a fresh one whose `trailing` is unset -- so `clear()` could always collect it. With the short-circuit an unchanged epoch resolves to `result` and never calls `startTrailing()`, so nothing replaces the entry and it stays pinned forever. The retention in `clear()` came in earlier with 9e596330004 ("[cherry-pick] Avoid Agent Host session listing starvation (#333646)") and is benign on its own, because that commit always replaced the entry. origin/main is therefore NOT affected and needs no separate fix; e1bc2e30576 exists only on this branch. The cached-entry logic is mode-independent by construction -- `listSessions` and `_startSessionListComputation` never consult the session-catalog gate, and `_isSessionCatalogEnabled()` is only read inside `_computeSessions` for data sourcing -- so the fix applies in both catalog modes. The regression test reproduces the defect deterministically with the catalog disabled only, where the provider metadata round-trip gives a reliable point at which to hold a listing open; with the catalog enabled the same sequence races against projection writes that bump the epoch again. Observed in the field as an agent host that stopped recomputing listings entirely: six `listSessions` requests served in ~1ms with no computation at all after the host wedged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * chat: rename the session catalog setting and mark it advanced Move `chat.agentSessions.sessionCatalog.enabled` to `chat.agentHost.sessionCatalog.enabled`. The setting governs how the agent host serves its session list, not the agent sessions UI, so it belongs in the existing `chat.agentHost.*` namespace alongside the other host-level settings. Tag it `advanced` as well as `experimental` so it surfaces under the advanced filter: it is a rollback lever for the catalog read path rather than a tuning option. Register a configuration migration so an existing value carries over instead of silently reverting to the default. The migration clears the old key and writes the new one only when the new key is unset, so a value already set under the new name is not clobbered -- the same shape as the existing `chat.experimental.autoApprovals.enabled` migration. The agent host root key `sessionCatalogEnabled` is unchanged: forwarding is driven by the registration's `agentHost: { key }` through the configuration registry rather than by the workbench setting id, so nothing on the host side needs to move. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: migrate the session catalog setting from application scope `chat.agentHost.sessionCatalog.enabled` is APPLICATION-scoped, so an existing value can live in the application settings file. The migration inspected only the user target, silently dropping such a value and resetting the user to the default. Follows the `unifiedWorkspacePicker` precedent. Also restate the wedge regression test's comment: the trailing refresh pins a settled entry because its success handler observes a matching epoch and returns the settled result rather than starting a replacement computation. That is an epoch-timing bug, not a catalog-mode one, which is why the catalog-enabled variant cannot fail -- projection writes bump the epoch again and heal the map before a test can observe it. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: track per-session storage access counts Opening a session database is the dominant cost of any listing that cannot be served from the catalog, and it is the one figure that compares across machines: per-file costs differ by an order of magnitude between platforms (virus scanning, filesystem), so a duration measured on one machine says little about another. Expose cumulative open and stat counts from `SessionDataService` so diagnostics can report them. The member is optional because it is diagnostics only -- an implementation that owns no real files has nothing to report, and requiring it would force every test double to implement it for no benefit. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: resolve legacy changeset aggregate when importing sessions The `sessions_v2` importer built each catalog payload from provider metadata, which never carries file-change counts -- those live only in the session's own database. Imported rows were therefore written with no `changes` aggregate, and because they were written clean and verified, reconciliation never revisited them. The host then reported no counts at all for those sessions. The workbench treats an absent `changes` as "keep what you had" (`session.changes ?? cached`) and persists that value per workspace, so a silent omission surfaced as a stale, inflated edit count in the session list that only corrected itself once the session was opened and its diffs were recomputed. Resolve the aggregate during the import, reusing the resolver the reconciliation path already uses; the session database is open at that point, so this costs no extra open. Bump the catalog verification version so profiles migrated by an earlier build re-verify once and pick up the aggregate they are missing. Read the small persisted summary before the diff blobs. The blobs run to hundreds of kilobytes and occasionally megabytes, while the modern aggregate is a few dozen bytes and is returned verbatim when present, so the common already-migrated session no longer loads and parses a blob it does not need. This also removes that cost from every reconciliation pass, including the one the version bump triggers. Finally, report duration and storage-access counts on the import and session-list log lines. The import runs at most once per provider per payload version, so a report that arrives afterwards can never reproduce it; both lines are emitted at info level for the same reason. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>Sandeep Somavarapu · 8ec3108c · 2026-09-16
- 10.4ETVCustomizations modal redesign (#322043) * Add prototype design for plugin page in customizations modal * More updates/tweaks * More updates/tweaks * More updates * Refactor AI customization components and tests for improved functionality - Enhance aiCustomizationListWidget and related management editors. - Introduce aiCustomizationPresentation for better UI handling. - Update styles in aiCustomizationManagement.css for consistency. - Improve tests for aiCustomization components to ensure reliability. * Refactor AI customization management and update related tests - Improve aiCustomizationManagementEditor and associated components - Enhance styling in aiCustomizationManagement and welcome prompt - Update tests for aiCustomizationManagementEditor and welcome page * Refactor AI customization components and update related tests * Refactor AI customization components and improve session handling - Update agent host sessions provider for better integration. - Enhance AI customization management editor and presentation. - Optimize embedded agent plugin and MCP server details. - Clean up CSS for AI customization management. - Adjust tests to reflect changes in AI customization components. * Refactor AI customization components and add new tests for coverage * Fix AgentService provider refactor compilation Route failed-turn resume through the provider service and use the existing provider registration helper in its tests.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address customization editor review feedback Preserve live MCP and plugin detail controls, map remote MCP resources correctly, defer marketplace and editor work until visible, scope hook discovery by storage, and make card-list metadata linear.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix customization CI regressions Keep Agent Host provider mapping compatible with lightweight providers and accept the reviewed component screenshot baselines generated by CI.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Update customization screenshot baselines Accept the reviewed Agent Host migration and welcome-page hashes generated by the blocks-CI Ubuntu run.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>Hawk Ticehurst · 2adee83d · 2026-08-27
- 10.0ETVchat: Add a unified customization marketplace (#337110)Paul · 33a7c035 · 2026-09-24
- 9.5ETVImplement agentHost process (#296627) * agent host init * Agent host: Copilot SDK integration with chat UI * Agent host: direct MessagePort, logging, SDK wrapper, env fix * Refactoring and cleanup * Copilot-authored message: Agent-host tool rendering, protocol, and session fixes Tool invocation rendering: - Emit tool_start/tool_complete as ChatToolInvocation (not progressMessage) - Shell tools (bash/powershell) render as terminal command blocks with IChatTerminalToolInvocationData, output, and exit codes - Non-shell tools render via invocationMessage/pastTenseMessage (markdown) - Filter out report_intent (hidden internal tool) Agent-agnostic protocol: - IPC events carry display-ready fields (displayName, invocationMessage, pastTenseMessage, toolInput, toolOutput, toolKind, language) - All Copilot CLI-specific logic in copilotToolDisplay.ts with typed interfaces for known tools (CopilotToolName enum, parameter types) - Renderer never references specific SDK tool names Session fixes: - Resumed sessions show tool invocations in history (getSessionMessages now returns tool events alongside messages) - Fixed 'already has a pending request' on resumed sessions by conditionally providing interruptActiveResponseCallback - Fixed event filtering for resumed sessions (sessionId override in _trackSession) Documentation: - Split parity.md into design.md (decisions) and backlog.md (tasks) - Updated architecture.md, sessions.md with cross-references - Added maintenance notes to all docs * Copilot-authored message: Model picker, session class, DI and test cleanup * Cleanups * stuff * add diagram * Add claude agent * Clean up * Copy some build script changes from #295817 * Simplify * Update docs * Register agent-host via chatSessions contribution API, reduce peripheral diff * Cleanup * Don't ship stuff in stable * Dynamic agent discovery via listAgents() IPC Replace hardcoded per-provider contributions with a single AgentHostContribution that discovers available agents from the agent host process at startup. Each IAgent backend now exposes an IAgentDescriptor with display metadata and auth requirements. - Add IAgentDescriptor interface and listAgents() to IPC contract - CopilotAgent/ClaudeAgent return descriptors via getDescriptor() - Single AgentHostContribution discovers + registers dynamically - Remove agentHostConstants.ts (no more hardcoded session types) - AgentHostSessionListController/LMProvider take params instead - Rename AgentSessionProviders.AgentHost -> AgentHostCopilot - Update architecture.md, sessions.md, backlog.md (Written by Copilot) * Fix review findings: proxy, disposal, filtering, tests - Add listAgents() forwarding to AgentHostServiceClient - Guard async discovery against disposal race - Add provider field to IAgentModelInfo for per-provider filtering - Filter models and sessions by provider in LM provider and list controller - Update tests for new dynamic API and agent-host-copilot scheme (Written by Copilot) * Use DI for AgentHostLanguageModelProvider (Written by Copilot) * Strip @img/sharp native binaries from builds sharp is a transitive dependency of the Claude Agent SDK used for image processing. Its native .node binaries cause dpkg-shlibdeps errors during Debian packaging due to $ORIGIN RPATH references. Strip all @img/sharp-* platform packages since the agent host doesn't need image processing at runtime. (Written by Copilot) * Strip Claude SDK vendored ripgrep binaries The Claude Agent SDK bundles ripgrep binaries for all platforms under vendor/ripgrep/. Wrong-architecture binaries cause macOS Mach-O verification to fail. Strip them entirely via .moduleignore (VS Code has its own ripgrep) and add to verify-macho skip list. (Written by Copilot) * Add tests for AgentSession, AgentService dispatcher, and workbench agent host components (Written by Copilot) * Add trace logging, IPC output channel, tool permissions, and attachment context - Add Agent Host IPC output channel (only registered at trace log level) that logs all IPC method calls, results, and progress events with full JSON payloads - Add trace-level logging in AgentService dispatcher for all method calls - Add trace-level logging in session handler for all progress events and session resolution - Wire up onPermissionRequest handler on CopilotClient.createSession and resumeSession to auto-approve tool permission requests - Add IAgentAttachment type to IPC contract and thread attachments from chat variables (file, directory, selection) through sendMessage to the Copilot SDK (Written by Copilot) * Add tests for attachment context conversion and threading (Written by Copilot) * Add gap analysis docs for Copilot and Claude SDK implementations (Written by Copilot) * Sanitize env vars for Copilot CLI subprocess Strip VSCODE_*, ELECTRON_* (except ELECTRON_RUN_AS_NODE), NODE_OPTIONS, and other debug-related env vars that can interfere with the Node.js process the SDK spawns. Matches the env sanitization from the extension implementation. Also set useStdio and autoStart for proper CLI communication. (Written by Copilot) * Add error, usage, and title_changed event types to IPC contract Add IAgentErrorEvent, IAgentUsageEvent, and IAgentTitleChangedEvent to the progress event union. Wire up session.error and assistant.usage events from the Copilot SDK to fire as IPC events instead of only logging. Handle error events in the renderer session handler by rendering the error message. Usage and title_changed events are logged at trace level. (Written by Copilot) * Add abortSession IPC method for proper cancellation Add abortSession(session) to the IPC contract, implemented across AgentService, CopilotAgent (calls session.abort()), ClaudeAgent (no-op, uses AbortController), and the renderer proxy. Wire up cancellation in the session handler to call abortSession before finishing, so the SDK actually stops processing. (Written by Copilot) * Address reviewer feedback: error finishes request, Claude abort, tests - Error events now call finish() so the request doesn't hang if the SDK doesn't send idle after an error - ClaudeAgent.abortSession calls ClaudeSession.abort() which signals the AbortController and creates a new one for future turns - Add test: cancellation calls abortSession on the agent host service - Add test: error event renders message and finishes the request - Remove stale TODO in interruptActiveResponseCallback - Use timeout() helper instead of raw setTimeout in test - Update gap docs to reflect completed work (Written by Copilot) * Add permission request IPC round-trip (Written by Copilot) * Remove Claude agent from agent-host process Strip the Claude Agent SDK integration from the agent-host utility process to focus on the Copilot SDK path. - Delete src/vs/platform/agent/node/claude/ (claudeAgent, claudeSession, claudeToolDisplay) - Remove @anthropic-ai/claude-agent-sdk from package.json - Remove AgentHostClaude enum member and all switch cases - Remove Claude command registration in electron-browser chat.contribution - Clean up build scripts (.moduleignore, verify-macho, gulpfile.vscode) - Narrow AgentProvider type to just 'copilot' - Update tests and documentation (Written by Copilot) * Wire up permission confirmation UI with ChatToolInvocation (Written by Copilot) * Fix reviewer feedback: safe permission serialization, deny on abort/dispose (Written by Copilot) * Forward reasoning events as thinking blocks (Written by Copilot) * Pass workspace folder as workingDirectory to Copilot SDK (Written by Copilot) * Store and pass workingDirectory on session resume, update gap docs (Written by Copilot) * Fix permission rendering, session-scoped permissions, and test gaps (Written by Copilot) * Auto-approve read permissions inside workspace folder (Written by Copilot) * Move read auto-approve into CopilotAgent where permission policy belongs (Written by Copilot) * Update gap docs (Written by Copilot) * Use log language for IPC output channel, add trace prefix (Written by Copilot) * Add tool rendering gaps to docs (Written by Copilot) * Stringify URIs in IPC output channel for readability (Written by Copilot) * Fix IPC output channel: use log languageId with non-log channel for proper append + syntax highlighting (Written by Copilot) * Fix build errors: add URI import, fix test mock types (Written by Copilot) * Don't localize agent host provider strings (Written by Copilot) * Remove claude-agent-sdk from eslint allowed imports (Written by Copilot) * fix test * initial thoughts * Rename folder to agentHost * Fix paths * Fixes * Fixes for copilot * Fix moduleignore * first working protocol version align more closely with protocol json rpc and some gaps * cleanup * Fix copilot pty.node packaging * Fix test * prebuild packaging * Agenthost server fixes * Update monaco.d.ts * Update docs * Fixes * Build fix * Fix build issues * reduce duplication in side effecting code * fix model switching not working * reduce mock duplication * Build fixes * Copy vscode's node.pty * And ripgrep * And thsi * Ripgrep goes to non-SDK * Skip copy for stable build * Remove outdated script * Build fixes for asar * fix * Add some logging * Fix for windows * Fix * Logs * build: add glob diagnostic for copyCopilotNativeDeps * build: check both node_modules/ and .asar.unpacked/ for source binaries * Fix * Remove excalidraw --------- Co-authored-by: Connor Peet <connor@peet.io> Co-authored-by: Connor Peet <copeet@microsoft.com>Rob Lourens · 98f15b55 · 2026-03-16
- 9.3ETVgithub: add reusable platform API service (#330673) * Phase 1: GitHub API service foundations with transport, coordination, and deterministic testing - Enhance AgentHostAuthenticationService with token generation tracking and lifecycle - Implement GitHubScheduler, GitHubRequestQueue, GitHubRateLimitCoordinator for deterministic coordination - Implement GitHubTransport with no-store REST/GraphQL, exact ETag/body caching by account, request coalescing, priority queueing, retry with deterministic jitter - Implement GitHubCredentialService with stable account resolution via /user probe, generation-scoped caching, automatic invalidation on 401 - Implement GitHubHostCapabilitiesService with schema probing, fail-closed defaults, endpoint-change resets - Convert AgentHostOctoKitService to adapter using new transport stack, preserving behavior compatibility - Wire new services into AgentService with auth-required forwarding for credential/endpoint changes - Create ProgrammableGitHubServer loopback test helper with ordered REST/GraphQL scripting, ETag/304, redirects, delays, rate-limit, errors, disconnects - Create FakeGitHubScheduler for deterministic time control with injection, due-time scheduling, positive deterministic jitter - Add comprehensive unit tests for transport (no-store, caching, coalescing, rate-limit, priorities), credentials (stable account, generation tracking, invalidation), capabilities (probing, error handling), and schedule (advancement) - Fix review findings: dual-resource endpoint-change auth, legacy-token resurrection blocking, transient capability failure caching, GraphQL rate-limit coordination Type-checked; 18 new files, 6 modified production files, all tests deterministic. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: add shared GitHub pull request reads Introduce normalized pull request fragments, capability-aware request planning, canonical shared resources, independent polling, complete conversation and checks pagination, mergeability fallbacks, and generation-safe lifecycle handling. Also include the reviewed Phase 1 transport and coordination corrections that these resources depend on.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: add safe GitHub mutations and diagnostics Add typed idempotent comment and review-thread mutations, workflow diagnostics and rerun reconciliation, bounded redacted log downloads, expected-head branch updates, generation-anchored merge preparation, direct merge reconciliation, and merge-queue enrollment.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: complete typed GitHub service parity Add shared repository and issue resources, comparison and pull request context queries, viewer work searches, issue linkage, behavior-compatible lookup operations, typed pull request creation and auto-merge, GHES capability handling, and the final internal service facade.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: group GitHub implementation files Move GitHub contracts, implementations, and focused tests into dedicated github folders.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agentHost: expose a single GitHub service Collapse GitHub credentials, transport, capabilities, queries, pull request resources, and mutations behind one IGitHubService composition root. Keep only the endpoint configuration and legacy OctoKit adapter as separate compatibility services, update moved imports and coverage paths, and remove the implementation plan from the branch.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * github: add reusable platform service Move the new GitHub API implementation into src/vs/platform/github behind caller-supplied endpoint and token providers. Keep all existing Agent Host and Sessions GitHub/auth behavior unchanged; AgentService only constructs and registers the new service for future adoption.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * github: reconcile pull request resource aliases Converge concurrent old and canonical repository subscriptions onto one scheduled entry while preserving issued resource handles. Reject review-thread pages and in-flight results that no longer match the current pull request head. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * github: add service diagnostics Add privacy-safe debug and trace logging for credential, transport, capability, resource, query, and mutation lifecycles. Cover the service path with a regression that verifies tokens and response payloads are not logged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * github: fix service hygiene Resolve the platform GitHub ESLint findings while preserving asynchronous request, scheduler, and loopback test behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * github: retrigger CI after hygiene fix Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>Benjamin Christopher Simmonds · ff1603fb · 2026-08-14
- 8.4ETVautomations: feat: migrate execution to Agent Host Protocol (#331796) * automations: feat: migrate execution to Agent Host Protocol Move Automation definitions, scheduling, run lifecycle, and persistence into the Agent Host while safely migrating legacy VS Code data and retaining older-host fallback behavior. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 142bb750-abf2-4b29-91b8-1e9ab2444635 * automations: guard Agent Host migration cutover Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * automations: optimize sparse cron evaluation Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * automations: gate initial Run advertisement on enabled state Match the canRun composite used by handleConfigurationChanged so a create that arrives while chat.automations.enabled is false does not advertise Run. * automations/ahp: gate SessionWorkingDirectoryReplaced action Bring Replaced to parity with Set/Removed at the working-directory gate: extend the action union, canonicalize both URIs in the resolver, enforce editor-only client and provider capability at _dispatchActionNow, and include Replaced in the customization-enablement listener. Also honors the Removed contract for primaryReplacement: rejects index-0 removal when the agent advertises primaryReplacement. * automations/ahp: enforce single-run invariant in schedule claim loop Break out of the trigger loop once a schedule trigger has been claimed for an Automation, after advancing that trigger's cursor. Prevents two simultaneously-due schedule triggers on one Automation from both starting sessions and violating the one-non-terminal-run-per-Automation invariant. Deferred triggers keep their cursors untouched so their firings are re-evaluated on the next tick rather than dropped. * automations/ahp: coalesce simultaneously-due schedule triggers into one run Two schedule triggers on one Automation whose past-due cursors land in the same claim tick now coalesce into a single run. Catch-up is idempotent: one run at now, regardless of how many missed firings a sibling trigger also carries. The claim block skips when another trigger has already claimed for this Automation this tick, but the deferred cursor still rolls forward to its next cron occurrence so it does not re-fire on the next tick. Replaces the earlier break-after-claim approach from e2c2657, which serialized the deferred firing back-to-back. * automations/ahp: gate Run authority on legacy import until source is durably removed The migration path published imported snapshots with Run granted before the legacy source row was CAS-removed, creating a double-authority window where both schedulers could dispatch the same occurrence. If the removal failed, the window became permanent. Stage imports with a pending meta flag, centralize the Run/Remove permission check in the host, restore Remove when the flag clears, gate scheduling ownership on the flag, and add an acknowledge hook so cross-provider retargets clear the pending state after the source is durably gone. Recovery drains stranded pending rows on reconnect. * automations: finish Agent Host merge integration Co-authored-by: benvillalobos <4691428+benvillalobos@users.noreply.github.com> * test: mirror host automation migration authority Co-authored-by: benvillalobos <4691428+benvillalobos@users.noreply.github.com> * agentHost: restore main's reject of SessionWorkingDirectoryReplaced The merge collapsed main's two-block structure for working-directory actions back into one, dropping the explicit reject for `session/workingDirectoryReplaced`. No provider advertises `primaryReplacement` and the host has no backend side effect for the action, so the reducer would apply an unvalidated mutation. Restore the standalone reject before the EditorWindow-gated block for Set / Removed. * signing commit * signing commit * automations: use family guards for dispatch, matching existing pattern Recreate the pre-existing dispatch-guard convention rather than switching this hot path to isClientDispatchable. The generic check pulled in synced protocol code and widened the scope of this change. Automation and automation-run actions now flow through family guards, consistent with how session, chat, terminal, changeset, and annotations actions are already handled. The family-vs-permission gap this restores is pre-existing and tracked for maintainer follow-up. * automations: drop reducer-helpers sync patch, no longer needed The dispatch guard no longer uses isClientDispatchable, so nothing imports the synced reducer-helpers.ts. Its generated-source compatibility patch only existed to widen that helper's signature for the guard, so remove it and let the file sync verbatim. The state.ts dead-import patch stays until the synced AHP revision picks up the upstream fix. * agentHost: separate subscription resources and channels Keep URI-based subscription APIs narrow while preserving exact AHP catalogue channels. Mark failed reconnect restorations by channel and cover the exact-channel path with regressions. * automations: give the catalogue channel a round-trippable authority The catalogue channel constant was `ahp-automations://`, which is not a round-trippable URI. `URI.parse('ahp-automations://').toString()` drops the empty authority and yields `ahp-automations:`, so a channel serialized on the client no longer matched the catalogue check on the host. Append a `catalog` authority so the URI survives a parse/toString round-trip. Comparing catalogue channels as URIs everywhere (ResourceMap/isEqual) remains the intended followup. * automations: key the catalogue channel like every other channel Now that the catalogue channel URI round-trips through parse/toString, its subscription key no longer needs to preserve the raw channel string. Drop the `_subscriptionChannel` helper and its automation-catalogue special case, and key every channel through `_subscriptionResource` by its parsed URI. Comparing channels as URIs everywhere (ResourceMap/isEqual) remains the intended followup. * automations: use shared action family routing Use dedicated automation channels for subscription relevance and reuse the canonical action-family guards in state management. This avoids silent drift when the protocol adds actions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 8c6d543f-7777-4e8b-9371-3e39a0842293 * automations: inject the automation service as a collaborator AgentService received the automation service through a post-construction setAutomationService setter, leaving a definite-assignment field and a one-off wiring step. It depends on AgentService only through the lazy callback adapter, so it can be built first and passed in the collaborators bag like every other dependency. Its constructor installs durable state without firing emitters, so the earlier ordering is safe. * automations: key subscriptions by URI through ResourceMap The subscription map had been changed from a ResourceMap to a Map<string> keyed by a synthetic getComparisonKey string, purely to hold the lossy catalogue channel under a raw key. With the catalogue channel now round-trippable and the special-case keying gone, every entry keys by a real URI again. Restores the ResourceMap that main uses and drops the synthetic key from the entry type, the resource helper, and all fifteen call sites. * automations: revert subscribe callbacks to URI The subscription manager threaded raw channel strings through _subscribe/_unsubscribe to dodge a lossy round-trip on the catalogue channel. Now that the catalogue URI round-trips, revert those callbacks to (resource: URI) to match main. The wire boundary keeps its .toString() serialization in the protocol client. * automations: migrate legacy definitions to native AHP state Translate legacy automations at the client boundary instead of persisting editor projection metadata. Derive the compatibility view from host state and canonicalize supported round trips. * automations: stabilize legacy target serialization for AHP migration Serialize folderUri as explicit URI components instead of URI.toJSON(). toJSON() only emits the lazily cached fsPath and formatted fields once they have been accessed, so two URIs for the same folder could serialize differently. That made the snapshot equality check during Agent Host migration fail with "kept changing while migrating" for every folder-target automation, blocking migration indefinitely. Reads already go through URI.revive, so existing ledger data stays compatible in both directions. * automations: ignore rejected chat actions when finalizing runs _handleEnvelope finalized an automation run on ChatTurnComplete, ChatTurnCancelled, or ChatError but did not check rejectionReason. A rejected action never reached authoritative host state, so applying it marked a still-live run terminal and orphaned its session. Guard against rejected envelopes before finalizing, matching the sessions provider's action handler. * automations: salvage valid legacy ledger entries Keep valid automations writable when individual persisted rows are malformed. Update migration coverage and compare round-tripped URI resources without relying on cache state. * automations: recover corrupt legacy run archives Salvage valid archived runs and repair unreadable current-version archives during import. Preserve fail-closed handling for unsupported newer versions. * automations: wait for provider migration before wakeup Refresh pending automations only after initial provider migration succeeds. Apply the same ordering when a failed provider migration is retried. * automations: reject inactive catalog subscriptions Apply the standard subscription cancellation guard before adding an automation catalogue subscriber. * automations: surface pending import drain failures * automations: acknowledge migrated snapshots * signing commit --------- Co-authored-by: Ben Villalobos <4691428+benvillalobos@users.noreply.github.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: Ben Villalobos <bevillal@microsoft.com> Copilot-Session: 142bb750-abf2-4b29-91b8-1e9ab2444635 Copilot-Session: 8c6d543f-7777-4e8b-9371-3e39a0842293Ulugbek Abdullaev · 33e6a5d6 · 2026-08-27