* feat: add inline editing for agent feedback comments
* feat: enable editing for code review comments and add updateComment method
* feat: disable action bar actions while editing feedback comment
When inline editing is active on a feedback item, all action bar
buttons (edit, convert, remove) are disabled to prevent conflicting
operations. Actions are re-enabled when editing ends (Enter/Escape/blur).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Initial plan
* Fix Reveal in File Explorer not working in WSL
When connected to WSL, the revealFileInOS command silently failed because
revealResourcesInOS only handled file:// and vscode-userdata:// schemes,
ignoring vscode-remote:// URIs used in WSL connections.
Added support for vscode-remote URIs by using
IRemoteAuthorityResolverService.getCanonicalURI() to resolve them to
local file:// URIs before revealing. Also updated the when-context to
include vscodeRemote scheme so menu items appear for remote resources.
This follows the same pattern used in the external terminal contribution.
Co-authored-by: alexr00 <38270282+alexr00@users.noreply.github.com>
* Replace getCanonicalURI with direct WSL UNC path construction
getCanonicalURI() keeps URIs as vscode-remote://, so instead construct
local UNC paths (\\wsl$\DistroName\...) directly from WSL remote URIs
by parsing the authority to extract the distribution name.
Co-authored-by: alexr00 <38270282+alexr00@users.noreply.github.com>
* Remove remote from whens
---------
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: alexr00 <38270282+alexr00@users.noreply.github.com>
* feat: implement customization harness service and UI toggle for AI customizations
* refactor: extract shared harness service base class and factories
- Move CustomizationHarnessServiceBase, harness descriptor factories,
and user root helpers to common/customizationHarnessService.ts
- Core and sessions implementations now extend the base class with
just configuration (~130 lines each reduced to ~40)
- Centralize ~/.copilot, ~/.claude, ~/.agents path knowledge
- Parameterize storage source extras (extension vs builtin)
- Add tablist accessibility: role=tablist, aria-label, roving tabIndex,
arrow-key keyboard navigation, focus-visible outline
- Use scoped DisposableStore for harness toggle pill listeners
* fix: initialize _activeHarness in constructor to avoid define-class-fields error
* feat: move harness selector to sidebar dropdown, add per-harness section filtering
- Move harness toggle from content area pills to sidebar dropdown
- Use VS Code quick pick for harness selection (native UX pattern)
- Add hiddenSections to IHarnessDescriptor for per-harness section visibility
- Claude harness hides Agents and Hooks sections (not supported)
- Rename VS Code harness to 'Local' with Codicon.vm icon
- Use Codicon.worktree for CLI and Codicon.claude for Claude
- Sessions window registers only CLI harness (dropdown hidden)
- Reactively rebuild sidebar sections on harness change
- Remove old pill toggle from list widget
- Style dropdown with VS Code dropdown theme variables
* fix: filter create targets by active harness
- Hide 'New X (User)' dropdown option in core when a restricted harness
(CLI/Claude) is active, since the file would be created in the VS Code
profile directory which isn't visible under those filters
- Sessions always shows User option (AgenticPromptsService routes to
CLI-accessible paths like ~/.copilot/)
- Update add button when harness changes so dropdown reflects new state
* fix: filter workspace directory picker by active harness subpaths
- Add workspaceSubpaths to IHarnessDescriptor for per-harness workspace
directory filtering in the creation picker
- Claude harness restricts to .claude/ directories only
- CLI harness allows .github/, .copilot/, .agents/, .claude/ directories
- Local harness has no restriction (undefined = show all)
- Add getActiveDescriptor() to ICustomizationHarnessService for callers
that need the full descriptor
- CustomizationCreatorService now filters the directory picker based on
the active harness's workspaceSubpaths
- When a plugin is installed via "Install Plugin from Source", the source
repository is now automatically added to the chat.plugins.marketplaces
setting so it appears in the marketplace management UI.
- Deduplicates by canonical ID to avoid adding the same marketplace twice.
Fixes https://github.com/microsoft/vscode/issues/302512
(Commit message generated by Copilot)
* plugins: support flat MCP server map format in .mcp.json
- The _parseMcpServerDefinitionMap method previously required a wrapper
`{ mcpServers: { ... } }` object. Some .mcp.json files use a flat
format where server entries are at the top level without the mcpServers
wrapper. This extracts a resolveMcpServersMap helper that accepts both
formats, so plugins with either style are discovered correctly.
- Adds tests for the new resolveMcpServersMap function.
Fixes https://github.com/microsoft/vscode/issues/302576
(Commit message generated by Copilot)
* Potential fix for pull request finding
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
- Migrates to use AHP types that are synced via `npx tsx scripts/sync-agent-host-protocol.ts`
- One big churn was migrating out of URIs as rich objects in the protocol.
We can't really shove our own `$mid`-type objects in there. I also explored doing a
generated translation layer but I had trouble getting one I was happy with.
- This tightens up some type safety in general and fixes some areas where vscode had
silently/sloppily diverged from the protocol types.
- Adds a 'Chat: Manage Plugin Marketplaces' command (f1) that lists
configured marketplaces and offers actions: show plugins, open the
cloned directory in the OS file manager, or remove the marketplace.
- Adds a globe icon button in the Agent Plugins - Installed view title
bar for quick access to the marketplace management flow.
- Extends the @agentPlugins search to also filter by marketplace name,
so 'Show Plugins' correctly narrows results to that marketplace.
Fixes https://github.com/microsoft/vscode/issues/302513
(Commit message generated by Copilot)
* Refactor NewChatWidget to use ProjectPicker for unified project selection
* Enhance project picker to migrate legacy storage for recently picked projects and last selected project
* Fix separator visibility for extension pickers in NewChatWidget toolbar
* Remove unused separator for extension pickers in NewChatWidget
* Enhance IsolationModePicker to support cloud mode and update visibility logic in NewChatWidget
* Refactor IsolationModePicker to TargetPicker and update related logic for session target selection
* Add padding to chat-full-welcome pickers container for improved layout
* Update hover styles for project picker action label to improve visibility
* Refactor project listing in ProjectPicker to deduplicate and sort projects by type
* Add extension toolbar pickers for remote sessions in NewChatWidget
* Add checked property to project items in ProjectPicker for selection indication
* Set repo URI from project picker on session initialization
* Update visibility of branch and sync indicators based on repository selection in NewChatWidget
* Update target mode labels in TargetPicker for clarity
* Improve styling of project picker button for better visibility
* fix: correct isolation option logic in TargetPicker initialization
* fix: update isolation option logic to treat false as disabled
* fix: add cancellation support for project selection in NewChatWidget
* fix: add fireEvent parameter to setSelectedFolder and setSelectedRepo methods in ProjectPicker
* Address PR feedback: fix trust revert, use GITHUB_REMOTE_FILE_SCHEME, fix setRepository behavior
- Fix trust denial to revert to previous project selection (folder or repo)
instead of assuming previous URI is always a local folder
- Replace hardcoded 'github-remote-file' with GITHUB_REMOTE_FILE_SCHEME constant
- Keep worktree mode when repository is undefined (disable instead of switching)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Address PR feedback on projectPicker.ts
- Rename storage keys to sessions.* namespace
- Remove repoId from IProjectSelection (URI encodes identity)
- Store URIs as UriComponents instead of strings
- Consolidate setSelectedFolder/setSelectedRepo into single setSelectedProject API
- Generalize removeFromRecents to work with any project URI
- Extract command string constants (COMMAND_BROWSE_FOLDERS/REPOS)
- Add legacy key migration for renamed storage keys
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Address PR feedback: remove label from IProjectSelection, use IUriIdentityService
- Remove label from IProjectSelection; compute it internally via _getProjectLabel()
- Use IUriIdentityService for URI equality checks instead of string comparison
- Remove unused isEqual import
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Unify IsolationMode and TargetMode, replace setRepository with setProject
- Remove IsolationMode type; use TargetMode everywhere
- Replace isolationMode getter with isWorktree/isFolder/isCloud booleans
- Replace setRepository + setCloudMode with single setProject(ITargetPickerProject)
- Rename setPreferredIsolationMode → setPreferredMode, setIsolationMode → setMode
- Rename isolationMode field in draft state to targetMode
- Update newSession.ts to use TargetMode
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Extract ISessionProject to shared types file
- Create src/vs/sessions/contrib/sessions/common/types.ts with ISessionProject
- ISessionProject has kind, optional uri, optional repository — a global concept
- IProjectSelection (exported from projectPicker.ts) narrows it with required uri
- TargetPicker.setProject accepts ISessionProject (uri optional for state updates)
- Remove ITargetPickerProject — replaced by ISessionProject
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Refactor ISessionProject to SessionProject class
- Convert ISessionProject interface to SessionProject class with constructor(uri, repository?)
- Derive isFolder/isRepo from URI scheme instead of explicit kind field
- Add withRepository() for creating copies with updated repository
- Remove kind from IStoredProject and IDraftState (derived from URI)
- Update all consumers to use new SessionProject(uri) constructor
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Export GITHUB_REMOTE_FILE_SCHEME from sessionProject.ts, rename types.ts
- Rename types.ts → sessionProject.ts
- Export GITHUB_REMOTE_FILE_SCHEME from the common layer
- Update all imports across sessions codebase to use the new canonical location
- githubFileSystemProvider.ts now re-exports from sessionProject.ts
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Remove important from project picker CSS
* Fix RemoteNewSession.targetMode to return 'cloud' instead of 'worktree'
* Remove label from IStoredProject, compute from URI on demand
* Remove setPreferredMode/setMode, use preferredMode parameter on setProject
* Remove GITHUB_REMOTE_FILE_SCHEME re-export from githubFileSystemProvider
* Remove unused setVisible from TargetPicker
* Add SessionProject to INewSession interface
- Add project property and setProject method to INewSession
- Implement in LocalNewSession and RemoteNewSession
- setRepoUri now delegates to setProject internally
- Update NewChatWidget to use setProject instead of setRepoUri
* Remove repoUri and setRepoUri from INewSession, use project instead
* Remove redundant target from draft state, derive from target picker
- Remove target (AgentSessionProviders) from IDraftState — redundant with targetMode
- Replace _currentTarget field with getter derived from _targetPicker.isCloud
- Simplify _onProjectSelected to use target picker state directly
* Unify session creation through _onProjectSelected
- _createNewSession is now a simple session factory (no trust handling)
- Initial session creation routes through _onProjectSelected when a
project was restored, ensuring trust is handled consistently
- _onProjectSelected always creates a new session and sets the project
- Removes duplicate trust handling from _createNewSession
* Remove redundant repoUri change listener from _setNewSession
* Only store targetMode in draft state for local sessions
* Use session.project as source of truth instead of projectPicker.selectedProject
- Read project from _newSession.value?.project throughout the widget
- Update session project when repository is resolved in _openRepository
- _updateTargetPickerState prefers session project over picker selection
- Reduces coupling to the picker's internal state
* Pass SessionProject as parameter to _createNewSession
* Rename ModePicker.setRepository to reset()
* Remove redundant targetMode session listener
The branch picker visibility is already handled by TargetPicker.onDidChange.
Keep the disabled listener — needed for async extension-driven state changes.
* Only open repository for folder projects, not repos
* Clean up _openRepository: read session at resolve time, remove defensive fallbacks
* Fix URI.revive error for legacy string URIs in stored projects
Add _reviveUri helper that handles both UriComponents (new) and
plain string (legacy) formats from storage.
* Migrate string URIs to UriComponents on load, remove _reviveUri
Convert legacy string URI format to UriComponents during deserialization
and re-persist. All runtime code now uses URI.revive safely.
* Remove all legacy storage migration code from ProjectPicker
* Restore legacy folder/repo picker migration, only remove string→UriComponents migration
* Only recreate session when project type changes (folder↔repo)
* Revert: always create new session when project changes
* Pass project to _updateTargetPickerState to avoid stale session state
* Inline _updateTargetPickerState and remove method
* Force Folder mode for non-git projects, disable picker when no repo
* Fix target mode restore: use _createNewSession for restored projects
Don't route restored projects through _onProjectSelected — the target
picker was already correctly configured by _restoreState with the
preferred mode. Calling _onProjectSelected would re-call setProject
without the preferred mode, losing the restored state.
* Remove early return in setProject, always update trigger label
* Default to worktree on project change, simplify setProject
Remove _preferredLocalMode — target always resets to worktree when
a new folder with git is selected, forced to folder when no git.
* Route restored projects through _onProjectSelected, remove preferredMode
- Initial session creation always goes through _onProjectSelected
- Remove preferredMode parameter from TargetPicker.setProject
- Remove targetMode from IDraftState (derived from project)
* Restore targetMode from draft state via _openRepository preferredMode
Store targetMode in draft, pass it through _openRepository to
_targetPicker.setProject when the git repo resolves.
* Reset target mode only on user project change, retain on repo resolve
- setProject takes resetMode flag instead of preferredMode
- _onProjectSelected passes resetMode=true (user action → reset to worktree)
- _openRepository passes resetMode=false (repo resolving → keep current mode)
- Remove targetMode from draft state — no longer needed for restore
- Simplify _openRepository signature
* Fix resetMode: persist flag until repo resolves
When resetMode=true is passed but the project has no repo yet,
store _pendingReset so the mode resets to worktree when the
repo resolves in a subsequent setProject call.
* Simplify: never reset target mode on project change
Target mode is retained across project changes. Only forced transitions:
- repo → cloud
- folder without git → workspace
- cloud → folder with git → worktree (switching back from cloud)
User's explicit dropdown choice (worktree/folder) is always respected.
* Don't force workspace for non-git folders, keep current mode disabled
Only forced transitions: repo→cloud, cloud→folder=worktree.
Non-git folders show current mode as disabled until repo resolves.
* Show Folder mode for non-git folders when isolation option is enabled
* Default to worktree always for folder projects
* Refactor TargetPicker: extract _updateMode, simplify disabled state
- Extract mode logic into _updateMode(), called from setProject and config change
- Folder with git → worktree, folder without git → workspace, repo → cloud
- Picker only enabled when folder has git repo and isolation option is enabled
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* chat: populate githubRepo for GitUri marketplace references
When a plugin marketplace reference is a full GitHub URL (e.g.
https://github.com/anthropics/claude-code) parsed as a GitUri, the
githubRepo property was not being set. This caused the AgentPluginEditor
to render the marketplace link as plain text instead of a clickable link.
- Add extractGitHubRepo helper that extracts owner/repo from GitHub URLs
- Set githubRepo on GitUri references when the authority is github.com
- Also handle SCP-style references (git@github.com:org/repo.git)
Fixes https://github.com/microsoft/vscode/issues/301288
(Commit message generated by Copilot)
* pr comments
* Enhance AI Customization Management: Add section item counts and update UI components
- Introduced count property for section items in the AI Customization Management editor.
- Updated the rendering logic to display item counts conditionally.
- Implemented event emitters for item count changes in MCP, Plugin, and Chat Models widgets.
- Enhanced CSS styles for section count display in the sidebar.
* Update section count styling: increase font size and adjust padding
* Refine section count styling: adjust font size, padding, border radius, and line height
* Update section count styling: increase font size, padding, border radius, and line height
* Remove section count background and color styles from selected list items
* Update section count handling in AICustomizationManagementEditor to include MCP, Plugins, and Models
* Seed initial section counts for MCP, Plugins, and Models in AICustomizationManagementEditor
* Refactor item count calculation in MCP and Plugin list widgets to sum displayed group header counts
* Refactor prompts section count handling to refresh all sections on data changes
* Refactor item count handling in AICustomizationListWidget and AICustomizationManagementEditor to use shared loading logic
* Add fireItemCount method to MCP, Plugin, and Models widgets for item count updates
* Fix sidebar count consistency: use data arrays as single source of truth
- Guard prompt list count handler to only update prompt sections (not MCP/Plugins)
- MCP itemCount derived from filteredServers + filteredBuiltinCount (same arrays as group headers)
- Plugin itemCount derived from installedItems (same array as enabled/disabled groups)
* Address PR review: debounce prompt count refresh, handle errors
- Debounce refreshAllPromptsSectionCounts via RunOnceScheduler (100ms)
to prevent stale overwrites from rapid successive prompts events
- Route rejected computeItemCountForSection promises to onUnexpectedError
instead of leaving them unhandled