Ulugbek Abdullaev
90d · built 2026-08-09
90-day totals
- Commits
- 95
- Grow
- 17.4
- Maintenance
- 11.0
- Fixes
- 16.6
- Total ETV
- 45
Where this dev ranks
Percentile against the global top-100 leaderboard (all-time totals).
- By commits
- Top 56 %
- By Growth share
- Top 35 %
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).
↑+7.1 %
vs 42 prior
↓-0.8 pp
recent vs prior
↑+40.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.
- 3.0ETVautomations: add agent tools to manage automations (#327110) * Agents: add automation management tools Expose reviewed list, configure, and delete automation tools in the Agents window, with explicit destructive confirmation and cross-window atomic persistence. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 02b3fd55-54ff-4d38-93b9-08bfa69ee95f * Address automation tool review feedback Require the explicit delete confirmation, share the browser storage database and fallback, use single-key reads, and prevent automation dialogs from mutating workspace recents. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 02b3fd55-54ff-4d38-93b9-08bfa69ee95f * Strengthen automation storage review coverage Document IndexedDB CAS semantics and cover key isolation across application, shared, profile, and workspace storage scopes. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 02b3fd55-54ff-4d38-93b9-08bfa69ee95f * Preserve browser storage encapsulation Expose narrow application-storage read and CAS operations instead of the IndexedDB backing interface. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 02b3fd55-54ff-4d38-93b9-08bfa69ee95f * Honor automation tool approval settings Use the resolved tool approval decision to apply auto-approved automation changes directly while retaining interactive review and cancellation paths. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 02b3fd55-54ff-4d38-93b9-08bfa69ee95f * Document automation service contracts Clarify guarded update conflicts, mutation semantics, and the resolved tool approval reason exposed to implementations. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 02b3fd55-54ff-4d38-93b9-08bfa69ee95f * Refine agent automation workflow Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 02b3fd55-54ff-4d38-93b9-08bfa69ee95f * Honor Allow all for client tools Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 02b3fd55-54ff-4d38-93b9-08bfa69ee95f --------- Copilot-Session: 02b3fd55-54ff-4d38-93b9-08bfa69ee95fgithub.com-microsoft-vscode · 7cfa613a · 2026-07-24
- 3.0ETVAgents: Fix automation branch picker (#325777) * Sessions: Make repository setters asynchronous Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: f5aa3878-217b-45dc-9b52-0b5091ddf707 * Agents: Fix automation branch picker Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: f5aa3878-217b-45dc-9b52-0b5091ddf707github.com-microsoft-vscode · c7f9ddca · 2026-07-15
- 2.3ETVAgents: Support workspace-less automations (#326315) Add workspace-less Automation targets, unify workspace selection, reuse headless quick-chat creation, and model persisted targets as discriminated unions. Copilot-Session: 7600152c-d485-4547-bd86-dd21ad05debd Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · e8bf36ec · 2026-07-18
- 1.9ETVnes-datagen: add cursor-jump (NCLP) sample task (#320113) * nes-datagen: add cursor-jump (NCLP) task Extend nes-datagen with a next-cursor-line prediction task alongside the existing xtab path. Detects the user's next intentional cursor move after the request bookmark and emits a training sample with the production cursor-prediction prompt + the observed jump as the expected response. Three sub-modes via --sample-task: - cursor-same-file: a jump farther than N lines from cursor at request time - cursor-cross-file: focus/selection on a different file - cursor-both: either of the above Reuses the production cursor-prediction prompt by capturing it via the telemetry builder and a no-op fetcher; the cross-file target line is resolved from a request-time content snapshot + post-request replay so previously-opened targets get a correct line number instead of being silently labelled :0. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: replace SAMPLE_TASK_VALUES tuple with a string enum Convert the string-union + as-const tuple to a proper NesDatagenSampleTask string enum. CLI surface is string-enum members keep theunchanged kebab-case wire values ('xtab', 'cursor-same-file', ...). All consumers (dispatch, fixtures, response metadata typing) updated to reference enum members instead of string literals. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: lower default --same-file-jump-min-above to 2 Upward cursor jumps (back to a definition, an import, etc.) are typically tighter than downward jumps after the user has been writing. Lower the default threshold to match. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: rename NCLP to cursor-jump throughout Drop the NCLP abbreviation in favor of the more descriptive 'cursor-jump' name already used in the production xtab provider. cursorJumpPromptStep, cursorJumpResponseStep), the capture request ids, and all surrounding doc comments / test descriptions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: build documentIndexMapping from whole recording path map from only the pre-request slice and then re-walked the post-request slice to backfill any documentEncountered entries that arrived later. Pass the whole recording into documentIndexMapping instead so the helper sees every document the user touched in a single pass; the backfill loop is gone. splitRecordingAtRequestTime now also returns the full entries array so both callers can reuse it without re-deriving it from altAction. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: use shared Result type in cursor-jump detectors Drop the bespoke { ok, value | reason } discriminated union in detectJump.ts and reuse the existing Result<T, E> from src/util/common/result. JumpDetectionResult<T> is now just an alias for Result<T, string>. .isOk(), .err) and the spec file accordingly. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: strip raw cursor-jump prompt from emitted telemetry cursorJumpRawMessages and cursorJumpKeptRange were added to IStatelessNextEditTelemetry so in-process debug / datagen tooling could read them back via getStatelessNextEditTelemetry(). However LlmNESTelemetryBuilder.build() spreads ...this._statelessNextEditTelemetry into the emitted payload, so those two fields would leak to telemetry cursorJumpRawMessages can contain full prompt content (sourcesinks code), which must never leave the process. Destructure them out before spreading into the build() payload. They remain readable via getStatelessNextEditTelemetry() for tooling. Documented the privacy contract on the IStatelessNextEditTelemetry field declarations so future edits don't forget. Addresses copilot-pull-request-reviewer feedback on PR #320113. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: fail cross-file detection when no selection lands on target detectCrossFileJump previously returned Result.ok with toLine undefined when only a focused event was seen for the target doc (no selectionChanged). That left generateCrossFileResponse to drop the sample later while the detector still reported a successful jump. Treat focused-without-selectionChanged as a failed detection ('crossFileTargetNoSelection') so callers can skip early, and tighten ICrossFileJump.toLine to non-undefined now that ok results always have a usable line number. Removes the dead error path in generateCrossFileResponse. Adds a regression test that focused-only triggers the new error. Addresses copilot-pull-request-reviewer feedback on PR #320113. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: capture cursor-jump prompt via logContext, not telemetry The datagen pipeline previously stashed the raw cursor-jump prompt and keptRange on IStatelessNextEditTelemetry so cursorJumpPromptStep.ts could read them back via LlmNESTelemetryBuilder.getStatelessNextEditTelemetry(). That leaked raw prompts into the telemetry payload (worked around by a destructure-strip hack in LlmNESTelemetryBuilder.build()) and was asymmetric with the xtab path, which captures via InlineEditRequestLogContext.rawMessages. Move the cursor-jump capture vehicle onto InlineEditRequestLogContext to match xtab: - Add cursorJumpRawMessages / cursorJumpKeptRange fields and setCursorJumpPrompt(messages, keptRange) to InlineEditRequestLogContext. - XtabNextCursorPredictor.predictNextCursorPosition now takes a logContext parameter and writes to it directly. The xtabProvider callsite passes the same logContext it already had in scope. - cursorJumpPromptStep reads from logContext instead of the telemetry builder. - Remove cursorJumpRawMessages / cursorJumpKeptRange from IStatelessNextEditTelemetry, plus the corresponding setter/getter on StatelessNextEditTelemetryBuilder and the getter on LlmNESTelemetryBuilder. - Revert the destructure-strip hack in LlmNESTelemetryBuilder.build(). The pre-existing cursorJumpPrompt telemetry field (JSON-stringified, fed by setCursorJumpPrompt(messages)) is intentional and unchanged. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: cursor-jump ground truth is first user EDIT, not cursor landing Selection-based detection treated peek, navigation, IDE auto-scroll, and recursive cursor settling as if they were the user's next intended edit location. The model's job is to predict where the user will EDIT next, so key off the first 'changed' event after the request bookmark instead. Same-file detector: - Walks for the first 'changed' on the active doc; uses the first edit's start offset to compute toLine; applies the linesAbove/linesBelow threshold. Bails with editsAnotherFileFirst when a non-active doc is edited first (lets the cross-file detector claim the sample in cursor-both mode). 'selectionChanged' is no longer consulted, so the settle-after-edit filter is gone it was a workaround for thetoo selection-based approach. Cross-file detector: - Walks for the first 'changed' on a non-active doc; uses the first edit's start offset, resolved against the target doc's snapshot just-before applying the event. Drops focused / selectionChanged heuristics and the crossFileTargetNoSelection error path (a focused event without an edit no longer counts; background peek can't pollute the dataset). buildLineResolver: tightened i <= entryIndex to i < entryIndex so the resolver returns the pre-edit line when entryIndex is itself a 'changed' event. The bound is equivalent for the old selectionChanged caller. Spec: switched ground-truth events from selChanged to changed; added coverage for first-edit-of-multi-edit, editsAnotherFileFirst, and active-doc-then-other-doc ordering. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * xtab: predictNextCursorPosition takes RequestTracingContext Every other helper in xtabProvider takes RequestTracingContext (the { tracer, logContext, telemetry } bundle). The cursor predictor was the odd one out, taking the three pieces as separate positional params with the latter two that asymmetry made the new logContext-captureoptional plumbing look more invasive than it is and forced an awkward ?.setCursorJumpPrompt chain at the use site. Switch the predictor to take RequestTracingContext directly: - Export RequestTracingContext from xtabProvider so the predictor can type-import it (TS-erased to avoid the runtime circular import). - predictNextCursorPosition signature collapses from 5 params to 3. - Drop the optional chains; tracing.telemetry / tracing.logContext are always present in production and the spec constructs a real bundle. - Spec adds a createTestTracingContext helper using the cheap InlineEditRequestLogContext / StatelessNextEditTelemetryBuilder constructors already used by other inlineEdits specs. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: rename splitRecording 'entries' field to 'wholeRecording' Review feedback: the field on the splitRecordingAtRequestTime return shape was named 'entries' but in context it carries the whole unsplit recording (i.e. before slicing into prior/after parts). 'wholeRecording' matches the comment at the consumer (documentIndexMapping callsite). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: inline JumpDetectionResult<T> as Result<T, string> Review feedback: the one-line alias was used in exactly two places in the same file and gave nothing over the underlying Result type. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: discriminated union for sample task + jump metadata Review feedback: ISampleMetadata had 'task' + an optional 'jump' field with toFilePath also optional. That let xtab samples accidentally carry a jump and let cursor-cross-file samples omit toFilePath. Replace with a discriminated union on task: - xtab: no jump - cursorSameFile: jump with fromLine/toLine/distance - cursorCrossFile: jump with required toFilePath assembleSample now takes a single SampleClassification arg, removing the parallel task/jump parameters that callers had to keep in sync. cursorJumpResponseStep is split into ISameFileGeneratedResponse and ICrossFileGeneratedResponse so the generator return types map cleanly to the union variants without a non-null assertion at the assembly site. DetectedJump no longer needs an assistantTask hint: the pipeline constructs the classification directly from the response shape. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix dup import * nes-datagen: address round-4 review feedback on pipeline.ts Five review threads on pipeline. all addressed in-place.ts - modelResponse: cursor samples were emitting an empty string for the expected response. Populate it with the assistant content (which IS the expected output) so downstream tooling has the gold label. - Promise.all unbounded throws: wrap the limiter callback body in try/catch so an unexpected exception from generateCursorPromptFromRecording becomes a recorded per-row error instead of aborting the whole batch via Promise.all's first-rejection semantics. - Inline import for OffsetRange: replace the inline import('...').OffsetRange type expression with a regular top-of-file import. - Duplicated config-override block: both pipelines applied the same applyConfigFile + four setConfig debounce/cache disables. Extract into applyBatchModeConfig(configService, configs) and call from both. - runInputPipeline parallelism + memory: add a doc comment clarifying that this is the single-process entry point, that cursor-jump tasks also benefit from runInputPipelineParallel (--sample-task is propagated to workers), and that loadAndParseInput is in-memory by design (sized per worker; use --parallelism > 1 for large inputs). Full architectural unification of the parallel and non-parallel paths is intentionally left as a follow- the surface area isup large and out of scope for this PR. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes-datagen: add e2e tests for cursor-jump pipeline Mirrors the existing xtab pipeline.e2e.spec.ts: drives two fixture rows (a same-file jump and a cross-file jump) through the full `runInputPipeline` for each `sampleTask` mode (cursor-same-file, cursor-cross-file, cursor-both) and asserts on the JSONL output. Coverage: - only the matching row is emitted per mode; both rows are emitted in cursor-both - emitted samples carry strategy=next-cursor-line-prediction and the correct discriminated `task` field (cursor-same-file / cursor-cross-file) - assistant message targets the jumped-to line / file - metadata.modelResponse mirrors the assistant content (the round-4 fix) - --row-offset is reflected in metadata.rowIndex Test fixtures are constructed in `fixtures/cursorJumpFixtureData.ts` with synthesized recordings: an explicit no-op edit + selectionChanged before the bookmark so the cursor-prediction path's recent-edit gating is satisfied, then a single post-request `changed` event the detector picks up. The cursor pipeline needs a prompting strategy whose response handler tolerates an empty stream — use `xtabUnifiedModel` in a dedicated `cursorJumpConfig.json` (the existing patchBased02 config crashes on empty output, which is acceptable in production but breaks the prompt-only capture path). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Strengthen cursor-jump e2e assertions Replace fuzzy matchers (toMatch(/25/), arrayContaining for tasks) with exact assertions on assistant content, metadata.task, and metadata.jump. In cursor-both, locate samples by filePath so a row→classification swap would now be caught instead of passing. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Make cursor-jump e2e helper accept partial nesDatagen overrides Helper previously took Partial<RunPipelineOptions>; if a caller passed `nesDatagen`, the spread fully replaced the default block and the configured path. Now the helper accepts a partial nesDatagen overlay and merges field-by-field, so the row-offset test only specifies the two fields it actually changes and there are no non-null assertions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add within-threshold cursor-jump negative fixture Scenario C: cursor on line 10, post-request edit on line 12 (only 2 lines below). Default threshold is ±5 lines, so neither the same-file nor the cross-file generator should emit a sample for this row. Asserted in cursor-both via a dedicated 'does not emit a sample for the within-threshold row' test, and implicitly in cursor-same-file / cursor-cross-file (their existing count==1 assertions would fail if the threshold guard regressed). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Ulugbek Abdullaev <ulugbekna@github.com>github.com-microsoft-vscode · a3e359ab · 2026-06-12
- 1.7ETVnes-datagen: generate training data from continuous recordings (#323855) * utils: document binarySearch * nes-datagen: generate training data from continuous recordings Continuous enhanced telemetry now ships sliding-window recordings that, unlike per-request alternative-action recordings, carry no requestTime. The datagen pipeline needs a point to split each recording into edit history before/after, so this adds a pluggable pivot strategy (starting with Random, selectable via --pivot-strategy) and a new continuous/ pipeline module that replays a recording at the chosen pivot to produce a processed row. Along the way this consolidates the pipeline's error and index handling: a shared WithRowIndex<T> replaces the ad-hoc { originalRowIndex, ... } pairs, per-record processing returns Result<IProcessedRow, Error> instead of field-presence unions, and failures surface as original Error objects (no string round-tripping). The telemetry sender's continuous payload is now the documented IContinuousRecording type. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * nes-datagen: label alt-action replay errors by originalRowIndex Address PR review: the alternative-action path mislabeled diagnostics when earlier records failed to parse. - processAllRows: push replay errors with the row's true `originalRowIndex` instead of its position in the filtered `rows` array (parse failures make `rows` sparse, so the two diverge). - loadAndProduceProcessedRows: resolve `languageForRow` via an `originalRowIndex`-keyed Map rather than positional `rows[i]`, matching how callers pass `e.originalRowIndex`. - Clarify the `recordCount` doc: it counts successfully-parsed records (parse failures are counted separately in `parseErrors`). - Add a regression spec asserting replay errors carry the row index, not the array position. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 6bd7400f · 2026-07-01
- 1.5ETVnes: generate samples from workspace recordings (#328095) * nes: feat: generate samples from workspace recordings Parse stateful local workspace recordings, select deterministic user-edit and cursor pivots, materialize privacy-safe replay slices, and support bounded parallel datagen without splitting raw timelines. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 62cca64b-0581-410e-ab89-034e20f02ca7 * nes: fix: include cursor boundaries in sample deduplication Hash the complete post-pivot label so identical prompts with different cursor destinations are rejected as conflicting samples. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 62cca64b-0581-410e-ab89-034e20f02ca7 * nes: fix: consolidate workspace recording imports Use inline type specifiers so the Copilot extension lint job accepts the new workspace-recording modules. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 62cca64b-0581-410e-ab89-034e20f02ca7 --------- Copilot-Session: 62cca64b-0581-410e-ab89-034e20f02ca7github.com-microsoft-vscode · 1516e1ad · 2026-07-29
- 1.3ETVnes: fix: compose complete recording oracles (#329454) * nes: fix: compose complete workspace recording oracles Compose raw workspace changes before applying the configurable disjoint-edit limit. Include accepted completion chains and omit targets that are later continued across recording, generated, idle, or cursor boundaries. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: f23381fa-6246-44d2-a0a3-167c28272a57 * nes: fix: group nearby workspace recording edits Treat cursor moves as soft oracle boundaries when user-intent edits continue nearby in the same document. Preserve distant and idle cursor boundaries so coherent multi-edit episodes remain grouped without crossing into unrelated work. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: f23381fa-6246-44d2-a0a3-167c28272a57 * nes: fix: omit empty workspace oracles Drop workspace-recording candidates whose collected operations compose to no net edit, such as typing and then deleting the same character. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: f23381fa-6246-44d2-a0a3-167c28272a57 * nes: fix: share composed oracle policy across formats Apply compose-before-limit oracle collection to alternative-action and continuous inputs, including idle and cursor locality boundaries, no-op filtering, restore handling, and parallel CLI propagation. Preserve workspace-specific source classification and end-of-recording rules. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: f23381fa-6246-44d2-a0a3-167c28272a57 --------- Co-authored-by: Dmitriy Vasyura <dmitriv@microsoft.com> Copilot-Session: f23381fa-6246-44d2-a0a3-167c28272a57github.com-microsoft-vscode · 68e1826d · 2026-08-06
- 1.2ETVautomations: add "run automation" command (#327549) * Add agent tool to run automations Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: f0a7297f-31b1-40f9-af96-c125c9f90f1c * Claim automation run slots atomically The active-run guard was check-then-act: `getActiveRunFor` read the local observable, then `recordRunStart` unconditionally appended a run row inside the ledger CAS. A losing swap just retried and committed a second run, so two agents, an agent and the Run now button, or two windows could all start the same automation concurrently. `recordRunStart` now re-checks for an active run inside the same mutate callback that writes the run, and returns an `IAutomationRunClaim` reporting whether it won the slot. Because the callback re-runs against freshly read storage on every CAS retry, at most one caller can claim an automation. `runOnce`'s `whenDispatched` now resolves to an `IAutomationRunDispatch` discriminated union instead of `void`, so callers learn the outcome directly rather than inferring it by diffing run IDs afterwards. Both the run tool and the Run now button were rewritten on top of it, which also removes their racy post-hoc lookups. The claim happens after the deleted-automation and target-available checks, since claiming writes to storage and there is no release mechanism. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: f0a7297f-31b1-40f9-af96-c125c9f90f1c --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: f0a7297f-31b1-40f9-af96-c125c9f90f1cgithub.com-microsoft-vscode · 137908c2 · 2026-07-27
- 1.2ETVSupport system-wide (OS global) keybindings (#323871) * Add support for system-wide (OS global) keybindings Allow user keybindings in keybindings.json to be marked with "systemWide": true so they register as operating-system global shortcuts that fire even when the window is not focused. - Thread the systemWide flag through IUserFriendlyKeybinding, ResolvedKeybindingItem and KeybindingIO (read + serialize) - New GlobalKeybindingsMainService owns Electron's globalShortcut, reconciles per-window registrations, resolves conflicts deterministically and routes triggers through the existing vscode:runAction path - New renderer contribution syncs opted-in bindings to the main process, gated behind the experimental, off-by-default setting keyboard.enableSystemWideKeybindings with a one-time confirmation dialog - Enable the GlobalShortcutsPortal feature on Linux/Wayland Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Avoid focusing the routing window on system-wide keybinding trigger Force-focusing the routing (main) window before dispatching the command pulled it to the foreground even when the command opens/reveals a different window (e.g. openAgentsWindow reveals the agents window), producing a visible flicker. Remove the force-focus and let the invoked command control what is surfaced/focused, matching every other vscode:runAction sender. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Add workbench.action.focusWindow to raise the current window Adds a generic command that brings the current window to the foreground and focuses it using FocusMode.Force (which works even when the application is not the active app). This lets users compose system-wide keybindings via runCommands to reveal the window before running a command that surfaces UI in it, e.g. [workbench.action.focusWindow, workbench.action.quickOpen]. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Address Copilot review: schema default, mnemonic comment, test grammar - keybindingService.ts: correct 'systemWide' schema default to false to match KeybindingIO parsing (defaults to false when absent/invalid) - systemWideKeybindings.contribution.ts: add '&& denotes a mnemonic' translator comment to the Enable button label - keybindingEditing.test.ts: fix test title grammar (a user) Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Always enable system-wide keybindings; drop the enablement setting Removes the experimental `keyboard.enableSystemWideKeybindings` setting so the feature is always active: any user keybinding with "systemWide": true is a candidate. The one-time confirmation dialog is retained and now serves as the opt-out - its Enable/Disable choice is persisted as a tri-state consent (unset -> ask, granted -> register, denied -> stay off and never re-ask). Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> * Make the first-run dialog an informational notice, not a permission prompt The system-wide keybindings feature is always on, so the first-run dialog no longer needs to grant/deny permission. Replace the Enable/Disable confirm dialog with a single-button informational notice ("I Understand") shown once before the first registration. Collapses the tri-state consent to a boolean acknowledged flag; the feature has no decline path, so there is no stuck off-state. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · dd611853 · 2026-07-01
- 1.2ETVquick chats: fix: show within Chats section instead of random UUID dirs (#327629) agents window: keep workspace-less quick chats out of bogus workspace groups Automation-created quick chats (and any quick chat seen after a reload or a list refresh) rendered in the sessions sidebar under a section header labelled with a raw session UUID instead of under "Chats". Whether a session is a quick chat cannot be derived from its working directory -- the host assigns workspace-less sessions a throwaway scratch cwd at ~/.copilot/chats/<sessionId> -- so it travels as an `agentHost.workspaceless` marker on the generic `_meta` bag. `AgentService.listSessions()` overlays it correctly, but the AHP `root/listSessions` round-trip dropped `_meta` on both ends, so any session first materialized from a listing was classified as a workspace session rooted at that scratch dir. `notify/sessionAdded` does carry `_meta`, which is why a fresh quick chat looked right until the next refresh. - carry `_meta` on the `listSessions` wire item (server) and map it back (client -- the only IAgentConnection implementation, so this covers the local host too) - infer workspace-less in `_buildInitialSummary` from `config?.` so a `createSession()` with no config matches what the agents themselves infer - make the adapter session-kind monotonically promotable instead of frozen at construction, so a mis-classified session heals when an authoritative `_meta` arrives, and report the promotion even when the workspace was already undefined so the list regroups - persist the healed kind by overlaying the adapter live quick-chat state in `_persistCache`, so a stale snapshot cannot resurrect the mis-classification The provider tests could never have caught the wire drop -- the mock host returns its stored metadata verbatim, bypassing both mappers -- so the wire regression tests live at the protocol layer, and the provider tests cover the promotion and the cache round-trip. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: c93359f3-9a7d-411d-9adb-21bdda78c6afgithub.com-microsoft-vscode · e823aaba · 2026-07-27
- 1.1ETVsessions: fix: put agent-created sessions in correct repository (#328375) * agentHost: fix: group linked-worktree sessions by repository Resolve the primary Git worktree as the canonical repository identity while preserving the selected checkout as the source for ignored include files. Migrate persisted repository metadata for sessions created before the fix. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: f3a1b843-be4c-447d-8aa6-8289d6aa760e * agentHost: fix: skip probes for missing session worktrees Use persisted repository metadata directly when cleanup has removed an archived session's working directory. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: f3a1b843-be4c-447d-8aa6-8289d6aa760e --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: f3a1b843-be4c-447d-8aa6-8289d6aa760egithub.com-microsoft-vscode · c90abb2b · 2026-07-31
- 1.1ETVFix persisted Agent Host MCP authentication (#327154) Restore persisted dynamic OAuth providers silently after extension host restarts while preserving consent and noninteractive client behavior. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 111cc987-c300-40e6-83f7-f5f524b35fedgithub.com-microsoft-vscode · 0fcfb104 · 2026-07-23
- 1.1ETVautomations: fix: automation startup readiness race (#326868) * Fix automation startup readiness race Defer automation runs until their session target and requested model are ready, then retry from deterministic readiness signals. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 2db12056-f41c-49ba-88e2-0c82044adf64 * Honor folder-specific session type readiness Recheck folder-scoped types while waiting for model readiness and use URI identity semantics in target availability tests. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 2db12056-f41c-49ba-88e2-0c82044adf64 --------- Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 68dfdd12 · 2026-07-22
- 0.9ETVnes: send periodic enhanced telemetry with overlapping recording windows (#319595) * nes: send periodic enhanced telemetry with overlapping recording windows Adds ContinuousEnhancedTelemetrySender which periodically ships a fixed-length slice (5 min) of DebugRecorder activity as an enhanced GH telemetry event, reusing the existing 'copilot-nes/provideInlineEdit' channel and tagging events with 'continuous: true' so the backend can route them. Adjacent slices are guaranteed to overlap by >= 30 s. With tick cadence INTERVAL = WINDOW - OVERLAP - HARD_CAP and a (idle, hard_cap) wait that mirrors the suggestion-anchored TelemetrySender, the slice always ends at a 'stable' moment so we don't capture mid-keystroke state. Slices with no actual edits are skipped. - DebugRecorder gains getLogInRange(from, to), with framing fast-forwarded so the emitted setContent reflects the document state at the slice start. - New experiment-gated setting chat.advanced.nes.continuousEnhancedTelemetry.enabled (default off). - Wired into InlineEditProviderFeature alongside TelemetrySender. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes: address PR review feedback - Fix config key mismatch: TS used 'chat.advanced.nes...' but package.json exposed 'chat.nes...', so user/experiment config was never read. Align the TS key with the package.json key. - Use DebugRecorder.getTimestamp() instead of Date.now() for the window end so edits whose recorded instant was bumped past Date.now() for total ordering aren't dropped at the boundary. - Drop unused 'at' parameter from the insertEdit test helper and clean up the call sites that were still passing a redundant timestamp. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes: drop config gate for continuous enhanced telemetry Per PR feedback: the existing GH enhanced-telemetry user controls are sufficient gating; no need for a dedicated setting. Removes: - chat.nes.continuousEnhancedTelemetry.enabled setting (package.json, package.nls.json, ConfigKey). - IConfigurationService + IExperimentationService dependencies from the sender; the loop now runs unconditionally for the sender's lifetime. - Two tests that exercised the config toggle. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes: clarify continuous telemetry semantics + drop misnamed field Subagent review findings: - Drop `activeDocumentRepository` for continuous events: a 5-min slice spans many docs over time, so there's no meaningful 'active' document. The full workspace repo set is reported via `repositories` already. - Rename `MAX_ENTRIES_BYTES` -> `MAX_ENTRIES_CHARS` (truth in advertising: it's `string.length` / UTF-16 code units, matching the existing suggestion- anchored recording cap). - Class-level doc: clarify that the overlap guarantee assumes timely scheduler execution; extension-host stalls / machine sleep / skipped empty slices can produce gaps. Treat `windowStart`/`windowEnd` as authoritative; don't infer contiguity from `sequenceNumber + 1`. - Doc that `sessionId` is per-sender-lifetime, and that the sender can be recreated within one extension session when `InlineEditProviderFeature`'s autorun reruns. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes: don't bump docVersion on selectionChanged in DebugRecorder Per PR review: `selectionChanged` entries have no `v` field in the schema (workspaceLog.ts:64), and production `WorkspaceRecorder` only bumps version on real document content changes via VS Code's model version. The replayer consumes `changed.v` directly when applying edits. Previously, `DebugRecorder` synthesized `v` and bumped it on every recorded event including selections, which produced phantom gaps in the `changed` version sequence (e.g. 2, 4, 5 instead of 2, 3, 4) that don't match what a real recording would contain. Fixed in both `getDocumentLog` and `getDocumentLogInRange`. Snapshot test updated; added a focused regression test asserting consecutive `changed` entries get consecutive `v` values regardless of interleaved selection changes. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes: drop caller reference from DebugRecorder.getLogInRange jsdoc Per PR review: low-level method docs shouldn't reference specific callers — they easily go stale. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes: clamp slice framing times + dedup upstream-remote helper Two PR review threads: 1. Slice framing times made misleading. `getDocumentLogInRange` was emitting `documentEncountered.time = creationTime` and `setContent.time = baseValueTime`, both of which can pre-date the requested `[fromTimeMs, toTimeMs]` window (a doc may have been open for hours). Now framing times are clamped up to `fromTimeMs` so the slice's per-event `time` contract holds. Documented the invariant and added a coverage test asserting every emitted time falls in range; updated the fast-forward test's expectation accordingly. 2. Upstream-remote extraction was copy-pasted in three places (twice in `nextEditProviderTelemetry.ts`, once in the new sender). Extracted to `getUpstreamRemote(repository)` in `platform/git/common/utils.ts` and reused everywhere. Behaviour preserved. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes: extract NES_GH_TELEMETRY_EVENT_NAME constant Per PR review: the literal 'copilot-nes/provideInlineEdit' was hardcoded in three call sites in nextEditProviderTelemetry.ts plus the new continuous sender. Extract into a named export from nextEditProviderTelemetry.ts (the file that already owns the event) and import it from the continuous sender so the relationship is explicit. Behaviour unchanged. Tests intentionally still use the literal string since they assert on the wire-level event name. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes: revert clamp of framing times in getDocumentLogInRange The clamp I added in b1d795c was wrong on three counts: 1. **Sort ambiguity**: clamping multiple docs' framing to `fromTimeMs` creates ties in the sortTime used by the cross-doc merge sort in `getLogInRange`. Ordering then depends on insertion order (i.e. map iteration order) instead of real time. Stable sort still preserves the per-doc framing-before-edits invariant, but the result becomes load-bearing on insertion order in a way the old code wasn't. 2. **Inconsistency with production**: `WorkspaceRecorder` (workspaceRecorder.ts:254) emits `documentEncountered`/`setContent`/ `opened` with their actual timestamps, never clamped to a window. The DebugRecorder slice should match that semantic. 3. **Worse for stitching**: with clamping, the same logical `documentEncountered` event gets a different time in each overlapping slice (fromTimeMs of that slice) — harder to dedup than the stable true creationTime. Revert the clamp; document that framing carries true creation/base-value times even when they pre-date `fromTimeMs`, and that consumers should treat any entry with `time < fromTimeMs` as framing. Drop the out-of-range test, restore the original setContent.time expectation in the fast-forward test. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * nes: harden continuous telemetry loop against subagent-found issues Subagent review (rounds: code-review HIGH + rubber-duck #2,#3,#8) found: 1. **Unhandled throw in _sendNow kills the loop forever.** RunOnceScheduler's runner has no try/catch, so an exception from JSON.stringify or the telemetry service would propagate out and never let reschedule() run. Fix: try/finally around _sendNow() so reschedule() always fires. Added regression test. 2. **cleanUpHistory() in getDocumentLogInRange races with fromTimeMs.** Cleanup uses getNow() - 5min as its cutoff. Between the caller computing windowEnd and the per-doc cleanup running, getNow() can advance enough that earliestTime > fromTimeMs, causing an edit at the leading edge of the requested range to be rotated into baseValue and dropped from the emitted slice. Fix: don't call cleanUpHistory() in this getter at all — the fast-forward loop already handles any base state, and the per-edit cleanup in handleEdit keeps memory bounded. 3. **Disposed idleStores accumulate in loopStore.** Calling idleStore.dispose() doesn't remove it from the parent's tracking Set, so dead inner stores leak one per ~4 min for the sender's lifetime. Fix: loopStore.delete(idleStore) instead. 4. **_sendNow() duration not in overlap math.** Added a doc caveat — the JSON.stringify cost is added to inter-send spacing but is well under 1 % of the 30 s overlap budget in practice. No code change. 5. **No test for doc opened after toTimeMs.** Added one. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 67ac0eef · 2026-06-12
- 0.9ETVNES: Generate scored edits with datagen (#329259) * nes: feat: generate scored edits with datagen Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 81ad9cfe-24c9-4793-a4f8-27de75510c82 * nes: fix: publish generated outputs transactionally Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 81ad9cfe-24c9-4793-a4f8-27de75510c82 --------- Copilot-Session: 81ad9cfe-24c9-4793-a4f8-27de75510c82github.com-microsoft-vscode · ba26e704 · 2026-08-05
- 0.8ETVFix inline edit cache telemetry attribution Preserve model attribution on cached inline edit results without copying request-specific telemetry. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 79a2259b-1b96-461c-969d-95ddb965f75dgithub.com-microsoft-vscode · 34f6e514 · 2026-07-13
- 0.8ETVsessions: prevent config controls flickering on Worktree toggle (#328130) * sessions: fix: prevent worktree config flicker Keep Agent Host configuration controls stable and visually unchanged while dynamic configuration resolves. Keep send ordering safe by waiting for the latest config resolution with draft cancellation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e84de7a6-6d5a-4714-97da-f33e82904a35 * sessions: fix: keep resolving controls fully inert Preserve the Worktree checkbox palette while resolving, disable permission dropdown keyboard activation, and correct the config-resolution comment. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e84de7a6-6d5a-4714-97da-f33e82904a35 * agentHost: fix: rebind local provider on start Rebind local session provider root, action, and notification listeners after the Agent Host protocol client starts so startup ordering cannot leave the session catalog empty. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e84de7a6-6d5a-4714-97da-f33e82904a35 --------- Copilot-Session: e84de7a6-6d5a-4714-97da-f33e82904a35github.com-microsoft-vscode · f1fbc55d · 2026-08-03
- 0.8ETVcopilot status bar hover: fix: status dashboard checkbox flicker (#325769) * Fix status dashboard checkbox flicker Keep the language completion tri-state synchronized with configured settings while preserving immediate feedback and serialized writes. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 089ad95e-853f-4c52-8a82-3b463b724cb8 * Fix status dashboard browser test Keep the regression test focused on the checkbox state, configured value, and override hint that this change owns. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 089ad95e-853f-4c52-8a82-3b463b724cb8 * Handle inherited completion overrides Remove language entries from every configured scope, resync the override hint after failed writes, and keep the browser regression test focused on owned state. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 089ad95e-853f-4c52-8a82-3b463b724cb8github.com-microsoft-vscode · 4980d698 · 2026-07-14
- 0.8ETVnes: fix: share in-flight speculative requests across concurrent calls (#327922) * nes: fix: share in-flight speculative requests across concurrent calls A speculative request is fired when a suggestion is shown, betting on the document state that results if the user accepts it. `consumePending()` nulled the pending slot as soon as the first `getNextEdit` caller claimed the request, so a second overlapping caller for the same post-edit state could not discover it and issued a duplicate model request — losing the latency win, the `ReusedRequestKind.Speculative` telemetry, and the `liveDependentants` sharing that keeps a joined request alive for multiple dependants. Rename it to `claimPending()` and keep claimed requests in a map until their `result` settles, so concurrent callers join the in-flight request instead. A map rather than a single slot: several speculatives can be claimed at once (e.g. one per document), and evicting one on the arrival of another would reintroduce the same bug. Claimed requests deliberately survive the "nobody will want this anymore" cancellation reasons (Replaced, Superseded, Rejected, IgnoredDismissed, trajectory divergence) since they have a live consumer; `invalidateClaimed()` still cancels them for reasons that invalidate the result itself (CacheCleared, DocumentClosed, Disposed). Also settle `firstEdit`/`result` in `_runSpeculativeProviderCall`'s outer catch. Previously a throw at the first `editStream.next()` left them unsettled forever, hanging any caller that reused the request — a pre-existing bug that the claimed map would otherwise widen into a permanent map entry. Behavior is unchanged when `inlineEdits.speculativeRequests` is off: the claimed map can only be populated via `_triggerSpeculativeRequest`, which is gated on the setting, so every new lookup degenerates to an empty-map no-op. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: b9cc340f-f2af-491d-a411-6e1c2c19583e * nes: test: cover speculative that throws before its first streamed edit The outer catch in `_runSpeculativeProviderCall` settles `firstEdit`/`result` so a caller reusing the request cannot hang, but nothing exercised it: every existing speculative test yields at least one edit or is cancelled. Add a `throwBeforeFirstYield` harness behavior and a regression test that claims such a speculative. `getNextEdit` rethrows the underlying error for `NoNextEditReason.Unexpected`, so the joiner rejects with the provider error instead of awaiting forever, and the released claim lets the following request recover with a fresh provider call. Verified to fail without the fix: the joining call times out after 8s. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: b9cc340f-f2af-491d-a411-6e1c2c19583e --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: b9cc340f-f2af-491d-a411-6e1c2c19583egithub.com-microsoft-vscode · ad6a5fe3 · 2026-07-28
- 0.8ETVAdd Adhoc Request Sender Mode with Tag Highlighting (#323100) * Agent Host changes for agents/adhoc-request-sender-mode-extension-55e2bb6f * Remove unconfigured react-hooks/exhaustive-deps eslint directive The eslint-disable directive referenced a rule that isn't registered in this repo's ESLint config, which caused ESLint to error with "Definition for rule 'react-hooks/exhaustive-deps' was not found" and failed the Compile & Hygiene and Copilot - Test CI checks. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Coalesce adhoc tag-decoration rescans with requestAnimationFrame Rescanning the whole editor text on every content change is wasteful for bursty updates (e.g. a streamed response). Debounce the decoration update to at most once per animation frame and cancel any pending frame during cleanup so the callback can't run after the editor is disposed. The initial scan stays synchronous so tags are highlighted immediately on mount. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address PR feedback: dispose token source; validate adhoc request JSON - adhocRequestSender: always dispose the per-send CancellationTokenSource in the finally block (separate from the current-send guard) so its cancellation listeners don't leak across repeated Send/Stop cycles. - simulationMain: validate and normalize the adhoc request JSON before use so malformed input (missing/null/wrong-typed model/user/system) yields a focused error message instead of a thrown stack trace. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · a9757315 · 2026-06-26