50 KiB
50 KiB
Hermes Agent v0.4.0 (v2026.3.23)
Release Date: March 23, 2026
The biggest release yet — 300 merged PRs in one week. Streaming output, native browser tools, Skills Hub, plugin system, 7 new messaging platforms, MCP server management, @ context references, prompt caching, API server, and a sweeping reliability overhaul across every subsystem.
✨ Highlights
- Streaming CLI output — Real-time token streaming enabled by default in CLI mode with proper tool progress spinners during streaming (#2251, #2340, #2161)
- Native browser tools — Full Browserbase-powered browser automation: navigate, click, type, screenshot, scrape — plus an interactive
/browserCLI command (#2270, #2273) - Skills Hub — Discover, install, and manage skills from curated community taps with
/skillscommands (#2235) - Plugin system — TUI extension hooks for building custom CLIs on top of Hermes, plus
hermes plugins install/remove/listcommands and slash command registration for plugins (#2333, #2337, #2359) - 7 new messaging platforms — Signal, DingTalk, SMS (Twilio), Mattermost, Matrix, WhatsApp bridge, and Webhook adapters join Telegram and Discord (#2206, #1685, #1688, #1683, #2168, #2166)
- @ context references — Claude Code-style
@fileand@urlcontext injection with tab completions (#2343, #2482) - OpenAI-compatible API server — Expose Hermes as an API endpoint with
/api/jobsfor cron management (#1756, #2450)
🏗️ Core Agent & Architecture
Provider & Model Support
- GitHub Copilot provider — Full OAuth auth, API routing, token validation, and documentation. Copilot context now correctly resolves to 400k (#1924, #1896, #1879 by @mchzimm, #2507)
- Claude Code OAuth provider — Anthropic-native API mode with dynamic version detection for OAuth user-agent (#2199, #1663, #1670)
- Alibaba Cloud / DashScope provider — Full integration with DashScope v1 runtime mode, model dot preservation, and 401 auth fixes (#1673, #2332, #2459)
- Kilo Code provider — Added as first-class inference provider (#1666)
- OpenCode Zen and OpenCode Go providers — New provider backends with custom endpoint support (#1650, #2393 by @0xbyt4)
- Multi-provider architecture — Automatic fallback, OpenRouter routing backend, Mistral native tool calling, Google Gemini integration (#2090, #2100, #2098, #2094, #2092)
- Eager fallback to backup model on rate-limit errors (#1730)
- Endpoint metadata for custom model context and pricing; query local servers for actual context window size (#1906, #2091 by @dusterbloom)
- Context length detection overhaul — models.dev integration, provider-aware resolution, fuzzy matching for custom endpoints,
/v1/propsfor llama.cpp (#2158, #2051, #2403) - Model catalog updates — gpt-5.4-mini, gpt-5.4-nano, healer-alpha, haiku-4.5, minimax-m2.7, claude 4.6 at 1M context (#1913, #1915, #1900, #2155, #2474)
- Custom endpoint improvements — config.yaml
model.base_urlsupport, custom endpoints use responses API viaapi_modeoverride, allow custom/local endpoints without API key, fail fast when explicit provider has no key (#2330, #1651, #2556, #2445, #1994, #1998) - Inject model and provider into system prompt (#1929)
- Fix: prevent Anthropic token leaking to third-party
anthropic_messagesproviders (#2389) - Fix: prevent Anthropic fallback from inheriting non-Anthropic
base_url(#2388) - Fix:
auxiliary_is_nousflag never resets — leaked Nous tags to other providers (#1713) - Fix: Anthropic
tool_choice 'none'still allowed tool calls (#1714) - Fix: Mistral parser nested JSON fallback extraction (#2335)
- Fix: MiniMax 401 auth error resolved by defaulting to
anthropic_messages(#2103) - Fix: case-insensitive model family matching (#2350)
- Fix: ignore placeholder provider keys in activation checks (#2358)
- Fix: Copilot models response decoding and provider bootstrap error logging (#2202)
- Fix: Preserve Ollama model:tag colons in context length detection (#2149)
Agent Loop & Conversation
- Streaming output — CLI streaming with proper linebreak handling, iteration boundary prevention, and blank line stacking fixes (#2251, #2340, #2258, #2413, #2473)
- Context compression overhaul — Structured summaries, iterative updates, token-budget tail protection, fallback model support (#2323, #2128, #2224, #1727)
- Context pressure warnings for CLI and gateway (#2159)
- Prompt caching for gateway — Cache AIAgent per session, keep assistant turns, fix session restore (#2282, #2284, #2361)
- Show reasoning/thinking blocks when
show_reasoningis enabled (#2118) - Subagent delegation for parallel task execution with thread safety (#2119, #1672, #1778)
- Pre-call sanitization and post-call tool guardrails (#1732)
- Auto-recover from provider-rejected
tool_choiceby retrying without (#2174) - Rate limit handling with exponential backoff retry (#2071)
- Fix: prevent silent tool result loss during context compression (#1993)
- Fix: handle empty/null function arguments in tool call recovery (#2163)
- Fix: handle API refusal responses gracefully instead of crashing (#2156)
- Fix: prevent stuck agent loop on malformed tool calls (#2114)
- Fix: return JSON parse error to model instead of dispatching with empty args (#2342)
- Fix: consecutive assistant message merge drops content on mixed types (#1703)
- Fix: message role alternation violations in JSON recovery and error handler (#1722)
- Fix:
compression_attemptsresets each iteration — allowed unlimited compressions (#1723) - Fix:
length_continue_retriesnever resets — later truncations got fewer retries (#1717) - Fix: compressor summary role violated consecutive-role constraint (#1720, #1743)
- Fix: correctly handle empty tool results (#2201)
- Fix: crash on None entry in
tool_callslist during Anthropic conversion (#2209 by @0xbyt4, #2316) - Fix: per-thread persistent event loops in worker threads (#2214 by @jquesnelle)
- Fix: prevent 'event loop already running' when async tools run in parallel (#2207)
- Fix: strip ANSI escape codes from terminal output before sending to model (#2115, #2585)
- Fix: skip top-level
cache_controlon role:tool for OpenRouter (#2391) - Fix: delegate tool — save parent tool names before child construction mutates global (#2083 by @ygd58, #1894)
- Fix: only strip last assistant message if empty string (#2326)
Session & Memory
- Honcho long-term memory backend integration (#2276)
- Per-session SQLite persistence for gateway (#2134)
--resumeflag for CLI session persistence across restarts +/resumeand/sessionscommands (#2135, #2143)- Session search and management slash commands (#2198)
- Auto session titles and
.hermes.mdproject config (#1712) - Background memory/skill review replaces inline nudges (#2235)
- SOUL.md as primary agent identity instead of hardcoded default (#1922, #1927)
- Priority-based context file selection + CLAUDE.md support (#2301)
- Fix: concurrent memory writes silently drop entries — added file locking (#1726)
- Fix: search all sources by default in
session_search(#1892) - Fix: handle hyphenated FTS5 queries and preserve quoted literals (#1776)
- Fix: skip corrupt lines in
load_transcriptinstead of crashing (#1744) - Fix: normalize session keys to prevent case-sensitive duplicates (#2157)
- Fix: prevent
session_searchcrash when no sessions exist (#2194) - Fix: reset token counters on new session for accurate usage display (#2101 by @InB4DevOps)
- Fix: prevent stale memory overwrites by flush agent (#2687)
- Fix: remove synthetic error message injection, fix session resume after repeated failures (#2303)
📱 Messaging Platforms (Gateway)
New Platform Adapters
- Signal Messenger adapter (#2206) with attachment handling fix (#2400), group message filtering (#2297), and Note to Self echo-back protection (#2156)
- DingTalk adapter with gateway wiring and setup docs (#1685, #1690, #1692)
- SMS (Twilio) adapter (#1688)
- Mattermost and Matrix adapters with @-mention-only filter for Mattermost channels (#1683, #2443)
- WhatsApp bridge adapter (#2168)
- Webhook platform adapter for external event triggers (#2166)
- OpenAI-compatible API server platform adapter with
/api/jobscron management endpoints (#1756, #2450, #2456)
Telegram
- Auto-detect HTML tags and use
parse_mode=HTMLinsend_message(#1709) - Telegram group vision support + thread-based sessions (#2153)
- MarkdownV2 support — strikethrough, spoiler, blockquotes, escape parentheses/braces/backslashes/backticks (#2199, #2200 by @llbn, #2386)
- Auto-reconnect polling after network interruption (#2517)
- Aggregate split text messages before dispatching (#1674)
- Fix: streaming config bridge, not-modified, flood control (#1782, #1783)
- Fix: edited_message event crashes (#2074)
- Fix: retry 409 polling conflicts before giving up (#2312)
- Fix: Telegram topic delivery via
platform:chat_id:thread_idformat (#2455)
Discord
- Document caching and text-file injection (#2503)
- Persistent typing indicator for DMs (#2468)
- Discord DM vision support — inline images + attachment analysis (#2186)
- Persist thread participation across gateway restarts (#1661)
- Fix: prevent gateway crash on non-ASCII guild names (#2302)
- Fix: handle thread permission errors gracefully (#2073)
- Fix: properly route slash event handling in threads (#2460)
- Fix: remove bugged followup messages + remove
/askcommand (#1836) - Fix: handle graceful reconnection on WebSocket errors (#2127)
- Fix: voice channel TTS not working when streaming enabled (#2322)
Other Platforms
- WhatsApp: outbound
send_messagerouting (#1769 by @sai-samarth), LID format self-chat support (#1667),reply_prefixconfig bridging fix (#1923), restart on bridge child exit (#2334), image/bridge improvements (#2181) - Matrix: duplicate messages and image caching for vision support (#2520), correct
reply_to_message_idparameter (#1895), bare media types fix (#1736) - Mattermost: MIME types for media attachments (#2329)
Gateway Core
- Multi-platform gateway support (Discord + Telegram + all adapters) (#2125)
- Auto-reconnect failed platforms with exponential backoff (#2584)
- Notify users when session auto-resets (#2519)
/queuecommand to queue prompts without interrupting (#2191)- Inject reply-to message context for out-of-session replies (#1662)
- Replace bare text approval with
/approveand/denycommands (#2002) - Support ignoring unauthorized gateway DMs (#1919)
- Configurable approvals in gateway +
/costcommand with live pricing (#2180) - Fix: prevent duplicate session-key collision in multi-platform gateway (#2171)
- Fix:
/resetin thread-mode resets global session instead of thread (#2254) - Fix: deliver MEDIA: files after streaming responses (#2382)
- Fix: cap interrupt recursion depth to prevent resource exhaustion (#1659)
- Fix: detect stopped processes and release stale locks on
--replace(#2406, #1908) - Fix: PID-based wait with force-kill for gateway restart (#1902)
- Fix: prevent
--replacemode from killing the caller process (#2185) - Fix:
/modelshows active fallback model instead of config default (#1660) - Fix:
/titlecommand fails when session doesn't exist in SQLite yet (#2379 by @ten-jampa) - Fix: process
/queue'd messages after agent completion (#2469) - Fix: strip orphaned
tool_results+ let/resetbypass running agent (#2180) - Fix: prevent agents from starting gateway outside systemd management (#2617)
- Fix: prevent systemd restart storm on gateway connection failure (#2327)
- Fix: include resolved node path in systemd unit (#1767 by @sai-samarth)
- Fix: send error details to user in gateway outer exception handler (#1966)
- Fix: improve gateway error handling for 429 usage limits and 500 context overflow (#1839)
- Fix: add all missing platform allowlist env vars to startup warning check (#2628)
- Fix: show startup banner with all env vars when
verbose_logging=true(#2298) - Fix: webhook platform config loading from config.yaml (#2328)
- Fix: media-group aggregation on rapid successive photo messages (#2160)
- Fix: media delivery fails for file paths containing spaces (#2621)
- Fix: Matrix and Mattermost never report as connected (#1711)
- Fix: PII redaction config never read — missing yaml import (#1701)
- Fix: NameError on skill slash commands (#1697)
- Fix: persist watcher metadata in checkpoint for crash recovery (#1706)
- Fix: pass
message_thread_idinsend_image_file,send_document,send_video(#2339)
🖥️ CLI & User Experience
Interactive CLI
- @ context completions — Claude Code-style
@file/@urlreferences with tab completion (#2482, #2343) - Persistent config bar in prompt with model + provider info +
/statusbartoggle (#2240, #1917) /permissioncommand for dynamic approval mode switching (#2207)/browsercommand for interactive browser sessions (#2273)/toolsdisable/enable/list slash commands with session reset (#1652)/modelcommand for runtime model switching with live API probe for custom endpoints (#2110, #1645, #2078)- Real-time config reload — config.yaml changes apply without restart (#2210)
- Kitty keyboard protocol Shift+Enter handling for Ghostty/WezTerm (reverted due to prompt_toolkit crash) (#2345, #2349)
- Fix: prevent 'Press ENTER to continue...' on exit (#2555)
- Fix: flush stdout during agent loop to prevent macOS display freeze (#1654)
- Fix: show human-readable error when
hermes setuphits permissions error (#2196) - Fix:
/stopcommand crash + UnboundLocalError in streaming media delivery (#2463) - Fix: resolve garbled ANSI escape codes in status printouts (#2448)
- Fix: normalize toolset labels and use skin colors in banner (#1912)
- Fix: update gold ANSI color to true-color format (#2246)
- Fix: suppress spinner animation in non-TTY environments (#2216)
- Fix: display provider and endpoint in API error messages (#2266)
Setup & Configuration
- YAML-based config with backward-compatible env var fallback (#2172)
${ENV_VAR}substitution in config.yaml (#2684)custom_models.yamlfor user-managed model additions (#2214)- Merge nested YAML sections instead of replacing (#2213)
- Fix: log warning instead of silently swallowing config.yaml errors (#2683)
- Fix: config.yaml provider key overrides env var silently (#2272)
- Fix:
hermes updateuse.[all]extras with fallback (#1728) - Fix:
hermes updateprompt before resetting working tree on stash conflicts (#2390) - Fix: add zprofile fallback and create zshrc on fresh macOS installs (#2320)
- Fix: use git pull --rebase in update/install to avoid divergent branch error (#2274)
- Fix: disabled toolsets re-enable themselves after
hermes tools(#2268) - Fix: platform default toolsets silently override tool deselection (#2624)
- Fix: honor bare YAML
approvals.mode: off(#2620) - Fix: remove
ANTHROPIC_BASE_URLenv var to avoid collisions (#1675) - Fix: don't ask IMAP password if already in keyring or env (#2212)
- Fix: prevent
/modelcrash when provider list is empty (#2209) - Fix: OpenCode Zen/Go show OpenRouter models instead of their own (#2277)
🔧 Tool System
Browser Tools
- Native Hermes browser tools — navigate, click, type, screenshot, scrape via Browserbase (#2270)
- Fix: race condition in session creation orphans cloud sessions (#1721)
- Fix: browser handlers TypeError on unexpected LLM params (#1735)
- Fix: add
/browserto COMMAND_REGISTRY for help + autocomplete (#1814)
MCP (Model Context Protocol)
- MCP server management CLI + OAuth 2.1 PKCE auth (#2465)
- Interactive MCP tool configuration in
hermes tools(#1694) - Expose MCP servers as standalone toolsets (#1907)
- Optional FastMCP skill (#2113)
- Fix: MCP-OAuth port mismatch, path traversal, and shared handler state (#2552)
- Fix: preserve MCP tool registrations across session resets (#2124)
- Fix: concurrent file access crash + duplicate MCP registration (#2154)
- Fix: normalise MCP schemas + expand session list columns (#2102)
- Fix:
tool_choicemcp_prefix handling (#1775)
Web Tools
- Configurable web backend — Firecrawl/BeautifulSoup/Playwright (#2256)
- Parallel as alternative web search/extract backend (#1696)
- Tavily as web search/extract/crawl backend (#1731)
- Fix: whitespace-only env vars bypass web backend detection (#2341)
Other Tools
- Vision analysis tool for image understanding with configurable timeout (#2182, #2480)
- Code execution tool for containerized Python/Node/Bash execution (#2299)
- TTS tool using OpenAI API with
base_urlsupport (#2118, #2064 by @hanai) - STT (speech-to-text) tool using Whisper API (#2072)
- IMAP email reading and sending tools (#2173)
- RL training data generation tool (#2225)
- Route-aware pricing estimates (#1695)
- Fix: chunk long messages in
send_message_toolbefore platform dispatch (#1646) - Fix: make concurrent tool batching path-aware for file mutations (#1914)
- Fix: tool result truncation on large outputs (#2088)
- Fix: concurrent file writes safely with atomic operations (#2086)
- Fix: improve fuzzy matching accuracy for file search + position calculation refactor (#2096, #1681)
- Fix:
search_fileswrong line numbers for multi-line matches (#2069) - Fix: include pagination args in repeated search key (#1824 by @cutepawss)
- Fix: strip ANSI escape codes from write_file and patch content (#2532)
- Fix: expand tilde (~) in vision_analyze local file paths (#2585)
- Fix: resource leak and double socket close in
code_execution_tool(#2381) - Fix: resolve vision analysis race condition and path handling (#2191)
- Fix: DM vision — handle multiple images and base64 fallback (#2211)
- Fix:
model_supports_imagesfor custombase_urlproviders returns wrong value (#2278) - Fix: add missing 'messaging' toolset — couldn't enable/disable
send_message(#1718) - Fix: prevent unavailable tool names from leaking into model schemas (#2072)
- Fix: disabled toolsets re-enable themselves after
hermes tools(#2268) - Fix: pass visited set by reference to prevent diamond dependency duplication (#2311)
- Fix: Daytona sandbox lookup migrated from
find_onetoget/list(#2063 by @rovle)
🧩 Skills Ecosystem
Skills System
- Skills Hub — discover, install, and manage skills from curated taps (#2235)
- Agent-created persistent skills with caution-level findings allowed, dangerous skills ask instead of block (#2116, #1840, #2446)
--yesflag to bypass confirmation in/skills installand uninstall (#1647)- Disabled skills respected across banner, system prompt, and slash commands (#1897)
- Fix: skills custom_tools import crash + sandbox file_tools integration (#2239)
- Fix: agent-created skills with pip requirements crash on install (#2145)
- Fix: race condition in
Skills.__init__whenhub.yamlmissing (#2242) - Fix: validate skill metadata before install and block duplicates (#2241)
- Fix: skills hub inspect/resolve — 4 bugs in inspect, redirects, discovery, tap list (#2447)
- Fix: agent-created skills keep working after session reset (#2121)
New Skills
- OCR-and-documents — PDF/DOCX/XLS/PPTX/image OCR with optional GPU (#2236)
- Huggingface-hub bundled skill (#1921)
- Sherlock OSINT username search skill (#1671)
- Inference.sh skill (terminal-based) (#1686)
- Meme-generation — real image generator with Pillow (#2344)
- Bioinformatics gateway skill — index to 400+ bio skills (#2387)
- Base blockchain optional skill (#1643)
- 3D-model-viewer optional skill (#2226)
- Hermes-agent-setup skill (#1905)
🔒 Security & Reliability
Security Hardening
- SSRF protection for vision_tools and web_tools (hardened) (#2679)
- Shell injection prevention in
_expand_pathvia~userpath suffix (#2685) - Block untrusted browser-origin API server access (#2451)
- Block sandbox backend creds from subprocess env (#1658)
- Block @ references from reading secrets outside workspace (#2601 by @Gutslabs)
- Require opt-in for project plugin discovery (#2215)
- Malicious code pattern pre-exec scanner for terminal_tool (#2245)
- Harden terminal safety and sandbox file writes (#1653)
- PKCE verifier leak fix, OAuth refresh Content-Type fix (#1775)
- Eliminate SQL string formatting in
execute()calls (#2061 by @dusterbloom) - Harden jobs API — input limits, field whitelist, startup check (#2456)
- Fix: OAuth flag stale after refresh/fallback (#1890)
- Fix: auxiliary client skips expired Codex JWT (#2397)
Reliability
- Concurrent tool safety — path-aware file mutation batching, thread locks on SessionDB methods, file locking for memory writes (#1914, #1704, #1726)
- Error recovery — handle OpenRouter errors gracefully, guard print() calls against OSError (#2112, #1668)
- Redacting formatter — safely handle non-string inputs, NameError fix when verbose_logging=True (#2392, #1700)
- ACP — preserve session provider when switching models, persist sessions to disk, preserve leading whitespace in streaming chunks (#2380, #2071, #2192)
- API server — persist ResponseStore to SQLite across restarts (#2472)
- Fix:
fetch_nous_modelscalled with positional args — always TypeError (#1699) - Fix:
make_is_write_deniedrobust to Path objects (#1678) - Fix: resolve merge conflict markers in cli.py breaking hermes startup (#2347)
- Fix:
minisweagent_path.pymissing from wheel (#2098 by @JiwaniZakir)
Cron System
- Cron job scheduling for gateway (#2140)
[SILENT]response — cron agents can suppress delivery (#1833)- Scale missed-job grace window with schedule frequency (#2449)
- Recover recent one-shot jobs (#1918)
- Fix: normalize
repeat<=0to None — cron jobs deleted after first run when LLM passes -1 (#2612 by @Mibayy) - Fix: Matrix added to scheduler delivery platform_map (#2167 by @buntingszn)
- Fix: naive ISO timestamps stored without timezone — jobs fire at wrong time (#1729)
- Fix:
get_due_jobsreadsjobs.jsontwice — race condition (#1716) - Fix: silent jobs return empty response for delivery skip (#2442)
- Fix: stop injecting cron outputs into gateway session history (#2313)
- Fix: close abandoned coroutine when
asyncio.run()raises RuntimeError (#2317)
🐛 Notable Bug Fixes
- Fix: show full command in dangerous command approval prompt (#1649)
- Fix: Telegram streaming message length overflow (#1783)
- Fix: prevent
/modelcrash when provider list is empty (#2209) - Fix: batch of 5 small contributor fixes — PortAudio, SafeWriter, IMAP, thread lock, prefill (#2466)
- Fix:
dingtalk-streamadded to optional dependencies (#2452) - Fix: remove hardcoded
gemini-3-flash-previewas default summary model (#2464) - Fix: remove post-compression file-read history injection (#2226)
- Fix: truncated
AUXILIARY_WEB_EXTRACT_API_KEYenv var name (#2309) - Fix: update validator does not stop (#2204, #2067)
- Fix: log disk warning check failures at debug level (#2394)
- Fix: quiet mode with
--resumenow passes conversation_history (#2357) - Fix: unify resume logic in batch mode for consistent
--resumebehavior (#2331) - Fix: prevent unavailable tool names from leaking into model schemas (#2072)
- Fix: remove
_is_special_keyhack and fix/skillspath completion (#2271) - Fix: use home-relative state paths if XDG dirs don't exist (#2325)
- Fix: inject model identity for Alibaba Coding Plan (#2314)
- Fix: OpenClaw migration warns when API keys are skipped (#1655)
- Fix: email
send_typingmetadata + ☤ Hermes staff symbol (#1665) - Fix: replace production
print()calls with logger in rl_training_tool (#2462) - Fix: restore opencode-go provider config corrupted by secret redaction (#2393 by @0xbyt4)
🧪 Testing
- Resolve all consistently failing tests (#2488)
- Replace
FakePathwithmonkeypatchfor Python 3.12 compat (#2444) - Align Hermes setup and full-suite expectations (#1710)
- Add tests for API server jobs API hardening (#2456)
📚 Documentation
- Comprehensive documentation update for recent features (#1693, #2183)
- Alibaba Cloud and DingTalk setup guide (#1687, #1692)
- SOUL.md as primary agent identity documentation (#1927)
- Detailed skills documentation (#2244)
- Honcho self-hosted / Docker configuration section (#2475)
- Context length detection references in FAQ and quickstart (#2179)
- Fix documentation inconsistencies across reference and user guides (#1995)
- Fix MCP install commands — use uv, not bare pip (#1909)
- Fix MDX build error in api-server.md (#1787)
- Replace ASCII diagrams with Mermaid/lists (#2402)
- Add missing gateway commands and correct examples (#2329)
- Clarify self-hosted Firecrawl setup (#1669)
- NeuTTS provider documentation (#1903)
- Gemini OAuth provider implementation plan (#2467)
- Discord Server Members Intent marked as required (#2330)
- Align venv path to match installer (venv/ not .venv/) (#2114)
- New skills added to hub index (#2281)
- OCR-and-documents skill — split, merge, search examples (#2461)
👥 Contributors
Core
- @teknium1 (Teknium) — 280 PRs
Community Contributors
- @mchzimm (to_the_max) — GitHub Copilot provider integration across Hermes (#1879)
- @jquesnelle (Jeffrey Quesnelle) — Per-thread persistent event loops in worker threads (#2214)
- @llbn (lbn) — Telegram MarkdownV2 support: strikethrough, spoiler, blockquotes, and escape fixes (#2199, #2200)
- @dusterbloom — SQL injection prevention + local server context window querying (#2061, #2091)
- @0xbyt4 — Anthropic tool_calls None guard + OpenCode-Go provider config fix (#2209, #2393)
- @sai-samarth (Saisamarth) — WhatsApp send_message routing + systemd node path fix (#1769, #1767)
- @Gutslabs (Guts) — Block @ references from reading secrets outside workspace (#2601)
- @Mibayy (Mibay) — Cron job repeat normalization fix (#2612)
- @ten-jampa (Tenzin Jampa) — Gateway /title command session fix (#2379)
- @cutepawss (lila) — File tools search pagination fix (#1824)
- @hanai (Hanai) — OpenAI TTS base_url support (#2064)
- @rovle (Lovre Pešut) — Daytona sandbox API migration (#2063)
- @buntingszn (bunting szn) — Matrix cron delivery support (#2167)
- @InB4DevOps — Token counter reset on new session (#2101)
- @JiwaniZakir (Zakir Jiwani) — Missing file in wheel fix (#2098)
- @ygd58 (buray) — Delegate tool parent tool names fix (#2083)
Full Changelog: v2026.3.17...v2026.3.23