SIGN IN SIGN UP

Sync built-in skills to agent hosts and add skill buttons (#313277)

* Sync built-in skills + add skill buttons for agent-host sessions

Brings back the UX from #311815 for the Agents window:

- Sync built-in prompts (e.g. /merge, /create-pr) into the local
  agent-host customization bundle so agent-host sessions can run
  the same slash commands as the Copilot CLI extension. The
  enumeration helper now reads the BUILTIN_STORAGE bucket from
  IPromptsService and includes those entries in the bundle pushed
  to the harness, alongside workspace, user, and extension prompts.
- Add four skill buttons to the changes view of agent-host sessions:
  Merge Changes, Create Pull Request, Create Draft Pull Request, and
  Sync Pull Request. Each button dispatches the matching slash
  command to the active session via IChatService, scoped to git +
  GitHub state context keys so the right buttons appear at the right
  time. The first registered button is hoisted as the primary blue
  toolbar button; the rest live in the apply submenu.
- Suppress the duplicate Copilot CLI extension buttons (Commit, Sync,
  Create PR, etc.) when the active session is an agent-host session,
  clause in extensions/copilot/package.json. The check only narrows
  the chatSessionType==copilotcli rows; claude-code rows are
  unchanged.
- Mark the agent-host chat contribution supportsPromptAttachments so
  /create-pr and friends parse as slash commands in the chat input.

Tests:
- agentHostSkillButtons.test.ts: action registration, context key
  reactivity, when-clause coverage.
- enumerateLocalCustomizationsForHarness.test.ts: built-in skill
  enumeration is folded into the bundle with BUILTIN_STORAGE.
- resolveCustomizationRefs.test.ts: built-in entries are resolvable
  through the existing ref resolution path.

End-to-end verified manually: clicking 'Merge Changes' on a
debug-test agent-host session dispatches '/merge', the agent host
receives the slash command, expands the merge skill, and runs its
tool steps. Copilot CLI extension buttons are not visible on
agent-host sessions.

(Written by Copilot)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* agent-host: read git.branchProtection in repo scope

The git.branchProtection setting is resource-scoped, so its value can
differ per workspace folder. Reading it without an override picked up
the host window's active workspace value instead of the session's own
repository value, which made the agent host show a Merge Changes button
for sessions whose repo had a protected main branch.

Pass the session's project URI as the resource override so we read the
setting in the scope of that folder.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* agent-host: register skill buttons from sessions main, drop stale comment

Move the skillButtons import to sessions.desktop.main.ts and
sessions.web.main.ts so it is wired in both desktop and web sessions
windows, instead of from the local-only contribution.

Drop the now-redundant comment on supportsPromptAttachments in the chat
session contribution registration.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* agent-host: register client filesystem provider for local in-process agent host

Previously, `vscode-agent-client://` was only registered for WebSocket
agent host transports (dynamic and env-var driven). The local in-process
utility-process agent host had no provider, so plugin syncs from the
renderer (used by `/create-pr`, `/merge` and other built-in skills) failed
with `ENOPRO`.

This wires the same reverse-RPC pattern over the existing MessagePort IPC:

* Renderer registers an `AgentHostClientResourceChannel` (server channel)
  on its `MessagePortClient`, wrapping the renderer's `IFileService`.
* The renderer's clientId is now used as the IPC ctx so the agent host can
  route reverse calls to a specific client.
* Agent host hoists `AgentHostClientFileSystemProvider` to a single shared
  instance and, for utility-process IPC connections, registers an authority
  per connection backed by the new channel.

Result: `vscode-agent-client://` URIs resolve identically for local and
remote agent hosts, the in-memory `vscode-synced-customization://` bundle
is reachable from the agent-host process, and built-in skills sync.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* agent-host: address Copilot review comments and fix branchProtection resource scope

- resourceList now throws when target URI is not a directory
- wrap BUILTIN_STORAGE listPromptFilesForStorage in try/catch so regular
  workbench prompts service (which throws on unknown storage) is handled
- update test to model the throw case for regression coverage
- use workingDirectory ?? project.uri as resource for git.branchProtection
  config lookup so worktree paths resolve the per-folder setting correctly

(Written by Copilot)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
R
Rob Lourens committed
9cd698c36bfc43d51a2879e4772b76ced430671e
Parent: af74f12
Committed by GitHub <noreply@github.com> on 4/29/2026, 9:36:05 PM