Extends the bot exception in no-engineering-system-changes to handle
version bump PRs that include package-lock.json alongside package.json.
The previous change (#308090) only allowed single-file package.json
changes. Version bumps also run npm install which updates the lock file.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Refactor SSHConnection to use the same dispose-and-recreate pattern as
TunnelConnection instead of the more complex isActiveRelay/replaceRelay
approach.
Key changes:
- Remove isActiveRelay() and replaceRelay() from SSHConnection
- Make _relay readonly (immutable connection objects)
- Add detachSshClient() for ownership transfer during reconnect
- Add removeListener to SSHClient interface for proper cleanup
- Simplify relay close handlers to just call conn.dispose()
- Add try/catch in reconnect to clean up SSH client on failure
Add 18 new unit tests covering relay message routing, multi-host
isolation, SSH close lifecycle, CLI install flow, reconnect failure
cleanup, and listener cleanup across reconnects (33 total, up from 15).
* Delete individual hooks instead of entire hooks file
When deleting a hook from the Chat Customizations UI, parse the hook
item ID to identify the specific entry within the JSON file. Remove
only that entry and write the file back, instead of deleting the
entire hooks file. If no hooks remain after removal, the file is
deleted.
Also passes the item ID through the action context so the delete
handler can distinguish individual hook entries from whole files.
Fixes microsoft/vscode-internalbacklog#7381
* Throw CancellationError when plugin trust dialog is declined
When the user cancels the trust dialog during plugin installation,
throw a CancellationError instead of silently returning. This allows
the install button's catch handler to properly reset to 'Install'
state instead of incorrectly showing 'Installed'.
Fixes microsoft/vscode-internalbacklog#7378
* Check installed state when rendering marketplace plugin items
When rendering marketplace plugin items in the plugin list, check
whether the plugin is already installed by comparing install URIs
with the agent plugin service's plugin list. Show 'Installed' with
the button disabled instead of offering a redundant install option.
Fixes microsoft/vscode-internalbacklog#7379
* Replace floppy disk icon with newFile icon for create plugin button
The save/floppy disk icon is misleading for a create action. Use the
newFile codicon instead, which better communicates the intent and is
consistent with other create actions in the UI.
Fixes microsoft/vscode-internalbacklog#7373
* Fix plugin page CSS: padding, back button, and focus outlines
- Add padding-bottom to marketplace plugin footer for proper Install
button alignment (fixes#7377)
- Restyle back-to-installed link as a button with muted foreground
color and rounded hover background instead of link styling
(fixes#7384)
- Add outline-offset: -1px to button group buttons to prevent focus
outline clipping by parent container (fixes#7385)
Fixesmicrosoft/vscode-internalbacklog#7377Fixesmicrosoft/vscode-internalbacklog#7384Fixesmicrosoft/vscode-internalbacklog#7385
* Show workspace folder name in provider path for multi-root workspaces
When rendering items from external customization providers (e.g.
Copilot CLI), use the label service to produce workspace-relative
paths for file: URIs instead of bare filenames. This shows the
folder name (e.g. 'tankgame • AGENTS.md') in multi-root workspaces,
matching the core (Local) path behavior.
Fixesmicrosoft/vscode-internalbacklog#7330
* Work around for missing stop button
For #283328
Co-authored-by: Copilot <copilot@github.com>
* Simplify to chatSessionHasActiveRequest
---------
Co-authored-by: Copilot <copilot@github.com>
* fix: exempt agent instructions from workspace subpath filter
AGENTS.md, CLAUDE.md, and copilot-instructions.md live at the workspace
root by design. The CLI harness restricts items to workspaceSubpaths
(.github, .copilot, .agents, .claude) which filtered out these root-level
agent instruction files. Now items with groupKey 'agent-instructions' are
exempt from the subpath filter, matching the existing exemption for
instructionFileFilter patterns.
* sessions: include AGENTS.md in instructions listing
The sessions AI customization tree view and overview were only calling
listPromptFiles(PromptsType.instructions) to discover instruction files.
However, AGENTS.md (along with CLAUDE.md and copilot-instructions.md)
is classified as an agent type by getPromptFileType(), so it was never
returned by that call.
Fix by also calling listAgentInstructions() and merging the results
(deduplicating by URI), matching the pattern already used by the
workbench customization editor.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* fix: add sequence counter to loadItems to prevent race conditions
Multiple concurrent loadItems() calls can overlap when autoruns fire
simultaneously. Without serialization, a slow earlier call can resolve
after the correct one and overwrite allItems with stale/empty results.
The sequence counter ensures only the latest call's result is applied.
* fix: add missing onDidChangeInstructions subscription
The list widget subscribed to onDidChangeCustomAgents,
onDidChangeSlashCommands, and onDidChangeSkills but not
onDidChangeInstructions. This meant instruction file discovery
completing after the initial load never triggered a widget refresh.
* fix: re-establish provider onDidChange when harness registers
The autorun that subscribes to itemProvider.onDidChange only read
activeHarness. If the harness ID was persisted from a previous session,
activeHarness never changed when the CLI harness registered, so the
subscription was never set up. Now also reads availableHarnesses to
re-fire when harnesses are added/removed.
* fix: add instruction groups to filterItemsForProvider
filterItemsForProvider only had storage-based groups (local, user,
extension, builtin). Provider-supplied instruction items have semantic
groupKey values like 'context-instructions' and 'on-demand-instructions'
which didn't match any group, causing all instruction items to be
silently dropped (allItems: 0). Add instruction-semantic groups when
the current section is Instructions, matching filterItemsForCore.
* fix: ignore customization provider API in sessions window
The sessions window manages its own harnesses via
SessionsCustomizationHarnessService and the remoteAgentHost
contribution. Extension-contributed harnesses via the provider API
should not be registered in the sessions window.
* sessions: use generic sign out confirmation copy (#307465)
Allow the shared account sign-out action to accept dialog copy overrides so the Agents app can show a generic confirmation instead of listing extension usage.
Adds a focused test for the override path while preserving the default workbench confirmation behavior.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: scope sign out confirmation to Agents app (#307465)
Keep the Agents-specific sign-out confirmation flow inside the sessions account menu instead of extending the shared authentication sign-out action.
This restores the core workbench auth dialog behavior and limits the copy change to the sessions app surface.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>