7 bug fixes
Fix #270: Memory KV endpoints now read/write to the shared memory namespace instead of per-agent IDs that don't exist, so all KV operations (get, set, list, delete) work correctly
Fix #272: Doctor command reads api_listen from config.toml instead of hardcoding port 4200, so custom port configurations are detected properly
Fix #258: Channel configuration now preserves number types (like poll_interval_secs) as TOML integers instead of forcing everything to strings
Fix #259: default_model config now applies to all agents regardless of whether they have api_key_env or base_url set, and propagates those fields from the default config
Fix #247: Telegram HTML sanitizer rewritten to use character-based iteration instead of byte indexing, fixing panics on messages with multi-byte UTF-8 characters like emoji or CJK text
Fix #262: Hand activation now extracts environment variable names from the requires section (ApiKey and EnvVar types), so Twitter and other hands that declare env var requirements get those vars passed to their subprocess
Fix #271: Dashboard now shows proper empty states on the agents list, chat page (when no agent selected), models tab, and tools tab instead of blank space