# config.json Limits

The runtime limits `config.json` can raise, and the package defaults it cannot change.

Missing `reply_lang`, `output_dir`, and `model_tag` are filled with defaults and written back on startup. Since v1.1.2 missing limit fields are no longer filled in, and a limit can only raise its default: the effective value is `max(config value, default)`, so a smaller value is ignored.

| Key | Default | Description |
|---|---:|---|
| `limits.max_tool_iterations` | `256` | Maximum tool iterations per run (`128` before v1.1.2) |
| `limits.agent_send_timeout_seconds` | `600` | Model-request timeout |
| `limits.max_history_messages` | `16` | Recent history messages retained (`24` before v1.1.2) |
| `limits.max_history_bytes` | `4194304` | History-size ceiling. Changed from `5242880` in v1.0.12, where it became `MAX_DOCUMENT_BYTES * 4` — four times the 1 MiB single-document ceiling |

Package defaults that are **not** read from `config.json` (since v1.1.2 all of them live in `configs/configs.go`):

| Constant | Default | Description |
|---|---:|---|
| `MAX_SESSION_TASKS` | `3` | Concurrent tasks per session; further tasks queue rather than fail (`NumCPU × 4` before v1.1.2) |
| `MAX_SUBAGENT_TIMEOUT_MIN` | `30` | Subagent timeout in minutes |
| `MAX_RESUME_WAIT_MIN` | `60` | How long a pending resume waits for answers |
| `MAX_CONCURRENT_TOOLS` | `5` | Concurrent tool calls within one model turn; the rest queue (v1.0.20) |

The daemon port is **not** configurable: `17989` is a package constant, and a `limits.port` entry is ignored.

There are **no environment variables** for runtime limits — env-based overrides were removed; `config.json` is the only knob.
