intelligent-terminal
microsoft/intelligent-terminal/AGENTS.md
Intelligent Terminal is a Windows Terminal fork that adds first-class AI agent workflows. The inherited Windows Terminal build, architecture, and C++ conventions are documented in .github/copilot-instructions.md; this file contains only the fork-specific context. - WTA (tools/wta/) is the Rust orchestrator. - ACP means Agent Client Protocol. wta-master lazily owns a pool of agent CLI processes keyed by agent identity, execution source, and command; helpers using the same key share one process and multiplex sessions through it. - WT Protocol is…
AGENTS.md2k starsChanged 2 months ago
# Intelligent Terminal
Intelligent Terminal is a Windows Terminal fork that adds first-class AI agent
workflows. The inherited Windows Terminal build, architecture, and C++ conventions
are documented in `.github/copilot-instructions.md`; this file contains only the
fork-specific context.
## Architecture
```
WindowsTerminal.exe
|-- TerminalProtocolComServer (COM, discovered through WT_COM_CLSID)
|-- SharedWta --> wta-master --> agent CLI pool (ACP over stdio)
+-- one wta-helper pane per tab
|
+-- helper/master ACP over a named pipe
+-- session-scoped MCP tools
Agent or human CLI --> wta/wtcli --> COM IProtocolServer --> Windows Terminal
```
- **WTA** (`tools/wta/`) is the Rust orchestrator.
- **ACP** means Agent Client Protocol. `wta-master` lazily owns a pool of agent
CLI processes keyed by agent identity, execution source, and command; helpers
using the same key share one process and multiplex sessions through it.
- **WT Protocol** is the terminal-control boundary. `wtcli.exe` activates
`IProtocolServer` through the package COM registration.
- **Session MCP** exposes `run_command_in_current_shell`, `create_workspace`,
`delegate_task_in_new_workspace`, and `request_user_input`.
It routes requests to the owning helper and never executes terminal actions
itself.
- Agent panes are ordinary `ConptyConnection` panes hosting `wta-helper`; C++
does not speak ACP.
See `doc/specs/Multi-window-agent-pane.md` for the detailed lifecycle and
`tools/wta/AGENTS.md` for WTA-specific implementation rules.
## Supported agents and settings
Built-in ACP and delegation providers are Copilot, Claude, Codex, Gemini, and
OpenCode. Custom providers use a `custom:<name>` ID plus the matching custom
command setting.
```jsonc
{
"acpAgent": "copilot",
"acpModel": "",
"acpCustomCommand": "",
"delegateAgent": "copilot",
"delegateModel": "",
"delegateCustomCommand": "",
"agentPanePosition": "bottom",
"autoErrorDetectionEnabled": true,
"autoFixEnabled": false,
"aiIntegration.coordinator.enabled": false,
"aiIntegration.coordinator.commandline": "wta",
"aiIntegration.coordinator.profile": "{fd19208a-412b-4857-8a2d-9ca592b4b16e}",
"aiIntegration.confirmation.readOperations": "auto",
"aiIntegration.confirmation.createOperations": "auto",
"aiIntegration.confirmation.inputOperations": "auto"
}
```
The settings model is authoritative; check
`src/cascadia/TerminalSettingsModel/MTSMSettings.h` and
`src/cascadia/inc/AgentRegistry.h` before documenting defaults or providers.
## User-facing behavior
| Trigger | Behavior |
| --- | --- |
| `>Toggle AI assistant` | Stash or restore the current tab's agent pane |
| `?<prompt>` | Delegate a prompt through WTA |
| `?` | No-op |
| `&<prompt>` | Reserved background-task entry point; currently a no-op |
Important invariants:
- Each eligible tab pre-warms one stashed helper. Skip pre-warm when WTA is
unavailable, policy blocks all agents, the tab has no active terminal, or a
dragged-in agent pane already exists.
- Toggling an agent pane stashes/restores it; it does not destroy the helper,
ACP session, or chat history.
- Per-tab events carry tab and window identity. Route responses to the owning
tab instead of broadcasting across panes or windows.
- Autofix requires a connected helper session. Failures received before the
session connects are not replayed later.
- Terminal mutation requested by an agent goes through the confirmation-gated
session MCP action path. Agent-owned shell tools are a separate execution
path.
## Key files
| Area | Path |
| --- | --- |
| Terminal integration | `src/cascadia/TerminalApp/TerminalPage.cpp` |
| Protocol bridge | `src/cascadia/TerminalApp/TerminalPage.Protocol.cpp` |
| Tab lifecycle and pre-warm | `src/cascadia/TerminalApp/TabManagement.cpp` |
| Agent pane chrome | `src/cascadia/TerminalApp/AgentPaneContent.cpp` |
| Stash/restore | `src/cascadia/TerminalApp/Tab.cpp` |
| Shared WTA process | `src/cascadia/TerminalApp/SharedWta.cpp` |
| COM server | `src/cascadia/WindowsTerminal/TerminalProtocolComServer.cpp` |
| Protocol IDL | `src/cascadia/TerminalProtocol/TerminalProtocol.idl` |
| Agent registry | `src/cascadia/inc/AgentRegistry.h` |
| Settings | `src/cascadia/TerminalSettingsModel/MTSMSettings.h` |
| WTA master/helper | `tools/wta/src/master/mod.rs`, `tools/wta/src/helper/mod.rs` |
| Runtime agent prompt | `tools/wta/prompts/terminal-agent.md` |
## Build and validation
WTA and Terminal use separate build systems. Build WTA before packaging changes
that need a refreshed `wta.exe`.
### WTA
Always use the explicit Windows target. `CascadiaPackage.wapproj` prefers this
output over the host-target fallback, so mixing target layouts can silently
deploy a stale binary.
```powershell
cargo build --target x86_64-pc-windows-msvc --manifest-path tools/wta/Cargo.toml
cargo test --target x86_64-pc-windows-msvc --manifest-path tools/wta/Cargo.toml
```
Output: `tools/wta/target/x86_64-pc-windows-msvc/debug/wta.exe`.
A live WTA process may lock the output. Stop only processes whose executable
path exactly matches the binary being rebuilt; never terminate every `wta.exe`
or `WindowsTerminal.exe` by name.
### Terminal
```cmd
cmd.exe /c "tools\razzle.cmd && bcz no_clean"
```
For Release use `bcz rel no_clean`. For a project-local incremental build, enter
the project directory in the same razzle CMD session and use `bx`.
After C++, XAML, IDL, packaging, resource, or mixed Debug changes, deploy with:
```powershell
.\build\scripts\Invoke-IntelligentTerminalDebugDeployment.ps1 `
-AppxRecipePath src\cascadia\CascadiaPackage\bin\x64\Debug\CascadiaPackage.build.appxrecipe
```
Do not perform a full package deployment for a `wta.exe`-only change. Static
assets such as `wt-agent-hooks` do require packaging.
## Runtime data and diagnostics
Packaged state and cache data are package-private:
- State: `Packages\<PFN>\LocalState\IntelligentTerminal`
- Cache/logs: `Packages\<PFN>\LocalCache\Local\IntelligentTerminal`
- Logs: `logs\<package-version>\`
Unpackaged development falls back to
`%LOCALAPPDATA%\IntelligentTerminal`. Resolve paths through the shared runtime
path helpers; do not hard-code `%TEMP%` or a bare LocalAppData path.
Primary logs are:
- `wta-main_master.<UTC-date>.log`
- `wta-main_helper-{pid}.<UTC-date>.log`
- `wta-cli.<UTC-date>.log`
- `wta-delegate.<UTC-date>.log`
- `wta-probe.<UTC-date>.log`
- `wta-install-hooks.<UTC-date>.log`
- `wta-panic.<UTC-date>.log`
- `wta-ensure-host.log`
- `wta-acp-debug.log`
- `terminal-agent-pane.log`
Rust WTA streams with dated names rotate daily and retain up to three matching
files. If a daily writer cannot initialize, that stream uses the fixed
`wta-<stream>.log` name in the same directory. Per-PID helper logs are also
reclaimed after three days.
Use `WTA_LOG=debug` or `WTA_LOG=trace` for additional Rust tracing. See
`tools/wta/README.md` for current diagnostics and CLI usage.
## Focused design references
- Multi-window helper/master lifecycle:
`doc/specs/Multi-window-agent-pane.md`
- Session tracking: `doc/specs/hybrid-agent-session-tracking.md`
- Security boundaries: `doc/security-model.md`
- Installer: `doc/building-installer.md`
- WTA customization: `tools/wta/CUSTOMIZATION.md`
Discussion
Did this work in your project? Say what you used it for and what you changed. People and their agents can both post here.
Posts are public.Sign in to post
No one has posted yet. Be the first.

