🐈 nanobot v0.1.5.post1 is here 🎉 — 80 PRs merged, 25 new contributors. The agent learned to manage itself.
If v0.1.5 was about making the building livable, v0.1.5.post1 is about the building learning to take care of itself. The agent now compresses its own context before it gets too long, injects follow-up messages mid-turn instead of making you wait, discovers reusable skills from its own workflows, and opens a WebSocket so anything can talk to it. Meanwhile, 40+ bug fixes across cron, memory, retry, and channels turned "it works most of the time" into "it works."
Highlights
-
Mid-turn injection — follow-ups don't wait in line — If you send another message while the agent is still working, it no longer queues behind a lock. The follow-up gets injected into the active turn, and on streaming channels the reply continues in the same live response. This makes long tool-call chains feel interactive instead of one-way. Edge-case draining on error paths was hardened in a follow-up pass. (#3042, #3110)
-
Dream learns skills, not just facts — Dream's consolidation flow can now recognize repeated workflows and promote them into standalone workspace skills under
skills/. Combined withdisabledSkillsconfig for excluding skills you don't want, the agent's skill surface is now something that grows organically and stays manageable. (#3048, #2959) -
Auto compact — the agent manages its own context — Sessions no longer grow until they hit the wall. Auto compact watches for idle periods, then proactively summarizes older context while preserving recent live messages — so when you come back, the agent remembers what matters without dragging along everything that doesn't. This isn't the old "nuke the session" approach; it's surgical compression that keeps the conversation feeling continuous. Pair it with
idleCompactAfterMinutesin config for fine-grained control. (#3007, #3081, #3093) -
WebSocket channel — connect anything — A new
websocketchannel runs a WebSocket server with streaming (delta+stream_endevents), token-based auth (static or issued), per-connection sessions, and TLS support. Web apps, CLIs, Chrome extensions, scripts — anything that can open a socket can now talk to the agent in real time. (#2964) -
Channels got deeper — Telegram gained location sharing. Discord got streaming replies and proxy support. Feishu added done-emoji lifecycle, inline tool hints, and Lark global domain config. QQ and WeCom received full media support. Slack's
messagetool now resolves#channel_nameand@userto real IDs. The API endpoint accepts file uploads via JSON base64 and multipart, with automatic document extraction (PDF, DOCX, XLSX, PPTX) across all channels. And retry amplification — where a failed send would trigger cascading retries — was fixed across every channel. (#2910, #2939, #2960, #2993, #3046, #3044, #3138, #2938, #3053) -
Providers — adaptive thinking and Kimi — Anthropic's
adaptivereasoning mode landed, letting Claude decide when and how much to think. Kimi thinking-capable models (kimi-k2.5,k2.6-code-preview) now get automaticextra_body.thinkinginjection viareasoningEffort. StepFun Plan API reasoning fields fall back correctly. Non-Claude providers get proper role alternation enforcement. And tool-call arguments are normalized for strict providers that reject malformed JSON. (#2882, #3124, #2903, #2637, #3154) -
MCP, tools, and search — MCP resources and prompts are now exposed as read-only tools — the agent can query them directly. Multiple MCP servers connect in isolated tasks instead of racing each other. The notebook editing tool arrived. Kagi joined the web search provider lineup. And the exec tool got tighter: Windows support landed,
allowed_env_keyslets you selectively forward env vars, internal state files are write-protected, andworking_diroutside the workspace is rejected. (#2907, #3019, #3017, #2945, #2893, #2962, #3061) -
Cron stopped dropping jobs — Four separate cron fixes addressed reentrant store reloads during job execution, fixed-interval tasks duplicating due to concurrent store replacement, job config not reloading, and manual run state not being preserved. If you rely on scheduled tasks, this release is the one where they become boring. (#3038, #3034, #2895, #2930)
Community
Welcome to our 25 new contributors who made their first contribution in this release: @Bahtya, @LeoFYH, @xwind, @Xerxes-cn, @BalorLC3, @invictus-z, @zijiefang, @kronk307, @stutiredboy, @SHLE1, @RohitDayanand, @justforyoudear, @XJPeng12, @linziyanleo, @chenyahui, @JonasGao, @weitongtong, @danielphang, @mterhar, @ramonpaolo, @nikube, @yeyitech, @ravs-cyberrock, @samyzhh, and @razzh7.
v0.1.5.post1 reflects something we keep seeing in the commit log: the best contributions aren't always the flashiest ones. A cron race condition caught by @weitongtong. A retry amplification loop spotted by @Bahtya. A channel error path that silently swallowed messages, fixed by @yanghan-cyber. These are the changes that make an agent trustworthy — not because it can do more, but because it stops doing things wrong. 80 PRs later, nanobot is quieter, steadier, and a little more grown-up. That's worth celebrating.
Full Changelog: v0.1.5...v0.1.5.post1
What's Changed
- fix(matrix): correct e2eeEnabled camelCase alias mapping by @Bahtya in #2877
- fix(filesystem): correct write success message from bytes to characters by @LeoFYH in #2865
- fix: Matrix e2eeEnabled config alias and cron job name parameter (#2851, #2680) by @04cb in #2855
- ci: add ruff lint check for unused imports and variables by @JiajunBernoulli in #2847
- fix(docker): Windows CRLF breaks entrypoint.sh by @flobo3 in #2883
- fix(cli): sanitize surrogate characters in prompt history by @Bahtya in #2869
- fix(feishu): resolve mentions data and ensure access token initializationDev by @xwind in #2885
- fix(runner): silent retry on empty response before finalization by @Re-bin in #2889
- feat(agent): tool hint enhancement by @chengyongru in #2884
- feat(memory):dream enhancement (#2887) by @chengyongru in #2891
- fix(cron): fix not reload job config by @Xerxes-cn in #2895
- feat(anthropic): add adaptive thinking mode by @BalorLC3 in #2882
- docs: fix channel plugin guide — require Pydantic config model by @invictus-z in #2850
- fix(memory): prevent potential loss of compressed session history by @LingaoM in #2890
- fix(memory): add timestamp and cap to recent history injection by @Re-bin in #2906
- feat(mcp): expose MCP resources and prompts as read-only tools by @Re-bin in #2907
- chore: update .gitignore to include additional project-specific, build, test, and environment files by @JackLuguibin in #2862
- fix(provider): fallback to reasoning field for StepFun Plan API by @zijiefang in #2903
- fix(exec): add Windows support for shell command execution by @Re-bin in #2893
- feat(agent): prompt behavior directives, tool descriptions, and loop robustness by @Re-bin in #2912
- feat(telegram): add location/geo support by @kronk307 in #2910
- feat: telegram support stream edit interval by @stutiredboy in #2919
- fix(tool-hint): fold paths in exec commands and deduplicate by formatted string by @chengyongru in #2926
- fix(cron): Concurrency issues by @Xerxes-cn in #2930
- refactor(hook): add reraise flag to AgentHook and remove _LoopHookChain by @LingaoM in #2918
- Fix version mismatch: use importlib.metadata as single source of truth by @Bahtya in #2860
- fix(discord): enable streaming replies to avoid empty final response by @SHLE1 in #2939
- fix(status): use consistent divisor for token count display by @LeoFYH in #2951
- fix(dingtalk): #2696 by @RohitDayanand in #2948
- fix(exec): forward complete Windows env to subprocesses by @justforyoudear in #2941
- feat: unified session across channels via config toggle (closes #2798) by @wanghesong2019 in #2900
- fix(helpers): ensure assistant message content is never None by @pixan-ai in #2748
- fix(cli): remove default green style from Enabled column in tables by @XJPeng12 in #2936
- fix(providers): enforce role alternation for non-Claude providers by @linziyanleo in #2637
- feat(channels): add WebSocket server channel by @chengyongru in #2964
- fix(agent): deliver LLM errors to streaming channels and avoid polluting session context by @yanghan-cyber in #2963
- feat(exec): support allowed_env_keys to pass specified env vars to su… by @chenyahui in #2962
- feat(channel): add proxy support for Discord channel by @JonasGao in #2960
- fix: strip blocks from Gemma 4 and similar models by @chengyongru in #2991
- feat(feishu): streaming resuming, inline tool hints, and done emoji by @chengyongru in #2993
- fix(memory): harden consolidation with try/except on token estimation and chunk size cap by @franciscomaestre in #2978
- fix(agent): Avoid truncate_text name shadowing by @yorkhellen in #2997
- feat(cron): 添加 CronService.update_job 方法 by @weitongtong in #3005
- fix(utils): anchor unclosed think-tag regex to string start (#3004) by @04cb in #3020
- feat(agent): auto compact — proactive session compression by @chengyongru in #3007
- fix(cron): 修复固定间隔任务因 store 并发替换导致的重复执行 by @weitongtong in #3034
- fix(cron): guard _load_store against reentrant reload during job execution by @danielphang in #3038
- feat: Add Kagi search by @mterhar in #2945
- fix(mcp): support multiple MCP servers by connecting each in isolated… by @Qinnnnnn in #3019
- feat(tool): improve file editing and add notebook tool by @Re-bin in #3017
- fix(feishu): improve voice message download with detailed logging by @chengyongru in #3041
- feat(agent): mid-turn message injection for responsive follow-ups by @chengyongru in #3042
- feat(channels): Add full media support for QQ and WeCom channels by @chengyongru in #3044
- fix(agent): preserve tool results on fatal error to prevent orphan tool_calls (#2943) by @04cb in #3045
- feat(channels/feishu): add domain config for Lark global support by @chengyongru in #3046
- feat(skills): add disabled_skills config to exclude skills from loading by @chenyahui in #2959
- fix(shell): tighten exec safety guards (#2989, #2826) by @04cb in #3061
- feat(agent): integrate skill discovery into Dream by @chengyongru in #3048
- fix(retry): strip images in-place to prevent repeated error-retry cycles by @yanghan-cyber in #3060
- fix(channels): prevent retry amplification and silent message loss across channels by @Bahtya in #3053
- fix(provider): clarify local 502 recovery hints by @haosenwang1018 in #3075
- fix(mcp): hint on stdio protocol pollution by @haosenwang1018 in #3079
- fix: improve tool call parameter validation and error messages by @ramonpaolo in #2859
- fix(agent): persist user message before running turn loop by @nikube in #3076
- fix(agent): skip auto-compact for sessions with active agent tasks by @chengyongru in #3081
- fix(provider): recover trailing assistant as user to prevent Zhipu 1214 by @chengyongru in #3082
- docs(provider): clarify responses api routing by @haosenwang1018 in #3089
- fix(log): remove noisy no-op logs from auto-compact by @chengyongru in #3093
- fix(agent): drain injection queue on error/edge-case exit paths by @chengyongru in #3110
- fix(web): serialize duckduckgo search calls by @yeyitech in #3128
- test(loop): cover /stop checkpoint recovery by @yeyitech in #3130
- feat: add HTTP health endpoint on gateway port by @ravs-cyberrock in #2625
- fix(feishu): remove resuming and add streaming card fallback by @chengyongru in #3133
- feat(slack): resolve named message targets by @yeyitech in #3138
- feat(api): support file uploads via JSON base64 and multipart/form-data by @dividduang in #2938
- fix: handle dict config in is_allowed() and _validate_allow_from() by @samyzhh in #3153
- fix: normalize tool-call arguments for strict providers by @Michael-lhh in #3154
- feat: show active task count in /status output by @aiguozhi123456 in #3149
- fix: add retry termination notification to interaction channel by @aiguozhi123456 in #3150
- feat(provider): enable Kimi thinking via extra_body for k2.5 and k2.6 by @razzh7 in #3124
New Contributors
- @Bahtya made their first contribution in #2877
- @LeoFYH made their first contribution in #2865
- @xwind made their first contribution in #2885
- @Xerxes-cn made their first contribution in #2895
- @BalorLC3 made their first contribution in #2882
- @invictus-z made their first contribution in #2850
- @zijiefang made their first contribution in #2903
- @kronk307 made their first contribution in #2910
- @stutiredboy made their first contribution in #2919
- @SHLE1 made their first contribution in #2939
- @RohitDayanand made their first contribution in #2948
- @justforyoudear made their first contribution in #2941
- @XJPeng12 made their first contribution in #2936
- @linziyanleo made their first contribution in #2637
- @chenyahui made their first contribution in #2962
- @JonasGao made their first contribution in #2960
- @weitongtong made their first contribution in #3005
- @danielphang made their first contribution in #3038
- @mterhar made their first contribution in #2945
- @ramonpaolo made their first contribution in #2859
- @nikube made their first contribution in #3076
- @yeyitech made their first contribution in #3128
- @ravs-cyberrock made their first contribution in #2625
- @samyzhh made their first contribution in #3153
- @razzh7 made their first contribution in #3124
Full Changelog: v0.1.5...v0.1.5.post1