* fix: strip command echo and prompt from terminal output (#303531)
Prevent sandbox-wrapped command lines from leaking as output when
commands produce no actual output. Adds stripCommandEchoAndPrompt()
to isolate real output from marker-based terminal buffer captures.
Also adds configurable idle poll interval and shell integration
timeout=0 support for faster test execution.
* Fix compilation errors
* fix: tighten trailing prompt stripping to avoid dropping legitimate output
Anchor prompt-detection regexes to specific prompt shapes instead of
broadly matching any line ending with $, #, %, or >. This prevents
stripping real command output like "100%", "<div>", or "item #".
* Review feedback
* fix: skip stale prompt fragments before command echo in stripping
In CI, ^C cancellations leave stale prompt fragments before the actual
command echo line. The leading-strip loop now continues scanning past
unmatched lines until it finds the command echo, instead of breaking
on the first non-matching line.
* fix: handle macOS CI prompt format and add stripping to rich strategy
- Add trailing prompt patterns for hostname:path user$ (no @ sign)
- Handle wrapped prompt fragments like "er$" at line boundaries
- Add stripCommandEchoAndPrompt to RichExecuteStrategy marker fallback
- Context-aware wrapped prompt continuation detection
* fix: Linux CI sandbox prereqs, platform-aware tests, broader prompt stripping
- Add bubblewrap and socat to Linux CI apt-get install
- Make sandbox test assertions platform-aware (macFileSystem vs linuxFileSystem)
- Make /etc/shells test accept both macOS and Linux first-line format
- Broaden wrapped prompt fragment regex to handle path chars (ts/testWorkspace$)
- Fix continuation pattern to match user@host:path wrapped lines
- Apply stripCommandEchoAndPrompt to getOutput() in BasicExecuteStrategy
(basic shell integration lacks reliable 133;C markers so getOutput()
can include command echo)
- Keep RichExecuteStrategy getOutput() unstripped (rich integration
has reliable markers)
* fix: detect sandbox failures heuristically when exit code is unavailable
* Relax some tests when shell integration is off
* refactor: extract findCommandEcho and use prompt evidence to narrow trailing prompt regex matching
* Cover case where the command is duplicated in `stripCommandEchoAndPrompt`
* Fix sandbox tests for Linux: handle different shell path and error message
- Handle /usr/bin/bash (Linux) vs /bin/bash (macOS) in /tmp write test
- Handle 'Read-only file system' (Linux) vs 'Operation not permitted' (macOS)
- Add 'Read-only file system' to outputLooksSandboxBlocked heuristic
- Replace newlines with spaces (not empty) to handle terminal wrapping
- Extract outputLooksSandboxBlocked as exported function with unit tests
* Fix slash history test
* Fix sandbox execPath resolution for remote environments
Add execPath to IRemoteAgentEnvironment so the server sends its actual
process.execPath to the client. The sandbox service now uses this instead
of hardcoding appRoot + '/node', which only works in production builds.
* Fix terminal output capture: prevent premature idle detection and handle partial command echoes
- setupRecreatingStartMarker returns IDisposable to stop marker recreation
before sending commands (prevents marker jumping on PSReadLine re-renders)
- noneExecuteStrategy waits for cursor to move past start line after sendText
before starting idle detection (prevents end marker at same line as start)
- findCommandEcho supports suffix matching for partial command echoes from
wrapped getOutput() results (shell integration ON with long commands)
- Suffix matching requires mid-word split to avoid false positives on output
that happens to be a suffix of the command (e.g. echo output)
- Integration tests: use ; separator on Windows, add && conversion test,
handle Windows exit code quirks with cmd /c
* Fix mock in unit test
* Address PR feedback: logging, performance, timeout, and docs
- Strip sensitive data from debug logs (log metadata only)
- Use array join instead of O(n^2) string concat in stripNewLinesAndBuildMapping
- Add 5s timeout to cursor-move wait to prevent indefinite hangs
- Align shellIntegrationTimeout descriptions (0 = skip the wait)
* Install bubblewrap and socat in Linux CI pipelines
These are required for terminal sandbox integration tests.
* Force /bin/bash over /bin/sh for copilot terminal profile
Shell integration cannot be injected into /bin/sh, causing loss of
exit code detection. This matches the existing cmd.exe -> powershell
override pattern.
* Fix bracketed prompt without @ and cap trailing prompt stripping at 2 lines
- Extend bracketed prompt patterns from isUnixAt to isUnix so prompts
like [W007DV9PF9-1:~/path] are recognized (CI macOS prompt format)
- Cap trailing prompt stripping at 2 non-empty lines to prevent
over-stripping legitimate output
- Add unit tests for bracketed prompt without @ format
* Distinguish complete vs fragment prompts to prevent false stripping
Split trailing prompt patterns into two categories:
- Complete prompts (user@host:~ $, PS C:\>, etc.) stop stripping
immediately — anything above is command output, not a wrapped prompt
- Fragment patterns (er$, ] $, [host:~/path...) allow continued
stripping to reassemble wrapped prompts
This prevents falsely stripping output lines that happen to end with
$ or # when a real complete prompt sits below them. Added adversarial
tests verifying correct behavior for output containing prompt-like
characters.
* Attempt to cover up the `run_in_terminal` tool not being registered quickly
* agent host init
* Agent host: Copilot SDK integration with chat UI
* Agent host: direct MessagePort, logging, SDK wrapper, env fix
* Refactoring and cleanup
* Copilot-authored message: Agent-host tool rendering, protocol, and session fixes
Tool invocation rendering:
- Emit tool_start/tool_complete as ChatToolInvocation (not progressMessage)
- Shell tools (bash/powershell) render as terminal command blocks with
IChatTerminalToolInvocationData, output, and exit codes
- Non-shell tools render via invocationMessage/pastTenseMessage (markdown)
- Filter out report_intent (hidden internal tool)
Agent-agnostic protocol:
- IPC events carry display-ready fields (displayName, invocationMessage,
pastTenseMessage, toolInput, toolOutput, toolKind, language)
- All Copilot CLI-specific logic in copilotToolDisplay.ts with typed
interfaces for known tools (CopilotToolName enum, parameter types)
- Renderer never references specific SDK tool names
Session fixes:
- Resumed sessions show tool invocations in history (getSessionMessages
now returns tool events alongside messages)
- Fixed 'already has a pending request' on resumed sessions by
conditionally providing interruptActiveResponseCallback
- Fixed event filtering for resumed sessions (sessionId override in
_trackSession)
Documentation:
- Split parity.md into design.md (decisions) and backlog.md (tasks)
- Updated architecture.md, sessions.md with cross-references
- Added maintenance notes to all docs
* Copilot-authored message: Model picker, session class, DI and test cleanup
* Cleanups
* stuff
* add diagram
* Add claude agent
* Clean up
* Copy some build script changes from #295817
* Simplify
* Update docs
* Register agent-host via chatSessions contribution API, reduce peripheral diff
* Cleanup
* Don't ship stuff in stable
* Dynamic agent discovery via listAgents() IPC
Replace hardcoded per-provider contributions with a single
AgentHostContribution that discovers available agents from the
agent host process at startup. Each IAgent backend now exposes
an IAgentDescriptor with display metadata and auth requirements.
- Add IAgentDescriptor interface and listAgents() to IPC contract
- CopilotAgent/ClaudeAgent return descriptors via getDescriptor()
- Single AgentHostContribution discovers + registers dynamically
- Remove agentHostConstants.ts (no more hardcoded session types)
- AgentHostSessionListController/LMProvider take params instead
- Rename AgentSessionProviders.AgentHost -> AgentHostCopilot
- Update architecture.md, sessions.md, backlog.md
(Written by Copilot)
* Fix review findings: proxy, disposal, filtering, tests
- Add listAgents() forwarding to AgentHostServiceClient
- Guard async discovery against disposal race
- Add provider field to IAgentModelInfo for per-provider filtering
- Filter models and sessions by provider in LM provider and list
controller
- Update tests for new dynamic API and agent-host-copilot scheme
(Written by Copilot)
* Use DI for AgentHostLanguageModelProvider
(Written by Copilot)
* Strip @img/sharp native binaries from builds
sharp is a transitive dependency of the Claude Agent SDK used for
image processing. Its native .node binaries cause dpkg-shlibdeps
errors during Debian packaging due to $ORIGIN RPATH references.
Strip all @img/sharp-* platform packages since the agent host
doesn't need image processing at runtime.
(Written by Copilot)
* Strip Claude SDK vendored ripgrep binaries
The Claude Agent SDK bundles ripgrep binaries for all platforms
under vendor/ripgrep/. Wrong-architecture binaries cause macOS
Mach-O verification to fail. Strip them entirely via .moduleignore
(VS Code has its own ripgrep) and add to verify-macho skip list.
(Written by Copilot)
* Add tests for AgentSession, AgentService dispatcher, and workbench agent host components
(Written by Copilot)
* Add trace logging, IPC output channel, tool permissions, and attachment context
- Add Agent Host IPC output channel (only registered at trace log level) that
logs all IPC method calls, results, and progress events with full JSON payloads
- Add trace-level logging in AgentService dispatcher for all method calls
- Add trace-level logging in session handler for all progress events and session
resolution
- Wire up onPermissionRequest handler on CopilotClient.createSession and
resumeSession to auto-approve tool permission requests
- Add IAgentAttachment type to IPC contract and thread attachments from chat
variables (file, directory, selection) through sendMessage to the Copilot SDK
(Written by Copilot)
* Add tests for attachment context conversion and threading
(Written by Copilot)
* Add gap analysis docs for Copilot and Claude SDK implementations
(Written by Copilot)
* Sanitize env vars for Copilot CLI subprocess
Strip VSCODE_*, ELECTRON_* (except ELECTRON_RUN_AS_NODE), NODE_OPTIONS, and
other debug-related env vars that can interfere with the Node.js process the
SDK spawns. Matches the env sanitization from the extension implementation.
Also set useStdio and autoStart for proper CLI communication.
(Written by Copilot)
* Add error, usage, and title_changed event types to IPC contract
Add IAgentErrorEvent, IAgentUsageEvent, and IAgentTitleChangedEvent to the
progress event union. Wire up session.error and assistant.usage events from
the Copilot SDK to fire as IPC events instead of only logging. Handle error
events in the renderer session handler by rendering the error message. Usage
and title_changed events are logged at trace level.
(Written by Copilot)
* Add abortSession IPC method for proper cancellation
Add abortSession(session) to the IPC contract, implemented across AgentService,
CopilotAgent (calls session.abort()), ClaudeAgent (no-op, uses AbortController),
and the renderer proxy. Wire up cancellation in the session handler to call
abortSession before finishing, so the SDK actually stops processing.
(Written by Copilot)
* Address reviewer feedback: error finishes request, Claude abort, tests
- Error events now call finish() so the request doesn't hang if the SDK
doesn't send idle after an error
- ClaudeAgent.abortSession calls ClaudeSession.abort() which signals the
AbortController and creates a new one for future turns
- Add test: cancellation calls abortSession on the agent host service
- Add test: error event renders message and finishes the request
- Remove stale TODO in interruptActiveResponseCallback
- Use timeout() helper instead of raw setTimeout in test
- Update gap docs to reflect completed work
(Written by Copilot)
* Add permission request IPC round-trip (Written by Copilot)
* Remove Claude agent from agent-host process
Strip the Claude Agent SDK integration from the agent-host utility process
to focus on the Copilot SDK path.
- Delete src/vs/platform/agent/node/claude/ (claudeAgent, claudeSession, claudeToolDisplay)
- Remove @anthropic-ai/claude-agent-sdk from package.json
- Remove AgentHostClaude enum member and all switch cases
- Remove Claude command registration in electron-browser chat.contribution
- Clean up build scripts (.moduleignore, verify-macho, gulpfile.vscode)
- Narrow AgentProvider type to just 'copilot'
- Update tests and documentation
(Written by Copilot)
* Wire up permission confirmation UI with ChatToolInvocation (Written by Copilot)
* Fix reviewer feedback: safe permission serialization, deny on abort/dispose (Written by Copilot)
* Forward reasoning events as thinking blocks (Written by Copilot)
* Pass workspace folder as workingDirectory to Copilot SDK (Written by Copilot)
* Store and pass workingDirectory on session resume, update gap docs (Written by Copilot)
* Fix permission rendering, session-scoped permissions, and test gaps (Written by Copilot)
* Auto-approve read permissions inside workspace folder (Written by Copilot)
* Move read auto-approve into CopilotAgent where permission policy belongs (Written by Copilot)
* Update gap docs (Written by Copilot)
* Use log language for IPC output channel, add trace prefix (Written by Copilot)
* Add tool rendering gaps to docs (Written by Copilot)
* Stringify URIs in IPC output channel for readability (Written by Copilot)
* Fix IPC output channel: use log languageId with non-log channel for proper append + syntax highlighting (Written by Copilot)
* Fix build errors: add URI import, fix test mock types (Written by Copilot)
* Don't localize agent host provider strings (Written by Copilot)
* Remove claude-agent-sdk from eslint allowed imports (Written by Copilot)
* fix test
* initial thoughts
* Rename folder to agentHost
* Fix paths
* Fixes
* Fixes for copilot
* Fix moduleignore
* first working protocol version
align more closely with protocol
json rpc and some gaps
* cleanup
* Fix copilot pty.node packaging
* Fix test
* prebuild packaging
* Agenthost server fixes
* Update monaco.d.ts
* Update docs
* Fixes
* Build fix
* Fix build issues
* reduce duplication in side effecting code
* fix model switching not working
* reduce mock duplication
* Build fixes
* Copy vscode's node.pty
* And ripgrep
* And thsi
* Ripgrep goes to non-SDK
* Skip copy for stable build
* Remove outdated script
* Build fixes for asar
* fix
* Add some logging
* Fix for windows
* Fix
* Logs
* build: add glob diagnostic for copyCopilotNativeDeps
* build: check both node_modules/ and .asar.unpacked/ for source binaries
* Fix
* Remove excalidraw
---------
Co-authored-by: Connor Peet <connor@peet.io>
Co-authored-by: Connor Peet <copeet@microsoft.com>
* Reapply "Git - adopt the new package to use copy-on-write for the worktree include files (#299583)" (#300448)
This reverts commit c56c7bc071.
* Attempt to fix tests
* Fix build
* build: copy node_modules into extension bundle
* Regenerate lock file
---------
Co-authored-by: deepak1556 <hop2deep@gmail.com>
* sessions: add built-in skills infrastructure
Add a 'built-in skills' concept mirroring the existing 'built-in prompts'
pattern, so that skills bundled with the Sessions app are always available.
- Create src/vs/sessions/skills/ directory for bundled SKILL.md files
- Bundle vs/sessions/skills/**/SKILL.md in build config
- AgenticPromptsService: discover and parse built-in skills from the
bundled directory, override findAgentSkills() to merge them at lowest
priority (user/workspace skills override by name), extend listPromptFiles
and listPromptFilesForStorage for skill type
- Tree view: handle BUILTIN_STORAGE group for skills category
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: add built-in 'update-skills' skill
First built-in skill that guides the agent to capture major repository
learnings by creating or updating skills and instructions. Triggered
when the user says 'learn!' or when significant reusable knowledge is
discovered during a session.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: support edit-and-save-to-override for built-in skills
Extend the built-in prompt save-to-override flow to also work for
built-in skills. When editing a built-in skill, users can save it to
workspace or user location, which overrides the built-in version.
- Gate the in-memory editing session on both prompt and skill types
- Resolve save target directories using the actual prompt type
- Preserve skill directory structure ({name}/SKILL.md) when saving
- Generalize UI labels from 'prompt override' to 'override'
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: address PR review feedback for built-in skills
- Sanitize built-in skill name/description (strip XML tags, truncate)
to match the same safety applied to other skill sources
- Fix JSDoc: all sources override built-ins, not just user/workspace
- Remove unnecessary 'as unknown as PromptsStorage' cast in tree view
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* sessions: refine editor options types for accessibility and font settings
---------
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
* Copy vscode's node.pty
* And ripgrep
* And thsi
* Connect to remote agent hosts via setting chat.remoteAgentHosts
* This
* Fix
* Cleanup
* Rearrange, add unit tests