# ACP editor integration
README
·
简体中文
·
Guide
·
ACP specification
Reasonix implements Agent Client Protocol (ACP) v1 as an NDJSON JSON-RPC 2.0
agent over standard input and output. Editors and other ACP hosts launch the
process, open one or more workspace-scoped sessions, and receive streamed
messages, tool activity, plans, permission requests, and configuration updates.
## Start the agent
An ACP host should launch one of these commands:
```sh
reasonix acp
reasonix acp --model deepseek-pro
reasonix acp --profile delivery
```
`--model` selects the startup model when the client does not override it.
`--profile` sets the startup work mode to `economy`, `balanced`, or `delivery`.
Both remain session-configurable after initialization.
Standard output is reserved for ACP messages. Reasonix sends diagnostics to
standard error, so hosts must not merge the two streams. Run `reasonix setup`
beforehand when no provider is configured; the initialize response also
advertises a terminal authentication method that launches `reasonix setup`.
## Initialize and negotiate capabilities
Clients should call `initialize` before opening a session. Reasonix advertises
the following capability shape (irrelevant fields omitted):
```json
{
"protocolVersion": 1,
"agentCapabilities": {
"loadSession": true,
"sessionCapabilities": {
"list": {},
"resume": {},
"close": {},
"delete": {}
},
"promptCapabilities": {
"image": false,
"audio": false,
"embeddedContext": true
},
"mcpCapabilities": {
"http": true,
"sse": false
},
"_meta": {
"reasonix.io": {
"sessionSteer": {
"method": "_reasonix.io/session/steer"
}
}
}
}
}
```
When the client advertises `fs.readTextFile`, `fs.writeTextFile`, or
`terminal`, Reasonix routes eligible file operations through the editor's
unsaved buffers and eligible foreground commands through a client-owned
terminal. Without those client capabilities, the normal workspace tools run
locally inside the Reasonix process.
## Session lifecycle
Each ACP session owns an independent Reasonix controller, workspace root, model,
work mode, collaboration mode, approval mode, MCP set, and persisted transcript.
State does not leak between sessions.
| Method | Behavior |
| --- | --- |
| `session/new` | Opens a session for an absolute `cwd` and returns its configuration state. |
| `session/load` | Opens a persisted ACP session and replays its transcript as `session/update` notifications. |
| `session/resume` | Opens a persisted session without replaying the transcript. |
| `session/prompt` | Runs one turn and streams updates until it returns a stop reason. |
| `session/cancel` | Cancels the active turn; this is a notification. |
| `session/list` | Lists live and persisted ACP sessions, optionally filtered by absolute `cwd`. |
| `session/close` | Stops a live session and releases resources without deleting history. |
| `session/delete` | Stops the session and removes its persisted ACP history. |
`session/new`, `session/load`, and `session/resume` may include `mcpServers`.
Reasonix accepts stdio, Streamable HTTP, and legacy SSE servers. ACP's official `[{"name":"...","value":"..."}]`
shape is supported for stdio `env` and HTTP `headers`; the older object-map
shape remains accepted for compatibility.
## Session controls
Reasonix exposes independent controls instead of combining unrelated choices in
one mode selector:
| Control | Values | Wire surface |
| --- | --- | --- |
| Collaboration mode | `normal`, `plan`, `goal` | `modes` and `session/set_mode` |
| Model | Configured `provider/model` entries | `configOptions` with id `model` |
| Reasoning effort | Provider-supported levels or `auto` | `configOptions` with id `effort` |
| Work mode | `economy`, `balanced`, `delivery` | `configOptions` with id `work_mode` |
| Tool approval | `ask`, `auto`, `yolo` | `configOptions` with id `tool_approval` |
Use `session/set_config_option` for model, effort, work mode, and tool approval.
Model, effort, and work-mode changes rebuild the session controller while
preserving its history and the other axes. Tool-approval changes update the
gate without rebuilding the controller.
For older clients, `session/set_model` remains available. The legacy
`session/set_mode` values `default` and `auto` are also accepted as Normal + Ask
and Normal + Yolo respectively; new clients should use the independent
selectors above.
## Prompts, updates, and approvals
`session/prompt` accepts text blocks and embedded text resources. Images and
audio are not advertised. During a turn, Reasonix may send:
- agent message and thought chunks;
- pending and completed tool-call updates;
- complete plan updates derived from `todo_write`;
- available slash commands;
- current-mode and configuration-option updates; and
- `session/request_permission` requests for permission-gated tools and user
questions.
Hosts should keep the `session/prompt` request open until Reasonix returns its
stop reason, while continuing to process requests and notifications in both
directions.
## Mid-turn steering extension
Reasonix exposes mid-turn guidance as an ACP v1 vendor extension. It is not a
core ACP method, and it is not the still-unreleased ACP v2 `session/inject`
proposal.
### Discover support
Read the method name from:
```text
agentCapabilities._meta["reasonix.io"].sessionSteer.method
```
Do not assume the extension exists, and do not call the unnamespaced
`session/steer` name. ACP reserves non-underscore method names for the core
protocol.
### Send guidance
Call the advertised method while `session/prompt` is active:
```json
{
"jsonrpc": "2.0",
"id": 2,
"method": "_reasonix.io/session/steer",
"params": {
"sessionId": "session-id",
"prompt": [
{"type": "text", "text": "use email instead of username"}
]
}
}
```
A successful `{}` result means the active turn accepted the guidance. Reasonix
adds it as a user message before the next safe model-call boundary, without
cancelling the turn or consuming an extra tool-step budget. The message is
persisted in normal history; transcript replay shows the original user text,
not Reasonix's internal steer marker.
| Condition | JSON-RPC result |
| --- | --- |
| Active prompt accepted the guidance | `{}` |
| Unknown session or empty prompt | `-32602 InvalidParams` |
| Session has no active prompt | `-32600 InvalidRequest` |
| Client calls `session/steer` | `-32601 MethodNotFound` |
On `InvalidRequest`, the guidance was not queued. A client may wait for the
active prompt to finish and offer the text as a normal new prompt, but it should
not silently report the failed steer as accepted.
## Compatibility and cache behavior
| Surface | Older or non-Reasonix clients | Conclusion |
| --- | --- | --- |
| Existing ACP v1 methods | Their names and response shapes are unchanged. | Compatible |
| Capability `_meta` | Unknown metadata may be ignored. | Compatible |
| Persisted transcripts | No new persisted schema is required. | Compatible |
| CLI, Desktop, and Bot steering | Their existing idle fallback remains unchanged. | Compatible |
Steering appends a user-requested message to normal conversation history. It
does not change the system prompt, tool schemas, tool order, or other stable
provider-prefix bytes. The next provider request necessarily misses the suffix
that did not previously exist, just like any normal new user message, while the
earlier prefix remains reusable.
## Client integration checklist
1. Launch `reasonix acp` with separate stdin, stdout, and stderr streams.
2. Call `initialize` and honor both standard and `_meta` capabilities.
3. Open sessions with absolute workspace paths and keep their ids isolated.
4. Process agent-to-client filesystem, terminal, and permission requests while
a prompt is running.
5. Show steer UI only when the Reasonix capability is advertised and a prompt
is active.
6. Treat a successful steer response as queued guidance, not immediate model
completion.
7. Use `session/close` for resource cleanup and `session/delete` only when the
user intends to remove persisted history.