-
Notifications
You must be signed in to change notification settings - Fork 0
Troubleshooting
Symptom-first. Run /doctor [--fix] in the REPL for an automated health check
(--fix repairs a broken web-search install), or /dump to produce a
redacted bundle for a bug report.
The optional extras aren't installed. They're separate on purpose so a plain CLI install stays small:
pip install -e ".[gateway,dev]"If a venv was rebuilt (e.g. uv sync), extras are dropped and need reinstalling.
ModuleNotFoundError at import in tests/gateway/platforms/. It's the missing
gateway extra, not broken code — those tests error instead of skipping. Install
the extra and re-run.
Expected and harmless — the one-time key migration. Keys moved from
config.txt into .env (mode 0600), with api_key_env pointers left behind.
It's idempotent and lossless.
It runs on any invocation, including --help, so it fires if you run the CLI
without an isolated HOME during testing. See
Testing.
--gateway-setup and friends need a base config first:
agent8088 --setupanthropic is one of the 12 built-in providers — check
provider.anthropic.api_key_env (or ANTHROPIC_API_KEY) is actually set; an
incomplete profile (missing base_url/model) is dropped rather than
half-registered. See Model Providers.
Resolution order is .env → explicit api_key in config → os.environ.
os.environ is last, so a shell export can't override configured settings.
If you expected the env var to win, that's why.
Check which sources exist:
grep -n "api_key" ~/.agent8088/config.txt # pointers, not secrets
grep -o "^[A-Z_]*=" ~/.agent8088/.env # names onlyA tool URL/header has an unresolved {placeholder}. The message names the exact
missing key — add it to config, or use a different search tool.
A provider needs both base_url and model to load; incomplete profiles
are dropped rather than half-registered. api_mode=litellm is the one exception
(no base URL needed).
Only retryable errors trigger it: HTTP 429, 503, connection errors. A 401 or 400 is deterministic — retrying elsewhere would just waste a call.
That's readonly mode. The default is full-auto, so --mode readonly,
/mode, AGENT8088_PERMISSION or default_permission_mode switched it.
Options: approve per action, /mode full-auto,
or add the directory to no_prompt_paths.
Hitting the always-on floor. Credential files (.env, .ssh, *.pem,
*_TOKEN*) and shell startup files (.zshrc, .bashrc, .profile) are refused
in every mode, including full-auto, and no escalation grant unlocks them.
For credential files there's an escape hatch:
allowed_sensitive_files=.env.exampleShell startup files have no override by design — writing one is code execution on your next shell launch. Edit it yourself.
Working as intended. You are in plan mode. The agent will read whatever it needs,
then call present_plan with the plan as markdown; approve it and the mode
changes so the plan runs. To leave without a plan, /mode full-auto or
/mode readonly.
Look for Still in plan mode — no plan was approved, so nothing above was written or run. A plan the model only wrote out in prose is not a plan it ran, and that
line is how you tell the two apart. Reply to have it revise and actually call
present_plan.
Correct for a shell git push: destructive git (push, reset --hard,
branch -D) run through the shell is on the always-on floor. To push, ask for
it: the git_push tool asks you to approve the exact remote and branch, then
pushes.
An escalation grant covers exactly one action and is then consumed. That's deliberate — approving one write must not silently become full-auto.
SSRF protection. To reach a genuinely local service, allowlist that host only:
ssrf_allow_hosts=127.0.0.1,localhostPrefer this over ssrf_allow_private=1, which opens the whole private network.
Run /search doctor. It reports the container state, the active backend chain,
whether ddgs is importable, and whether a configured host is actually covered
by ssrf_allow_hosts.
Web search should not fail outright: the keyless ddgs backend ships with
agent8088, so an unreachable SearXNG falls through to it. If you get an error
instead of results, the chain is pinned (web_search_provider=) or a guard
denied the request — a guard denial deliberately does not fall through.
SearXNG ships with JSON output disabled. /search setup writes this for
you; a hand-rolled instance needs it in settings.yml:
search:
formats:
- html
- jsonThe bot limiter is on. For a loopback instance used as an API, turn it off:
server:
limiter: falseDuckDuckGo throttled the request. ddgs scrapes rather than using an API, so it
is the least reliable backend under sustained use — that is why it is last in
the chain. Provision SearXNG (/search setup) or add a TAVILY_API_KEY /
EXA_API_KEY for heavier use.
Plaintext http:// is only accepted for loopback and private hosts; a public
instance must use https://. Its host must also be in ssrf_allow_hosts if it
resolves to an internal address. See
Pointing web search at a SearXNG
for the exact settings per case.
That is the shipped default, not a fault: no endpoint is assumed for you, so
ddgs serves until you configure one. Run /search setup to provision a local
instance, or set search_base_url by hand — see
Pointing web search at a SearXNG.
Set searxng_host_port in config.txt and re-run /search setup. The bind host
stays 127.0.0.1 either way — the unauthenticated JSON API is never published to
the network.
Redirect targets are re-checked against SSRF. A public URL that 302s to a private address is blocked at the redirect — by design.
/mcp prints the reason per server. Common causes: command not on PATH;
both or neither of command/url set; bearer_token_env naming an unset
variable; a server name with illegal characters. One bad server doesn't stop the
others.
Tools without the server's readOnlyHint annotation are treated as mutating and
gated normally. That's the server's annotation to fix, not a config setting.
Intentional — the MCP tool surface is read-only by default because MCP has no approval channel. Opt in:
mcp_server_allow_writes=1Narrow allowed_paths and set blocked_paths first; writes are unattended.
There's no authentication on the HTTP transport. It binds 127.0.0.1 by
default. Remote binds are intentionally rejected because the bundled HTTP
transport has no authentication.
Almost always the allowlist. Empty means nobody (fail-closed). Check the log for
disallowed user dropped: <id> (<platform>).
If you see allowing <id> on discord, but it is configured under slack_allowed_users — the id is on the wrong config line. It still works, but
move it.
By design: it responds only to DMs and @mentions, not all channel traffic.
Confirm the app_mention event subscription and the Messages tab are enabled.
Stale app-state-sync keys. Re-pairing wipes the entire session directory for
this reason — if you restored a partial backup, delete
whatsapp_session_dir and pair again.
The Message Content intent isn't enabled in the developer portal. It's required.
Check gateway_permission_mode. Under edit there are no prompts at all.
Not installed:
agent8088 --sandbox-setupNeeds Node.js 20.11+; Linux also needs bubblewrap, socat, ripgrep.
Neither backend is available. Install the native runtime or Docker; local
means no isolation at all.
Correct by default. Allowlist what it needs:
sandbox_allowed_domains=pypi.org,api.example.comNote this is separate from ssrf_allow_hosts, which governs the HTTP tools.
tests/test_cli_setup.py has known cross-test fixture dependence — 3 cases fail
in isolation but pass in the full suite. Pre-existing; run the full suite to
judge.
Python keeps only the last definition — no error. Run:
python scripts/check_duplicate_defs.pyDon't rely on ruff F811; it has verifiably missed this in this codebase.
/doctor # environment health (add --fix to repair a broken web-search install)
/dump # redacted diagnostic bundle, for sharing in a bug report
/config # active config + path
/status # model, mode, tools, skills
/trace on # capture full JSON trace, then /save trace.json
Source of truth: docs/wiki/ in the main repository. Edits here are overwritten by the next sync.
Start here
Guides
- Permissions and Security
- Sandboxing
- Model Providers
- MCP
- Messaging Gateway
- Skills and Subagents
- Memory
- Docker
Reference
Development