# Seat conversation control

Arc agent documentation

Exact arguments and input schemas for seat conversation control.

[MCP reference index](/arc/docs/reference/mcp)

## arc_seat_context

Read exactly what a managed seat's next turn will replay: the exchanges inside its replay window (newest 12 non-excluded entries), the older ones beyond it, excluded ones, the next to fall out, and history_revision — the CAS token the seat-context verbs take as expected_history_revision. Tool calls, tool results and images are never replayed. run_id is required.

| Argument | Required | Type | Description / schema default |
| --- | --- | --- | --- |
| `run_id` | yes | string | See the schema below. |
| `membership_id` | no | string | See the schema below. |
| `agent_id` | no | string | See the schema below. |
| `max_chars` | no | integer | character budget (default 24000); older entries past it are clipped to a stand-in with head + sha256 |

### Complete input schema

```json
{
  "type": "object",
  "properties": {
    "run_id": {
      "type": "string"
    },
    "membership_id": {
      "type": "string"
    },
    "agent_id": {
      "type": "string"
    },
    "max_chars": {
      "type": "integer",
      "description": "character budget (default 24000); older entries past it are clipped to a stand-in with head + sha256"
    }
  },
  "required": [
    "run_id"
  ]
}
```

## arc_seat_retry

Drop a managed seat's last exchange and re-run it with the same or an edited prompt (message); superseded rows stay in the room for audit as stubs. dry_run=true returns the plan and the side effects that STAY (files, tasks, claims, artifacts, decisions). Refused while the seat is busy; queued turns block unless drop_queued=true. Conversation only — never an undo of files, tasks, or decisions.

| Argument | Required | Type | Description / schema default |
| --- | --- | --- | --- |
| `run_id` | yes | string | See the schema below. |
| `membership_id` | no | string | See the schema below. |
| `agent_id` | no | string | See the schema below. |
| `turn_id` | yes | string | the seat's last committed turn (from arc_seat_context or arc_seat_status) |
| `message` | no | string | edited prompt; omit to retry the original prompt |
| `dry_run` | no | boolean | return the supersede plan and side effects without acting |
| `drop_queued` | no | boolean | drop the seat's queued turns first instead of refusing |
| `expected_history_revision` | no | integer | CAS token from arc_seat_context; a mismatch is refused |
| `supersede_request` | no | boolean | also stub the operator's request row on a same-prompt retry |
| `source_message_id` | no | integer | room message that carries the new prompt, if you posted one |
| `max_steps` | no | integer | checkpoint interval for the replacement turn, 1..500 |
| `origin_id` | no | string | optional stable delivery key for the replacement turn |
| `request_id` | no | string | idempotency key; retry a timed-out write with the SAME id (never duplicates) |

### Complete input schema

```json
{
  "type": "object",
  "properties": {
    "run_id": {
      "type": "string"
    },
    "membership_id": {
      "type": "string"
    },
    "agent_id": {
      "type": "string"
    },
    "turn_id": {
      "type": "string",
      "description": "the seat's last committed turn (from arc_seat_context or arc_seat_status)"
    },
    "message": {
      "type": "string",
      "description": "edited prompt; omit to retry the original prompt"
    },
    "dry_run": {
      "type": "boolean",
      "description": "return the supersede plan and side effects without acting"
    },
    "drop_queued": {
      "type": "boolean",
      "description": "drop the seat's queued turns first instead of refusing"
    },
    "expected_history_revision": {
      "type": "integer",
      "description": "CAS token from arc_seat_context; a mismatch is refused"
    },
    "supersede_request": {
      "type": "boolean",
      "description": "also stub the operator's request row on a same-prompt retry"
    },
    "source_message_id": {
      "type": "integer",
      "description": "room message that carries the new prompt, if you posted one"
    },
    "max_steps": {
      "type": "integer",
      "description": "checkpoint interval for the replacement turn, 1..500"
    },
    "origin_id": {
      "type": "string",
      "description": "optional stable delivery key for the replacement turn"
    },
    "request_id": {
      "type": "string",
      "description": "idempotency key; retry a timed-out write with the SAME id (never duplicates)"
    }
  },
  "required": [
    "run_id",
    "turn_id"
  ]
}
```

## arc_seat_rewind

Forget one exchange and everything after it in a managed seat's memory. Pass message to continue from that point; omit it to leave the seat ready (at the last exchange this is simply Discard reply). The forgotten replies and requests are superseded in the room — stubbed for every reader, kept for audit. dry_run=true previews the plan and the side effects that stay. Refused while the seat is busy; queued turns block unless drop_queued=true.

| Argument | Required | Type | Description / schema default |
| --- | --- | --- | --- |
| `run_id` | yes | string | See the schema below. |
| `membership_id` | no | string | See the schema below. |
| `agent_id` | no | string | See the schema below. |
| `turn_id` | yes | string | the first committed turn to forget; every later exchange goes with it |
| `message` | no | string | optional prompt to continue with from the rewind point |
| `dry_run` | no | boolean | See the schema below. |
| `drop_queued` | no | boolean | See the schema below. |
| `expected_history_revision` | no | integer | See the schema below. |
| `source_message_id` | no | integer | See the schema below. |
| `max_steps` | no | integer | See the schema below. |
| `origin_id` | no | string | See the schema below. |
| `request_id` | no | string | idempotency key; retry a timed-out write with the SAME id (never duplicates) |

### Complete input schema

```json
{
  "type": "object",
  "properties": {
    "run_id": {
      "type": "string"
    },
    "membership_id": {
      "type": "string"
    },
    "agent_id": {
      "type": "string"
    },
    "turn_id": {
      "type": "string",
      "description": "the first committed turn to forget; every later exchange goes with it"
    },
    "message": {
      "type": "string",
      "description": "optional prompt to continue with from the rewind point"
    },
    "dry_run": {
      "type": "boolean"
    },
    "drop_queued": {
      "type": "boolean"
    },
    "expected_history_revision": {
      "type": "integer"
    },
    "source_message_id": {
      "type": "integer"
    },
    "max_steps": {
      "type": "integer"
    },
    "origin_id": {
      "type": "string"
    },
    "request_id": {
      "type": "string",
      "description": "idempotency key; retry a timed-out write with the SAME id (never duplicates)"
    }
  },
  "required": [
    "run_id",
    "turn_id"
  ]
}
```

## arc_seat_edit_reply

Rewrite the reply a managed seat will remember for one committed exchange. The seat's old reply row is superseded and the edited text is posted BY YOU (metadata arc_event=seat_reply_edited names the seat and turn) — never as the seat — and the seat is told on its next turn that the edited text is authoritative.

| Argument | Required | Type | Description / schema default |
| --- | --- | --- | --- |
| `run_id` | yes | string | See the schema below. |
| `membership_id` | no | string | See the schema below. |
| `agent_id` | no | string | See the schema below. |
| `turn_id` | yes | string | See the schema below. |
| `content` | yes | string | the reply the seat should remember having given |
| `expected_history_revision` | no | integer | See the schema below. |
| `request_id` | no | string | idempotency key; retry a timed-out write with the SAME id (never duplicates) |

### Complete input schema

```json
{
  "type": "object",
  "properties": {
    "run_id": {
      "type": "string"
    },
    "membership_id": {
      "type": "string"
    },
    "agent_id": {
      "type": "string"
    },
    "turn_id": {
      "type": "string"
    },
    "content": {
      "type": "string",
      "description": "the reply the seat should remember having given"
    },
    "expected_history_revision": {
      "type": "integer"
    },
    "request_id": {
      "type": "string",
      "description": "idempotency key; retry a timed-out write with the SAME id (never duplicates)"
    }
  },
  "required": [
    "run_id",
    "turn_id",
    "content"
  ]
}
```

## arc_seat_exclude_context

Exclude one committed exchange from (excluded=true, the default) or restore it to (excluded=false) a managed seat's replayed context without deleting it or touching the room. Excluding pulls an older exchange into the replay window.

| Argument | Required | Type | Description / schema default |
| --- | --- | --- | --- |
| `run_id` | yes | string | See the schema below. |
| `membership_id` | no | string | See the schema below. |
| `agent_id` | no | string | See the schema below. |
| `turn_id` | yes | string | See the schema below. |
| `excluded` | no | boolean | See the schema below. |
| `expected_history_revision` | no | integer | See the schema below. |
| `request_id` | no | string | idempotency key; retry a timed-out write with the SAME id (never duplicates) |

### Complete input schema

```json
{
  "type": "object",
  "properties": {
    "run_id": {
      "type": "string"
    },
    "membership_id": {
      "type": "string"
    },
    "agent_id": {
      "type": "string"
    },
    "turn_id": {
      "type": "string"
    },
    "excluded": {
      "type": "boolean"
    },
    "expected_history_revision": {
      "type": "integer"
    },
    "request_id": {
      "type": "string",
      "description": "idempotency key; retry a timed-out write with the SAME id (never duplicates)"
    }
  },
  "required": [
    "run_id",
    "turn_id"
  ]
}
```
