Bhavya U
90d · built 2026-07-24
90-day totals
- Commits
- 81
- Grow
- 12.5
- Maintenance
- 6.7
- Fixes
- 5.2
- Total ETV
- 24.5
Where this dev ranks
Percentile against the global top-100 leaderboard (all-time totals).
- By commits
- Top 49 %
- By Growth share
- Top 13 %
30-day trajectory
Last 30 days vs. the 30 days before. Up arrows on Growth and ETV mean improvement; up arrow on Fixes share means more time on fixes (worse).
↓-65.5 %
vs 29 prior
↑+31.0 pp
recent vs prior
↓-13.1 pp
recent vs prior
Daily performance
Daily ETV, stacked by Growth, Maintenance and Fixes.
Work-mix over time
Share of Growth / Maintenance / Fixes over a rolling 7-day window. Reads as 'where is effort flowing right now'.
Repository spread
Where this developer's commits land. Concentrated work (top1 > 80%) vs polymath spread (top1 < 30%).
Most impactful commits
Top 20 by ETV in the 90-day window.
- 2.8ETVAdd Cache Explorer view to chat debug panel (#313620) * Add Cache Explorer view to chat debug panel Add a new "Cache Explorer" entry under "Explore Trace Data" in the chat debug overview. The view helps diagnose prompt-cache misses by diffing two model-turn requests side by side. The pure diff engine (chatDebugCacheDiff.ts) parses the input messages JSON exposed via IChatDebugEventModelTurnContent.sections, normalizes each message to {role, name, text, byteLength}, and produces a per- position signature of the prompt prefix. The first position whose role, length, or content diverges is reported as the cache break — anything after that point cannot be served from the prompt cache. The view (chatDebugCacheExplorerView.ts) lays out a left rail of model turns annotated with cache hit %, A/B summary cards, the prompt signature with the break marker, and a Components accordion that diffs the system prompt and any divergent messages. Sequential pairing is the default (B = current selection, A = previous turn); click in the rail to set B and shift-click to set A. The diff engine ships with 10 unit tests in chatDebugCacheDiff.test.ts. * Cache Explorer iteration: rail groups, OTel-backed metrics, prompt signature bars Iterate on the Cache Explorer view added earlier on this branch: - Left rail groups model turns by parent request and shows the user prompt as the group header. Group rows are collapsible and the full request id is shown in the header. - Each rail row reports agent source, cache hit %, duration, and time for the turn; rows with hit < 90% render the chip in red. - Single-selection model: clicking a row sets it as the current request and the row above is implicitly the previous one to diff against. - Producer plumbing: the file logger now persists copilot_chat.debug_name and gen_ai.response.id alongside the model-turn entry, and the modelTurn content carries a requestId. The summary card surfaces the full network requestId so it can be copied. - Replaced the chip-style prompt signature with a horizontal role- colored bar visualization showing both requests on a shared scale, with a vertical break marker at the divergence index. - Cache performance card replaces the pill row with a structured layout: cache hit headline + token reuse, where the cache broke + estimated lost tokens, and a one-line diff summary. - Component diff and signature lanes use Previous/Current labels instead of A/B. Refs https://github.com/microsoft/vscode/pull/313608 * Cache Explorer: char-level inline diff in Components accordion Replace the plain-text body of each Components row with a side-by-side line + character diff rendered directly into HTML. Uses the existing linesDiffComputers.getDefault().computeDiff() that Monaco's diff editor also uses internally; ignoreTrimWhitespace stays off so cache-relevant whitespace is visible. - Each line is emitted as a div with one of three classes `context`, `add`, `remove` for full-line styling. - Inner range mappings produce char-level <span> highlights inside added or removed lines. - Multi-line inner range mappings are skipped for v1; the surrounding add/remove styling already conveys the change. - Bounded by maxComputationTimeMs=200 so a stray giant tool-result diff cannot stall the renderer. No widget, no editor instance, no layout calls; replaces the existing two raw <div> bodies with a directly-styled HTML diff. Refs https://github.com/microsoft/vscode/pull/313620 * Cache Explorer: extract text from tool_call_response and tool_call parts The OTel input messages format wraps tool I/O as part-level objects, not as top-level text: - A user/tool message that returns tool output uses { type: 'tool_call_response', id, response: '...' } - An assistant message that invokes a tool uses { type: 'tool_call', id, name, arguments: {...} } Until now parseInputMessages only counted parts with type === 'text', so these messages showed up as zero-byte slots in the diff with both sides labeled '(not present)' \u2014 confusing because tool I/O is the single most cache-relevant content in an agentic loop. This change pulls the response payload out of tool_call_response (and the tool name + arguments out of tool_call) and includes them in the normalized text we diff against. We also reclassify the row's display role to 'tool' when the message is dominated by a tool result so the rail / signature / accordion label it consistently. Two new unit tests pin the extraction behaviour. Refs https://github.com/microsoft/vscode/pull/313620 * Cache Explorer: track request options + likely cache expiration Prompt caches invalidate on more than just message-array changes \u2014 flipping tool_choice, raising reasoning_effort, switching to Claude extended thinking, or changing the response_format all bust the cache even when the prompt prefix is byte-identical. Surface those changes. Producer: - New OTel attribute copilot_chat.request.options carrying a curated subset of the request body. Captures tool_choice, reasoning, reasoning_effort, thinking, thinking_budget, output_config, response_format, text, truncation, context_management, the various penalties, store, stream, stream_options, prediction, seed, parallel_tool_calls, service_tier, metadata, verbosity, snippy, state, intent, intent_threshold, include, plus an 'extra' catch-all for any unrecognised top-level fields. - Persisted onto llm_request entries in the file logger so the data survives session reloads. Consumer plumbing: - New requestOptions?: string on IChatDebugEventModelTurnContent and the matching DTO + ext-host class + proposed API. Read on both the live OTel span path and the on-disk entry path. View: - New 'Request Options' table renders every captured option with Previous and Current columns; rows whose values differ are highlighted with the diff-removed background. The model id is layered on top of the request_options blob so model swaps show up in the same table. - An inline 'Options changed: ...' banner sits below the summary cards so the user spots option drift without scrolling. - Cache performance card now detects the 'likely cache expiration' case: when the model reports 0% hit, the structural diff finds no prefix break, AND the option table is identical, the headline switches to '\u2014 likely cache expiration' with an explanation. When options are the only thing that changed, the break line says so explicitly. Refs https://github.com/microsoft/vscode/pull/313620 * Cache Explorer: address Copilot review nits from #313608 + #313602 Six small follow-ups: - Switch truthy checks to '!== undefined' for token fields in chatDebugFlowGraph.ts (model-turn tooltip) so a turn with 0 input or output tokens still gets a tooltip line. - Same fix for the modelTurn aria label in chatDebugLogsView.ts \u2014 a 0-token turn now still announces 'Model turn: <model> 0 tokens' instead of dropping the count. - Add the cached-tokens row to the modelTurn branch of formatEventDetail in chatDebugEventDetailRenderer.ts (regressed during a recent merge) and add the cachedTokens field to the existing 'modelTurn - with all fields' unit test. - chatDebugFlowGraph tooltip also gains a 'Cached tokens: N' line when present. - Restore the requestName deserialize in ExtHostChatDebug._deserialize Event \u2014 the serializer sends it but the round trip was dropping it. Add the corresponding requestName field to the ChatDebugModelTurnEvent ext-host class so the assignment compiles. * Cache Explorer: address Copilot review on #313620 Five fixes from Copilot's review: - Rename INormalizedMessage.byteLength to charLength (text.length is UTF-16 code units, not bytes), and update all UI labels from 'B' to 'chars' so the displayed unit matches what we actually measure. Touches the diff engine, the explorer view, and the unit tests. - setSession now clears collapsedGroups and resets openComponents to the default expanded set, mirroring how Flow Chart resets its collapse state on session change. Prevents unbounded growth and cross-session collapse-state leaks. - Rail rows are now keyboard accessible: each row is focusable (tabIndex=0), exposes role='button', aria-selected, and aria-label, and responds to Enter/Space. Adds a focus-visible outline. - render() now uses a monotonically-increasing renderToken captured at the start of each call and re-checked after each await; an older render whose model-turn resolves come back late will no longer write into a DOM the newer render has already rebuilt. - _reviveResolvedContent in mainThreadChatDebug now passes through maxInputTokens and maxOutputTokens, which were silently dropped. Refs https://github.com/microsoft/vscode/pull/313620 * Cache Explorer: address Councillor-Opus follow-up nits Five fixes prompted by the council review: - breakBytePos used to fall through to 'cumulative' (the right edge of the bar) when the diff's break index was outside the side's segment list \u2014 it now returns undefined, which the renderer already handles as 'no break marker for this side'. Prevents a logic mismatch between the diff and the segment list from being silently masked as a misleading 'cache broke at the end' marker. - pickCacheRelevantRequestOptions drops the 'extra' catch-all. We now only forward an explicit allowlist of cache-keying body fields to OTel and the on-disk debug log. Keeps any future provider- specific body fields (auth tokens, API keys, personalization) from leaking through; new cache knobs must be added explicitly. - Replace the local JSON-stringify based deepEqual helper in the view with the equals function from vs/base/common/objects, which is already used elsewhere in the workbench for value comparisons. - Add a fast-fail comment to messagesEqual explaining why charLength stays even though it is implied by text equality. - Document the trailing-context loop in renderInlineDiff and the silent selectedIndex clamp on session change so future readers don't think they're bugs. Expand the isLikelyCacheExpiration JSDoc to enumerate other invalidation causes the heuristic cannot distinguish. * Cache Explorer: clarify stableStringify fallback intent Document why stableStringify falls back to String(value) (circular refs / BigInt) and why the diff engine deliberately does not take an ILogService dependency to log such cases. The fallback produces a stable but lossy representation that still surfaces as content drift in the UI, so the failure mode is visible rather than silent. * Cache Explorer: address Copilot review nits round 2 Four small fixes from the latest Copilot review pass: - Update parseInputMessages JSDoc: was still describing charLength as 'byte length' even though the field was renamed. - Update diffPromptSignature comment: it claimed every position from the divergence onward is reported as non-identical, but the algorithm classifies each position independently. The first divergence is what breaks the cache; later identical positions are reported truthfully and the UI keys off the first break index. - Rename the 'bytes' field on the local renderSignature segment type to 'chars' (and the breakBytePos helper to breakCharPos) so the source code matches what the user-visible labels already say. - Drop the dead 'tools' entry from the openComponents Set seed in setSession and the field initializer; the diff pipeline only emits 'system' and 'messages[N]' component names, so the 'tools' entry never matched and had no visible effect.github.com-microsoft-vscode · 8c4048e0 · 2026-05-01
- 2.1ETVCache explorer: conversation-level hit rate, exclude utility models, agent-type filter (#320902) Fixes #320765github.com-microsoft-vscode · aefd1103 · 2026-06-11
- 1.5ETVAdd tool search to Copilot agent host (#326213) * Add tool search to Copilot agent host * Address review: alias-aware tool-search gating, drop transient candidates, cover prompt branch - Compute the tool-search capability decision from the family-aliased model in both the launcher and CopilotAgentSession so an aliased preview model is no longer rejected and the two stay in agreement. - Strip the transient tool-search candidate corpus from the completed tool call's _meta so repeated searches don't bloat synchronized session state or persist across reconnects. - Add active/inactive + composition tests for the tool-search prompt line at both the unit and prompt-registry layers, plus a model-family alias regression test for tool-search gating. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Remove obsolete tool-search start barrier * Address tool-search review feedback * Use the extension's existing tool-embedding cache for Agent Host search * Address review: keep server tools eager, harden tool-search candidate corpus - Force server-provided SDK tools to defer:'never' so they stay eager and are not deferred behind tool_search. - Default missing candidate descriptions to '' when building the tool-search corpus, so the all-or-nothing metadata reader never drops a valid corpus. - Drop the unused inputSchema field from the tool-search candidate corpus (name + description are all the embeddings ranker consumes). - Use the client-facing tool name in the custom-tool auto-approve membership check so a deferred tool_search runtime name resolves correctly. - Remove a redundant conjunct in _clientToolName already implied by _isToolSearchActive(). * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> * Temporarily disable GPT tool search --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>github.com-microsoft-vscode · c6b3beee · 2026-07-23
- 1.1ETVCache Explorer: handle Responses API continuations and tool definitions (#314654) Surfaces tool definitions and Responses API continuation deltas in the Agent Debug Logs Cache Explorer so users can reason about cache hit/miss behavior on requests that use previous_response_id. OTel pipeline: - Capture tool definitions per chat span as gen_ai.tool.definitions. - Add copilot_chat.request.shape attribute carrying sanitized request shape metadata (api type, hasPreviousResponseId, input item types). No IDs or content are captured. - Persist both attributes through the file logger and surface them in resolved model-turn debug content for live and replayed sessions. Provider message normalization: - Treat tool_search_output as a distinct tool_search role with a tool_search_output part instead of dropping it through the generic fallback (which produced {role: undefined, parts: []}). - Add normalization for function_call, function_call_output, and tool_search_output Responses API item types. - Preserve absent-vs-empty tools distinction on tool_search_output so cache-key-relevant byte-level differences are not flattened. Cache Explorer UI: - Add tools (catalog) component diff alongside system. - Add a tool search color/legend role distinct from tool results, with a hyphenated CSS class for consistency. - Re-frame the prompt signature in prefix order (system, tools, messages) so a tools-catalog change is no longer misreported as break at messages[0]. - For Responses API continuation requests, suppress positional message diffing against the previous request: the wire delta is asymmetric with the previous full input, so positional diffs are misleading. Render the current continuation delta as its own component, label the comparison as Visible Request Signature, and skip the cache- expiration heuristic since the full provider-reconstructed prompt cannot be inferred from the wire delta. - Strip multiple leading system messages on dedup, harden prefix component insertion against double-insertion, and guard against malformed inputItemTypes metadata. Tests: - Added Vitest coverage for new Responses API normalizers and the absent-vs-empty tools distinction. - Added cache diff parser tests for tool_search_output messages.github.com-microsoft-vscode · a1c2e116 · 2026-05-06
- 1.1ETVCache Explorer: agent filter, per-chunk breakdown, stable rail selection (#320469) * Cache Explorer: agent filter, per-chunk breakdown, stable rail selection - Agent filter dropdown in the rail (defaults to panel/editAgent) - Collapsible per-chunk breakdown table for the prompt signature - Clicking/arrowing rail turns updates selection in place instead of rebuilding the rail, fixing focus loss and scroll jump; adds Up/Down nav * Cache Explorer: preserve rail selection for turns without an id Agent-filter selection was stored as the turn's optional id, so turns without an id skipped the restore path and could still jump to an unrelated turn. Store the turn object instead and match in two passes: precise id/reference identity first, then a composite fallback for id-less turns so an earlier look-alike can't win over the exact turn. * Cache Explorer: address review a11y/perf comments - Rail rows use role=button, so swap aria-selected -> aria-current (kept in sync in selectTurn and on initial render). - Agent filter trigger: aria-haspopup=menu instead of generic true. - Mark decorative chevrons (filter + chunk-breakdown toggle) and the chunk role swatch aria-hidden. - Chunk breakdown gets table semantics: role table/row/columnheader/cell on header, data, and totals rows. - moveSelection: drop the per-keypress sort; railRowsByIndex Map iteration already yields rows in visual order.github.com-microsoft-vscode · fb811e18 · 2026-06-08
- 1.0ETVCopilot CLI agent-host: experimentation overrides + config split (#324099) * Copilot CLI agent-host: experimentation overrides + config split Ports reasoningEffortOverride and modelCapabilityOverrides from the Copilot Chat extension to the Copilot CLI agent-host provider, and splits Copilot-CLI-specific root-config keys into a dedicated schema. - New settings chat.agentHost.reasoningEffortOverride and chat.agentHost.modelCapabilityOverrides (experimental/advanced), forwarded into the local agent host root config. - New copilotCliConfig module owns CLI-only keys; opus48Prompt, enableCustomTerminalTool, rubberDuck moved out of the shared schema (wire strings unchanged, so persisted config stays valid). - Reasoning-effort override applied at session create and mid-session model change; family alias applied for prompt routing only (wire model id untouched). - Shared AgentHostRootConfigForwarder de-duplicates the settings->root-config forwarding (schema gate, hydration retry, cross-window loop guard). * agentHost: consolidate CLI setting IDs, extract sandbox forwarder, trim comments - Move the chat.agentHost.* Copilot-CLI setting IDs into copilotCliConfig.ts beside their root-config keys; rename the prompt contribution to AgentHostCopilotCliSettingsContribution. - Extract the sandbox settings forwarding into AgentHostSandboxForwarder. - Trim verbose doc/inline comments across the changed agent-host files. * agentHost: revert comment-only changes in agentHostSandboxForwarder (keep import change only) * agentHost: clarify reasoning-effort override wording (recognized level vs model-supported)github.com-microsoft-vscode · 4919fddd · 2026-07-06
- 1.0ETVSurface Agent Host (Copilot CLI) sessions in the Chat Debug Logs panel (#321809) Adds a core-side IChatDebugLogProvider that reads each Agent Host Copilot CLI session's on-disk events.jsonl and converts the records into debug-panel events, reconstructing the user -> model-turn -> tool-call trajectory tree. Local and remote (remote-<authority>-copilotcli) agent-host sessions are made debug-eligible, historical local sessions are discovered for the home list, and the currently-viewed session's events.jsonl is watched for live refresh. Usage reporting: - Session-cumulative input/cache tokens and Copilot AIU are back-filled from the session.shutdown summary onto model-turn events so the Summary tiles sum exactly; in-progress sessions fall back to live AHP session-state usage. Lifecycle: - Add IChatDebugService.onDidEndSession so the provider can dispose its live file watcher when the session it follows is closed.github.com-microsoft-vscode · 532673ae · 2026-06-17
- 0.9ETVAdd per-model system-prompt registry for Copilot agent-host sessions (#321864) * Add per-model system-prompt registry for Copilot agent-host sessions Introduces a prompt registry (mirroring the Copilot extension's PromptRegistry/IAgentPrompt) so Copilot CLI agent-host sessions resolve their SDK system message per model instead of a single hardcoded constant. First contributor: a Claude Opus 4.8 resolver applying customize-mode section overrides, opt-in via the new chat.agentHost.opus48Prompt.enabled setting (forwarded into the local agent host root config). Forwarding is registered for the VS Code workbench only, not the Agents window. * Address PR review: empty section overrides fall back to default; strongly type test schema helper - promptRegistry: treat an empty resolveSectionOverrides() result as 'no override' so the default identity customization is preserved instead of emitting customize-mode with empty sections. - agentHostCopilotPromptContribution.test: import ConfigPropertySchema and type makeRootStateWithSchema, removing the unsafe Record<string, never> cast. - agentHostPromptRegistry.test: add regression test for the empty-overrides fallback. - anthropicPrompt: lead the Opus 4.8 tone append with a newline so it doesn't run on from the SDK foundation tone.github.com-microsoft-vscode · 17e40350 · 2026-06-20
- 0.6ETVAdd setting to keep shorter context option for free long-context models (#324650) Gates the collapse-to-long-context-only behavior behind the new github.copilot.chat.preferLongContext.enabled setting (default off), so models with a free long context window (e.g. Claude) show both the default and long context options again. Covers the main chat picker, CLI picker, and the Agents window. Fixes #323936 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · b664e8ae · 2026-07-08
- 0.6ETVExternal ingest: harden finalize against 412 phase mismatch (#322254) * External ingest: harden finalize against 412 phase mismatch Fixes the "Build Codebase Semantic Index" failure for non-GitHub repos where `/external/code/ingest/finalize` returns HTTP 412 ("request sent for phase which was not the current phase"). The server only advances to the finalize phase once it has received every expected document, so a finalize can fail when the server is still missing documents. - Retry finalize with backoff (bounded) after a 412, re-polling `/batch` for documents the server still reports as missing and re-uploading them. - Stop swallowing per-document upload failures: collect them and fail the pass with a descriptive error (status + requestId) before finalize, so the real cause is surfaced instead of a misleading finalize 412. Failed uploads are no longer counted as uploaded. - Make a `/document` 404 ("ingest is gone") abort the pass deterministically rather than relying on a rejection an intermediate `Promise.all` can swallow. - When finalize keeps returning 412 but the server reports no missing documents, surface a distinct "likely server-side" error after retries. Adds an ExternalIngestClient test suite driving the real client through the ingest HTTP protocol (retry-then-success, re-upload still-missing, exhaustion, server-side-no-missing-docs, persistent upload failure, and 404 abort). Refs microsoft/vscode#320915 * Use fake timers for finalize-retry tests; count unique uploaded docShas - Test suite uses fake timers so finalize-retry backoff doesn't add real wall-clock time - Record unmapped docSha as a deterministic upload failure instead of throwing (rejection was swallowed by Promise.all) - updatedFileCount counts unique uploaded docShas across passes instead of summing per-pass attempts - Add test for the unmapped-docSha failure path * Fix externalIngest tests failing in CI without a GitHub token createPlatformServices() wires a static auth service backed by createStaticGitHubTokenProvider(), which throws when no GITHUB_PAT/GITHUB_OAUTH_TOKEN is set (CI). Override IAuthenticationService with a static token so getAuthToken() resolves deterministically. Verified by running the suite with the token env vars unset.github.com-microsoft-vscode · 49d32125 · 2026-06-22
- 0.6ETVWire up universal tool_instructions for agent host prompts (#322507) * Wire up universal tool_instructions for agent host prompts * Address review follow-ups for universal tool_instructionsgithub.com-microsoft-vscode · e4fa1d34 · 2026-06-23
- 0.6ETVFix stale background compaction across model switches and /compact (#317163) The `_backgroundSummarizers` map on `AgentIntent` is keyed only by sessionId, so a summary kicked off against one model's prefix could be applied unconditionally on the next render — even after the user switched to a model with a larger context window or ran `/compact`. The user saw a 'Compacted conversation' notice on a turn with plenty of headroom, with content summarized against the old model's history. * `BackgroundSummarizer` now records the `endpointModel` it was built for. * `AgentIntent.getOrCreateBackgroundSummarizer` cancels and recreates the summarizer if the endpoint identity changed since last call. * `handleSummarizeCommand` (`/compact`) cancels any pending background summarizer once we commit to foreground compaction. * Pre-render apply now gates on `contextRatio >= applyMinRatio` (0.65) as defense-in-depth — covers context-size overrides and any path that slips past the endpoint check. Stale completed results are consumed-and-discarded so a fresh kick-off can replace them.github.com-microsoft-vscode · 15bd7994 · 2026-05-23
- 0.6ETVFix Anthropic 400 on empty-text thinking blocks (#320196) Track redacted-ness with an explicit flag instead of inferring it from missing text. A regular thinking block with an empty text field but a valid signature (display: "omitted" or pruned) was misclassified as redacted_thinking and shipped the signature in the data field, which Anthropic rejects with "Invalid 'data' in 'redacted_thinking' block".github.com-microsoft-vscode · e50398f8 · 2026-06-06
- 0.6ETVReject path traversal in Create Workspace file tree (#318057) - fileTreeParser: reject node names that are empty, '.', '..', or contain '/' or '\\'; throw on unsafe project root names. Filters unsafe child node names from the parsed tree. - newWorkspaceFollowup: replace the platform-aware path.relative destination computation (which resolved a relative projectRoot against process.cwd() on Windows) with a posix prefix-strip helper, resolveProjectFileUri. Add a runtime isUriContained guard before writeFile so any traversal that slips past the parser cannot escape the generated workspace folder. - Tests: cover unsafe node names, the PoC tree, isUriContained edge cases (prefix collision, scheme/authority, trailing slash), and resolveProjectFileUri for both copilot and GitHub repo-template path shapes.github.com-microsoft-vscode · 3027c82e · 2026-05-22
- 0.5ETVKeep historical user messages cache-safe (#315194) When a historical turn was missing RenderedUserMessageMetadata (older sessions, freeze-not-fired paths), AgentUserMessage fell through to the current-turn render path and embedded live workspace state (<editorContext>, terminal, todos, reminderInstructions) into a past user message, breaking the prompt cache prefix on every request. - AgentUserMessage now delegates to AgentUserMessageInHistory in this fallback, matching what the other history renderers already do. - Thread userQueryTagName through AgentUserMessageInHistory and AgentConversationHistory so historical turns honor model-specific tag names (e.g. <user_query> for Grok).github.com-microsoft-vscode · 80b2b692 · 2026-05-08
- 0.5ETVWarn when changing model/options mid-session breaks the prompt cache (#323594) chat: warn when changing model/options mid-session breaks the prompt cache The model and options pickers surface a cache-break cost hint when the chat session's prompt cache is warm — switching the model or changing options mid-session resets that warm cache and may increase cost. The hint includes a "Learn more" link (rendered via the shared Link widget through a new optional headerLink on the action list header banner) pointing at the Copilot docs on optimizing AI usage. Warmth is derived directly from the session's request history at the picker rather than tracked in a parallel in-memory map: getRequests() length for the default chat, and session status leaving Untitled for agent-host sessions. Both warm as soon as the first request is sent, so the signal is drift-free and consistent across surfaces — it covers reloaded/restored sessions, every request path, and the agents window. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · d9c7d78c · 2026-07-01
- 0.5ETVfeat: add per-model capability overrides for advanced configuration (#317237)github.com-microsoft-vscode · d8e88906 · 2026-05-19
- 0.4ETVFix cache break hint when models are unavailable (#325444)github.com-microsoft-vscode · d40305ca · 2026-07-11
- 0.4ETVRegression: Fix execution subagent model setting being ignored (#320231) (#320479) * Fix execution subagent model setting being ignored (#320231) getChatEndpoint(string) regressed in the copilot-utility rename (ef061ccb0fc): the string branch only resolved the two utility families and threw 'Unrecognized chat endpoint family' for anything else. The execution and search subagents pass their *.model override (e.g. gemini-3-flash) straight to getChatEndpoint(), so the throw was caught and they silently fell back to the parent model. Restore arbitrary CAPI family resolution via a new _resolveFamily() that routes utility families to their dedicated resolvers and any other family through getChatModelFromCapiFamily(). Adds a regression test. * Widen getChatEndpoint to accept CAPI family strings; drop casts Addresses PR review: the public IEndpointProvider.getChatEndpoint only typed its family parameter as ChatEndpointFamily (the two utility aliases), so valid CAPI families like gemini-3-flash required unsafe casts and the contract was misleading. Introduce ChatModelFamily (utility aliases | any CAPI family string, preserving literal autocomplete) and use it for the public API, removing the casts in the execution/search subagents and the regression test. * Guard search subagent against non-tool-calling configured models Council review found the search subagent resolved its configured chat.searchSubagent.model and used it directly, without the supportsToolCalls guard the execution subagent already has. Since this PR makes arbitrary CAPI families resolve (instead of throwing and falling back), a resolvable-but-non-tool-calling search model would run the search subagent with its tools stripped by interceptBody. Mirror the execution subagent: fall back to the parent endpoint when the resolved model can't call tools.github.com-microsoft-vscode · be3152e6 · 2026-06-08
- 0.4ETVOptimize prompt cache hit rate by freezing deferred tool list in initial context (#312577) Move deferred tool list out of system prompt for cache hit rategithub.com-microsoft-vscode · 602d64e0 · 2026-04-26