Terminal Conductor
Orchestrate named terminals for GitHub Copilot and AI agents.
A VS Code extension that gives Copilot (and any other Language Model Tools consumer) a small, opinionated set of terminal-management tools. Instead of the agent spawning a fresh terminal for every command, it reuses named, role-based terminals — dev-server, build, test, git, etc. — with shell-integration-aware output capture.
Why
Without help, AI agents tend to:
- spin up a new terminal per command (terminal panel fills up fast)
- lose track of which terminal is running which long-lived process
- abandon dev servers and watchers in untracked terminals
Terminal Conductor fixes this by making named-terminal reuse the path of least resistance for the model.
Features
- Six Language Model Tools (
#listTerminals, #sendCommand, #getTerminalOutput, #cancelCommand, #createTerminal, #deleteTerminal).
- Real output capture via VS Code's shell integration — when available,
sendCommand waits for completion and returns stdout/stderr + exit code.
- Background commands — long-running processes (dev servers, watchers) start in the background and can be checked on later with
getTerminalOutput.
- Status tracking — every named terminal exposes
idle / busy / exited, last command, last exit code, and cwd (when shell integration provides it).
- Adopt existing terminals — terminals already open at activation are picked up so they're addressable by name.
@conductor chat participant with /run, /list, /output, /cancel, /relaunch slash commands. Natural-language requests are translated into a real shell command via the active chat model before being run.
- Palette commands for everything the tools do.
Recommended terminal names
| Name |
Use for |
dev-server |
Long-running servers (npm run dev, python manage.py runserver) |
build |
Builds (npm run build, cargo build, dotnet build) |
test |
Test runs and watch modes |
package-manager |
Dependency installs (npm install, pip install) |
git |
Version control |
docker |
Containers |
database |
DB CLIs |
cloud |
Cloud CLIs (az, aws, gcloud) |
scripts |
One-off automation |
general |
Anything that doesn't fit elsewhere |
How agents use it
The tools are exposed via VS Code's Language Model Tools API. In Copilot Chat agent mode they appear automatically, and the model is steered (via tool descriptions) to prefer sendCommand with a descriptive terminalName instead of spawning new terminals.
Typical flow:
listTerminals → see what's already running.
sendCommand { terminalName: "test", command: "npm test" } → terminal is created on first use, output is captured.
sendCommand { terminalName: "dev-server", command: "npm run dev", background: true } → fires and returns immediately.
getTerminalOutput { terminalName: "dev-server" } → check on the server later.
cancelCommand { terminalName: "test" } → Ctrl+C if needed.
Configuration
| Setting |
Default |
Description |
terminalConductor.maxOutputChars |
8000 |
Max characters of captured output returned to the model. Older output is dropped. |
terminalConductor.commandTimeoutMs |
60000 |
How long sendCommand waits for completion when shell integration is available. |
terminalConductor.adoptExistingTerminals |
true |
Adopt already-open terminals on activation. |
Copilot instructions
The extension ships a tuned instructions file
(instructions/terminal-conductor.instructions.md) that tells Copilot to prefer
the Terminal Conductor tools over the default run_in_terminal. On first
activation the extension asks once whether to enable it globally; doing so adds
the extension's instructions/ folder to your user setting
chat.instructionsFilesLocations. No workspace files are modified.
You can change this any time:
- Terminal Conductor: Enable Copilot Instructions
- Terminal Conductor: Disable Copilot Instructions
The tool descriptions themselves also steer the model, so the extension is
useful even without the instructions file enabled.
Development
npm install
npm run compile # bundle with esbuild
npm run watch # bundle in watch mode
npm test # run mocha unit tests (no VS Code required)
npm run check-types # tsc --noEmit
Press F5 in VS Code to launch the Extension Development Host.
Project layout
src/
extension.ts — activation entry
terminalManager.ts — named-terminal registry + shell-integration tracking
outputBuffer.ts — pure ring buffer for captured output
tools.ts — six Language Model Tools
commands.ts — palette commands
types.ts — shared types / ITerminalManager contract
test/
mocks/vscode.ts — vscode module mock for unit tests
*.test.ts — mocha tests
License
MIT