diff --git a/.claude/skills/docs/watermark b/.claude/skills/docs/watermark index 24ba74587..1a0244d12 100644 --- a/.claude/skills/docs/watermark +++ b/.claude/skills/docs/watermark @@ -1 +1 @@ -c8185eaee6797e5f48963fcfff688838c5ff497d +31cbdb5c316e0e128d935371989afef0d4714209 diff --git a/docs/public/administration/troubleshooting.mdx b/docs/public/administration/troubleshooting.mdx index 1bd5d9b61..f6a231d04 100644 --- a/docs/public/administration/troubleshooting.mdx +++ b/docs/public/administration/troubleshooting.mdx @@ -15,10 +15,12 @@ fabro doctor --server https://fabro.example.com/api/v1 It checks: - Local user config and storage directory health -- Server-reported LLM provider connectivity +- Server-reported LLM provider connectivity, with configured providers probed concurrently - GitHub App, sandbox, and Brave Search credentials - Server authentication and crypto configuration +LLM provider probe failures are reported as errors. Use `--verbose` to see the underlying provider error chain when a key, network route, or model endpoint fails. + ## Common issues **Install wizard didn't open in my browser** — `fabro server start` prints the install URL to stderr before attempting to open it. Copy that URL into your browser manually. Auto-open fails on headless Linux hosts, inside most containers, and over SSH sessions without a display. @@ -29,7 +31,7 @@ It checks: **Stall watchdog timeouts** — If runs are cancelled unexpectedly, the agent may be stuck or the LLM provider may be slow. Check `FABRO_LOG=debug` output for `Agent.LlmRetry` events. Increase `stall_timeout` in the graph if needed, or add [fallback providers](/core-concepts/models) to handle outages. -**Sandbox creation failures** — For Docker: ensure the Docker daemon is running and the configured image exists. For Daytona: verify `DAYTONA_API_KEY` is set and the `gh` CLI is authenticated. For Exe: verify your SSH keys are configured for `exe.dev` and that `ssh exe.dev` connects successfully. +**Sandbox creation failures** — For Docker: ensure the Docker daemon is running and the configured image exists. For Daytona: verify `DAYTONA_API_KEY` is set, includes `write:snapshots`, `delete:snapshots`, `write:sandboxes`, and `delete:sandboxes`, and that the `gh` CLI is authenticated. For Exe: verify your SSH keys are configured for `exe.dev` and that `ssh exe.dev` connects successfully. **Port already in use** — Change the port with `fabro server start --port 3001` or stop the conflicting process. diff --git a/docs/public/core-concepts/models.mdx b/docs/public/core-concepts/models.mdx index 5db0d6612..1bb0419f3 100644 --- a/docs/public/core-concepts/models.mdx +++ b/docs/public/core-concepts/models.mdx @@ -13,7 +13,8 @@ No single model is best at everything. Fabro lets you assign the right model to | Model | Provider | Aliases | Context | Cost (in/out per Mtok) | Speed | |---|---|---|---|---|---| -| `claude-opus-4-6` | anthropic | `opus`, `claude-opus` | 1M | $15.00 / $75.00 | 25 tok/s | +| `claude-opus-4-7` | anthropic | `opus`, `claude-opus` | 1M | $5.00 / $25.00 | 25 tok/s | +| `claude-opus-4-6` | anthropic | | 1M | $5.00 / $25.00 | 25 tok/s | | `claude-sonnet-4-6` | anthropic | `sonnet`, `claude-sonnet` | 200K | $3.00 / $15.00 | 50 tok/s | | `claude-sonnet-4-5` | anthropic | | 200K | $3.00 / $15.00 | 50 tok/s | | `claude-haiku-4-5` | anthropic | `haiku`, `claude-haiku` | 200K | $0.80 / $4.00 | 100 tok/s | @@ -23,6 +24,8 @@ No single model is best at everything. Fabro lets you assign the right model to | `gpt-5.3-codex` | openai | `codex` | 1M | $1.80 / $14.00 | 100 tok/s | | `gpt-5.3-codex-spark` | openai | `codex-spark` | 128K | n/a | 1000 tok/s | | `gpt-5.4` | openai | `gpt54` | 1M | $2.50 / $15.00 | 70 tok/s | +| `gpt-5.5` | openai | `gpt55` | 1M | $5.00 / $30.00 | 70 tok/s | +| `gpt-5.5-pro` | openai | `gpt55-pro` | 1M | $30.00 / $180.00 | 20 tok/s | | `gpt-5.4-mini` | openai | `gpt54-mini` | 400K | $0.75 / $4.50 | 140 tok/s | | `gpt-5.4-pro` | openai | `gpt54-pro` | 1M | $30.00 / $180.00 | 20 tok/s | | `gemini-3.1-pro-preview` | gemini | `gemini-pro` | 1M | $2.00 / $12.00 | 85 tok/s | @@ -42,8 +45,8 @@ When no model or provider is specified, Fabro auto-detects the provider by check | Provider | Default model | |---|---| -| `anthropic` | `claude-sonnet-4-6` | -| `openai` | `gpt-5.4` | +| `anthropic` | `claude-opus-4-7` | +| `openai` | `gpt-5.5` | | `gemini` | `gemini-3.1-pro-preview` | | `kimi` | `kimi-k2.5` | | `zai` | `glm-4.7` | diff --git a/docs/public/execution/environments.mdx b/docs/public/execution/environments.mdx index abffb5df5..2a988d564 100644 --- a/docs/public/execution/environments.mdx +++ b/docs/public/execution/environments.mdx @@ -123,6 +123,8 @@ The Daytona sandbox runs all tool operations inside a cloud-hosted VM managed by - A `DAYTONA_API_KEY` environment variable - GitHub access configured via `fabro install` or `gh auth login` (for private repository cloning) +The Daytona API key must include `write:snapshots`, `delete:snapshots`, `write:sandboxes`, and `delete:sandboxes`. `fabro install`, `fabro secret set DAYTONA_API_KEY`, and `fabro doctor` validate these scopes before the first run reaches sandbox creation. + ### How it works - **Sandbox lifecycle** — On `initialize()`, Fabro creates a Daytona sandbox (from an image or a snapshot), clones the run's GitHub origin into it when one is available, and waits until it's ready. On `cleanup()`, the sandbox is deleted. diff --git a/docs/public/human-tools/interviews.mdx b/docs/public/human-tools/interviews.mdx index 79b7707cc..453fe00ad 100644 --- a/docs/public/human-tools/interviews.mdx +++ b/docs/public/human-tools/interviews.mdx @@ -83,7 +83,9 @@ If the console prompt is canceled or stdin is already closed, the interviewer re The default for API server runs. The web interviewer holds questions in a queue until answers are submitted externally — typically by the web UI or a REST API call. Each question gets a unique ID (e.g. `q-1`), and the `ask()` call blocks on a oneshot channel until `submit_answer(id, answer)` is called. -This decoupling means the workflow engine and the user interface can run in different processes. The web UI polls for pending questions and posts answers back to the API. +This decoupling means the workflow engine and the user interface can run in different processes. The web UI shows pending questions in the run page's interview dock, listens for interview events, and posts answers back to the API. + +The dock supports yes/no, confirmation, multiple choice, multi-select, and freeform questions. When multiple questions are pending, the dock lets you cycle through them without leaving the run detail page. If the pending session disappears before an answer is submitted, the waiting question resolves as `Interrupted`. diff --git a/docs/public/integrations/daytona.mdx b/docs/public/integrations/daytona.mdx index 86c254689..b5d5c39d7 100644 --- a/docs/public/integrations/daytona.mdx +++ b/docs/public/integrations/daytona.mdx @@ -20,6 +20,8 @@ description: "Run Fabro workflows in sandboxed Daytona cloud environments" - A `DAYTONA_API_KEY` environment variable (get one from [app.daytona.io](https://app.daytona.io)) - GitHub access configured via the default `token` strategy or a [GitHub App](/integrations/github) (required for private repository cloning and checkpoint pushing) +The Daytona key must include the snapshot and sandbox scopes Fabro uses to create and clean up environments: `write:snapshots`, `delete:snapshots`, `write:sandboxes`, and `delete:sandboxes`. Fabro validates these scopes during install, when you run `fabro secret set DAYTONA_API_KEY`, and in `fabro doctor`. + ## Configuration Set the sandbox provider in your run config TOML or via CLI flag: @@ -174,7 +176,9 @@ See [Server Configuration](/administration/server-configuration) for details. ### "Failed to create Daytona sandbox" -The `DAYTONA_API_KEY` environment variable is missing or invalid. Store it with `fabro secret set DAYTONA_API_KEY ...` or export it in the server process environment, then check that it's a valid key from [app.daytona.io](https://app.daytona.io). +The `DAYTONA_API_KEY` environment variable is missing, invalid, or missing the required snapshot/sandbox scopes. Store it with `fabro secret set DAYTONA_API_KEY ...` or export it in the server process environment, then run `fabro doctor` to verify that Daytona reports the key as valid. + +If doctor reports missing scopes, regenerate the Daytona key with `write:snapshots`, `delete:snapshots`, `write:sandboxes`, and `delete:sandboxes`, then save it again with `fabro secret set DAYTONA_API_KEY`. ### "Snapshot does not exist and no dockerfile provided" diff --git a/docs/public/workflows/human-in-the-loop.mdx b/docs/public/workflows/human-in-the-loop.mdx index 0555f1964..e864aed02 100644 --- a/docs/public/workflows/human-in-the-loop.mdx +++ b/docs/public/workflows/human-in-the-loop.mdx @@ -17,7 +17,7 @@ approve -> plan [label="[R] Revise"] approve -> skip [label="[S] Skip"] ``` -When execution reaches the gate, the user sees the previous stage's output followed by the node's label ("Approve Plan") and the available options. In the CLI, this appears as an interactive menu. In the web UI, it appears as a set of buttons. +When execution reaches the gate, the user sees the previous stage's output followed by the node's label ("Approve Plan") and the available options. In the CLI, this appears as an interactive menu. In the web UI, blocked runs show an interview dock on the run page where the user can answer the pending question. ### Keyboard accelerators