- Add GenAiProviderName.GEMINI; switch geminiNativeProvider, anthropicProvider, copilotcliSession to use GenAiProviderName.* constants
- Add CopilotChatAttr.HOOK_TYPE/HOOK_INPUT/HOOK_OUTPUT/HOOK_RESULT_KIND, MODE_NAME, TOTAL_COST_USD; switch chatHookService, claudeMessageDispatch, copilotCliBridgeSpanProcessor, chatDebugFileLoggerService, otelSpanToChatDebugEvent, toolCallingLoop, claudeOTelTracker to use the new constants
- Add CopilotCliSdkAttr group for SDK-emitted hook attribute keys (github.copilot.hook.*); switch consumers in copilotCliBridgeSpanProcessor and otelSpanToChatDebugEvent
- Replace magic-number SpanStatusCode casts in copilotCliBridgeSpanProcessor with the enum members
- Expand otel barrel index.ts to re-export CopilotCliSdkAttr and previously-missing event helpers (emitEditFeedbackEvent, emitEditHunkActionEvent, emitInlineDoneEvent, emitEditSurvivalEvent, emitUserFeedbackEvent, emitCloudSessionInvokeEvent)
No behavior change.
Follow-up to #313128. The VSCODE_OSS fallback isn't needed for the
api.github.com calls in core-ci — secrets.GITHUB_TOKEN already
authenticates those reads with permissions: contents: read (added in
#304929), so we don't hit the anonymous rate limit on 1ES.
* 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>
* chore: migrate agent-browser to @playwright/cli
Replace all uses of the `agent-browser` automation tool with `@playwright/cli`,
which supports `npx @playwright/cli attach --cdp=<port>` for connecting to
Electron/Chromium apps via CDP.
- Rewrite launch SKILL.md files (Code OSS and Copilot variants) with new
command mappings: attach --cdp, tab-list, snapshot, screenshot --filename,
fill, press
- Update auto-perf-optimize and chat-customizations-editor skills with
@playwright/cli commands; fix eval blocks to use IIFE syntax required by
the new tool
- Migrate testRemoteAgentHost.sh: connect→attach --cdp, snapshot -i→snapshot,
screenshot path→screenshot --filename=path; verified end-to-end with --skip-message
- Remove agent-browser from extensions/copilot/package.json (covered by root
devDependency); bump @playwright/cli to ^0.1.9 in root package.json
* fix: add @types/ws as explicit devDependency in copilot extension
Previously pulled in transitively via agent-browser -> webdriver.
Now that agent-browser is removed, @types/ws must be declared directly.
* ci: switch PR workflows back to 1ES self-hosted runners with JobId
Re-applies #311975 (reverted in #312033). Adds per-run+attempt JobId
labels to scope 1ES agents to specific GitHub Actions runs and prevent
intermittent runner cancellations.
Also switches the pr.yml compile job's GITHUB_TOKEN from the
ephemeral repo-scoped runner token to secrets.VSCODE_OSS so cross-repo
GitHub API release fetches (vscode-js-debug, vscode-js-debug-companion,
vscode-js-profile-visualizer, etc.) authenticate properly. On 1ES pools
the shared egress IPs hit the anonymous 60/hr api.github.com rate limit
and produced 403 fan-out across PRs last time.
* ci: fall back to GITHUB_TOKEN for fork PRs
Match the historical pattern from before #255987 — fork PRs can't
access secrets.VSCODE_OSS, so use the conditional to pick GITHUB_TOKEN
for forks.
* Re-parse agent host history prompts to revive slash decorations
When restoring an agent host session (local `agent-host-*` or remote
`remote-*`), historical prompts were wrapped in a single ChatRequestTextPart,
losing decorations for slash commands, prompt slash commands (e.g. /skill),
and agent mentions.
Re-run the prompt through ChatRequestParser for agent host sessions so
decorated parts are revived in the UI. Falls back to a plain text part on
parse failure or empty parse result.
Also moves `isAgentHostTarget` from the browser layer into common (where
ChatService lives), with a re-export from the browser file for existing
callers.
Adds two snapshot tests for /skill parsing covering both the forcedAgent +
supportsPromptAttachments path and the no-agent fallback.
(Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Hoist empty references/tool map to avoid per-history-item allocations
Address Copilot review feedback on #313158.
(Written by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Source attachmentCapabilities from chat session contribution
Agent-host providers register capabilities via registerChatSessionContribution,
but that programmatic path does not create an IChatAgentData with those
capabilities. Look them up via IChatSessionsService.getCapabilitiesForSessionType
instead so /skill etc. are revived in restored history.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
(Written by Copilot)
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
We already handled the case where an ingest had completed. This makes it so that any ongoing ingests also should reuse the existing operation
Co-authored-by: Copilot <copilot@github.com>
* Add GitHub PR review threads model
* Cache GitHub PR review thread models
* Use PR review threads model in code review
* Keep GitHub PR model refresh lightweight
* Complete PR review threads validation checklist
* Saving my work
* Limit PR review polling to active session
* Refactor CodeReviewService to only poll the model for the active session
* Add GitHub PR polling lifecycle
* Refactor the logic that polls
* Use pull request head SHA for CI checks
* More fixes in
* Fix bug + tests
* More test cleanup
* Support prompting the user to share an existing browser tab
* feedback
Co-authored-by: Copilot <copilot@github.com>
---------
Co-authored-by: Copilot <copilot@github.com>
We had a separate representation of agent events in the agent host that
were usually mostly just the same as the protocol events/state. And we
had steps to map to and from in various places which added to code and
implementation complexity. Remove it.