diff --git a/docs/concepts/distribution/index.md b/docs/concepts/distribution/index.md
index 2db2a8db6..9ad2fc1f0 100644
--- a/docs/concepts/distribution/index.md
+++ b/docs/concepts/distribution/index.md
@@ -119,9 +119,31 @@ $ docker agent share push ./agent.yaml docker.io/myorg/private-agent:latest
$ docker agent run docker.io/myorg/private-agent:latest
```
+
+
Docker Desktop credentials
+
+
When pulling or running an agent from a docker.com or *.docker.com HTTPS URL (e.g. desktop.docker.com), docker-agent automatically forwards your Docker Desktop JWT for authentication — no explicit login required when Docker Desktop is running and signed in.
+
Note: docker.io (the standard Docker Hub registry domain) is a separate domain and is not covered by automatic JWT forwarding. Agents pulled from docker.io or registry-1.docker.io still require docker login docker.io for private repositories.
+
+
Troubleshooting
Having issues with push/pull? See Troubleshooting for common registry issues.
+
+## Local Development
+
+For local development and testing, you can run an agent directly from a local HTTP server without a registry:
+
+```bash
+# Serve an agent config locally
+$ python3 -m http.server 8080
+
+# Run it directly via HTTP
+$ docker agent run http://localhost:8080/agent.yaml
+$ docker agent run http://127.0.0.1:8080/agent.yaml
+```
+
+This is useful for iterating on agent configs served from a local dev server before pushing to a registry. Both `localhost` and `127.0.0.1` addresses are supported with plain `http://` URLs.
diff --git a/docs/configuration/tools/index.md b/docs/configuration/tools/index.md
index d05ce7b03..1429371fc 100644
--- a/docs/configuration/tools/index.md
+++ b/docs/configuration/tools/index.md
@@ -262,7 +262,7 @@ toolsets:
| Property | Type | Description |
| --- | --- | --- |
| `profile` | string | One of `resilient` (default), `strict`, `best-effort`. Picks defaults for every other field. |
-| `restart` | string | When the supervisor should reconnect after a disconnect: `never`, `on_failure` (default), or `always`. |
+| `restart` | string | When the supervisor should reconnect after a disconnect: `never`, `on_failure` (default), or `always`. For **remote** MCP toolsets (Streamable HTTP / SSE), `on_failure` is automatically promoted to `always` so idle-timeout closes reconnect gracefully — `never` is still honored. |
| `max_restarts` | int | Maximum consecutive restart attempts before the toolset is marked `Failed`. `0` uses the profile default (5); `-1` means unlimited. |
| `backoff.initial` | duration | First wait between attempts (Go duration: `500ms`, `1s`, …). Default: `1s`. |
| `backoff.max` | duration | Cap on the wait between attempts. Default: `32s`. |
diff --git a/docs/features/remote-mcp/index.md b/docs/features/remote-mcp/index.md
index 0b575196c..693511cb1 100644
--- a/docs/features/remote-mcp/index.md
+++ b/docs/features/remote-mcp/index.md
@@ -52,6 +52,12 @@ For full configuration details, see the [Tool Config]({{ '/configuration/tools/'
Set `allow_private_ips: true` on a remote MCP toolset only when the MCP server or its OAuth registration/token endpoints intentionally resolve to private, loopback, or link-local addresses. The default blocks those OAuth helper requests to reduce SSRF risk.
+
+
Automatic reconnection after idle timeouts
+
+
Remote MCP connections (Streamable HTTP / SSE) automatically reconnect after the server closes an idle connection — no configuration needed. Services like Notion and Linear close idle connections periodically; docker-agent detects the clean close and reconnects with exponential backoff. To tune reconnect behaviour or disable reconnection entirely, use the lifecycle block.
+
+
### OAuth for servers without Dynamic Client Registration
Most remote MCP servers that require OAuth support [Dynamic Client Registration (RFC 7591)]({{ 'https://datatracker.ietf.org/doc/html/rfc7591' }}) — no configuration is needed, docker-agent handles the flow for you.
diff --git a/docs/guides/go-sdk/index.md b/docs/guides/go-sdk/index.md
index 9ae6ac8c8..2e8f8a93e 100644
--- a/docs/guides/go-sdk/index.md
+++ b/docs/guides/go-sdk/index.md
@@ -34,14 +34,16 @@ docker-agent can be used as a Go library, allowing you to build AI agents direct
| `pkg/tui/components/toolconfirm` | Tool-confirmation policy: `Decision` enum, `BuildPermissionPattern`, key bindings, and rejection-reason presets. Share this instead of copying the permission-pattern logic. |
| `pkg/tui/service` | `StaticSessionState` — a `SessionStateReader` with conservative fixed values, for rendering message/tool views outside the full TUI app. Replaces hand-rolled nine-method stubs. |
| `pkg/tui/animation` | `Stopper` / `StopView` — animation lifecycle contract. Call `StopAnimation` on views removed from the UI to prevent leaked tick subscriptions. |
+| `pkg/tui/components/transcript` | Embedded transcript view with read-only `Messages()` accessor for observing conversation structure in host tests and persistence layers. |
## Embedding TUI Components
-When building custom UIs on top of docker-agent's TUI primitives, three packages define the contracts that keep the runtime and the UI in sync:
+When building custom UIs on top of docker-agent's TUI primitives, four packages define the contracts that keep the runtime and the UI in sync:
- **`pkg/tui/components/toolconfirm`** — import this package for the permission-decision policy rather than copying the pattern-building logic. The `Decision` enum, `BuildPermissionPattern` helper, and rejection-reason presets are the canonical source of truth: whatever pattern is shown to the user in the confirmation dialog is exactly the pattern granted to the runtime.
- **`pkg/tui/service`** — use `StaticSessionState` as a stub `SessionStateReader` when rendering individual message or tool views outside the full TUI app. It returns conservative fixed values for all nine interface methods, eliminating the need for hand-rolled stubs.
- **`pkg/tui/animation`** — implement `animation.Stopper` on any view that owns a tick-based animation. Call `StopAnimation` whenever a view is removed from the UI hierarchy to prevent leaked `time.Tick` subscriptions from firing against a dead view.
+- **`pkg/tui/components/transcript`** — embed the transcript view for displaying conversation history. Use the `Messages()` method to read the current slice of transcript messages (treat as read-only — mutations desync renders). This is useful for host-side tests asserting on chat history, and for persistence layers that need to snapshot conversation state.
## Basic Example
diff --git a/docs/guides/thinking/index.md b/docs/guides/thinking/index.md
index 14f3b13cf..19239fbb4 100644
--- a/docs/guides/thinking/index.md
+++ b/docs/guides/thinking/index.md
@@ -304,6 +304,15 @@ models:
| Research, difficult math/logic | `xhigh` / `max` |
| Long agentic tasks (Anthropic) | `adaptive` |
+## Changing Thinking Level at Runtime
+
+While running in the TUI, press **Shift+Tab** to cycle the thinking effort level for the current model without editing your YAML config:
+
+- The level steps through the model's supported range (provider-specific), wrapping around — for example `none → minimal → low → medium → high → xhigh → none` on OpenAI.
+- The current level is shown in the sidebar next to the model name (e.g. `openai/gpt-5 • high`).
+- This applies as a session override — it is **not** saved to the config file. The next session starts from the level defined in your YAML.
+- For models that don't support reasoning, and for remote runtimes, Shift+Tab is a no-op and an informational message is displayed.
+
## Sharing Thinking Config Across Models
Define a provider with a default `thinking_budget` and all models that reference it inherit it:
diff --git a/docs/tools/mcp/index.md b/docs/tools/mcp/index.md
index 311768294..50a1fc5fc 100644
--- a/docs/tools/mcp/index.md
+++ b/docs/tools/mcp/index.md
@@ -217,7 +217,7 @@ See [Per-Toolset Model Routing]({{ '/configuration/tools/#per-toolset-model-rout
### Lifecycle (auto-restart, profiles)
-Local stdio and remote MCP servers are supervised: crashed servers reconnect automatically with exponential backoff. Tune the policy with the `lifecycle` block:
+Local stdio and remote MCP servers are supervised: crashed servers reconnect automatically with exponential backoff. **Remote** MCP servers (Streamable HTTP / SSE) also reconnect after idle/clean connection closes — services like Notion and Linear periodically close idle connections, and docker-agent reconnects transparently. Tune the policy with the `lifecycle` block:
```yaml
toolsets: