Bug report draft: Control UI only shows main chat and throws GatewayRequestError: missing scope: operator.read
Summary
When accessing the OpenClaw Control UI through a private Tailscale Serve setup, the web UI loads and basic chat access works, but richer operator/dashboard views remain unavailable. The UI shows:
GatewayRequestError: missing scope: operator.read
Observed behavior:
- only the main chat appears accessible in the web UI
- the error appears in that same location
- issue persists after fixing runtime/service mismatch and re-authenticating
Environment
Host:
- macOS 26.3.1
- OpenClaw source checkout at a local source path
- active gateway service now launches:
/opt/homebrew/opt/node/bin/node <source-checkout>/dist/index.js gateway --port 18789
Client devices tested:
- macOS notebook via Safari
- Windows 11 notebook
Network/access model:
- private Tailscale tailnet
- Tailscale Serve HTTPS
- no Funnel / no public exposure
Working remote URL:
Local URL:
Relevant config
{
"gateway": {
"bind": "loopback",
"auth": {
"mode": "token",
"allowTailscale": true
},
"controlUi": {
"allowedOrigins": [
"http://localhost:18789",
"http://127.0.0.1:18789",
"https://<magicdns-host>"
],
"dangerouslyDisableDeviceAuth": true
},
"tailscale": {
"mode": "serve",
"resetOnExit": false
}
}
}
Reproduction
- Run OpenClaw gateway on macOS from source checkout.
- Configure gateway for:
bind = loopback
tailscale.mode = serve
auth.mode = token
auth.allowTailscale = true
- Control UI allowed origin = Tailscale HTTPS URL
dangerouslyDisableDeviceAuth = true
- Enable Tailscale Serve on the tailnet and publish the local gateway:
tailscale serve --bg 127.0.0.1:18789
- Open the Control UI from another tailnet device at:
- Authenticate with the gateway token.
Expected behavior
After successful auth, the Control UI should have normal operator read access and show the usual operator/dashboard/session views.
Actual behavior
- UI loads
- auth succeeds sufficiently to enter the UI
- only main chat is accessible
- richer operator views fail with:
GatewayRequestError: missing scope: operator.read
What was ruled out
Not a network problem
- Tailscale connectivity works across all devices
- remote HTTPS Control UI access works
- local loopback gateway responds with HTTP 200
Not a stale browser-token issue
- browser history/storage was cleared on Safari on the host
- current token from
gateway.auth.token was pasted fresh
- same error persists
Not an old service entrypoint problem
Initially there was a runtime mismatch:
- older Homebrew CLI in PATH
- service running source checkout via
dist/entry.js
This was corrected by reinstalling/restarting the LaunchAgent so it now runs dist/index.js.
After correction:
openclaw gateway status shows service loaded
- runtime running
- RPC probe ok
- error still persists
Additional notes
openclaw gateway probe / status now report healthy connectivity
- the issue appears to be specifically about missing operator scope in the web UI session, not general gateway reachability
- docs indicate
operator.read is an operator scope used for richer control-plane metadata calls
Question
Is this expected behavior for token-auth / Tailscale Serve browser sessions, or is the Control UI failing to request / receive operator.read when authenticating in this setup?
Bug report draft: Control UI only shows main chat and throws
GatewayRequestError: missing scope: operator.readSummary
When accessing the OpenClaw Control UI through a private Tailscale Serve setup, the web UI loads and basic chat access works, but richer operator/dashboard views remain unavailable. The UI shows:
GatewayRequestError: missing scope: operator.readObserved behavior:
Environment
Host:
/opt/homebrew/opt/node/bin/node <source-checkout>/dist/index.js gateway --port 18789Client devices tested:
Network/access model:
Working remote URL:
https://<magicdns-host>/Local URL:
http://127.0.0.1:18789/Relevant config
{ "gateway": { "bind": "loopback", "auth": { "mode": "token", "allowTailscale": true }, "controlUi": { "allowedOrigins": [ "http://localhost:18789", "http://127.0.0.1:18789", "https://<magicdns-host>" ], "dangerouslyDisableDeviceAuth": true }, "tailscale": { "mode": "serve", "resetOnExit": false } } }Reproduction
bind = loopbacktailscale.mode = serveauth.mode = tokenauth.allowTailscale = truedangerouslyDisableDeviceAuth = truetailscale serve --bg 127.0.0.1:18789https://<magicdns-host>/Expected behavior
After successful auth, the Control UI should have normal operator read access and show the usual operator/dashboard/session views.
Actual behavior
GatewayRequestError: missing scope: operator.readWhat was ruled out
Not a network problem
Not a stale browser-token issue
gateway.auth.tokenwas pasted freshNot an old service entrypoint problem
Initially there was a runtime mismatch:
dist/entry.jsThis was corrected by reinstalling/restarting the LaunchAgent so it now runs
dist/index.js.After correction:
openclaw gateway statusshows service loadedAdditional notes
openclaw gateway probe/ status now report healthy connectivityoperator.readis an operator scope used for richer control-plane metadata callsQuestion
Is this expected behavior for token-auth / Tailscale Serve browser sessions, or is the Control UI failing to request / receive
operator.readwhen authenticating in this setup?