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: