Releases: nullclaw/nullclaw
Releases · nullclaw/nullclaw
v2026.4.17
What's Changed
- v2026.4.9 by @DonPrus in #795
- Migrate project to Zig 0.16 by @DonPrus in #823
- fix(security): initialize docker sandbox mount args via factory | 修复(安全): 通过工厂初始化 Docker 沙箱挂载参数 by @manelsen in #801
- fix(agent): persist cli turns into sqlite session history | 修复(agent): 将 CLI 对话持久化到 SQLite 会话历史 by @manelsen in #802
- fix(providers): Responses API tool schema and null error handling by @fakhriaunur in #790
- fix(agent): keep unbound sessions on the main agent | 修复(agent): 让未绑定会话始终落到主代理 main by @manelsen in #804
- fix(config): allow local container hostnames for otel http | 修复(config): 允许 OTEL 使用本地容器主机名作为 HTTP endpoint by @manelsen in #803
- fix(provider): fall back to responses on chat endpoint 404 | 修复(provider): chat 端点返回 404 时回退到 responses by @manelsen in #806
- hardening(web): expire pairing tokens and tighten provider/browser boundaries | 加固(web): 为配对令牌添加过期并收紧 provider/browser 边界 by @manelsen in #807
- service: add SysVinit fallback for nullclaw service install by @mark-os in #810
- fix(compaction): fix UTF-8 truncation in history compaction by @wanderingmeow in #824
- fix(security): require runnable linux sandboxes in auto-detect | 修复(安全): Linux 自动检测仅接受可实际运行的沙箱后端 by @manelsen in #805
- fix(web_search): add setup guidance for missing providers | 修复(web_search): 为缺失搜索提供方补充设置指引 by @manelsen in #815
- fix(doctor): clarify CLI-only channel status diagnostics | 修复(doctor): 澄清仅 CLI 场景下的 channel 状态诊断 by @manelsen in #828
- fix(onboard): raise models refresh output budget | 修复(onboard): 提高模型目录刷新输出预算 by @manelsen in #813
- fix(agent): stabilize named-agent provider lifetimes | 修复(agent): 稳定命名子代理提供方生命周期 by @manelsen in #814
- feat(test): utility additions by @fakhriaunur in #787
- feat: support http_proxy/https_proxy env vars in std.http.Client by @juvenn in #755
- Add admin-oriented config and models CLI by @DonPrus in #829
- Add Weixin QR auth flow and channel support by @DDGRCF in #818
- ci: pin CI workflow actions and set permissions by @grtninja in #798
- feat(telegram): add interactive skill menus and harden topic/codex handling by @vedmalex in #782
- feat: dispatch agent on heartbeat when HEARTBEAT.md has tasks by @quinlanjager in #757
- refactor(providers): consolidate error text predicates (EN | ZH) by @manelsen in #754
- feat(test): Add tests for version, verbose, and web search providers by @fakhriaunur in #786
New Contributors
- @mark-os made their first contribution in #810
- @DDGRCF made their first contribution in #818
- @grtninja made their first contribution in #798
- @quinlanjager made their first contribution in #757
Full Changelog: v2026.4.9...v2026.4.17
v2026.4.9
What's Changed
- docs: add beginner's guide for non-technical users (EN | ZH) | docs: 新手入门指南(英文 + 中文) by @manelsen in #750
- release: package Windows binaries as zip archives | 发布(release): 将 Windows 二进制打包为 zip 归档 by @manelsen in #738
- v2026.4.7 by @DonPrus in #785
- fix(web): avoid immediate WebSocket disconnects on Windows | 修复(web): 避免 Windows 上 WebSocket 立即断开 by @manelsen in #742
- fix(onboarding): pretty json config alignment on interactive onboarding by @kunalk16 in #794
- fix: update build.zig.zon2json-lock for wasm3 and websocket by @jonathanhfmills in #792
- telegram: improve interactive reply UX | 改进(telegram): 优化交互回复体验 by @manelsen in #726
- providers(openrouter): preserve reasoning traces in stream | 修复(providers/openrouter): 保留流式 reasoning 轨迹 by @manelsen in #724
- onboard(cli): improve model setup and catalog selection | 改进(onboard/cli): 优化模型配置与目录选择 by @manelsen in #725
- fix(qq): retry delayed replies without msg_id | 修复(qq): 延迟回复在 msg_id 失效后改为普通发送重试 by @manelsen in #732
- feat(channels): retry transient final outbound sends | 功能(channels): 为最终出站消息增加瞬时失败重试 by @manelsen in #731
- feat(skills): support web-discovered skill installs | 功能(skills): 支持通过 Web 发现安装技能 by @manelsen in #735
- fix(ollama): normalize scheduler tool aliases | 修复(ollama): 规范 scheduler 工具别名 by @manelsen in #744
- refactor(tools): share file and web search helpers | 重构(tools): 共享文件与网页搜索辅助工具 by @manelsen in #745
- config: fix custom provider primary model parsing | 修复(config): 修正自定义 provider 的主模型解析 by @manelsen in #728
- feat(model-picker): add interactive multi-provider selection | 功能(model-picker): 增加交互式多 provider 选择 by @manelsen in #727
- feat(channels): add durable outbound delivery outbox | 功能(channels): 增加持久化出站投递 outbox by @manelsen in #730
- fix(config): validate agent provider by @fakhriaunur in #788
- fix(providers): guard tool_calls and choices against null JSON values by @vernonstinebaker in #781
- fix(cli): filter streamed tool-call markup by @vernonstinebaker in #761
- onboard: respect container workspace defaults by @valonmulolli in #756
- fix(observability): default OTLP endpoint to HTTPS | 修复(observability): OTLP 端点默认 HTTPS by @manelsen in #752
- test(security): add tests for Sandbox interface and NoopSandbox | 测试(sandbox): 添加 Sandbox 接口测试 by @manelsen in #751
- feat(providers): add session_id (user) and custom body parameters support | 特性(providers): 增加 session_id (user) 和自定义正文参数支持 by @manelsen in #709
- fix(onboard): keep Docker Compose onboarding on volume-backed defaults | 修复(onboard): 保持 Docker Compose 初始化使用卷挂载默认路径 by @manelsen in #749
New Contributors
- @jonathanhfmills made their first contribution in #792
- @fakhriaunur made their first contribution in #788
- @valonmulolli made their first contribution in #756
Full Changelog: v2026.4.7...v2026.4.9
v2026.4.7
What's Changed
- v2026.4.4 by @DonPrus in #769
- feat(lark): add reaction emoji support on message receipt by @Aisht669 in #704
- fix(routing): always use "main" as the default agent fallback | 修复(routing): 始终使用 "main" 作为默认 Agent 回退 by @manelsen in #705
- docs: clarify that config values do not support environment variable interpolation | 文档: 澄清配置值不支持环境变量插值 by @manelsen in #706
- feat(tools): support reading Pushover credentials from process environment | 特性(tools): 支持从进程环境变量读取 Pushover 凭证 by @manelsen in #707
- feat(tools): wire file_append tool into the runtime | 特性(tools): 将 file_append 工具接入运行时 by @manelsen in #708
- feat(heartbeat): add detailed logging for heartbeat ticks | 特性(heartbeat): 增加 Heartbeat Tick 的详细日志 by @manelsen in #710
- Add calculator tool for mathematical operations by @festoinc in #716
- docs(config): document built-in WeChat channel setup | 文档(config): 补充内置 WeChat 渠道配置说明 by @manelsen in #718
- fix(session): correct Discord scheduled DM delivery target | 修复(session): 更正 Discord 定时私聊投递目标 by @manelsen in #719
- docs(external): document async login for plugins | 文档(external): 补充插件异步登录说明 by @manelsen in #736
- fix(lark): add processing feedback placeholder before final reply | 修复(lark): 在最终回复前提供处理中占位反馈 by @manelsen in #720
New Contributors
Full Changelog: v2026.4.4...v2026.4.7
v2026.4.4
What's Changed
- feat(cron): wire up session_target routing for agent jobs by @sanderdewijs in #666
- fix(ollama): avoid empty chat responses by default / 修复 Ollama 默认空响应问题 by @manelsen in #668
- v2026.3.21 by @DonPrus in #670
- fix(web): clarify public-bind guidance for browser UI / 澄清浏览器 UI 公网绑定使用指引 by @manelsen in #672
- fix(compatible): enable reasoning for custom vLLM/Qwen endpoints / 为自定义 vLLM/Qwen 兼容接口启用推理 by @manelsen in #669
- docs: refine navigation and runtime guidance by @telagod in #713
- docs: add reliability and model fallbacks section / 文档:新增可靠性与模型备选配置说明 by @manelsen in #695
- fix(shell): stop hanging on interactive commands / 修复交互式命令导致挂起的问题 by @manelsen in #673
- feat(inbound): debounce rapid-fire text across Telegram, Discord, and CLI / 为 Telegram、Discord 与 CLI 的连续文本消息增加入站防抖 by @manelsen in #676
- provider: resolve explicit custom-url model refs by @juslintek in #681
- fix(error_classify): handle msg field and image+not-supported pattern by @vernonstinebaker in #685
- feat(a2a): multi-modal support — agent card capability, inlineData forwarding, vision probe by @vernonstinebaker in #686
- fix: respect NULLCLAW_HOME in cron.zig config directory resolution by @realrubberduckdev in #692
- fix/markdown timestamp temporal decay clean by @shkarlsson in #679
- refactor(main): route Telegram and Signal startup through shared channel loops / 将 Telegram 与 Signal 的启动流程统一到共享轮询循环 by @manelsen in #677
- feat(gateway): make HTTP body size limit and request timeout configurable by @vernonstinebaker in #687
- feat(otel): enrich observability with channel attribution, delegation tracing, and skill load spans / 增强 OTEL 观测能力:新增渠道归属、委托追踪及技能加载耗时 by @manelsen in #693
- feat: integrate sandbox support for shell tool execution by @shkarlsson in #678
- fix(gemini-cli): align ACP handshake with Gemini CLI 0.34 / 使 gemini-cli 的 ACP 握手与 Gemini CLI 0.34 对齐 by @manelsen in #675
- fix: telegram dupes, bifrost compatibility, and tool cache staleness / 修复 Telegram 重复消息、Bifrost 兼容性及工具缓存失效 by @manelsen in #694
New Contributors
- @realrubberduckdev made their first contribution in #692
- @shkarlsson made their first contribution in #679
Full Changelog: v2026.3.21...v2026.4.4
v2026.3.21
What's Changed
- v2026.3.18 by @DonPrus in #639
- feat(runtime): add wasm3 interpreter by default by @manelsen in #568
- feat(agent): support configurable prompt timezone / 特性(agent): 支持可配置的提示词时区 by @manelsen in #546
- fix(security): resolve absolute wasmtime executable path / 修复(security): 解析 wasmtime 可执行文件的绝对路径 by @manelsen in #536
- [OneBot] auth hardening and operational health signal / [OneBot] 认证加固与运行健康信号 by @manelsen in #554
- fix(agent): robustify tool-call parsing for malformed LLM outputs / 修复(agent): 增强对格式错误 LLM 输出的工具调用解析 by @manelsen in #551
- fix(lark): improve websocket reconnect logging and permission diagnostics / 修复(lark): 改进 WebSocket 重连日志与权限诊断 by @manelsen in #552
- [Lark] operations readiness runbook (EN/中文) / [Lark] 运维就绪手册(英/中) by @manelsen in #556
- [QQ] websocket health signal hardening / [QQ] websocket 健康信号加固 by @manelsen in #555
- [DingTalk] operations readiness runbook (EN/中文) / [DingTalk] 运维就绪手册(英/中) by @manelsen in #557
- fix(providers): enable native_tools for z.ai/glm aliases / 修复(providers): 为 z.ai/glm 别名启用 native_tools by @manelsen in #577
- feat(wecom+wechat): implement secure callbacks and passive replies / 特性(wecom+wechat): 实现安全回调与被动回复 by @manelsen in #559
- fix(subagent): inject installed skills into delegated subagents / 修复(subagent): 将已安装的技能注入到委派的子代理中 by @manelsen in #558
- fix(providers/compatible): return NoResponseContent when all fields are null/empty by @vernonstinebaker in #584
- fix(fs): avoid statx-dependent makePath for Linux < 4.11 by @juvenn in #589
- fix(compatible): handle kimi-k2.5 reasoning_content responses / 修复(compatible): 处理 kimi-k2.5 reasoning_content 响应 by @manelsen in #578
- docs(agents): add §8.1 test coverage mandate by @vernonstinebaker in #590
- feat(providers): make max_streaming_prompt_bytes configurable per-provider by @vernonstinebaker in #591
- feat(providers): add Hunyuan (Tencent Cloud) and Baichuan to compat_providers / 特性(providers): 新增混元(腾讯云)与百川提供商 by @manelsen in #595
- feat(security): Tencent platform crypto primitives (AES-256-CBC, TC3-HMAC-SHA256, WeChat SHA-1) / 特性(security): 腾讯平台加密原语 by @manelsen in #593
- fix(providers): detect stalled SSE streams with curl speed-limit; cap non-streaming fallback timeout by @vernonstinebaker in #597
- feat(channels): abstract OutboundPayload port + sendRich for DingTalk and Lark Card 2.0 / 特性(channels): 抽象富消息端口 + DingTalk/Lark Card 2.0 sendRich 实现 by @manelsen in #596
- feat(providers): support Ollama cloud API key with Bearer auth by @juvenn in #615
- docs: clarify workspace_path and system_prompt behavior by @vedmalex in #620
- fix(memory): make durable recall work across sessions | 修复(memory): 让持久记忆在跨会话场景下正常召回 by @manelsen in #650
- fix(agent): ensure profile-aware hot reload and add /config to telegram menu | 修复(agent): 确保 profile 感知的热重载并将 /config 添加至 Telegram 菜单 by @manelsen in #622
- Add Gemini CLI as a local provider using ACP mode by @mailiam in #628
- Use portable_atomic.zig to simplify u64 atomic access by @Centauria in #640
- fix(cron): allow agent jobs to omit command field in cron.json by @yanggf8 in #643
- fix(providers): fix GLM/ZhipuAI thinking mode and native tool_calls by @yanggf8 in #641
- fix(config): allow http:// MCP URLs for localhost, private IPs, and Tailscale CGNAT range by @vernonstinebaker in #642
- docs(a2a): expand protocol doc and examples + add config details and method reference by @hfreire in #649
- fix: nix build error in NixOS-25.11 by @cloudsbit in #653
- fix(cron): add --account flag to cron add-agent CLI by @yanggf8 in #645
- fix(config): accept flat OTEL diagnostics fields | 修复(config): 兼容平铺式 OTEL diagnostics 配置字段 by @manelsen in #652
- Surface provider API details in channel-loop errors | 在 channel-loop 错误中展示 provider API 细节 by @manelsen in #656
- Avoid logged-errors in update curl skip path | 避免更新 curl 跳过路径触发 logged-errors by @manelsen in #655
- feat(cron): expose live scheduler via HTTP API by @yanggf8 in #648
- Add Xiaomi MiMo as an OpenAI-compatible provider | 新增 Xiaomi MiMo OpenAI 兼容提供方支持 by @manelsen in #654
- Add onboarding-generated CONFIG.md guide | 新增 onboarding 生成的 CONFIG.md 配置指南 by @manelsen in #657
- feat(telegram): add reply detection for bot messages in TelegramChannel by @byjk in #661
- fix(observability): enrich OTEL spans and flush at turn boundaries | 修复(observability): 丰富 OTEL spans 并在回合边界刷新 by @manelsen in #660
- fix(mcp): add Accept header and SSE response parsing for HTTP transport by @vernonstinebaker in #658
- fix: Windows compatibility and DingTalk debugging by @young13shao in #662
- fix(agent): enable empty-response retry and follow-through guardrail in streaming by @vernonstinebaker in #663
- fix/responses add explicit responses mode for compatible providers by @DonPrus in #664
- feat(provider): add OpenAI Responses mode for compatible providersCodex/OpenAI responses design by @ouraihub in #424
New Contributors
- @mailiam made their first contribution in #628
- @yanggf8 made their first contribution in #643
- @cloudsbit made their first contribution in #653
- @byjk made their first contribution in #661
- @young13shao made their first contribution in #662
- @ouraihub made their first contribution in #424
Full Changelog: v2026.3.18...v2026.3.21
v2026.3.18
What's Changed
- v2026.3.17 by @DonPrus in #614
- feat(providers): add Novita AI as OpenAI-compatible provider by @Alex-wuhu in #621
- fix(docker): update container starter config to current schema | 修复(docker): 将容器初始配置更新为当前配置结构 by @manelsen in #636
- fix(telegram): suppress draft retries for invalid peers | 修复(telegram): 对无效 peer 停止重试草稿请求 by @manelsen in #635
- fix(matrix): use joined member count for private room detection | 修复(matrix): 使用已加入成员数判断私聊房间 by @manelsen in #634
- fix(agent): inject configured AIEOS identity into system prompts | 修复(agent): 将已配置的 AIEOS identity 注入系统提示词 by @manelsen in #633
- fix(nix): pin flake dev shell to Zig 0.15.2 | 修复(nix): 将 flake 开发环境固定为 Zig 0.15.2 by @manelsen in #637
- fix(a2a): update to v0.3.0 + add new task states + refine message handling and enhance history support by @hfreire in #630
New Contributors
- @Alex-wuhu made their first contribution in #621
Full Changelog: v2026.3.17...v2026.3.18
v2026.3.17
What's Changed
- v2026.3.15 by @DonPrus in #582
- Add runtime observability wiring and OTLP support by @DonPrus in #600
- feat(channels): add hardened external channel plugins by @DonPrus in #604
- feat: per-agent workspace isolation by @DNature in #275
- refactor(interactions): move command and callback rules into shared core / 重构(interactions): 将命令与回调规则移入共享核心 by @manelsen in #294
- feat(session): claim-gated per-peer auto-provision with isolated runtimes / 特性(session): 带身份验证的按对等端自动配置与隔离运行时 by @manelsen in #297
- fix(security): harden browser read URL handling / 修复(security): 加固浏览器读取工具的 URL 处理 by @manelsen in #532
- fix(matrix): handle invites and sync policy by @manelsen in #610
- feat(email): email channel with IMAP IDLE and community example by @sanderdewijs in #451
- fix(providers): fall back to non-streaming on CurlWaitError for… by @brunojuliao in #608
- fix(security): block yolo autonomy on non-loopback gateway / 修复(security): 在非 loopback 网关上阻止 yolo 自主模式 by @manelsen in #534
- fix(security): implement secret key rotation / 修复(security): 实现机密密钥轮换 by @manelsen in #538
- fix(config): encrypt persisted api keys in config.json by @manelsen in #609
- fix(security): stop logging pairing code secrets / 修复(security): 停止记录 pairing code 秘钥 by @manelsen in #535
- feat(service): add OpenRC support on Linux / feat(service): 支持 Linux OpenRC 服务管理 by @manelsen in #605
- fix(tools): honor http_timeout_secs in http_request / 修复(tools): 在 http_request 中遵循 http_timeout_secs by @manelsen in #541
- fix(security): warn on wildcard allowlist usage / 修复(security): 使用通配符白名单时发出警告 by @manelsen in #539
- feat(channels): extend external plugin message actions by @DonPrus in #611
- fix(cron): improve diagnostics when cron tasks are not running (fixes #592) by @yassinebkr in #598
Full Changelog: v2026.3.15...v2026.3.17
v2026.3.15
What's Changed
- Bump version to 2026.3.14 by @DonPrus in #513
- fix(cron): handle InvalidExe on macOS after in-place binary replacement by @vernonstinebaker in #522
- Use portable Atomic for Slack channel by @Centauria in #523
- fix(config): normalize legacy #topic: peer IDs in binding config by @vedmalex in #529
- fix(security): redact oversized sensitive header names by @manelsen in #542
- feat(http_request): include curl stderr in failure diagnostics by @manelsen in #544
- fix(onboard): add yolo autonomy option to wizard by @manelsen in #545
- fix(web): make websocket handshake size configurable by @manelsen in #573
- docs: fix typos, sync zh/en parity, update stats and command table by @telagod in #563
- fix(gateway): add port conflict detection before listen() by @lighterEB in #515
- feat(providers): auto discover qwen-portal oauth token by @juvenn in #524
- fix(http_request): make redaction buffer ownership explicit / 修复(http_request): 明确脱敏缓冲区的内存所有权 by @manelsen in #543
- refactor(http_request): remove dead std.http migration helpers / 重构(http_request): 移除过时的 std.http 迁移辅助代码 by @manelsen in #560
- fix(agent): suppress orphan closing tool-call tag from user-visible reply by @vernonstinebaker in #570
- fix(mcp): ensure MCP tools are initialized in all tool-building paths by @vernonstinebaker in #567
- refactor: remove dead code and redundant compilation tests / 重构: 移除过时代码与冗余编译测试 by @manelsen in #562
- docs: add Discord channel documentation by @msb090219 in #528
- fix(session): persist runtime slash settings across restores / 修复(session): 在会话恢复时持久化运行时斜杠命令设置 by @manelsen in #530
- fix(security): use constant-time bearer token comparison / 修复(security): 使用等时比较验证 bearer 令牌 by @manelsen in #531
- fix(security): enforce secrets encryption / 修复(security): 强制执行机密加密 by @manelsen in #537
- docs(config): subagent routing and AIEOS identity examples / 文档(config): 子代理路由与 AIEOS 身份配置示例 by @manelsen in #547
- fix(telegram): preserve attachment context when media processing fails / 修复(telegram): 媒体处理失败时保留附件上下文 by @manelsen in #548
- fix(errors): actionable provider network error guidance / 修复(errors): 可操作的提供商网络错误指导 by @manelsen in #561
- fix(http_request): reorder checks, allowlist SSRF bypass, HTTPS-only by @lighterEB in #526
- fix(agent): prevent redundant tool execution via turn-scoped deduplication / 修复(agent): 通过轮次作用域去重防止冗余工具执行 by @manelsen in #572
- feat(agent): hot reload for config and skills / 特性(agent): 支持配置与技能的热重载 by @manelsen in #571
- feat(mcp): support stateful streaming-compatible MCP over HTTP by @sheauhuu in #566
- fix(web): restore local WebChannel on Windows and vendor dependencies / 修复(web): 恢复 Windows 本地 WebChannel 并同步依赖项 by @manelsen in #550
- docs: add Discord community links by @DonPrus in #581
- fix(lark): stabilize card action callback in websocket mode by @Yandre97 in #564
New Contributors
- @msb090219 made their first contribution in #528
- @sheauhuu made their first contribution in #566
- @Yandre97 made their first contribution in #564
Full Changelog: v2026.3.14...v2026.3.15
v2026.3.14
What's Changed
- Fix/memory by @DonPrus in #486
- fix(claude-cli): scope resume sessions to nullclaw sessions by @manelsen in #478
- fix(claude-cli): harden resume session handling by @manelsen in #481
- feat(onboard): use models.dev for model discovery by @manelsen in #480
- fix(websocket): stop TLS connections from closing prematurely on empty reads by @kuzeofficial in #487
- docs(agents): align naming contract with actual codebase conventions by @juvenn in #483
- Add the binary file to the PATH in installation guide for Windows by @neoliuhua in #489
- docs: ecosystem integration analysis and roadmap by @vedmalex in #501
- fix(session): resolve dangling provider pointer in named-agent sessions by @vedmalex in #500
- fix(agent): move single-message status lines to log.debug by @vernonstinebaker in #491
- Make skill installation continue on individual skill failures by @EdmondFrank in #494
- feat: integrate tunnel module into gateway startup by @lighterEB in #502
- feat(channels): add Microsoft Teams channel by @ethanbrown3 in #438
- fix(slack): persist interactive callbacks across HTTP requests by @manelsen in #505
- feat(config): auto-detect file paths in agent system_prompt by @vedmalex in #459
- fix(cli): honor --help for agent and gateway subcommands by @DonPrus in #511
- fix(sse): accept no-space SSE data prefix by @BioniCosmos in #509
New Contributors
- @kuzeofficial made their first contribution in #487
- @EdmondFrank made their first contribution in #494
- @lighterEB made their first contribution in #502
- @BioniCosmos made their first contribution in #509
Full Changelog: v2026.3.13...v2026.3.14
v2026.3.13
What's Changed
- fix(agent): avoid immediate retries after rate limits by @manelsen in #474
- v2026.3.12 by @DonPrus in #476
- 增加了windows用户直接使用二进制文件的说明 by @neoliuhua in #479
Full Changelog: v2026.3.12...v2026.3.13