Osvaldo Ortega
48293249+osortega@users.noreply.github.com
90d · built 2026-05-28
90-day totals
- Commits
- 107
- Grow
- 21.9
- Maintenance
- 4.6
- Fixes
- 2.6
- Total ETV
- 29.1
Where this dev ranks
Percentile against the global top-100 leaderboard (all-time totals).
- By commits
- Top 67 %
- By Growth share
- Top 0.1 %
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).
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'.
Bug flow over time
Monthly bug flow attributed to this developer. The left bar (red) is bug impact this dev authored that was addressed in the given month — combining bugs others fixed for them and bugs they fixed themselves. The right bar is fixes they personally shipped that month, split between self-fixes (overlap with the red bar) and fixes done for someone else. X-axis is fix-time, not introduction-time — the Navigara API attributes bugs backward to the author at the moment the fix lands.
- Self-fix share
- 34%
- Bugs you introduced
- 7.9
- Bugs you fixed
- 9.2
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.1ETVAgents web: Host filtering improvements and mobile improvements (#313062) * sessions: mobile UI improvements — filter chips, terminal view, diff view, tool cards - Feature 1: Add horizontally scrollable filter chips below session list header on phone layout. Chips for Completed, In Progress, and Failed status filters; active state highlights chip. - Feature 2: Improve touch targets for collapsible tool cards in chat on mobile. Minimum 44px height for tool card toggle buttons and always-visible chevron. - Feature 3: Add dedicated full-screen mobile terminal view overlay. Tapping a terminal tool invocation on phone opens a full-screen output view with back navigation, monospace output, and copy/search footer actions. - Feature 4: Add dedicated full-screen mobile diff view overlay. Tapping a file change on phone opens a Diff/File segmented control view with inline unified diff (colored +/- gutters) and full file content tab. All features are phone-only (IsPhoneLayoutContext). Desktop behavior is unchanged. Layer rules preserved: sessions/browser imports only vs/workbench/services; contrib-layer command handlers bridge to local-interface view functions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * MVP Co-authored-by: Copilot <copilot@github.com> * Review * Clean up * Filter fixes * Search fix Co-authored-by: Copilot <copilot@github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Copilot <copilot@github.com>github.com-microsoft-vscode · 4701612e · 2026-04-28
- 3.1ETVMobile agents: home screen improvements (#314226) * Mobile home screen tweaks * Full * Update * Updates * Updatesgithub.com-microsoft-vscode · 2fc10e36 · 2026-05-04
- 2.6ETVsessions: Add mobile-compatible PWA layout for agent sessions (#309344) * sessions: add mobile-compatible PWA layout for agent sessions Introduce a responsive mobile layout for the agent sessions window, enabling a native app-like experience when accessed via mobile browsers or installed as a PWA. The implementation uses mobile Part subclasses, a MobileTopBar chrome component, CSS overrides, and when-clause gating to progressively enhance the desktop sessions workbench for phone viewports. Key changes: Layout policy & viewport detection: - SessionsLayoutPolicy with observable viewport classification (phone <640px, tablet 640-1024, desktop >1024) - Context keys: ViewportClassContext, IsMobileLayoutContext, KeyboardVisibleContext - Runtime viewport class change detection in layout() Mobile chrome components: - MobileTopBar: hamburger + session title + new session (+) - MobileNavigationStack: history.pushState integration for Android back button - Sidebar drawer overlay with backdrop dismiss Mobile Part subclasses: - MobileChatBarPart, MobileSidebarPart, MobileAuxiliaryBarPart, MobilePanelPart override layout()/updateStyles() only - AgenticPaneCompositePartService conditionally instantiates mobile vs desktop Parts View gating: - Desktop-only views hidden on mobile via IsMobileLayoutContext: Changes, Files, Logs, Terminal, Code Review, Open in VS Code - Customization toolbar hidden via CSS on phone CSS & PWA: - Edge-to-edge chat (no card chrome on phone) - Safe area insets, touch targets (44px min), overscroll containment - PWA manifest with standalone display mode - viewport-fit=cover meta tag - Dynamic theme-color meta created programmatically Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Remove out-of-scope changes from mobile PR Remove agentHost WebSocket implementation, webHostDiscovery contribution, welcome/walkthrough OAuth flow changes, PWA manifest updates, and lock file noise — none of these are related to mobile layout components for the agents workbench. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Restore agentHost browser files incorrectly deleted These files exist in main and were not introduced by this PR. They were mistakenly removed during out-of-scope cleanup. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Remove unrelated changes and PWA support from mobile PR - Revert copilot package-lock.json to main (unrelated npm artifact) - Revert agentHost remoteAgentHostProtocolClient.ts (diffs field not mobile-related) - Revert agentHost sessionTransport.ts (protocol cleanup not mobile-related) - Remove theme-color meta element creation and dynamic updates (PWA) - Remove apple-touch-startup-image link injection (PWA) - Remove PWA & Viewport section from MOBILE.md - Keep viewport-fit=cover as it is needed for safe-area-inset CSS on mobile Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix mobile chat welcome page CSS selectors to match actual DOM classes The mobile phone-layout CSS targeted non-existent class names (chat-full-welcome*) instead of the actual DOM classes used by newChatViewPane.ts and newChatInput.ts. This caused the welcome page to render without the Copilot logo, centering, or bottom-pinned input on phone viewports. Also fixes the logo SVG path and adds dark/light theme support. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address PR review comments: titlebar visibility, CSS docs, inline styles - Fix isVisible(TITLEBAR_PART) to return false on phone layout where the grid titlebar is hidden and replaced by MobileTopBar - Fix computeContainerOffset() to use MobileTopBar height on phone layout so overlays (quick picks, hovers) are positioned correctly - Add CSS comment block documenting the .mobile-layout vs .phone-layout class hierarchy and when to use each - Add code comment in MobileAuxiliaryBarPart explaining why inline style clearing is needed (parent sets them via JS, CSS can't override) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address council review: fix mobile Part runtime transitions and disposal hygiene - Mobile Parts now dispatch at runtime (isPhoneLayout): phone uses mobile layout math, tablet/desktop delegates to super. Fixes 35px chat overlap after phone→landscape rotation across the 640px breakpoint. - Workbench calls updateStyles() on pane composite parts after viewport class transitions so card-chrome inline styles re-apply/clear correctly. - MobileNavigationStack: replace _suppressNextPop boolean with pending counter to handle concurrent popSilently calls and rapid back taps. - Drop redundant Part.prototype.layout.call in mobile Part overrides (AbstractPaneCompositePart.layout already cascades to Part.layout). - Virtual keyboard detection: use mainWindow.innerHeight as baseline instead of captured initialViewportHeight; threshold 150→100. - Sidebar drawer backdrop: managed via DisposableStore with addDisposableListener for its click handler. - MobileTopBar: switch raw addEventListener to addDisposableListener; register element removal before parent.prepend so exceptions still clean up. - Remove redundant matchMedia orientation listener; the window resize listener already handles orientation changes. * Use head.getElementsByTagName instead of querySelector for viewport meta * Scope mobile layout to phone only (remove .mobile-layout class) * Fix desktop/tablet regressions: keep auxiliaryBar visible and use original sizes * Gate phone layout on mobile OS (iOS/Android) instead of width alone --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 6aaf3c6b · 2026-04-23
- 1.4ETVagents mobile: redesign changes/diff overlays with master-detail navigation and syntax highlighting (#314433) * Improve sessions list rendering on phone layout - Phone-aware row height (76px) in SessionsTreeDelegate, refreshed on IsPhoneLayoutContext changes. - Larger title/details fonts and roomier padding under .phone-layout. - Card-style row margin/border-radius and centered icon alignment. - Per-row toolbar always visible on touch; pulled out of the title-row flow with absolute positioning so 44px tap targets do not shift the details row. - Stop pointer/click propagation at the toolbar container so action taps do not trigger the row open handler. * Address PR review - Stop Monaco Gesture tap from reaching the list when the user taps an inline action on touch (DOM stopPropagation only covers mouse). - Drop unsafe vertical margin on the absolutely positioned list row; any inter-row spacing lives inside the row via padding/border. - Refresh stale doc comments (row geometry, iteration cost, no-op '2-line wrap' description). * agents mobile: redesign changes/diff overlays with master-detail nav and syntax highlighting - Add MobileChangesView: full-screen overlay listing all changed files with codicon file-type icons, A/M/D pills, colored +N/-N counters and reactive live updates via autorun over sessionsManagementService.activeSession.changes - Rewrite MobileDiffView: prev/next navigation between sibling files (chevrons + horizontal swipe gesture), Monaco tokenization with regex fallback (4 token kinds: comment/string/keyword/number), 3px colored left-edge bar on added/removed lines, sticky hunk headers, horizontal scroll fix - Wire title-bar Changes pill to MOBILE_OPEN_CHANGES_VIEW_COMMAND_ID; single- file sessions skip the list and open the diff directly (fewer taps) - Add mobileDiffColors.ts: mobile-specific registerColor registrations for agentsMobileDiff.{added,modified,deleted}Foreground; imported as side-effect from mobileChangesView.ts so colors are available before any view renders - Fix disposable leak: per-row gesture/click listeners use a rowsStore that clears on every renderList call instead of accumulating in viewStore - Fix merged-hunk rendering: track sub-change list per group, emit context rows between adjacent sub-changes so unchanged lines aren't misclassified - Update vscode-known-variables.json with new --vscode-agentsMobileDiff-* theme tokens and --mobile-diff-{tok,added,modified,deleted} CSS vars Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * agents mobile: address Copilot reviewer feedback on PR #314433 - Fix deletion bug in single-file shortcut: reuse toRow/rowToDiffData (now exported) from mobileChangesView.ts so modifiedURI stays undefined for IChatSessionFileChange2 deletions instead of incorrectly falling back to the v2 uri field - Localize Action2 titles in mobileOverlayContribution.ts via localize2() - Correct MOBILE.md: MobileChangesView uses codicons not ResourceLabels; MobileDiffView uses async tokenizeToString + injected colorMap <style>, with regex fallback emitting CSS-class spans (not inline style spans) - Rewrite regex tokenizer comment to accurately describe the class-based approach and per-theme CSS variable layering in mobileOverlayViews.css Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 8a8d6bb8 · 2026-05-05
- 1.3ETVAgents web: add tunnel indicator dropdown (#311751) * Add agent host filter dropdown to Agents web titlebar Adds a dropdown indicator next to the Toggle Primary Side Bar Visibility button that shows which remote agent host the workbench is scoped to. Picking a host (or 'All Hosts') filters the sessions list by providerId. The UI is web-only; the filter service is registered in common so the SessionsList DI always resolves (defaults to 'All Hosts' on desktop). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add connection status indicator to host filter dropdown Shows a green debug-connected codicon when the selected host is connected, and a clickable debug-disconnect codicon when disconnected (clicking it triggers reconnect). While connecting the icon pulses and is non-interactive. The indicator is only shown when a specific host is selected (hidden for 'All Hosts'). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Split connect button from host filter dropdown, fill sidebar width The compound widget now lays out as [dropdown pill][flex-spacer][connect button] and stretches to fill the left-toolbar-container width, which already tracks the sidebar width. The connect/disconnect button is a separate, independently clickable element flush against the right edge so it lines up with the sidebar's right border (and the chat input border below it). The dropdown pill (click to pick host) and the connect button (click to reconnect when disconnected) have their own hover and click handlers so each one is clearly actionable. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Update * update * Gate web Co-authored-by: Copilot <copilot@github.com> * Test fixes and review comments Co-authored-by: Copilot <copilot@github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Copilot <copilot@github.com>github.com-microsoft-vscode · 04d05114 · 2026-04-21
- 1.1ETVsessions: move account widget to titlebar with entitlement-aware badges (#307243) * sessions: move account widget to titlebar with entitlement-aware badges Move the account section from the sidebar footer to the titlebar in the sessions/agents app, providing a more prominent and accessible location for account status and Copilot entitlement information. Key changes: - Add TitleBarAccountWidget with entitlement-aware dot badges (orange for low tokens, red for quota exceeded) - Add TitleBarUpdateWidget positioned between separator and account icon - Create accountTitleBarState.ts pure state machine for badge/icon/kind - Reuse existing ChatStatusDashboard and UpdateHoverWidget in hover panel - Move 'Open in VS Code' to TitleBarSessionMenu (left of separator) - Remove old sidebar footer AccountWidget and its fixture - Add unit tests for the state machine Layout: [session actions] [Open in VS Code] | [Update] [Account] Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: handle AvailableForDownload state and stabilize badge key - Add downloadUpdate(true) for the normal AvailableForDownload case (when canInstall !== false), matching the workbench pattern - Remove localized label from badge key to avoid brittleness across locales; key now uses only source, dotBadge, and badge percent - Update unit test assertions for new key format Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · f9d4d435 · 2026-04-01
- 1.1ETVCloud Agent: Tasks API experimental setting and backend (#317206) * Cloud Agent: Tasks API experimental setting and backend Introduces a CloudAgentBackend seam with two implementations: - JobsApiBackend wraps the existing sweagentd Jobs API (default, no behavior change). - TaskApiBackend implements the new Mission Control Task API and currently uses a StubTaskApiClient pending CAPI routing. Selection is controlled by the new 'github.copilot.chat.cloudAgentBackend.version' setting ('v1' = Jobs API, 'v2' = Task API). The setting is tagged experimental and defaults to 'v1', preserving existing behavior for legacy users. * Review comments * Address PR review feedback - TaskArtifactPullData: add optional 'number' field separate from db id - Add ListTaskEventsOptions for event-specific pagination/filters - Relax sendFollowUp success check (only undefined is failure) - Drop unused _configurationService field; read config locally in ctor - Document that cloudAgentBackend.version requires reloadgithub.com-microsoft-vscode · c96dc550 · 2026-05-19
- 1.0ETVCloud agents on task API - Initial part (#317659) * Update * Review comments * Refactor * lock revert * Update * cleanupgithub.com-microsoft-vscode · b700ecb3 · 2026-05-21
- 0.9ETVSessions: web support (#308904) * WIP * Update customization: español.agent.md * Update customization: español.agent.md * Review comments * allow select of user code * fix instantiation. * Clean up * Move * Remove local storage auth * Test fix * Multiple fixes * Test fixes * Remove console.log * Remove dev strategy * Web: tunnel discovery provider (#310012) * Web: tunnel discovery provider * :lipstick: --------- Co-authored-by: Peng Lyu <penn.lv@gmail.com>github.com-microsoft-vscode · 8d4822e0 · 2026-04-15
- 0.8ETVAdd account indicator to mobile titlebar in agents workbench (#312437) * Add account indicator to mobile titlebar in agents workbench The mobile titlebar now shows a contextual right slot: - Welcome / new session screen: [☰] [title] [account] - In a chat session: [☰] [title] [+] The account indicator mirrors the desktop titlebar account widget: - Shows GitHub avatar when signed in, codicon fallback otherwise - Displays dot badge for quota warnings/errors - Tapping opens a panel with account info, copilot status dashboard, and sign-in/sign-out actions - Touch-friendly: 44px minimum touch targets, touch-action: manipulation Also extracts the AccountMenu MenuId to Menus.AccountMenu for sharing between the desktop and mobile implementations. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix account panel immediately dismissing on mobile tap The hover service registers a document-level mousedown listener for sticky hovers that dismisses the hover when clicking outside it. On mobile, the mousedown fires in the same event cycle as the click that opens the panel, so the hover was created and then immediately dismissed. Defer the showInstantHover call to the next animation frame so the mousedown event has completed before the sticky listener is registered. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Use DOM overlay for mobile account panel instead of hover service The hover service's sticky mousedown/mouseout handling doesn't work reliably on mobile touch devices. Replace it with a simple DOM overlay pattern: a full-screen backdrop that catches taps to dismiss, with the panel absolutely positioned below the top bar. This is more appropriate for mobile UX — touch interactions work natively without fighting the desktop hover infrastructure. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix account panel styling by appending inside workbench container The panel was appended to document.body, outside the .agent-sessions-workbench container, so none of the existing .sessions-account-titlebar-panel-* CSS selectors matched. Append the backdrop and panel inside the workbench container so the desktop panel styles (header, actions, dashboard, separators) apply correctly on mobile. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Redesign mobile account panel as full-screen bottom sheet Replace the desktop-style dropdown with a native mobile bottom sheet: - Full-screen sheet with header (title + close button) - Profile section with large avatar + name + provider - Copilot status dashboard when signed in - Large touch-friendly action rows (52px height, 16px font) with icons for Sign In/Out and Settings - Proper safe area insets for notched devices - Scrollable content area with overscroll containment - All new CSS classes (mobile-account-sheet-*) purpose-built for mobile — no reuse of desktop hover panel styles Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix scopeListOrRequest is not iterable in signIn When product.json defaultChatAgent.providerScopes is empty, scopes[0] evaluates to undefined. The spread in createSession then fails with is not iterable. Default to an empty array. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add OAuth callback support to sessions web dev server The sessions dev server was missing two things needed for GitHub OAuth sign-in to work: 1. A /callback route serving the OAuth redirect page (callback.html) that writes the auth code to localStorage 2. A urlCallbackProvider passed to the workbench create() options that polls localStorage for the auth code and delivers it back to the GitHub authentication extension Without these, the OAuth flow would complete on GitHub's side but the auth code was never delivered back to the workbench. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Revert "Add OAuth callback support to sessions web dev server" This reverts commit 4034dd5b0b8add4e94e47c38c08ee0fcb22ffcfe. * Fix web walkthrough auth scope mismatch and token expiry Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Use product config scopes for walkthrough sign-in instead of hardcoded The previous fix used defaultAccountService.signIn() which blocks on the init barrier — the DefaultAccountProvider may not be set yet when the walkthrough runs on first launch. Instead, keep using authenticationService.createSession() directly (which doesn't depend on the provider lifecycle) but read the scopes from productService.defaultChatAgent.providerScopes[0] instead of hardcoding ['repo', 'user:email', 'read:user']. This ensures the session has the 'workflow' scope that the account provider needs while avoiding the provider initialization race. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add fallback scopes when product config is unavailable If productService.defaultChatAgent.providerScopes is undefined (e.g. in vscode-dev web context where product config may not include it), fall back to the full scope set including workflow. Without this, an empty scopes array would create a session that the tunnel discovery code cannot find (it filters for user:email). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Listen to auth session changes directly for mobile account indicator The mobile account indicator relied solely on defaultAccountService.onDidChangeDefaultAccount, which depends on the DefaultAccountProvider completing its async initialization (extension registration, entitlement resolution). On mobile web, the walkthrough sign-in creates the session before the provider is fully initialized, so the event is missed. Also listen to authenticationService.onDidChangeSessions to pick up new GitHub sessions immediately when they're created, regardless of the DefaultAccountProvider lifecycle. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix account indicator showing Sign In after walkthrough on localhost Two fixes for the mobile account indicator not reflecting auth state after the walkthrough completes: 1. Fall back to reading GitHub sessions directly from IAuthenticationService when DefaultAccountService returns null. This covers the window between session creation (walkthrough) and DefaultAccountProvider initialization (extension registration). 2. When we have an account name from auth sessions but entitlement is still Unknown (not yet resolved), treat it as Unresolved rather than Unknown. This prevents getAccountTitleBarState() from returning 'Agents Signed Out' when the user is actually signed in but the entitlement service hasn't caught up yet. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Hide Copilot setup dashboard in mobile account sheet when unresolved The ChatStatusDashboard shows 'Set up Copilot to use AI features' when the entitlement is Unknown or Available (new user). This setup flow doesn't apply in the agents app which has its own walkthrough. Only show the dashboard when entitlements have fully resolved to a known plan (Free, Pro, etc). When still resolving, the profile section already shows the account name which is sufficient. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Apply same auth state fixes to desktop TitleBarAccountWidget The desktop account widget had the same issue as the mobile one: after walkthrough sign-in, it showed 'Agents Signed Out' because the DefaultAccountProvider hadn't initialized yet. Apply the same three fixes from the mobile indicator: 1. Listen to authenticationService.onDidChangeSessions directly 2. Fall back to reading GitHub sessions when defaultAccountService returns null 3. Override Unknown -> Unresolved when an account name is present to prevent showing signed-out state during entitlement resolution Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Add INFO-level logging to DefaultAccountProvider for debugging Upgrade key log messages from debug to info level to trace the account resolution flow in the browser console: - Session count and matching results in findMatchingProviderSession - Account name and scopes when sessions are found - Final account state after initialization completes Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Use console.log for DefaultAccount debug logging Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Accept any session when providerScopes is empty On vscode.dev the product config may not include providerScopes, resulting in an empty allScopes array. The scope matching loop never executes, so no sessions match even though valid sessions exist. When no scopes are configured, accept any available session. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Hide 'Use AI Features' button when AI features are disabled When users disable AI features via chat.disableAIFeatures, the account section in the Agents window should not show the 'Set up Copilot to use AI features' button. This change checks sentiment.hidden in addition to the other disabled states to properly hide this UI element. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Hide Copilot setup dashboard in desktop account panel when unresolved Same fix as the mobile account sheet — don't show the ChatStatusDashboard when entitlement is Unknown or Available, as it renders a 'Set up Copilot to use AI features' prompt that doesn't apply in the agents app. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Update * Clean up Co-authored-by: Copilot <copilot@github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Copilot <copilot@github.com>github.com-microsoft-vscode · bb4ad201 · 2026-04-27
- 0.7ETVfeat(sessions): mobile bottom-sheet picker for opened-chat input (#314571) * feat(sessions): mobile bottom-sheet picker for opened-chat input Mirrors the new-chat empty-state mobile experience for the workbench ChatInputPart used in vscode.dev/agents on phone-classified viewports: the desktop Mode + Model pickers are replaced with a single chip that opens a unified bottom sheet (Agent Mode + Model rows). The bottom-sheet primitive (showMobilePickerSheet) stays in vs/sessions. A new workbench service (IChatPhoneInputPresenter, no-op default singleton) lets sessions register a phone-only impl that opens the sheet; ChatInputPart consults the presenter from its inline actionViewItemProvider to swap in a chip when active. Desktop behavior is unchanged. Files added: - src/vs/workbench/contrib/chat/browser/widget/input/chatPhoneInputPresenter.ts - src/vs/workbench/contrib/chat/browser/widget/input/media/chatPhoneInputPresenter.css - src/vs/sessions/contrib/chat/browser/mobileChatPhoneInputPresenter.ts Files modified: - src/vs/workbench/contrib/chat/browser/widget/input/chatInputPart.ts - src/vs/sessions/sessions.web.main.ts Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Update * Address council review: fix stale session refs, wrong-widget target, dedupe storage key * Error when merging * Refactor: use MobileAgentHostModePicker subclass for phone path * re-structure * Fixture * Review comments --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 706a68ee · 2026-05-07
- 0.6ETVMove agent host picker to sessions sidebar (web desktop) (#313619) * Move agent host picker to sessions sidebar (web desktop) On web desktop (vscode.dev/agents), surface the agent host picker in a new toolbar at the bottom of the sessions sidebar instead of the titlebar's left layout. The new widget is modeled on AICustomizationShortcutsWidget but is always expanded -- no collapse chevron, no storage key. Scope: - Web desktop: picker moves to the sidebar (new SidebarAgentHost menu). - Web phone: unchanged -- still rendered in MobileTitlebarPart. - Electron: unchanged -- no host picker, never had one. Visual alignment: HostFilterActionViewItem gains a HostFilterAppearance ('titlebar' | 'sidebar') parameter so it can render the same Monaco Button + .sidebar-action-button shell used by CustomizationLinkViewItem. The sidebar appearance lays out the picker button as [remote-icon] [host-name (flex:1)] [chevron-down], with the connect / disconnect / re-discover indicator as an independent 26x26 sibling control to the right. When there are no hosts the right slot becomes a refresh button that triggers rediscover(). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Update src/vs/sessions/contrib/remoteAgentHost/browser/hostFilterActionViewItem.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Update src/vs/sessions/contrib/sessions/test/browser/agentHostShortcutsWidget.test.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Address PR #313619 review feedback - Drop the icon-by-state enumeration from the HostFilterActionViewItem class JSDoc. - Sidebar picker no longer no-ops with 0 hosts: pass the click event through to `_showMenu`, which already routes to `rediscover()` when no hosts are known. Same affordance as the dedicated refresh slot. - Widen `_showMenu(e)` to accept `Event`; this avoids fabricating a synthetic `MouseEvent('click')` that would anchor the context menu at (0,0) on touch/gesture activations. `dom.isMouseEvent(e)` keeps the runtime check. - Gate the `AgentHostShortcutsWidget` mount on `IsSessionsWindowContext && !IsAuxiliaryWindowContext && !IsPhoneLayoutContext` instead of `isWeb && !isPhoneLayout(...)`. Prevents an empty toolbar shell in auxiliary windows and aligns the runtime gate with the agents-window context the menu items target. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Avoid querySelector in HostFilterActionViewItem (sidebar) Hold stable references to the leading host icon and trailing chevron as `_sidebarLeadingIcon` / `_sidebarTrailingIcon` fields, created once in `_renderSidebar()`. `_renderSidebarButtonAffordances` now attaches/detaches the chevron via `appendChild` / `remove` on the stored reference instead of `querySelector(':scope > ...)`, fixing the `no-restricted-syntax` ESLint warnings reported by CI. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>github.com-microsoft-vscode · d3e91ab0 · 2026-05-01
- 0.6ETVAgents web: improve connection stability and terminal reconnection (#312189) * sessions: improve connection stability and terminal reconnection - WebSocketClientTransport: fail-fast on send to dead socket with force-close and _closeFired guard to prevent double onClose events - AgentHostPty: add reconnect() method with 10s hydration timeout and buffer clear before snapshot replay - AgentHostTerminalService: add reconnectTerminals() scoped by oldClientId, track active ptys with dispose cleanup - RemoteAgentHostContribution: trigger terminal reconnection on clientId change during reconnect - Telemetry: add socket/close, socket/sendDropped, socket/visibilityResumed, terminal/recovery events - Fix isMeasurement on boolean fields in existing telemetry * Update src/vs/sessions/common/sessionsTelemetry.ts Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * address review: gate terminal reconnect on clientId change, add reconnect tests --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>github.com-microsoft-vscode · dcc7279e · 2026-04-23
- 0.5ETVAgents tunnels: auto-reconnect with backoff and wake-triggered retry (#310868) * Agents tunnels: auto-reconnect with backoff and wake-triggered retry Tunnel-backed remote agent hosts previously had no auto-reconnect behavior — on laptop sleep / network drop the tunnel would flip to Disconnected and stay there until the user manually retried. This adds a reconnect loop inside TunnelAgentHostContribution: - Detect Connected→Disconnected transitions for still-cached tunnels and schedule an immediate reconnect. Only fires when the entry is explicitly Disconnected — if the entry has been removed (e.g. user clicked "Remove Remote"), we honour the removal and do not reconnect. - Exponential backoff on consecutive failures: 1s → 30s cap, up to 10 attempts, then pause. - Wake-triggered retry: on browser `online` or tab `visibilitychange` → visible, resume any paused reconnects. Rate-limited to one resume per 10s so rapid tab toggling can't hammer a permanently broken endpoint with unbounded attempt bursts. - Prune all reconnect state when a tunnel is uncached or the contribution is disposed. * Review comment Co-authored-by: Copilot <copilot@github.com> * Telemetry Co-authored-by: Copilot <copilot@github.com> * Clean up Co-authored-by: Copilot <copilot@github.com> --------- Co-authored-by: Copilot <copilot@github.com>github.com-microsoft-vscode · ea6aac97 · 2026-04-17
- 0.5ETVSessions: Fix stopped session stuck in list as Working (#307508) * Sessions: Fix stopped session stuck in list as Working (#306883) When a session was stopped before the agent created a worktree, the temp session remained in the list permanently because the promises waiting for session commit and cache population would never resolve. - Bound _waitForCommittedSession with responseCompletePromise so it throws immediately when the response finishes without a commit - Add timeouts and DisposableStore cleanup to both wait helpers to prevent leaked listeners - Allow archive/delete on temp sessions via _cleanupTempSession fallback when _findAgentSession returns nothing Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Sessions: Use response.isCanceled to bound waitForCommittedSession without arbitrary timeout Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Sessions: Address PR feedback — tighten safety timeouts and revert JSDoc - Reduce both raceTimeout safety nets to 5s (commit wait and cache wait) - Revert chatSessionsService.ts JSDoc to original wording - Clarify _waitForSessionInCache comment: only runs once during init Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Sessions: Fix _cleanupTempSession leaking _sessionGroupCache; add tests for cancelled temp sessions - Clear _sessionGroupCache entries in _cleanupTempSession to avoid stale ISession wrapper leaks in multi-chat mode - Add tests covering delete/archive of uncommitted temp sessions and the cancellation path where commit never fires Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Sessions: Use isEqual for URI comparison in _waitForCommittedSession Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · cac02410 · 2026-04-03
- 0.4ETVAgents web: Fix for terminals (#311089) * Agents web: Fix for terminals Co-authored-by: Copilot <copilot@github.com> * Review comment Co-authored-by: Copilot <copilot@github.com> * Fixes Co-authored-by: Copilot <copilot@github.com> --------- Co-authored-by: Copilot <copilot@github.com>github.com-microsoft-vscode · a947515f · 2026-04-17
- 0.4ETVImprove tunnel connection reliability: malformed-frame hardening, auth short-circuit, host-online resume (#311518) * Improve tunnel connection reliability: malformed-frame hardening, auth short-circuit, host-online resume, session cleanup Transport layer: - Add malformed-frame detection across all three transports (WebSocketClientTransport, TunnelConnectionTransport, TunnelRelayTransport): warn log first 5 per connection, force-close transport after >10 to trigger reconnect loop instead of silently dropping corrupt data. Shared constants in new transportConstants.ts. Reconnect logic (tunnelAgentHost.contribution.ts): - Auth-error short-circuit: authExpired/auth errors immediately pause reconnects instead of burning 10 retry slots, resume driven by onDidChangeSessions. - Host-online auto-resume: _silentStatusCheck detects when a host-offline-paused tunnel comes back online and auto-resumes without needing a wake/visibility event. - Session-removal cleanup: react to github session removal by tearing down matching tunnel state and best-effort disconnect. - Richer _categorizeError: distinguish authExpired (401/403/token expired) from generic auth, add ECONN/ENOTFOUND/ETIMEDOUT to network category. Telemetry: - Add authExpired to TunnelConnectErrorCategory and TunnelConnectFailureReason types. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix review findings: token regex over-match, auto-cached authProvider - _categorizeError: remove \btoken\b from auth regex to avoid matching 'connection token' protocol errors. Use 'auth.*(fail|error|invalid)' instead, which catches real auth failures without over-matching. - _silentStatusCheck: pass 'github' authProvider to cacheTunnel() so auto-discovered tunnels are properly matched by _handleSessionsChange for teardown on session removal. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address PR review comments - Pass actual errorCategory ('auth'|'authExpired') to _pauseReconnect instead of always using 'authExpired'. Add 'auth' to TunnelConnectFailureReason type. - Update telemetry classification comments to list all current enum members (authExpired for errorCategory, auth/authExpired for failureReason). - Log actual data type (ArrayBuffer/Blob) and byte length for non-string WebSocket frames instead of coercing to empty string. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 8ca93cdb · 2026-04-21
- 0.4ETVSessions: Add Copilot status indicator to sidebar footer (#306953) * Sessions: Add Copilot status indicator to sidebar footer Add a Copilot status button to the AccountWidget in the sessions app sidebar footer. The button shows the current Copilot status icon and opens a ChatStatusDashboard hover popup on click. - Add per-section disable options to ChatStatusDashboard to control which sections render (disableInlineSuggestionsSettings, disableModelSelection, disableProviderOptions, disableCompletionsSnooze, disableContributions) - Copilot status button is hidden when the update button is visible - Status icon updates based on entitlement, sessions, and quota state - Scoped CSS overrides for dashboard popup in sessions context Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix Copilot status button accessibility and disposable leak - Set aria-label on the Copilot status button so screen readers announce the current status tooltip - Track dashboard DisposableStore via MutableDisposable registered on the widget, ensuring cleanup on widget disposal or re-click Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Remove native tooltip from Copilot status button Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 521587c2 · 2026-03-31
- 0.4ETVMobile titlebar: live session title + web host widget on welcome (#312261) * Mobile titlebar: live session title + web host widget on welcome On phone layouts the desktop titlebar is hidden and replaced by a mobile-specific bar above the grid. Two issues fixed here: 1. The title was hardcoded to "New Session" because `setTitle()` was never called. It now subscribes to `ISessionsManagementService.activeSession.title` via `autorun` and updates live. 2. On the home/empty (welcome) screen there was no way to pick an agent host or connect on mobile web. The host filter widget (dropdown + connection status/connect button) from the web titlebar is now surfaced in the mobile titlebar's center slot while the welcome view is visible. ## Implementation - New `MobileTitlebarPart` under `browser/parts/mobile/` replaces the old `MobileTopBar`. It hosts a hamburger, a center slot with a title element and a `MenuWorkbenchToolBar` for a new `Menus.MobileTitleBarCenter` menu id, and a new-session button. The center slot switches between title and toolbar based on `SessionsWelcomeVisibleContext` AND whether the toolbar has any contributed items, so empty menus (e.g., desktop/electron) fall back to showing the title. - Instantiated via `IInstantiationService.createInstance` so it can consume `ISessionsManagementService` / `IContextKeyService`. - `hostFilter.contribution.ts` registers a second menu entry on `Menus.MobileTitleBarCenter` (gated by `IsWeb && !AuxiliaryWindow && HasAgentHosts && SessionsWelcomeVisible`) plus a matching `IActionViewItemService.register()` call reusing the existing `HostFilterActionViewItem`. No new widget code. - Layering is preserved: `browser/` never imports from `contrib/`; the mobile part only knows about the menu id. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Address review: touch + a11y for mobile titlebar widgets - MobileTitlebarPart: render the session title as a <button> so it is keyboard-focusable and handles touch via native button semantics. - HostFilterActionViewItem: register Gesture.addTarget on both the dropdown pill and the connection button, and listen for TouchEventType.Tap alongside CLICK so iOS taps work reliably. Use dom.EventHelper.stop for consistency. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix mobile titlebar host widget gating: use IsNewChatSessionContext SessionsWelcomeVisibleContext is only true during the first-run walkthrough overlay, not on the home/new-session screen. As a result the host picker was never registered into the mobile titlebar's center slot (the MenuWorkbenchToolBar reported zero items and the title stayed visible). Switch the gate to IsNewChatSessionContext, which is true whenever a new (empty) chat session is active, so the widget shows on the phone home screen and hides once a real session starts. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix host filter layout on mobile titlebar The '.monaco-action-bar .action-item' base rule sets display:block with higher specificity than '.agent-host-filter-combo', which caused the dropdown pill and connect button inside the li to stack vertically on the mobile titlebar. Qualify the combo selector with the action-item class to override that rule and restore the intended horizontal layout. Also switch '.mobile-top-bar-actions' to flex-direction: column so future mobile titlebar actions can stack while each compound item still lays out its internal controls as a row. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Remove unicode char from mobileTitlebarPart comment Replace hamburger unicode with [menu] to satisfy hygiene check. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · 96d2420e · 2026-04-24
- 0.4ETVsessions: rename `inSessions` to `inAgents` and fix updateTask duplication bug (#308876) Rename the `inSessions` task property to `inAgents` across all source, tests, JSON configs, and documentation. Also fix a bug in `updateTask` where `setProperty` with a numeric array index was inserting a duplicate entry instead of replacing the existing one. The fix replaces the entire tasks array with the updated entry mapped in at the correct index, consistent with how `removeTask` already works. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>github.com-microsoft-vscode · c5729b10 · 2026-04-09