* sessions: soften blocked-session titlebar accent and fix blink on session switch
The "N sessions require input" titlebar pill used a full-strength orange (solid border + 14%/22% fill + a 45% blink peak) that felt too heavy. Lighten it so the orange label carries the signal while the fill (7%/12%) and border (mixed with the command center border) stay subtle, and gentle the blink peak to 26%.
Also fix the attention blink firing when merely switching the active session. Blink detection read visibleSessions untracked (a snapshot at block-detection time), so a session whose block was detected a moment before its own view became visible got a queued blink that later fired when the user navigated away and re-surfaced it. Track visibility in the blink-detection autorun instead: a blink is only ever queued for a session missing from the previous blocked set (a real new block), so a visibility-only change can only drop pending blinks, never start one. A blocked session the user can already see (excluded from the count) is dropped from the pending set, so switching to a blocked session and back never blinks.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: trim verbose comments and sync LAYOUT.md
Address PR review: shorten the class/property/autorun/test comments to the repo's concise limit, and update the LAYOUT.md Blocked Sessions section to describe visibility-suppressed blink detection and the softened accent.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Filter agent-host last-turn changes for chat input status pills to files inside the session workspace or worktree so external file edits do not inflate the changes count or preview list.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Agents window: revert accidental response code-block word-wrap
The word-wrap on response code blocks (`codeBlockRenderOptions` in the
sessions chat view) was an earlier mis-fix for the "picker too wide" bug
that shipped by accident. It wraps code blocks for every agent-host
provider in the Agents window and was never requested; the correct fix
for the original bug caps the Codex approvals picker width instead.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Codex agent host: cap approvals picker width so preset descriptions wrap
The Codex "Approvals" preset picker rendered its long per-preset
descriptions on a single line, stretching the popup far wider than the
chip. Give `AgentHostSessionEnumPicker` an overridable `_getListOptions()`
hook (threaded into `IActionWidgetService.show`) and have the Codex
approvals picker return a bounded `maxWidth` (360) plus a scoped class
whose CSS lets `.detail` wrap. `detailItemHeight` (92) reserves room for
the tallest wrapped description across platform UI fonts so nothing clips
in the fixed-height virtual list. The base hook returns undefined, so all
other pickers are unaffected.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add CopilotSlashCommandProvider for managing runtime slash commands and update related classes
* Fix typo in CopilotSlashCommandProvider variable name and improve logging message format
Restart the application after updating sandbox settings so
configuration changes are loaded before running the allowRead
and allowNetwork probes.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Preserve chat input text typed while a session is loading (#325323)
A chat widget's input editor stays visible and editable while its session
loads asynchronously, but no view model is bound yet. When the model finally
binds, it resets the editor to the session's own (usually empty) draft, which
discarded whatever the user typed in the meantime. The placeholder decoration
also stayed rendered on top of the typed text during loading.
Add a shared `setModelPreservingInputTypedWhileLoading` helper used by the
editor, sessions, and panel chat hosts to carry newly-typed text across the
model bind (without clobbering a persisted draft or a previous session's
leftover draft), and clear the placeholder decoration when there is input text
but no bound view model yet.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Address review: baseline panel draft at loadSession start, condense comments
The panel's slow-load path (`ChatViewPane.loadSession`) opens the load window
(clear + acquire) before calling `showModel` to bind, so capturing the input
baseline inside `showModel` happened at the end of the window and text typed
during loading was mistaken for the baseline and erased. Capture the baseline
at the start of `loadSession` and thread it into `showModel` (new optional
param), keeping direct `showModel` callers capturing their own baseline.
Also condense the verbose explanatory comments flagged in review.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Captures the editor-scoped model configuration before inline edit teardown so a changed thinking effort reaches the replacement request.
- Allows later prompt metadata to select a different model without reusing configuration captured for the previous model.
(Commit message generated by Copilot)
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Add Live Browser pill above chat input
Surfaces a "Live Browser" pill above the chat input (alongside the
changes/preview pills) while an agent-host turn is in progress. It shows
when the last turn's output contains a URL-carrying browser tool call
(openBrowserPage/navigatePage), taking the last such URL, and opens the
integrated browser at that URL when activated.
Gated behind a new `browser` sub-flag of `chat.turnStatusPills` (default off).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Fix stale "Both pills" comment in fixture
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Avoid "in" operator in browser tool URL parsing
The hygiene check forbids the `in` operator. Narrow the tool call by its
`status` discriminator instead: `toolInput` is present on every tool call
state except while parameters are still streaming.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Use server-backed archived state for agent host sessions
For agent host sessions, isArchived() now ignores the local view-state
overlay and uses only the server-authoritative session.archived value, so
a stale local archived:false can no longer mask the server's archived
state. Non-agent-host providers keep the existing overlay behavior.
Fixes#325398
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* AgentHost - seed active-client customizations on Claude session creation
Copilot sessions in the Agents window receive the synced customization
bundle — the built-in skills backing /create-pr, /fix-ci, /merge, etc. —
because `copilotAgent.createSession` seeds the eagerly-claimed `activeClient`.
`claudeAgent.createSession` did not, so the initial active client (already
present in the workbench session state) never triggered a customization
sync: no follow-up `session/activeClientSet` is dispatched when the state
already matches, so `syncClientCustomizations` never ran. Claude sessions
were left without the built-in skills that Copilot sessions get.
Seed the active client in `claudeAgent.createSession`, mirroring the Copilot
agent, and cover it in claudeAgent.test.ts.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* AgentHost - address review: seed eager active client on reconnect + quiet initial sync
- Extract `_seedEagerActiveClient` and apply it on the existing-session
(reconnect) path too, not just fresh creates: AgentService reissues
createSession for an existing URI, so a reconnected client's tools and
customizations must still reach Claude (mirrors the Copilot agent).
- Pass `{ quiet: true }` for the initial sync so it doesn't emit orphan
`SessionCustomizationUpdated` progress before the session state exists.
- Add reconnect + quiet regression tests.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
* Debt: Remove workspacePickerInput from chatInputPart
* Remove dead renderTrigger code
* Cleanup: Consolidate into a single pickeractionviewitem class
* signing commit
Add best practice: never anchor :has() on body or a workbench-wide root
A body:has() selector forces the style engine to re-evaluate against the whole
document on nearly every DOM mutation, degrading workbench interaction perf even
in builds where the feature is disabled. Document the class-on-container
alternative under the Styling best practices.
* sessions: rename single-pane detail context key to HasDockedDetailsContext
Rename SinglePaneDetailChangesOrFilesActiveContext (raw key
agentSessionsSinglePaneDetailChangesOrFiles) to HasDockedDetailsContext
(raw key agentSessionsHasDockedDetails) to better convey its meaning:
whether the single-pane active editor has a docked detail panel. Updates
the producer, both consumers (Toggle Details, Hide Editor), tests and docs.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: align docs and test terminology with HasDockedDetailsContext
Address review feedback: update SINGLE_PANE_SCENARIOS.md to describe the
new intent (active editor has a docked detail panel — a managed
Changes/Files tab or a text file editor) instead of the old
Changes/Files-target wording, and rename the test helpers
(isChangesOrFilesActive -> hasDockedDetails) and snapshot property
(gatedOnChangesOrFilesTab -> gatedOnDockedDetails).
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* editor: reuse toggle.diff.renderSideBySide in the Agents window Changes editor
Introduce IDiffEditorCommandsService so the workbench toggle.diff.renderSideBySide
command works in the Agents window multi-diff Changes editor, fixing #324765 (a
user's keybinding for that command now carries over). The base impl is registered
by a workbench-only contribution (diffEditor.workbench.contribution) and the Agents
window contributes its own impl (diffEditor.sessions.contribution) that flips the
workspace diffEditor.renderSideBySide setting, which the Changes editor observes.
The Changes header button and command palette entry now use the shared command id
instead of a custom action, and the accessibility help references it.
Only toggleRenderSideBySide is extracted for now; a follow-up will move the
remaining diff-editor command handlers into the service.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: add behavioral tests for the diff toggle override
Addresses CCR feedback: the menu tests only checked the shared command id
was referenced. Add focused tests for SessionsDiffEditorCommandsService that
invoke toggleRenderSideBySide with a SessionChangesEditor active and assert the
workspace diffEditor.renderSideBySide setting is flipped (both directions), and
that a non-Changes editor falls back to the base path.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: align read-only chat banner with the tab strip
Inset the read-only chat banner's left edge to match the chat tab
strip's padding-left so the banner begins under the first tab rather
than under the header's status-icon column. The right edge already
matched the tab strip's padding-right, so the banner now starts and
ends flush with the tabs.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: trim read-only banner alignment comment
Condense the verbose comment on the banner's margin per CCR feedback;
keep only the non-obvious intent.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>