UI ng Kontrol (browser)¶
Ang Control UI ay isang maliit na Vite + Lit single-page app na sini-serve ng Gateway:
- default:
http://<host>:18789/ - optional na prefix: itakda ang
gateway.controlUi.basePath(hal./openclaw)
Direkta itong nakikipag-usap sa Gateway WebSocket sa parehong port.
Mabilis na pagbukas (local)¶
Kung tumatakbo ang Gateway sa parehong computer, buksan:
Kung hindi mag-load ang page, simulan muna ang Gateway: openclaw gateway.
Ibinibigay ang auth sa panahon ng WebSocket handshake sa pamamagitan ng:
connect.params.auth.tokenconnect.params.auth.passwordPinapayagan ka ng settings panel ng dashboard na mag-imbak ng token; hindi sini-save ang mga password. Ang onboarding wizard ay bumubuo ng gateway token bilang default, kaya i-paste ito rito sa unang pag-connect.
Device pairing (unang koneksyon)¶
Kapag kumonekta ka sa Control UI mula sa bagong browser o device, ang Gateway ay
nangangailangan ng one-time pairing approval — kahit na nasa parehong Tailnet ka
na may gateway.auth.allowTailscale: true. Isa itong hakbang sa seguridad upang maiwasan ang
hindi awtorisadong pag-access.
Makikita mo: "disconnected (1008): pairing required"
Para aprubahan ang device:
# List pending requests
openclaw devices list
# Approve by request ID
openclaw devices approve <requestId>
Kapag naaprubahan na, matatandaan ang device at hindi na mangangailangan ng muling pag-apruba maliban kung bawiin mo ito gamit ang openclaw devices revoke --device <id> --role <role>. Tingnan ang
Devices CLI para sa token rotation at revocation.
Mga tala:
- Ang mga local na koneksyon (
127.0.0.1) ay auto-approved. - Mga remote na koneksyon (LAN, Tailnet, atbp.) nangangailangan ng tahasang pag-apruba.
- Bawat browser profile ay gumagawa ng natatanging device ID, kaya ang pagpapalit ng browser o pag-clear ng browser data ay mangangailangan ng muling pairing.
Ano ang kaya nitong gawin (sa ngayon)¶
- Makipag-chat sa model sa pamamagitan ng Gateway WS (
chat.history,chat.send,chat.abort,chat.inject) - Mag-stream ng mga tool call + live na tool output cards sa Chat (agent events)
- Mga channel: WhatsApp/Telegram/Discord/Slack + mga plugin channel (Mattermost, atbp.) status + QR login + per-channel na config (
channels.status,web.login.*,config.patch) - Mga instance: presence list + refresh (
system-presence) - Mga session: listahan + per-session thinking/verbose overrides (
sessions.list,sessions.patch) - Mga cron job: list/add/run/enable/disable + run history (
cron.*) - Skills: status, enable/disable, install, pag-update ng API key (
skills.*) - Mga node: listahan + caps (
node.list) - Exec approvals: i-edit ang gateway o node allowlists + humingi ng policy para sa
exec host=gateway/node(exec.approvals.*) - Config: tingnan/i-edit ang
~/.openclaw/openclaw.json(config.get,config.set) - Config: apply + restart na may validation (
config.apply) at gisingin ang huling aktibong session - Kasama sa mga write ng config ang base-hash guard para maiwasan ang pag-clobber ng sabayang mga edit
- Config schema + form rendering (
config.schema, kasama ang plugin + channel schemas); nananatiling available ang Raw JSON editor - Debug: mga snapshot ng status/health/models + event log + manual RPC calls (
status,health,models.list) - Logs: live tail ng gateway file logs na may filter/export (
logs.tail) - Update: magpatakbo ng package/git update + restart (
update.run) na may restart report
Mga tala sa panel ng cron jobs:
- Para sa mga isolated na trabaho, ang default na delivery ay ang pag-anunsyo ng buod. Maaari kang lumipat sa none kung gusto mo ng internal-only na mga run.
- Lalabas ang mga field na channel/target kapag napili ang announce.
Asal ng chat¶
- Ang
chat.senday non-blocking: agad itong nag-a-ack gamit ang{ runId, status: "started" }at ang sagot ay nag-i-stream sa pamamagitan ng mga event nachat. - Ang muling pagpapadala na may parehong
idempotencyKeyay magbabalik ng{ status: "in_flight" }habang tumatakbo, at{ status: "ok" }matapos makumpleto. - Ang
chat.injectay nagdadagdag ng assistant note sa session transcript at nagbo-broadcast ngchatevent para sa UI-only na mga update (walang agent run, walang channel delivery). - Ihinto:
- I-click ang Stop (tumatawag sa
chat.abort) - I-type ang
/stop(ostop|esc|abort|wait|exit|interrupt) para mag-abort out-of-band - Ang
chat.abortay sumusuporta sa{ sessionKey }(walangrunId) para i-abort ang lahat ng aktibong run para sa session na iyon
Tailnet access (inirerekomenda)¶
Integrated Tailscale Serve (mas mainam)¶
Panatilihin ang Gateway sa loopback at hayaang i-proxy ito ng Tailscale Serve gamit ang HTTPS:
openclaw gateway --tailscale serve
Buksan:
https://<magicdns>/(o ang naka-configure monggateway.controlUi.basePath)
Bilang default, ang mga Serve request ay maaaring mag-authenticate sa pamamagitan ng Tailscale identity headers
(tailscale-user-login) kapag ang gateway.auth.allowTailscale ay true. Bini-verify ng OpenClaw ang identidad sa pamamagitan ng pag-resolve ng x-forwarded-for address gamit ang
tailscale whois at pagtutugma nito sa header, at tinatanggap lamang ang mga ito kapag ang request ay tumatama sa loopback na may mga x-forwarded-* header ng Tailscale. Itakda ang
gateway.auth.allowTailscale: false (o pilitin ang gateway.auth.mode: "password")
kung gusto mong mangailangan ng token/password kahit para sa Serve traffic.
Bind sa tailnet + token¶
openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)"
Pagkatapos ay buksan:
http://<tailscale-ip>:18789/(o ang naka-configure monggateway.controlUi.basePath)
I-paste ang token sa settings ng UI (ipinapadala bilang connect.params.auth.token).
Hindi Ligtas na HTTP¶
Kung bubuksan mo ang dashboard gamit ang plain HTTP (http://<lan-ip> o http://<tailscale-ip>),
tatakbo ang browser sa isang non-secure context at haharangan ang WebCrypto. Bilang default,
binablock ng OpenClaw ang mga koneksyon ng Control UI na walang device identity.
Inirerekomendang ayos: gumamit ng HTTPS (Tailscale Serve) o buksan ang UI nang lokal:
https://<magicdns>/(Serve)http://127.0.0.1:18789/(sa host ng Gateway)
Halimbawa ng downgrade (token-only sa HTTP):
{
gateway: {
controlUi: { allowInsecureAuth: true },
bind: "tailnet",
auth: { mode: "token", token: "replace-me" },
},
}
Pinapagana nito ang pag-disable ng device identity + pairing para sa Control UI (kahit sa HTTPS). Gamitin lamang kung pinagkakatiwalaan mo ang network.
Tingnan ang Tailscale para sa gabay sa pag-setup ng HTTPS.
Pagbuo ng UI¶
Nagsi-serve ang Gateway ng mga static file mula sa dist/control-ui. Buuin ang mga ito gamit ang:
pnpm ui:build # auto-installs UI deps on first run
Opsyonal na absolute base (kapag gusto mo ng fixed asset URLs):
OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
Para sa local development (hiwalay na dev server):
pnpm ui:dev # auto-installs UI deps on first run
Pagkatapos ay ituro ang UI sa iyong Gateway WS URL (hal. ws://127.0.0.1:18789).
Pag-debug/pagsusuri: server para sa development + malayong Gateway¶
Ang Control UI ay mga static file; ang WebSocket target ay configurable at maaaring iba sa HTTP origin. Kapaki-pakinabang ito kapag gusto mo ang Vite dev server lokal ngunit tumatakbo ang Gateway sa ibang lugar.
- Simulan ang UI dev server:
pnpm ui:dev - Magbukas ng URL tulad ng:
http://localhost:5173/?gatewayUrl=ws://<gateway-host>:18789
Opsyonal na one-time auth (kung kailangan):
http://localhost:5173/?gatewayUrl=wss://<gateway-host>:18789&token=<gateway-token>
Mga tala:
- Ang
gatewayUrlay ini-store sa localStorage pagkatapos mag-load at inaalis mula sa URL. - Ang
tokenay ini-store sa localStorage; angpassworday pinananatili lamang sa memory. - Kapag nakatakda ang
gatewayUrl, hindi na babalik ang UI sa config o environment credentials. Ibigay angtoken(opassword) nang tahasan. Ang kawalan ng tahasang credentials ay isang error. - Gamitin ang
wss://kapag ang Gateway ay nasa likod ng TLS (Tailscale Serve, HTTPS proxy, atbp.). - Ang
gatewayUrlay tinatanggap lamang sa isang top-level window (hindi embedded) upang maiwasan ang clickjacking. - Para sa mga cross-origin dev setup (hal.
pnpm ui:devpatungo sa isang remote Gateway), idagdag ang UI origin sagateway.controlUi.allowedOrigins.
Halimbawa:
{
gateway: {
controlUi: {
allowedOrigins: ["http://localhost:5173"],
},
},
}
Mga detalye ng setup para sa remote access: Remote access.