First-class Clawdis tools (browser, canvas, nodes, cron) replace the old clawdis-* skills; tool schemas are now injected directly into the agent runtime.
+
Per-session model selection + custom model providers: models.providers merges into ~/.clawdis/agent/models.json (merge/replace modes) for LiteLLM, local OpenAI-compatible servers, Anthropic proxies, etc.
+
Group chat activation modes: per-group /activation mention|always command with status visibility.
+
Discord bot transport for DMs and guild text channels, with allowlists + mention gating.
+
Gateway webhooks: external wake and isolated agent hooks with dedicated token auth.
Command queue modes + per-session overrides (/queue ...) and new agent.maxConcurrent cap for safe parallelism across sessions.
+
Background bash tasks: bash auto-yields after 20s (or on demand) with a process tool to list/poll/log/write/kill sessions.
+
Gateway in-process restart: clawdis_gateway tool action triggers a SIGUSR1 restart without needing a supervisor.
+
+
Breaking
+
+
Config refactor: inbound.* removed; use top-level routing (allowlists + group rules + transcription), messages (prefixes/timestamps), and session (scoping/store/mainKey). No legacy keys read.
+
Heartbeat config moved to agent.heartbeat: set every: "30m" (duration string) and optional model. agent.heartbeatMinutes is removed, and heartbeats are disabled unless agent.heartbeat.every is set.
+
Heartbeats now run via the gateway runner (main session) and deliver to the last used channel by default. WhatsApp reply-heartbeat behavior is removed; use agent.heartbeat.target/to (or target: "none") to control delivery.
+
Browser act no longer accepts CSS selector; use snapshot refs (default ai) or evaluate as an escape hatch.
+
+
Fixes
+
+
Heartbeat replies now strip repeated HEARTBEAT_OK tails to avoid accidental “OK OK” spam.
+
Heartbeat delivery now uses the last non-empty payload, preventing tool preambles from swallowing the final reply.
+
Heartbeat failure logs now include the error reason instead of [object Object].
+
Duration strings now accept h (hours) where durations are parsed (e.g., heartbeat intervals).
+
WhatsApp inbound now normalizes more wrapper types so quoted reply bodies are extracted reliably.
+
WhatsApp send now preserves existing JIDs (including group @g.us) instead of coercing to @s.whatsapp.net. (Thanks @arun-8687.)
+
Telegram/WhatsApp: reply context stays in Body/ReplyTo*, but outbound replies no longer thread to the original message. (Thanks @joshp123 for the PR and follow-up question.)
+
Suppressed libsignal session cleanup spam from console logs unless verbose mode is enabled.
+
WhatsApp web creds persistence hardened; credentials are restored before auth checks and QR login auto-restarts if it stalls.
+
Group chats now honor routing.groupChat.requireMention=false as the default activation when no per-group override exists.
+
Gateway auth no longer supports PAM/system mode; use token or shared password.
+
Tailscale Funnel now requires password auth (no token-only public exposure).
+
Group /new resets now work with @mentions so activation guidance appears on fresh sessions.
+
Group chat activation context is now injected into the system prompt at session start (and after activation changes), including /new greetings.
+
Typing indicators now start only once a reply payload is produced (no "thinking" typing for silent runs).
+
WhatsApp group typing now starts immediately only when the bot is mentioned; otherwise it waits until real output exists.
+
Streamed segments are stripped before partial replies are emitted.
+
System prompt now tags allowlisted owner numbers as the user identity to avoid mistaken “friend” assumptions.
+
LM Studio/Ollama replies now require tags; streaming ignores content until begins.
+
LM Studio responses API: tools payloads no longer include strict: null, and LM Studio no longer gets forced / tags.
+
Identity emoji no longer auto-prefixes replies (set messages.responsePrefix explicitly if desired).
+
Model switches now enqueue a system event so the next run knows the active model.
+
/model status now lists available models (same as /model).
+
process log pagination is now line-based (omit offset to grab the last N lines).
+
macOS WebChat: assistant bubbles now update correctly when toggling light/dark mode.
+
macOS: avoid spawning a duplicate gateway process when an external listener already exists.
+
Node bridge: when binding to a non-loopback host (e.g. Tailnet IP), also listens on 127.0.0.1 for local connections (without creating duplicate loopback listeners for 0.0.0.0/127.0.0.1 binds).
+
UI perf: pause repeat animations when scenes are inactive (typing dots, onboarding glow, iOS status pulse), throttle voice overlay level updates, and reduce overlay focus churn.
+
Canvas defaults/A2UI auto-nav aligned; debug status overlay centered; redundant await removed in CanvasManager.
+
Gateway launchd loop fixed by removing redundant kickstart -k.
+
CLI now hints when Peekaboo is unauthorized.
+
WhatsApp web inbox listeners now clean up on close to avoid duplicate handlers.
+
Gateway startup now brings up browser control before external providers; WhatsApp/Telegram/Discord auto-start can be disabled with web.enabled, telegram.enabled, or discord.enabled.
+
+
Providers & Routing
+
+
New Discord provider for DMs + guild text channels with allowlists and mention-gated replies by default.
+
routing.queue now controls queue vs interrupt behavior globally + per surface (defaults: WhatsApp/Telegram interrupt, Discord/WebChat queue).
+
/queue supports one-shot or per-session overrides; /queue reset|default clears overrides.
+
agent.maxConcurrent caps global parallel runs while keeping per-session serialization.
+
+
macOS app
+
+
Update-ready state surfaced in the menu; menu sections regrouped with session submenus.
+
Menu bar now shows a dedicated Nodes section under Context with inline rows, overflow submenu, and iconized actions.
+
Nodes now expose consistent inline details with per-node submenus for quick copy of key fields.
+
Node rows now show compact app versions (build numbers moved to submenus) and offer SSH launch from Bonjour when available.
+
Menu actions are grouped below toggles; Open Canvas hides when disabled and Voice Wake now anchors the mic picker.
+
Connections now include Discord provider status + configuration UI.
+
Menu bar gains an Allow Camera toggle alongside Canvas.
+
Session list polish: sleeping/disconnected/error states, usage bar restored, padding + bar sizing tuned, syncing menu removed, header hidden when disconnected.