* sessions: resolve ${workspaceFolder} in agent-host tasks via IConfigurationResolverService
Agent-host worktree sessions build their task command line through
AgentHostSessionTaskRunner/resolveTaskCommand, which bypassed variable
resolution and sent ${workspaceFolder} to the terminal verbatim (causing
EROFS errors writing to a literal "${workspaceFolder}" path).
Expand variables using the workbench IConfigurationResolverService (already
registered in the Agents window), passing the session's worktree folder so
${workspaceFolder} resolves to the worktree rather than the Agents window's
own workspace. The resolver API is async, so the resolveTaskCommand pipeline
is now async; the hook is attached only when a cwd is known so variables are
left untouched otherwise.
Also adds the Agents-window worktree dev tasks (Install & Watch Client,
Run Client, Install & Watch) to .vscode/tasks.json, and tightens the
over-commenting guidance in the coding guidelines and sessions skill.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: address CCR feedback on agent-host variable resolution
- Resolve ${workspaceFolder} for remote hosts using the POSIX URI path
instead of IConfigurationResolverService.resolveAsync (whose fsPath uses
renderer-OS separators, wrong for a differently-OS'd remote host).
- Wrap the local resolveAsync call in try/catch so an unresolvable variable
(e.g. ${command:}/${input:}) leaves the string unchanged rather than
failing task dispatch.
- Fix the _getCwd comment to reference the real scheme (vscode-agent-host).
- Add a remote-host test asserting POSIX-path expansion and that the
renderer resolver is not consulted.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: make agent-host task runner test platform-independent
The expansion test asserted against the resolver substituting URI.fsPath,
which on Windows yields backslash separators. Backslash is in
POSIX_NEEDS_QUOTING, so the expanded arg was strong-quoted on Windows and
the unquoted assertion failed. Substitute the POSIX URI path instead so the
test is deterministic across platforms.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Document two antipatterns fixed in #320913 so AI agents avoid them and
Copilot Code Reviews flag them:
- `.monaco-editor-background` must be opaque (never transparent), otherwise
the reverse-rounded selection corners break and performance suffers.
- Editor highlights should use regular decorations with inlineClassName/className;
registerDecorationType/setDecorationsByType is reserved for the ext host API.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replace the per-provider model picker actions with a single sessions-core
ModelPicker that wraps the shared workbench ModelPickerActionItem. The core
picker reads the available models from the active session's provider via the
new ISessionsProvider.getModels API, remembers the last used model per provider
per session type, and applies the selection through ISessionsProvider.setModel.
Providers stay authoritative for their own behavior:
- getModels resolves model metadata per provider (local/CLI/agent-host filter
registered language models; cloud synthesizes metadata from its option group).
- getModelPickerOptions lets each provider decide grouping, featured models and
whether the Manage Models action is shown, instead of core branching on
session type.
- onDidChangeModels lets the core picker refresh when models change.
Decouple the core picker from agent-host provider identity: the agent-host
mobile combined config picker now publishes the neutral
ActiveSessionUsesCombinedConfigPickerContext key, which the core picker uses to
gate itself out on phone layouts.
Add architecture guidelines: do not mirror runtime state into context keys,
delegate provider-specific decisions to the provider, and avoid large
mid-method comments.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
After adopting the sessions grid we lost the previous "restore on reload" behaviour. Restore the full visible grid (order, sticky/pinned state and the active session, including the empty new-session slot) from persisted workspace state instead of only the last active session.
- Snapshot the live visibility model on save and rebuild it atomically via VisibleSessions.restoreGrid so multiple restored sessions appear in one shot without flicker; late-arriving sessions are inserted into their persisted position incrementally.
- Suppress the empty new-session view while restore runs (view-owned restoring flag + grid hide) so the composer does not flash before sessions are laid out.
- Show per-leaf load progress on each chat view's own ProgressBar (mirroring editor-group ScopedProgressIndicator) while its chat model loads.
- Move keyboard focus into the active session by observing ISessionsManagementService.activeSession from the part, guarded so it never steals focus from another surface (e.g. the sessions list).
- Use a dedicated restore cancellation token that is actually cancelled when the user opens a session, and bound provider waits with a timeout so a deleted session cannot keep restore (and its listeners) pending forever.
- Add a coding guideline forbidding lazy invokeFunction/accessor.get service resolution.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Agents: session header command center and toolbar refactor
Restructure the Agents window titlebar and session view header:
- Add a VS Code editor style command center to the titlebar showing the
session kind icon, session title and workspace name. The session title
truncates while the workspace name stays fully visible.
- Split the monolithic ChatCompositeBar into a dedicated SessionHeader
(session identity, title, meta row and toolbars) and a tabs-only
ChatCompositeBar (chat tab strip).
- Move the Open in VS Code and Run actions next to the session header,
introducing menu ids as needed; keep terminal/run actions in place.
- Align the session header with the sessions list (status icon column +
stacked title/meta) and show a folder/worktree/cloud icon before the
workspace name.
- Add an architecture rule discouraging direct DOM traversal helpers
(closest, etc.).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Agents: update RunScriptContribution test for new menu location
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Agents: address PR review feedback
- sessionsTitleBarWidget: drop status/changes from the re-render autorun
(the widget only displays title + workspace, so tracking the extra
observables caused unnecessary DOM rebuilds).
- sessionHeader: guard the drag-start handler so drags don't initiate
from inside the title-row toolbar or the meta-row inline toolbar,
preventing button clicks from being swallowed by a session drag.
- chatCompositeBar: mark the tabs container as role="tablist" with an
aria-label so screen readers announce it as a set of tabs.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Move copilotChatSessions, remoteAgentHost, and agentHost providers from
contrib/ into a new contrib/providers/ subfolder for clearer separation
- Add ESLint layer rule 'contrib/providers/*/~' (before 'contrib/*/~') so
sibling contrib folders cannot import directly from providers
- Update all entry points (sessions.common.main.ts, sessions.desktop.main.ts,
sessions.web.main.ts) to reference new provider paths
- Port all upstream changes from origin/main to the new provider locations
- Add contrib/providers entry to build/lib/i18n.resources.json
- Rewrite docs: README.md, LAYOUT.md, LAYERS.md, SESSIONS.md, SKILL.md,
sessions.instructions.md; add source-code-organization, coding-guidelines,
and writing-tests instruction files; remove stale SESSIONS_PROVIDER.md and
AGENTS_CHAT_WIDGET.md
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Introduced `buildNext.instructions.md` to provide comprehensive notes on the new build pipeline.
- Documented key learnings, including issues with comment stripping, authorization errors, and build-time placeholders.
- Explained integration with the old build system and outlined important fixes related to source maps and resource copying.
- Included testing instructions and future work items to address outstanding issues.
* feat: replace host picker context menu with mobile-native bottom sheet on phone layout
Agent-Logs-Url: https://github.com/microsoft/vscode/sessions/c0ced124-328e-43c3-a95c-34c56f55a84d
Co-authored-by: osortega <48293249+osortega@users.noreply.github.com>
* fix: guard bottom sheet dismiss against double-invocation and stop event propagation from sheet
Agent-Logs-Url: https://github.com/microsoft/vscode/sessions/c0ced124-328e-43c3-a95c-34c56f55a84d
Co-authored-by: osortega <48293249+osortega@users.noreply.github.com>
* refactor: extract mobile host picker into MobileHostFilterActionViewItem
Move the bottom sheet UI from an inline phone-layout branch in the
desktop HostFilterActionViewItem into a proper mobile subclass in
browser/parts/mobile/, following the established mobile architecture:
- Create MobileHostFilterActionViewItem extending the desktop class,
overriding _showMenu() to show a bottom sheet instead of a context menu
- Remove IsPhoneLayoutContext branching from the desktop component
- Move bottom sheet CSS from hostFilter.css to mobileChatShell.css
- Update hostFilter.contribution.ts to instantiate the mobile variant
for the MobileTitleBarCenter menu registration
- Add Mobile Component Architecture rules to sessions.instructions.md
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: replace bottom sheet with dropdown anchored below trigger
The bottom sheet slid up from the bottom of the screen, far from the
picker trigger at the top, and had a transparent background. Replace
with a dropdown panel that:
- Anchors directly below the trigger element
- Has a solid background with border and shadow
- Animates in/out with a subtle fade + slide from above
- Uses 44px min-height items for touch targets
- Transparent backdrop for dismiss-on-tap without visual overlay
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: improve mobile host picker dropdown design
- Use agentsChatInput background color to match the chat input
- Add font-weight: normal to prevent bold text in items
- Add Gesture.addTarget + TouchEventType.Tap on each item button
so taps register on iOS/touch devices (CLICK alone is unreliable)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* refactor: move host picker dropdown CSS to own component file
- Create media/hostPickerDropdown.css in mobile parts folder
- Move all host picker styles from mobileChatShell.css to dedicated component file
- Add CSS import in mobileHostFilterActionViewItem.ts
- Document CSS organization pattern in sessions.instructions.md
This follows the same pattern as regular VS Code parts where each component
owns its CSS in a media/ subfolder. Keeps mobileChatShell.css focused on
shell-level phone layout styles only.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: use defined CSS theme variables for host picker dropdown
Replace undefined fallback variables with proper agentsChatInput theme tokens:
- background: var(--vscode-agentsChatInput-background)
- foreground: var(--vscode-agentsChatInput-foreground)
- border: var(--vscode-agentsChatInput-border)
These variables are registered in src/vs/sessions/common/theme.ts and
properly available in all themes.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: use globally available CSS theme variables for host picker
Replace agentsChatInput variables (only available in .agent-sessions-workbench scope)
with globally available input and foreground variables since the backdrop is
rendered directly on body, outside the workbench scope.
- background: var(--vscode-input-background)
- foreground: var(--vscode-foreground)
- border: var(--vscode-input-border)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: use inline styles from theme service for host picker
CSS variables aren't available in the body scope where the dropdown is rendered.
Instead, fetch theme colors via IThemeService and apply them as inline styles:
- Get theme colors at dropdown creation time
- Set backgroundColor, borderColor, foregroundColor via style attribute
- Apply hoverBackgroundColor and linkColor via event listeners
- Remove all CSS variable references
This ensures colors work in vscode.dev and all environments where CSS variables
may not be injected.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: remove unused focusBorderColor variable
The focus border styling is handled by the CSS :focus-visible rule,
so the TypeScript variable is not needed.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: render dropdown inside workbench container for CSS variables
The dropdown was appended to document.body, which is outside the
.monaco-workbench element where --vscode-* CSS custom properties
are defined. This caused all theme variables to be undefined.
Fix: query for the .monaco-workbench container and append the
backdrop there instead. This restores CSS variable inheritance
and moves all color declarations back to the CSS file where
they belong.
Also reverts the IThemeService inline-styles approach — colors
are now purely in hostPickerDropdown.css using standard CSS
variables.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: center host picker dropdown and remove status text
1. Center the dropdown horizontally on screen using left: 50% +
translateX(-50%) instead of anchoring to the trigger's left edge.
2. Remove the 'connecting…' / 'disconnected' status text from dropdown
items — the titlebar connection icon already conveys this info, and
the status text was causing the dropdown to extend beyond screen.
3. Clean up unused AgentHostFilterConnectionStatus import and status CSS.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: include translateX(-50%) in dropdown animation keyframes
The entrance/exit animations were overriding the centering transform
during playback, causing the dropdown to appear right-aligned then
jump to center when the animation ended.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: remove stray closing brace in mobileChatShell.css
Leftover from extracting host picker CSS into its own file.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: address PR review comments
1. Fix dismiss race condition: guard the timeout callback so it only
clears the dropdown if it still owns the current store, and register
the timeout for disposal when the dropdown is reopened early.
2. Use correct ARIA pattern: switch from listbox/option to menu/menuitemradio
which better matches the single-select interaction pattern.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* wip
* update learnings
* clean 1
* clean 2
* commit update-instructions.prompt.md
* swap back to normal model after being in delegate
* adding generation
* wip
* wip
* update
---------
Co-authored-by: Henning Dieterichs <hdieterichs@microsoft.com>
Co-authored-by: Anthony Kim <anthonykim@microsoft.com>
Co-authored-by: SteVen Batten <sbatten@microsoft.com>