Problem:
- Sending a message with no response left users stuck with an empty typing
indicator forever (no timeout, no error, no feedback)
- Users had no visibility into what OpenClaw was doing (thinking, planning,
executing tools, running commands, waiting for approval)
- The response watchdog only reacted to chat delta/final events, ignoring
all agent processing events
Root cause:
- Watchdog looped every 15s polling history but had no ultimate timeout
- Agent events (lifecycle, item, plan, approval, thinking, command_output)
were not handled — only tool stream events updated the typing hint
- When OpenClaw processed silently (no delta), the UI showed nothing useful
Fix:
1. Handle ALL OpenClaw 4.5 agent event streams in handleEvent():
- lifecycle: "AI is processing…" on phase start
- item: structured execution steps (tool/command/search/analysis)
- plan: "AI is planning…"
- approval: "Waiting for approval…"
- thinking: "AI is thinking…"
- command_output: "Running command…"
- compaction/error: appropriate indicators
2. Enhanced watchdog mechanism:
- 3-minute ultimate timeout that persists across watchdog re-polls
- Agent events reset the polling timer (OpenClaw is alive) but not
the ultimate timeout
- After 30s shows "Still waiting…" with elapsed time
- At 3min shows clear error: "Check if OpenClaw is running"
3. Live elapsed timer in typing indicator:
- Shows seconds elapsed since message was sent (after 5s)
- Updates every 5s while waiting
- Properly cleaned up on response/error/page exit
4. Config compatibility check: no changes needed — our code already uses
canonical config paths, no legacy aliases affected by 4.5 removal.
Files: chat.js, chat.css, locales/modules/chat.js
- All pages now use t() for internationalization
- Sidebar footer: searchable upward dropdown language switcher
- Generated zh-TW.json (Traditional Chinese) via gen-locales.cjs
- CSS for lang switcher with mobile/collapsed sidebar support
- Removed language toggle from settings page
- #32: parseCookies decodeURIComponent crash with malformed cookies (Authelia)
- #31: Gateway restart no longer overwrites user CORS allowedOrigins (merge instead)
- #25: Windows terminal flashing - add CREATE_NO_WINDOW to skills.rs + assistant.rs
- #33: Model test tolerates non-auth HTTP errors (Ali Coding Plan compatibility)
- #29: Auto-detect ws/wss protocol for reverse proxy + protocol-aware Docker URLs
- #23: Chat session sidebar stays open when switching sessions