- sidebar.js: add clock SVG to ICONS map for 定时任务 nav item
- cron.js: add loading feedback to toggle/delete buttons
- dev-api.js: extract _normalizeBaseUrl from handlers object to standalone function
Fixes#35: 'Cannot read properties of undefined (reading _normalizeBaseUrl)'
Root cause: handlers are called as standalone functions via API middleware,
so 'this' is undefined. Moving to a standalone function fixes it.
- Config editor section in services page (hidden when file doesn't exist)
- Real-time JSON syntax validation as you type
- Auto-backup before every save
- Two save modes: 'Save & Restart Gateway' or 'Save Only'
- Reload button to discard unsaved changes
- Change detection (dirty state indicator)
- channels.js: guide steps now use <details> for collapsible display
- components.css: add .modal-content-body to scrollable flex rule
- Fixes modals being too tall with buttons pushed off screen
- Frontend: add feishu to PLATFORM_REGISTRY with official tutorial guide
- Tauri backend: add feishu read/save/verify in messaging.rs
- Web backend: add all messaging platform handlers to dev-api.js
- Feishu verification uses tenant_access_token API (feishu/lark dual domain)
- Plugin: @openclaw/feishu@latest auto-installed on save
- Guide links to official OpenClaw Feishu plugin article
- dev-api.js: treat unreadable PIDs as potential Gateway instead of foreign
- dev-api.js: add TCP probe fallback in get_services_status for all platforms
- service.rs: same fix in Tauri side inspect_port_owners
- #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