[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"similar-nullclaw--nullclaw":3,"tool-nullclaw--nullclaw":64},[4,17,27,35,43,56],{"id":5,"name":6,"github_repo":7,"description_zh":8,"stars":9,"difficulty_score":10,"last_commit_at":11,"category_tags":12,"status":16},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,3,"2026-04-05T11:01:52",[13,14,15],"开发框架","图像","Agent","ready",{"id":18,"name":19,"github_repo":20,"description_zh":21,"stars":22,"difficulty_score":23,"last_commit_at":24,"category_tags":25,"status":16},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",138956,2,"2026-04-05T11:33:21",[13,15,26],"语言模型",{"id":28,"name":29,"github_repo":30,"description_zh":31,"stars":32,"difficulty_score":23,"last_commit_at":33,"category_tags":34,"status":16},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107662,"2026-04-03T11:11:01",[13,14,15],{"id":36,"name":37,"github_repo":38,"description_zh":39,"stars":40,"difficulty_score":23,"last_commit_at":41,"category_tags":42,"status":16},3704,"NextChat","ChatGPTNextWeb\u002FNextChat","NextChat 是一款轻量且极速的 AI 助手，旨在为用户提供流畅、跨平台的大模型交互体验。它完美解决了用户在多设备间切换时难以保持对话连续性，以及面对众多 AI 模型不知如何统一管理的痛点。无论是日常办公、学习辅助还是创意激发，NextChat 都能让用户随时随地通过网页、iOS、Android、Windows、MacOS 或 Linux 端无缝接入智能服务。\n\n这款工具非常适合普通用户、学生、职场人士以及需要私有化部署的企业团队使用。对于开发者而言，它也提供了便捷的自托管方案，支持一键部署到 Vercel 或 Zeabur 等平台。\n\nNextChat 的核心亮点在于其广泛的模型兼容性，原生支持 Claude、DeepSeek、GPT-4 及 Gemini Pro 等主流大模型，让用户在一个界面即可自由切换不同 AI 能力。此外，它还率先支持 MCP（Model Context Protocol）协议，增强了上下文处理能力。针对企业用户，NextChat 提供专业版解决方案，具备品牌定制、细粒度权限控制、内部知识库整合及安全审计等功能，满足公司对数据隐私和个性化管理的高标准要求。",87618,"2026-04-05T07:20:52",[13,26],{"id":44,"name":45,"github_repo":46,"description_zh":47,"stars":48,"difficulty_score":23,"last_commit_at":49,"category_tags":50,"status":16},2268,"ML-For-Beginners","microsoft\u002FML-For-Beginners","ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程，旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周，包含 26 节精炼课程和 52 道配套测验，内容涵盖从基础概念到实际应用的完整流程，有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。\n\n无论是希望转型的开发者、需要补充算法背景的研究人员，还是对人工智能充满好奇的普通爱好者，都能从中受益。课程不仅提供了清晰的理论讲解，还强调动手实践，让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持，通过自动化机制提供了包括简体中文在内的 50 多种语言版本，极大地降低了全球不同背景用户的学习门槛。此外，项目采用开源协作模式，社区活跃且内容持续更新，确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路，ML-For-Beginners 将是理想的起点。",84991,"2026-04-05T10:45:23",[14,51,52,53,15,54,26,13,55],"数据工具","视频","插件","其他","音频",{"id":57,"name":58,"github_repo":59,"description_zh":60,"stars":61,"difficulty_score":10,"last_commit_at":62,"category_tags":63,"status":16},3128,"ragflow","infiniflow\u002Fragflow","RAGFlow 是一款领先的开源检索增强生成（RAG）引擎，旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体（Agent）能力相结合，不仅支持从各类文档中高效提取知识，还能让模型基于这些知识进行逻辑推理和任务执行。\n\n在大模型应用中，幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构（如表格、图表及混合排版），显著提升了信息检索的准确度，从而有效减少模型“胡编乱造”的现象，确保回答既有据可依又具备时效性。其内置的智能体机制更进一步，使系统不仅能回答问题，还能自主规划步骤解决复杂问题。\n\n这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统，还是致力于探索大模型在垂直领域落地的创新者，都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口，既降低了非算法背景用户的上手门槛，也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目，它正成为连接通用大模型与行业专有知识之间的重要桥梁。",77062,"2026-04-04T04:44:48",[15,14,13,26,54],{"id":65,"github_repo":66,"name":67,"description_en":68,"description_zh":69,"ai_summary_zh":69,"readme_en":70,"readme_zh":71,"quickstart_zh":72,"use_case_zh":73,"hero_image_url":74,"owner_login":67,"owner_name":75,"owner_avatar_url":76,"owner_bio":77,"owner_company":78,"owner_location":78,"owner_email":78,"owner_twitter":78,"owner_website":78,"owner_url":79,"languages":80,"stars":95,"forks":96,"last_commit_at":97,"license":98,"difficulty_score":23,"env_os":99,"env_gpu":100,"env_ram":101,"env_deps":102,"category_tags":105,"github_topics":106,"view_count":111,"oss_zip_url":78,"oss_zip_packed_at":78,"status":16,"created_at":112,"updated_at":113,"faqs":114,"releases":140},129,"nullclaw\u002Fnullclaw","nullclaw","Fastest, smallest, and fully autonomous AI assistant infrastructure written in Zig","nullclaw 是一个用 Zig 语言编写的极简、高性能 AI 助手基础设施，主打“小而全”：仅 678 KB 的静态二进制文件，启动时间低于 2 毫秒，运行时内存占用约 1 MB，可在低至 5 美元的开发板甚至微控制器上流畅运行。它解决了传统 AI 助手依赖复杂运行时、资源消耗大、部署门槛高的问题，提供开箱即用的自主运行能力，无需虚拟机、解释器或额外依赖。\n\nnullclaw 内置对 50 多种 AI 提供商、19 种通信渠道和多种硬件外设的支持，并采用模块化设计，核心组件均可替换。其安全机制包括严格沙箱、权限白名单和加密密钥管理，适合注重性能与安全的边缘计算场景。\n\n这款工具主要面向嵌入式开发者、AI 研究人员及系统工程师，尤其适合需要在资源受限设备上部署轻量级、可定制 AI 助手的用户。如果你希望在树莓派、单片机或老旧设备上快速运行一个功能完整又省资源的 AI 代理，nullclaw 是一个值得尝试的选择。","Want a simpler way to install and configure nullclaw with a UI? Try [nullhub](https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullhub)! (currently in beta)\n\n[nullhub](https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullhub) provides a UI layer for the Null ecosystem: simpler nullclaw setup and configuration, orchestration from [nullboiler](https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullboiler), observability from [nullwatch](https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullwatch), and task tracking from [nulltickets](https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnulltickets).\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnullclaw_nullclaw_readme_973e00ed6564.png\" alt=\"nullclaw\" width=\"200\" \u002F>\n\u003C\u002Fp>\n\n\u003Ch1 align=\"center\">NullClaw\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\n  \u003Cstrong>Null overhead. Null compromise. 100% Zig. 100% Agnostic.\u003C\u002Fstrong>\u003Cbr>\n  \u003Cstrong>678 KB binary. ~1 MB RAM. Boots in \u003C2 ms. Runs on anything with a CPU.\u003C\u002Fstrong>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Factions\u002Fworkflows\u002Fci.yml\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg\" alt=\"CI\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fnullclaw.github.io\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdocs-nullclaw.github.io-informational\" alt=\"Documentation\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fdiscord.gg\u002FBfmdua22Ud\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdiscord-join%20community-5865F2?logo=discord&logoColor=white\" alt=\"Discord\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"LICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-blue.svg\" alt=\"License: MIT\" \u002F>\u003C\u002Fa>\n\u003C\u002Fp>\n\nThe smallest fully autonomous AI assistant infrastructure — a static Zig binary that fits on any $5 board, boots in milliseconds, and requires nothing but libc.\n\nDocs: [English](docs\u002Fen\u002FREADME.md) · [中文](docs\u002Fzh\u002FREADME.md) · [Contributing](CONTRIBUTING.md) · [Discord](https:\u002F\u002Fdiscord.gg\u002FBfmdua22Ud)\n\n```\n678 KB binary · \u003C2 ms startup · 5,300+ tests · 50+ providers · 19 channels · Pluggable everything\n```\n\n### Features\n\n- **Impossibly Small:** 678 KB static binary — no runtime, no VM, no framework overhead.\n- **Near-Zero Memory:** ~1 MB peak RSS. Runs comfortably on the cheapest ARM SBCs and microcontrollers.\n- **Instant Startup:** \u003C2 ms on Apple Silicon, \u003C8 ms on a 0.8 GHz edge core.\n- **True Portability:** Single self-contained binary across ARM, x86, and RISC-V. Drop it anywhere, it just runs.\n- **Feature-Complete:** 50+ providers, 19 channels, 35+ tools, 10 memory engines, multi-layer sandbox, tunnels, hardware peripherals, MCP, subagents, streaming, voice — the full stack.\n\n### Why nullclaw\n\n- **Lean by default:** Zig compiles to a tiny static binary. No allocator overhead, no garbage collector, no runtime.\n- **Secure by design:** pairing, strict sandboxing (landlock, firejail, bubblewrap, docker), explicit allowlists, workspace scoping, encrypted secrets.\n- **Fully swappable:** core systems are vtable interfaces (providers, channels, tools, memory, tunnels, peripherals, observers, runtimes).\n- **No lock-in:** OpenAI-compatible provider support + pluggable custom endpoints.\n\n## Benchmark Snapshot\n\nLocal machine benchmark (macOS arm64, Feb 2026), normalized for 0.8 GHz edge hardware.\n\n| | [OpenClaw](https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw) | [NanoBot](https:\u002F\u002Fgithub.com\u002FHKUDS\u002Fnanobot) | [PicoClaw](https:\u002F\u002Fgithub.com\u002Fsipeed\u002Fpicoclaw) | [ZeroClaw](https:\u002F\u002Fgithub.com\u002Fzeroclaw-labs\u002Fzeroclaw) | **[🦞 NullClaw](https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw)** |\n|---|---|---|---|---|---|\n| **Language** | TypeScript | Python | Go | Rust | **Zig** |\n| **RAM** | > 1 GB | > 100 MB | \u003C 10 MB | \u003C 5 MB | **~1 MB** |\n| **Startup (0.8 GHz)** | > 500 s | > 30 s | \u003C 1 s | \u003C 10 ms | **\u003C 8 ms** |\n| **Binary Size** | ~28 MB (dist) | N\u002FA (Scripts) | ~8 MB | ~8.8 MB | **678 KB** |\n| **Tests** | — | — | — | 1,017 | **5,300+** |\n| **Source Files** | ~400+ | — | — | ~120 | **~230** |\n| **Cost** | Mac Mini $599 | Linux SBC ~$50 | Linux Board $10 | Any $10 hardware | **Any $5 hardware** |\n\n> Measured with `\u002Fusr\u002Fbin\u002Ftime -l` on ReleaseSmall builds. nullclaw is a static binary with zero runtime dependencies.\n\nReproduce locally:\n\n```bash\nzig build -Doptimize=ReleaseSmall\nls -lh zig-out\u002Fbin\u002Fnullclaw\n\n\u002Fusr\u002Fbin\u002Ftime -l zig-out\u002Fbin\u002Fnullclaw --help\n\u002Fusr\u002Fbin\u002Ftime -l zig-out\u002Fbin\u002Fnullclaw status\n```\n\n## Documentation\n\nStart here if you want the shortest path to install, configure, operate, or extend nullclaw.\n\nLocalized documentation lives under `docs\u002Fen\u002F` and `docs\u002Fzh\u002F`. Use the links below to jump straight to the page you need.\n\n| Need | English | 中文 |\n|---|---|---|\n| Start here | [`docs\u002Fen\u002FREADME.md`](docs\u002Fen\u002FREADME.md) | [`docs\u002Fzh\u002FREADME.md`](docs\u002Fzh\u002FREADME.md) |\n| Install | [`docs\u002Fen\u002Finstallation.md`](docs\u002Fen\u002Finstallation.md) | [`docs\u002Fzh\u002Finstallation.md`](docs\u002Fzh\u002Finstallation.md) |\n| Configure | [`docs\u002Fen\u002Fconfiguration.md`](docs\u002Fen\u002Fconfiguration.md) | [`docs\u002Fzh\u002Fconfiguration.md`](docs\u002Fzh\u002Fconfiguration.md) |\n| Commands | [`docs\u002Fen\u002Fcommands.md`](docs\u002Fen\u002Fcommands.md) | [`docs\u002Fzh\u002Fcommands.md`](docs\u002Fzh\u002Fcommands.md) |\n| Development | [`docs\u002Fen\u002Fdevelopment.md`](docs\u002Fen\u002Fdevelopment.md) | [`docs\u002Fzh\u002Fdevelopment.md`](docs\u002Fzh\u002Fdevelopment.md) |\n| Operations | [`docs\u002Fen\u002Fusage.md`](docs\u002Fen\u002Fusage.md) | [`docs\u002Fzh\u002Fusage.md`](docs\u002Fzh\u002Fusage.md) |\n| Architecture | [`docs\u002Fen\u002Farchitecture.md`](docs\u002Fen\u002Farchitecture.md) | [`docs\u002Fzh\u002Farchitecture.md`](docs\u002Fzh\u002Farchitecture.md) |\n| Security | [`docs\u002Fen\u002Fsecurity.md`](docs\u002Fen\u002Fsecurity.md) | [`docs\u002Fzh\u002Fsecurity.md`](docs\u002Fzh\u002Fsecurity.md) |\n| Gateway API | [`docs\u002Fen\u002Fgateway-api.md`](docs\u002Fen\u002Fgateway-api.md) | [`docs\u002Fzh\u002Fgateway-api.md`](docs\u002Fzh\u002Fgateway-api.md) |\n\n- Specialized guides: [`CONTRIBUTING.md`](CONTRIBUTING.md), [`SECURITY.md`](SECURITY.md), [`SIGNAL.md`](SIGNAL.md)\n\n## Choose Your Path\n\n| Goal | Open this first | Then go to |\n|---|---|---|\n| First run in English | [`docs\u002Fen\u002FREADME.md`](docs\u002Fen\u002FREADME.md) | [`docs\u002Fen\u002Finstallation.md`](docs\u002Fen\u002Finstallation.md) → [`docs\u002Fen\u002Fconfiguration.md`](docs\u002Fen\u002Fconfiguration.md) → [`docs\u002Fen\u002Fusage.md`](docs\u002Fen\u002Fusage.md) |\n| Chinese Quick Start (中文快速上手) | [`docs\u002Fzh\u002FREADME.md`](docs\u002Fzh\u002FREADME.md) | [`docs\u002Fzh\u002Finstallation.md`](docs\u002Fzh\u002Finstallation.md) → [`docs\u002Fzh\u002Fconfiguration.md`](docs\u002Fzh\u002Fconfiguration.md) → [`docs\u002Fzh\u002Fusage.md`](docs\u002Fzh\u002Fusage.md) |\n| Find the right CLI command | [`docs\u002Fen\u002Fcommands.md`](docs\u002Fen\u002Fcommands.md) \u002F [`docs\u002Fzh\u002Fcommands.md`](docs\u002Fzh\u002Fcommands.md) | `nullclaw help` → task-specific subcommand page |\n| Contribute code or docs | [`CONTRIBUTING.md`](CONTRIBUTING.md) | [`docs\u002Fen\u002Fdevelopment.md`](docs\u002Fen\u002Fdevelopment.md) \u002F [`docs\u002Fzh\u002Fdevelopment.md`](docs\u002Fzh\u002Fdevelopment.md) → relevant architecture page |\n| Operate or secure a deployment | [`docs\u002Fen\u002Fusage.md`](docs\u002Fen\u002Fusage.md) \u002F [`docs\u002Fzh\u002Fusage.md`](docs\u002Fzh\u002Fusage.md) | [`docs\u002Fen\u002Fsecurity.md`](docs\u002Fen\u002Fsecurity.md) \u002F [`docs\u002Fzh\u002Fsecurity.md`](docs\u002Fzh\u002Fsecurity.md) → Gateway API |\n\n## After This README\n\n- New here: jump to [`docs\u002Fen\u002FREADME.md`](docs\u002Fen\u002FREADME.md) or [`docs\u002Fzh\u002FREADME.md`](docs\u002Fzh\u002FREADME.md) and follow the guided reading order.\n- Want commands fast: open [`docs\u002Fen\u002Fcommands.md`](docs\u002Fen\u002Fcommands.md) or [`docs\u002Fzh\u002Fcommands.md`](docs\u002Fzh\u002Fcommands.md).\n- Want to submit a PR: start with [`CONTRIBUTING.md`](CONTRIBUTING.md), then read [`docs\u002Fen\u002Fdevelopment.md`](docs\u002Fen\u002Fdevelopment.md) or [`docs\u002Fzh\u002Fdevelopment.md`](docs\u002Fzh\u002Fdevelopment.md).\n\n## Quick Start\n\n### 1) Recommended install (Homebrew)\n\nThe simplest path: install a ready-to-run binary with no extra runtime dependencies.\n\n```bash\nbrew install nullclaw\nnullclaw --help\n```\n\n### 2) Build from source\n\n> **Prerequisite:** use **Zig 0.15.2** (exact version).\n> `0.16.0-dev` and other Zig versions are currently unsupported and may fail to build.\n> Verify before building: `zig version` should print `0.15.2`.\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw.git\ncd nullclaw\nzig build -Doptimize=ReleaseSmall\nzig build test --summary all\n```\n\nMake `nullclaw` available on `PATH`:\n\nmacOS\u002FLinux (zsh\u002Fbash):\n\n```bash\nzig build -Doptimize=ReleaseSmall -p \"$HOME\u002F.local\"\necho 'export PATH=\"$HOME\u002F.local\u002Fbin:$PATH\"' >> ~\u002F.zshrc\n# or ~\u002F.bashrc\n```\n\nWindows (PowerShell):\n\n```powershell\nzig build -Doptimize=ReleaseSmall -p \"$HOME\\.local\"\n\n$bin = \"$HOME\\.local\\bin\"\n$user_path = [Environment]::GetEnvironmentVariable(\"Path\", \"User\")\nif (-not ($user_path -split \";\" | Where-Object { $_ -eq $bin })) {\n  [Environment]::SetEnvironmentVariable(\"Path\", \"$user_path;$bin\", \"User\")\n}\n$env:Path = \"$env:Path;$bin\"\n```\n\nThen:\n\n```bash\nnullclaw --help\n```\n\n### 3) Common commands\n\n```bash\n\n# Quick setup\nnullclaw onboard --api-key sk-... --provider openrouter\n\n# Or interactive wizard\nnullclaw onboard --interactive\n\n# Chat\nnullclaw agent -m \"Hello, nullclaw!\"\n\n# Interactive mode\nnullclaw agent\n\n# Start gateway runtime (gateway + all configured channels\u002Faccounts + heartbeat + scheduler)\nnullclaw gateway                # default: 127.0.0.1:3000\nnullclaw gateway --port 8080    # custom port\n\n# Check status\nnullclaw status\n\n# Run system diagnostics\nnullclaw doctor\n\n# Check channel health\nnullclaw channel status\n\n# Start specific channels\nnullclaw channel start telegram\nnullclaw channel start discord\nnullclaw channel start signal\n\n# Manage background service\n# Linux supports systemd user services and OpenRC\nnullclaw service install\nnullclaw service status\n\n# Migrate memory from OpenClaw\nnullclaw migrate openclaw --dry-run\nnullclaw migrate openclaw\n```\n\n## Edge MVP (Hybrid Host + WASM Logic)\n\nIf you want edge deployment (Cloudflare Worker) with Telegram + OpenAI while keeping agent policy in WASM, see:\n\n`examples\u002Fedge\u002Fcloudflare-worker\u002F`\n\nThis pattern keeps networking\u002Fsecrets in the edge host and lets you swap\u002Fupdate logic by replacing a tiny Zig WASM module.\n\n## Architecture\n\nEvery subsystem is a **vtable interface** — swap implementations with a config change, zero code changes.\n\n| Subsystem | Interface | Ships with | Extend |\n|-----------|-----------|------------|--------|\n| **AI Models** | `Provider` | 50+ providers (OpenRouter, Anthropic, OpenAI, Azure OpenAI, Gemini, Vertex AI, Ollama, Venice, Groq, Mistral, xAI, DeepSeek, Together, Fireworks, Perplexity, Cohere, Bedrock, and many OpenAI-compatible endpoints) | `custom:https:\u002F\u002Fyour-api.com` — any OpenAI-compatible API |\n| **Channels** | `Channel` | CLI, Telegram, Signal, Discord, Slack, iMessage, Matrix, WhatsApp, Webhook, IRC, Lark\u002FFeishu, OneBot, Line, DingTalk, Email, Nostr, QQ, MaixCam, Mattermost | Any messaging API |\n| **Memory** | `Memory` | SQLite with hybrid search (FTS5 + vector cosine similarity), Markdown, ClickHouse, PostgreSQL, Redis, LanceDB, Lucid, LRU, API | Any persistence backend |\n| **Tools** | `Tool` | shell, file_read, file_write, file_edit, file_edit_hashed, file_read_hashed, file_append, memory_store, memory_recall, memory_forget, memory_list, browser_open, screenshot, composio, http_request, web_fetch, web_search, delegate, schedule, hardware_info, hardware_memory, pushover, message, spawn, git, image, i2c, spi, and more | Any capability |\n| **Observability** | `Observer` | Noop, Log, File, Multi | Prometheus, OTel |\n| **Runtime** | `RuntimeAdapter` | Native, Docker (sandboxed), WASM (wasmtime) | Any runtime |\n| **Security** | `Sandbox` | Landlock, Firejail, Bubblewrap, Docker, auto-detect | Any sandbox backend |\n| **Identity** | `IdentityConfig` | OpenClaw (markdown), AIEOS v1.1 (JSON) | Any identity format |\n| **Tunnel** | `Tunnel` | None, Cloudflare, Tailscale, ngrok, Custom | Any tunnel binary |\n| **Heartbeat** | Engine | HEARTBEAT.md periodic tasks | — |\n| **Skills** | Loader | TOML\u002FJSON manifests or YAML frontmatter in `SKILL.md` | Community skill packs |\n| **Peripherals** | `Peripheral` | Serial, Arduino, Raspberry Pi GPIO, STM32\u002FNucleo | Any hardware interface |\n| **Cron** | Scheduler | Cron expressions + one-shot timers with JSON persistence | — |\n\n### Memory System\n\nAll custom, zero external dependencies for the core path:\n\n| Layer | Implementation |\n|-------|---------------|\n| **Vector DB** | Embeddings stored as BLOB in SQLite, cosine similarity search |\n| **Keyword Search** | FTS5 virtual tables with BM25 scoring |\n| **Hybrid Merge** | Weighted merge (configurable vector\u002Fkeyword weights) |\n| **Embeddings** | `EmbeddingProvider` vtable — OpenAI, custom URL, or noop |\n| **Hygiene** | Automatic archival + purge of stale memories |\n| **Snapshots** | Export\u002Fimport full memory state for migration |\n| **Engines** | SQLite (default), Markdown, ClickHouse, PostgreSQL, Redis, LanceDB, Lucid, LRU, API, None |\n\n```json\n{\n  \"memory\": {\n    \"backend\": \"sqlite\",\n    \"auto_save\": true,\n    \"embedding_provider\": \"openai\",\n    \"vector_weight\": 0.7,\n    \"keyword_weight\": 0.3,\n    \"hygiene_enabled\": true,\n    \"snapshot_enabled\": false\n  }\n}\n```\n\n## Security\n\nnullclaw enforces security at **every layer**.\n\n| # | Item | Status | How |\n|---|------|--------|-----|\n| 1 | **Gateway not publicly exposed** | Done | Binds `127.0.0.1` by default. Refuses `0.0.0.0` without tunnel or explicit `allow_public_bind`. |\n| 2 | **Pairing required** | Done | 6-digit one-time code on startup. Exchange via `POST \u002Fpair` for bearer token. |\n| 3 | **Filesystem scoped** | Done | `workspace_only = true` by default. Null byte injection blocked. Symlink escape detection. |\n| 4 | **Access via tunnel only** | Done | Gateway refuses public bind without active tunnel. Supports Tailscale, Cloudflare, ngrok, or custom. |\n| 5 | **Sandbox isolation** | Done | Auto-detects best backend: Landlock, Firejail, Bubblewrap, or Docker. |\n| 6 | **Encrypted secrets** | Done | API keys encrypted with ChaCha20-Poly1305 using local key file. |\n| 7 | **Resource limits** | Done | Configurable memory, CPU, disk, and subprocess limits. |\n| 8 | **Audit logging** | Done | Signed event trail with configurable retention. |\n\n### Channel Allowlists\n\n- Empty allowlist = **deny all inbound messages**\n- `\"*\"` = **allow all** (explicit opt-in)\n- Otherwise = exact-match allowlist\n\nNostr additionally: the `owner_pubkey` is **always** allowed regardless of `dm_allowed_pubkeys`. Private keys are encrypted at rest via SecretStore (`enc2:` prefix) and only decrypted into memory while the channel is running; zeroed on channel stop.\n\n### Nostr Channel Setup\n\n`nullclaw` speaks Nostr natively via NIP-17 (gift-wrapped private DMs) and NIP-04 (legacy DMs), using [`nak`](https:\u002F\u002Fgithub.com\u002Ffiatjaf\u002Fnak).\n\n**Prerequisites:** Install `nak` and ensure it's in your `$PATH`.\n\n**Setup via onboarding wizard:**\n\n```bash\nnullclaw onboard --interactive   # Step 7 configures Nostr\n```\n\nThe wizard will:\n1. Generate a new keypair for your bot or import a key & encrypt it with ChaCha20-Poly1305\n2. Ask for your (owner) pubkey (npub or hex) — always allowed through DM policy\n3. Configure relays and DM relays (kind:10050 inbox)\n4. Display the bot's pubkey\n\nOr configure manually in the [config](#configuration).\n\n**How it works:** On startup, nullclaw announces its DM inbox relays (kind:10050), then listens for incoming NIP-17 gift wraps and NIP-04 encrypted DMs. Outbound messages mirror the sender's protocol. Multi-relay rumor deduplication prevents duplicate responses when the same message is delivered via multiple relays.\n\n## Configuration\n\nConfig: `~\u002F.nullclaw\u002Fconfig.json` (created by `onboard`)\n\n> **OpenClaw compatible:** nullclaw uses the same config structure as [OpenClaw](https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw) (snake_case). Providers live under `models.providers`, the default model under `agents.defaults.model.primary`, and channels use `accounts` wrappers.\n> Top-level `default_provider` \u002F `default_model` keys are not supported.\n>\n> **Vertex AI note:** `models.providers.vertex.api_key` supports either:\n> 1. a bearer token (`ya29...`), or\n> 2. a full Google service-account JSON object (same shape as Apps Script `GEMINI_KEY` with `project_id`, `client_email`, `private_key`).\n>\n> `models.providers.vertex.base_url` can be set explicitly (`...\u002Fprojects\u002F\u003Cid>\u002Flocations\u002F\u003Cloc>\u002Fpublishers\u002Fgoogle\u002Fmodels`), or omitted when service-account JSON is used (nullclaw will derive it from `project_id`, with `VERTEX_LOCATION` defaulting to `global`).\n> Service-account mode requires `openssl` available in `$PATH` for RS256 JWT signing.\n\n```json\n{\n  \"default_temperature\": 0.7,\n\n  \"models\": {\n    \"providers\": {\n      \"openrouter\": { \"api_key\": \"sk-or-...\" },\n      \"groq\": { \"api_key\": \"gsk_...\" },\n      \"vertex\": {\n        \"api_key\": {\n          \"type\": \"service_account\",\n          \"project_id\": \"your-project\",\n          \"client_email\": \"svc@your-project.iam.gserviceaccount.com\",\n          \"private_key\": \"-----BEGIN PRIVATE KEY-----\\n...\\n-----END PRIVATE KEY-----\\n\"\n        },\n        \"base_url\": \"https:\u002F\u002Faiplatform.googleapis.com\u002Fv1\u002Fprojects\u002Fyour-project\u002Flocations\u002Fglobal\u002Fpublishers\u002Fgoogle\u002Fmodels\"\n      },\n      \"anthropic\": { \"api_key\": \"sk-ant-...\", \"base_url\": \"https:\u002F\u002Fapi.anthropic.com\" }\n    }\n  },\n\n  \"agents\": {\n    \"defaults\": {\n      \"model\": { \"primary\": \"openrouter\u002Fanthropic\u002Fclaude-sonnet-4\" },\n      \"heartbeat\": { \"every\": \"30m\" }\n    },\n    \"list\": [\n      { \"id\": \"researcher\", \"model\": { \"primary\": \"openrouter\u002Fanthropic\u002Fclaude-opus-4\" }, \"system_prompt\": \"...\" }\n    ]\n  },\n\n  \"channels\": {\n    \"telegram\": {\n      \"accounts\": {\n        \"main\": {\n          \"bot_token\": \"123:ABC\",\n          \"allow_from\": [\"user1\"],\n          \"reply_in_private\": true,\n          \"proxy\": \"socks5:\u002F\u002F...\"\n        }\n      }\n    },\n    \"discord\": {\n      \"accounts\": {\n        \"main\": {\n          \"token\": \"disc-token\",\n          \"guild_id\": \"12345\",\n          \"allow_from\": [\"user1\"],\n          \"allow_bots\": false\n        }\n      }\n    },\n    \"irc\": {\n      \"accounts\": {\n        \"main\": {\n          \"host\": \"irc.libera.chat\",\n          \"port\": 6697,\n          \"nick\": \"nullclaw\",\n          \"channel\": \"#nullclaw\",\n          \"tls\": true,\n          \"allow_from\": [\"user1\"]\n        },\n        \"meshrelay\": {\n          \"host\": \"irc.meshrelay.xyz\",\n          \"port\": 6697,\n          \"nick\": \"nullclaw\",\n          \"channels\": [\"#agents\"],\n          \"tls\": true,\n          \"nickserv_password\": \"YOUR_NICKSERV_PASSWORD\",\n          \"allow_from\": [\"*\"]\n        }\n      }\n    },\n    \"slack\": {\n      \"accounts\": {\n        \"main\": {\n          \"bot_token\": \"xoxb-...\",\n          \"app_token\": \"xapp-...\",\n          \"allow_from\": [\"user1\"]\n        }\n      }\n    },\n    \"nostr\": {\n      \"private_key\": \"enc2:...\",\n      \"owner_pubkey\": \"hex-pubkey-of-owner\",\n      \"relays\": [\"wss:\u002F\u002Frelay.damus.io\", \"wss:\u002F\u002Fnos.lol\", \"wss:\u002F\u002Frelay.nostr.band\"],\n      \"dm_allowed_pubkeys\": [\"*\"],\n      \"display_name\": \"NullClaw\",\n      \"about\": \"AI assistant on Nostr\",\n      \"nip05\": \"nullclaw@yourdomain.com\",\n      \"lnurl\": \"lnurl1...\"\n    }\n  },\n\n  \"tools\": {\n    \"media\": {\n      \"audio\": {\n        \"enabled\": true,\n        \"language\": \"ru\",\n        \"models\": [{ \"provider\": \"groq\", \"model\": \"whisper-large-v3\" }]\n      }\n    }\n  },\n\n  \"mcp_servers\": {\n    \"filesystem\": {\n      \"transport\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-filesystem\"]\n    },\n    \"remote\": {\n      \"transport\": \"http\",\n      \"url\": \"https:\u002F\u002Fmcp.example.com\u002Frpc\",\n      \"timeout_ms\": 10000,\n      \"headers\": {\n        \"Authorization\": \"Bearer ${MCP_TOKEN}\"\n      }\n    }\n  },\n\n  \"memory\": {\n    \"backend\": \"sqlite\",\n    \"auto_save\": true,\n    \"embedding_provider\": \"openai\",\n    \"vector_weight\": 0.7,\n    \"keyword_weight\": 0.3\n  },\n\n  \"gateway\": {\n    \"port\": 3000,\n    \"require_pairing\": true,\n    \"allow_public_bind\": false\n  },\n\n  \"autonomy\": {\n    \"level\": \"supervised\",\n    \"workspace_only\": true,\n    \"max_actions_per_hour\": 20\n  },\n\n  \"runtime\": {\n    \"kind\": \"native\",\n    \"docker\": {\n      \"image\": \"alpine:3.20\",\n      \"network\": \"none\",\n      \"memory_limit_mb\": 512,\n      \"read_only_rootfs\": true\n    }\n  },\n\n\n  \"tunnel\": { \"provider\": \"none\" },\n  \"secrets\": { \"encrypt\": true },\n  \"identity\": { \"format\": \"openclaw\" },\n\n  \"security\": {\n    \"sandbox\": { \"backend\": \"auto\" },\n    \"resources\": { \"max_memory_mb\": 512, \"max_cpu_percent\": 80 },\n    \"audit\": { \"enabled\": true, \"retention_days\": 90 }\n  }\n}\n```\n\nTelegram forum topics:\n\n- Topic session isolation is automatic. You do not add a `topic_id` field under `channels.telegram`.\n- The easiest operator flow is:\n  1. define named agent profiles under `agents.list`\n  2. open the target Telegram chat or forum topic\n  3. run `\u002Fbind \u003Cagent>`\n- To bind a specific Telegram forum topic to a specific agent, use `bindings[].match.peer.id` with the canonical thread form `\"\u003Cchat_id>:thread:\u003Ctopic_id>\"`.\n- To bind the whole Telegram group as a fallback for all other topics, keep a normal group binding with `\"\u003Cchat_id>\"`.\n- `\u002Fbind status` shows the current effective route and the available agent ids.\n- `\u002Fbind clear` removes only the exact binding for the current account\u002Fchat\u002Ftopic and falls back to the broader route.\n- `\u002Fbind` persists an exact `bindings[]` entry for the current Telegram account and peer.\n- `\u002Fbind status` distinguishes an exact local override from an inherited broader fallback.\n- Topic-specific bindings win over group fallback by route priority; the order in `bindings[]` does not matter.\n- Telegram menu visibility for `\u002Fbind` is controlled by `channels.telegram.accounts.\u003Cid>.binding_commands_enabled`.\n\nExample:\n\n```json\n{\n  \"bindings\": [\n    {\n      \"agent_id\": \"coder\",\n      \"match\": {\n        \"channel\": \"telegram\",\n        \"account_id\": \"main\",\n        \"peer\": { \"kind\": \"group\", \"id\": \"-1001234567890:thread:42\" }\n      }\n    },\n    {\n      \"agent_id\": \"orchestrator\",\n      \"match\": {\n        \"channel\": \"telegram\",\n        \"account_id\": \"main\",\n        \"peer\": { \"kind\": \"group\", \"id\": \"-1001234567890\" }\n      }\n    }\n  ]\n}\n```\n\nIn that setup, topic `42` routes to `coder`, while the rest of the forum falls back to `orchestrator`.\n\nNamed agent profiles are configured separately from bindings. Bindings only choose which named agent handles a given chat\u002Ftopic.\n\nIf a named agent should run from its own workspace, set `agents.list[].workspace_path`.\nRelative paths are resolved from the directory that contains `config.json`, the workspace is scaffolded on first use, and the agent gets a durable memory namespace `agent:\u003Cagent-id>`.\nSetting `workspace_path` does not disable `system_prompt`: when both are configured, the named profile prompt is still applied and the workspace bootstrap files are loaded from that dedicated workspace.\nThis applies to `nullclaw agent --agent \u003Cid>`, `\u002Fsubagents spawn --agent \u003Cid>`, and routed sessions resolved through `bindings`.\n\nMinimal end-to-end example:\n\n```json\n{\n  \"agents\": {\n    \"list\": [\n      {\n        \"id\": \"orchestrator\",\n        \"provider\": \"openrouter\",\n        \"model\": \"anthropic\u002Fclaude-sonnet-4\"\n      },\n      {\n        \"id\": \"coder\",\n        \"provider\": \"ollama\",\n        \"model\": \"qwen2.5-coder:14b\",\n        \"system_prompt\": \"You are the coding agent for this topic.\"\n      }\n    ]\n  },\n  \"channels\": {\n    \"telegram\": {\n      \"accounts\": {\n        \"main\": {\n          \"bot_token\": \"123456:ABCDEF\",\n          \"allow_from\": [\"YOUR_TELEGRAM_USER_ID\"],\n          \"binding_commands_enabled\": true,\n          \"topic_commands_enabled\": true,\n          \"topic_map_command_enabled\": true,\n          \"commands_menu_mode\": \"scoped\"\n        }\n      }\n    }\n  },\n  \"bindings\": [\n    {\n      \"agent_id\": \"orchestrator\",\n      \"match\": {\n        \"channel\": \"telegram\",\n        \"account_id\": \"main\",\n        \"peer\": { \"kind\": \"group\", \"id\": \"-1001234567890\" }\n      }\n    }\n  ]\n}\n```\n\nOperator flow:\n\n- Send `\u002Fbind coder` inside the target forum topic.\n- `nullclaw` writes a new exact `bindings[]` entry to `~\u002F.nullclaw\u002Fconfig.json` for that topic and Telegram account.\n- The next message in that topic uses the new routed agent profile.\n- `nullclaw` must have write access to `~\u002F.nullclaw\u002Fconfig.json` for `\u002Fbind` to persist changes.\n\nAbout `account_id`:\n\n- `account_id` identifies the configured Telegram account entry, not a topic and not an agent.\n- In the usual `channels.telegram.accounts` form, the object key becomes the account id. For example, `accounts.main` means `account_id = \"main\"`, and `accounts.backup` means `account_id = \"backup\"`.\n- In `bindings`, `match.account_id` limits that binding to one specific Telegram account.\n- If `match.account_id` is omitted, the binding can match any Telegram account for that channel.\n- Use different account ids only when you run multiple Telegram bot accounts\u002Ftokens in the same nullclaw instance.\n\nEffect on delivery:\n\n- Incoming Telegram updates are processed by the account that received them.\n- Routing uses that same `account_id`, so `match.account_id = \"main\"` matches only messages received by `channels.telegram.accounts.main`.\n- Replies go back out through the same Telegram account\u002Fruntime that handled the message.\n- Setting one binding to `account_id = \"main\"` and another to `account_id = \"sub\"` does not split one chat across two agents automatically; it scopes each binding to a different configured Telegram account.\n\n### Full Web Search + Shell Access\n\nUse this when you want full web-search provider control plus unrestricted shell command allowlist behavior:\n\n```json\n{\n  \"http_request\": {\n    \"enabled\": true,\n    \"search_base_url\": \"https:\u002F\u002Fsearx.example.com\",\n    \"search_provider\": \"auto\",\n    \"search_fallback_providers\": [\"jina\", \"duckduckgo\"]\n  },\n  \"autonomy\": {\n    \"level\": \"full\",\n    \"allowed_commands\": [\"*\"],\n    \"allowed_paths\": [\"*\"],\n    \"require_approval_for_medium_risk\": false,\n    \"block_high_risk_commands\": false\n  }\n}\n```\n\n- `http_request.search_base_url` accepts either instance root (`https:\u002F\u002Fhost`) or explicit endpoint (`https:\u002F\u002Fhost\u002Fsearch`); local\u002Fprivate SearXNG instances may also use plain HTTP such as `http:\u002F\u002Flocalhost:8888` or `http:\u002F\u002F192.168.1.10:8888\u002Fsearch`.\n- Invalid `http_request.search_base_url` now fails config validation at startup (no automatic fallback for malformed URL).\n- `http_request.search_provider` supports: `auto`, `searxng`, `duckduckgo` (`ddg`), `brave`, `firecrawl`, `tavily`, `perplexity`, `exa`, `jina`.\n- `http_request.search_fallback_providers` is optional and is tried in order when the primary provider fails.\n- Provider env vars: `BRAVE_API_KEY`, `FIRECRAWL_API_KEY`, `TAVILY_API_KEY`, `PERPLEXITY_API_KEY`, `EXA_API_KEY`, `JINA_API_KEY` (or shared `WEB_SEARCH_API_KEY` where supported). DuckDuckGo and SearXNG do not require API keys.\n- `allowed_commands` entries support `\"cmd\"`, `\"cmd *\"`, and `\"*\"` formats.\n  - `\"cmd\"` and `\"cmd *\"` both allow that command family at the allowlist stage.\n  - `\"*\"` allows any command at the allowlist stage.\n- `allowed_paths: [\"*\"]` allows access outside workspace, except system-protected paths.\n\n### Web UI \u002F Browser Relay\n\nUse `channels.web` for browser UI events (WebChannel v1):\n\n```json\n{\n  \"channels\": {\n    \"web\": {\n      \"accounts\": {\n        \"default\": {\n          \"transport\": \"local\",\n          \"listen\": \"127.0.0.1\",\n          \"port\": 32123,\n          \"path\": \"\u002Fws\",\n          \"auth_token\": \"replace-with-long-random-token\",\n          \"message_auth_mode\": \"pairing\",\n          \"allowed_origins\": [\"http:\u002F\u002Flocalhost:5173\", \"chrome-extension:\u002F\u002Fyour-extension-id\"]\n        }\n      }\n    }\n  }\n}\n```\n\n- Local: keep `\"listen\": \"127.0.0.1\"`.\n- `message_auth_mode` controls inbound `user_message` auth:\n  - `\"pairing\"` (default): send `pairing_request`, receive `pairing_result`, include UI `access_token` in every `user_message`.\n  - `\"token\"` (local transport only): include `auth_token` in each `user_message` payload (`access_token` is also accepted for compatibility).\n- `auth_token` hardens the WebSocket upgrade and becomes required when binding non-loopback addresses.\n- Unauthenticated WebSocket upgrade is loopback-only. Pairing-first local UX works on `127.0.0.1`, but a public\u002FLAN bind must authenticate the `\u002Fws` upgrade on the first hop with `?token=\u003Cauth_token>` or `Authorization: Bearer \u003Cauth_token>`.\n- `\u002Fws` is the WebSocket endpoint. `\u002Fpair` belongs to the HTTP gateway API and is not part of the web channel handshake.\n- Remote\u002Fheadless host: if you bind `\"listen\": \"0.0.0.0\"`, prefer a stable configured token plus `message_auth_mode: \"token\"` behind TLS\u002Freverse proxy, or keep loopback bind and expose it through SSH tunnel\u002Fproxy.\n- UI\u002Fextension should live in a separate repository and connect via this WebSocket endpoint.\n- For orchestration, use local token mode with a stable token from config or env (`NULLCLAW_WEB_TOKEN`, `NULLCLAW_GATEWAY_TOKEN`, `OPENCLAW_GATEWAY_TOKEN`).\n- Relay transport (outbound agent socket) is configured via:\n\n```json\n{\n  \"channels\": {\n    \"web\": {\n      \"accounts\": {\n        \"default\": {\n          \"transport\": \"relay\",\n          \"relay_url\": \"wss:\u002F\u002Frelay.nullclaw.io\u002Fws\u002Fagent\",\n          \"relay_agent_id\": \"default\",\n          \"relay_token\": \"replace-with-relay-token\",\n          \"relay_token_ttl_secs\": 2592000,\n          \"relay_pairing_code_ttl_secs\": 300,\n          \"relay_ui_token_ttl_secs\": 86400,\n          \"relay_e2e_required\": false\n        }\n      }\n    }\n  }\n}\n```\n\n- Relay token lifecycle (dedicated): `relay_token` (config) -> `NULLCLAW_RELAY_TOKEN` (env) -> persisted `web-relay-\u003Caccount_id>` credential -> generated token.\n- Relay UI handshake: send `pairing_request` with one-time `pairing_code`, receive `pairing_result` with UI `access_token` JWT (and optional `set_cookie` string for relay HTTP layer).\n- Relay `user_message` must include valid UI JWT in `access_token` (top-level or `payload.access_token`).\n- If E2E is enabled (`relay_e2e_required=true`), UI and agent exchange X25519 keys during pairing and send encrypted payloads in `payload.e2e`.\n- WebChannel event envelope is defined in [`spec\u002Fwebchannel_v1.json`](spec\u002Fwebchannel_v1.json).\n\n## Gateway API\n\n| Endpoint | Method | Auth | Description |\n|----------|--------|------|-------------|\n| `\u002Fhealth` | GET | None | Health check (always public) |\n| `\u002Fpair` | POST | `X-Pairing-Code` header | Exchange one-time code for bearer token |\n| `\u002Fwebhook` | POST | `Authorization: Bearer \u003Ctoken>` | Send message: `{\"message\": \"your prompt\"}` |\n| `\u002F.well-known\u002Fagent-card.json` | GET | None | A2A Agent Card discovery (public) |\n| `\u002Fa2a` | POST | `Authorization: Bearer \u003Ctoken>` | A2A JSON-RPC endpoint (canonical methods plus legacy slash aliases) |\n| `\u002Fwhatsapp` | GET | Query params | Meta webhook verification |\n| `\u002Fwhatsapp` | POST | None (Meta signature) | WhatsApp incoming message webhook |\n\n### A2A (Agent-to-Agent Protocol v0.3.0)\n\nNullClaw implements Google's [A2A protocol](https:\u002F\u002Fgithub.com\u002Fgoogle\u002FA2A) v0.3.0, allowing any A2A-compatible agent or client to discover, authenticate, and interact with your instance over JSON-RPC 2.0.\n\nEnable in `~\u002F.nullclaw\u002Fconfig.json`:\n\n```json\n{\n  \"a2a\": {\n    \"enabled\": true,\n    \"name\": \"nullclaw\",\n    \"description\": \"General-purpose AI assistant\",\n    \"url\": \"https:\u002F\u002Fexample.com\",\n    \"version\": \"1.0.0\"\n  }\n}\n```\n\n**Endpoints:**\n\n| Endpoint | Auth | Description |\n|----------|------|-------------|\n| `GET \u002F.well-known\u002Fagent-card.json` | None | Agent Card discovery (public) |\n| `POST \u002Fa2a` | Bearer token | JSON-RPC 2.0 dispatch |\n\n**Supported methods:** `message\u002Fsend`, `message\u002Fstream`, `tasks\u002Fget`, `tasks\u002Fcancel`, `tasks\u002Flist`, `tasks\u002Fresubscribe`.\n\n**Quick test:**\n\n```bash\n# 1. Get a bearer token\nTOKEN=$(curl -s -X POST -H \"X-Pairing-Code: 123456\" http:\u002F\u002Flocalhost:3000\u002Fpair | jq -r .token)\n\n# 2. Discover the agent\ncurl http:\u002F\u002Flocalhost:3000\u002F.well-known\u002Fagent-card.json\n\n# 3. Send a message\ncurl -X POST -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message\u002Fsend\",\"params\":{\"message\":{\"messageId\":\"msg-1\",\"role\":\"user\",\"parts\":[{\"kind\":\"text\",\"text\":\"Hello\"}]}}}' \\\n  http:\u002F\u002Flocalhost:3000\u002Fa2a\n```\n\nSee [Gateway API docs](docs\u002Fen\u002Fgateway-api.md) for full A2A reference including streaming, task lifecycle, and configuration details.\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `onboard --api-key sk-... --provider openrouter` | Quick setup with API key and provider |\n| `onboard --interactive` | Full interactive wizard |\n| `onboard --channels-only` | Reconfigure channels\u002Fallowlists only |\n| `agent -m \"...\"` | Single message mode |\n| `agent` | Interactive chat mode |\n| `gateway` | Start long-running runtime (default: `127.0.0.1:3000`) |\n| `service install\\|start\\|stop\\|restart\\|status\\|uninstall` | Manage background service |\n| `doctor` | Diagnose system health |\n| `status` | Show full system status |\n| `channel list\\|start\\|status\\|add\\|remove` | Manage channels |\n| `cron list\\|add\\|add-agent\\|once\\|once-agent\\|remove\\|pause\\|resume\\|run\\|update\\|runs` | Manage scheduled tasks |\n| `skills list\\|install\\|remove\\|info` | Manage skill packs |\n| `history list\\|show` | View session conversation history |\n| `memory stats\\|count\\|reindex\\|search\\|get\\|list\\|drain-outbox\\|forget` | Inspect and maintain memory |\n| `hardware scan\\|flash\\|monitor` | Hardware device management |\n| `models list\\|info\\|benchmark\\|refresh` | Model catalog |\n| `workspace edit\\|reset-md` | Maintain workspace markdown\u002Fbootstrap files |\n| `capabilities [--json]` | Show runtime capabilities manifest |\n| `auth login\\|status\\|logout` | Manage OAuth authentication |\n| `migrate openclaw [--dry-run] [--source PATH]` | Import memory + migrate config from OpenClaw |\n| `update [--check] [--yes]` | Check for and install updates |\n\n## Development\n\nBuild and tests are pinned to **Zig 0.15.2**.\n\n```bash\nzig build                          # Dev build\nzig build -Doptimize=ReleaseSmall  # Release build (678 KB)\nzig build test --summary all       # 5,300+ tests\n```\n\n### Channel Flow Coverage\n\nChannel CJM coverage (ingress parsing\u002Ffiltering, session key routing, account propagation, bus handoff) is validated by tests in:\n\n- `src\u002Fchannel_manager.zig` (runtime channel registration\u002Fstart semantics + listener mode wiring)\n- `src\u002Fconfig.zig` (OpenClaw-compatible `channels.*.accounts` parsing, multi-account selection\u002Fordering, aliases)\n- `src\u002Fgateway.zig` (Telegram\u002FWhatsApp\u002FLINE\u002FLark routed session keys from webhook payloads)\n- `src\u002Fdaemon.zig` (gateway-loop inbound route resolution for Discord\u002FQQ\u002FOneBot\u002FMattermost\u002FMaixCam)\n- `src\u002Fchannels\u002Fdiscord.zig`, `src\u002Fchannels\u002Fmattermost.zig`, `src\u002Fchannels\u002Fqq.zig`, `src\u002Fchannels\u002Fonebot.zig`, `src\u002Fchannels\u002Fsignal.zig`, `src\u002Fchannels\u002Fline.zig`, `src\u002Fchannels\u002Fwhatsapp.zig` (per-channel inbound\u002Foutbound contracts)\n\n### Project Stats\n\n```\nLanguage:     Zig 0.15.2\nSource files: ~250\nLines of code: ~249,000\nTests:        5,300+\nBinary:       678 KB (ReleaseSmall)\nPeak RSS:     ~1 MB\nStartup:      \u003C2 ms (Apple Silicon)\nDependencies: 0 (besides libc + optional SQLite)\n```\n\n### Source Layout\n\n```\nsrc\u002F\n  main.zig              CLI entry point + argument parsing\n  root.zig              Module hierarchy (public API)\n  config.zig            JSON config loader + 30 sub-config structs\n  agent.zig             Agent loop, auto-compaction, tool dispatch\n  daemon.zig            Daemon supervisor with exponential backoff\n  gateway.zig           HTTP gateway (rate limiting, idempotency, pairing)\n  channels\u002F             19 channel implementations (telegram, signal, discord, slack, nostr, matrix, whatsapp, line, lark, onebot, mattermost, qq, ...)\n  providers\u002F            50+ AI provider integrations\n  memory\u002F               SQLite backend, embeddings, vector search, hygiene, snapshots\n  tools\u002F                35+ tool implementations\n  security\u002F             Secrets (ChaCha20), sandbox backends (landlock, firejail, ...)\n  cron.zig              Cron scheduler with JSON persistence\n  health.zig            Component health registry\n  tunnel.zig            Tunnel vtable (cloudflare, ngrok, tailscale, custom)\n  peripherals.zig       Hardware peripheral vtable (serial, Arduino, RPi, Nucleo)\n  runtime.zig           Runtime vtable (native, docker, WASM)\n  skillforge.zig        Skill discovery (GitHub), evaluation, integration\n  ...\n```\n\n## Versioning\n\nnullclaw uses **CalVer** (`YYYY.M.D`) for releases — e.g. `v2026.2.20`.\n\n- **Tag format:** `vYYYY.M.D` (one release per day max; patch suffix `vYYYY.M.D.N` if needed)\n- **Release binaries derive their embedded version from the git tag** (`v...` -> `nullclaw --version`)\n- **Non-release builds default to `dev`** unless you override with `zig build -Dversion=...`\n- **No stability guarantees yet** — the project is pre-1.0, config and CLI may change between releases\n- **`nullclaw --version`** prints the current version\n\n## Contributing\n\nSee [`CONTRIBUTING.md`](CONTRIBUTING.md) for development environment setup, workflow, validation commands, and the PR checklist.\n\nImplement a vtable interface, submit a PR:\n\n- New `Provider` -> `src\u002Fproviders\u002F`\n- New `Channel` -> `src\u002Fchannels\u002F`\n- New `Tool` -> `src\u002Ftools\u002F`\n- New `Memory` backend -> `src\u002Fmemory\u002F`\n- New `Tunnel` -> `src\u002Ftunnel.zig`\n- New `Sandbox` backend -> `src\u002Fsecurity\u002F`\n- New `Peripheral` -> `src\u002Fperipherals.zig`\n- New `Skill` -> `~\u002F.nullclaw\u002Fworkspace\u002Fskills\u002F\u003Cname>\u002F`\n\n## Chinese Docs (中文文档)\n\n- [Chinese docs overview (中文文档总览)](docs\u002Fzh\u002FREADME.md)\n- [Installation guide (安装指南)](docs\u002Fzh\u002Finstallation.md)\n- [Configuration guide (配置指南)](docs\u002Fzh\u002Fconfiguration.md)\n- [Usage and operations (使用与运维)](docs\u002Fzh\u002Fusage.md)\n- [Architecture overview (架构总览)](docs\u002Fzh\u002Farchitecture.md)\n- [Security model (安全机制)](docs\u002Fzh\u002Fsecurity.md)\n- [Gateway API (中文)](docs\u002Fzh\u002Fgateway-api.md)\n- [Commands reference (命令参考)](docs\u002Fzh\u002Fcommands.md)\n- [Development guide (开发指南)](docs\u002Fzh\u002Fdevelopment.md)\n\n## English Docs\n\n- [English docs overview](docs\u002Fen\u002FREADME.md)\n- [Installation](docs\u002Fen\u002Finstallation.md)\n- [Configuration](docs\u002Fen\u002Fconfiguration.md)\n- [Usage and operations](docs\u002Fen\u002Fusage.md)\n- [Architecture](docs\u002Fen\u002Farchitecture.md)\n- [Security](docs\u002Fen\u002Fsecurity.md)\n- [Gateway API](docs\u002Fen\u002Fgateway-api.md)\n- [Commands](docs\u002Fen\u002Fcommands.md)\n- [Development](docs\u002Fen\u002Fdevelopment.md)\n\n## Disclaimer\n\nnullclaw is a pure open-source software project. It has **no token, no cryptocurrency, no blockchain component, and no financial instrument** of any kind. This project is not affiliated with any token or financial product.\n\n## License\n\nMIT — see [LICENSE](LICENSE)\n\n---\n\n**nullclaw** — Null overhead. Null compromise. Deploy anywhere. Swap anything.\n\n## Star History\n\n[![Star History Chart](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnullclaw_nullclaw_readme_8b281f1fcc9e.png)](https:\u002F\u002Fwww.star-history.com\u002F#nullclaw\u002Fnullclaw&type=date&legend=top-left)\n","想要一种更简单的方式来安装和配置 nullclaw 并带有 UI？试试 [nullhub](https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullhub)！（目前处于 beta 阶段）\n\n[nullhub](https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullhub) 为 Null 生态系统提供了 UI 层：简化 nullclaw 的设置与配置、来自 [nullboiler](https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullboiler) 的编排（orchestration）、来自 [nullwatch](https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullwatch) 的可观测性（observability），以及来自 [nulltickets](https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnulltickets) 的任务追踪。\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnullclaw_nullclaw_readme_973e00ed6564.png\" alt=\"nullclaw\" width=\"200\" \u002F>\n\u003C\u002Fp>\n\n\u003Ch1 align=\"center\">NullClaw\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\n  \u003Cstrong>零开销。零妥协。100% Zig。100% 无依赖。\u003C\u002Fstrong>\u003Cbr>\n  \u003Cstrong>678 KB 二进制文件。约 1 MB 内存占用。启动时间 \u003C2 毫秒。可在任何带 CPU 的设备上运行。\u003C\u002Fstrong>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Factions\u002Fworkflows\u002Fci.yml\">\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg\" alt=\"CI\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fnullclaw.github.io\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdocs-nullclaw.github.io-informational\" alt=\"Documentation\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"https:\u002F\u002Fdiscord.gg\u002FBfmdua22Ud\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fdiscord-join%20community-5865F2?logo=discord&logoColor=white\" alt=\"Discord\" \u002F>\u003C\u002Fa>\n  \u003Ca href=\"LICENSE\">\u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-blue.svg\" alt=\"License: MIT\" \u002F>\u003C\u002Fa>\n\u003C\u002Fp>\n\n最小的完全自主 AI 助手基础设施 —— 一个静态 Zig 二进制文件，可放入任意 $5 开发板，毫秒级启动，仅需 libc 即可运行。\n\n文档：[English](docs\u002Fen\u002FREADME.md) · [中文](docs\u002Fzh\u002FREADME.md) · [Contributing](CONTRIBUTING.md) · [Discord](https:\u002F\u002Fdiscord.gg\u002FBfmdua22Ud)\n\n```\n678 KB 二进制文件 · \u003C2 ms 启动时间 · 5,300+ 测试用例 · 50+ 提供商（providers）· 19 种通道（channels）· 所有组件均可插拔\n```\n\n### 特性\n\n- **极致小巧**：678 KB 静态二进制文件 —— 无运行时、无虚拟机、无框架开销。\n- **近零内存占用**：峰值 RSS 约 1 MB。可在最便宜的 ARM 单板计算机（SBC）和微控制器上舒适运行。\n- **瞬时启动**：Apple Silicon 上 \u003C2 ms，0.8 GHz 边缘核心上 \u003C8 ms。\n- **真正可移植**：单个自包含二进制文件，支持 ARM、x86 和 RISC-V。随处放置，即刻运行。\n- **功能完整**：50+ 提供商、19 种通道、35+ 工具、10 种记忆引擎、多层沙箱、隧道、硬件外设、MCP、子代理（subagents）、流式处理、语音 —— 全栈功能一应俱全。\n\n### 为什么选择 nullclaw\n\n- **默认精简**：Zig 编译为极小的静态二进制文件。无分配器开销、无垃圾回收器、无运行时。\n- **设计安全**：配对机制、严格沙箱（landlock、firejail、bubblewrap、docker）、显式白名单、工作区作用域、加密密钥。\n- **完全可替换**：核心系统采用虚表接口（vtable interfaces）（提供商、通道、工具、记忆、隧道、外设、观察器、运行时）。\n- **无厂商锁定**：兼容 OpenAI 的提供商支持 + 可插拔的自定义端点。\n\n## 基准快照\n\n本地机器基准测试（macOS arm64，2026 年 2 月），已针对 0.8 GHz 边缘硬件进行归一化。\n\n| | [OpenClaw](https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw) | [NanoBot](https:\u002F\u002Fgithub.com\u002FHKUDS\u002Fnanobot) | [PicoClaw](https:\u002F\u002Fgithub.com\u002Fsipeed\u002Fpicoclaw) | [ZeroClaw](https:\u002F\u002Fgithub.com\u002Fzeroclaw-labs\u002Fzeroclaw) | **[🦞 NullClaw](https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw)** |\n|---|---|---|---|---|---|\n| **语言** | TypeScript | Python | Go | Rust | **Zig** |\n| **内存占用** | > 1 GB | > 100 MB | \u003C 10 MB | \u003C 5 MB | **~1 MB** |\n| **启动时间 (0.8 GHz)** | > 500 s | > 30 s | \u003C 1 s | \u003C 10 ms | **\u003C 8 ms** |\n| **二进制大小** | ~28 MB (dist) | N\u002FA (脚本) | ~8 MB | ~8.8 MB | **678 KB** |\n| **测试用例数** | — | — | — | 1,017 | **5,300+** |\n| **源文件数量** | ~400+ | — | — | ~120 | **~230** |\n| **成本** | Mac Mini $599 | Linux SBC ~$50 | Linux 开发板 $10 | 任意 $10 硬件 | **任意 $5 硬件** |\n\n> 使用 `\u002Fusr\u002Fbin\u002Ftime -l` 在 ReleaseSmall 构建下测量。nullclaw 是一个静态二进制文件，无任何运行时依赖。\n\n本地复现：\n\n```bash\nzig build -Doptimize=ReleaseSmall\nls -lh zig-out\u002Fbin\u002Fnullclaw\n\n\u002Fusr\u002Fbin\u002Ftime -l zig-out\u002Fbin\u002Fnullclaw --help\n\u002Fusr\u002Fbin\u002Ftime -l zig-out\u002Fbin\u002Fnullclaw status\n```\n\n## 文档\n\n如果你想以最短路径安装、配置、操作或扩展 nullclaw，请从此处开始。\n\n本地化文档位于 `docs\u002Fen\u002F` 和 `docs\u002Fzh\u002F` 目录下。使用下方链接可直接跳转至所需页面。\n\n| 需求 | English | 中文 |\n|---|---|---|\n| 入门指南 | [`docs\u002Fen\u002FREADME.md`](docs\u002Fen\u002FREADME.md) | [`docs\u002Fzh\u002FREADME.md`](docs\u002Fzh\u002FREADME.md) |\n| 安装 | [`docs\u002Fen\u002Finstallation.md`](docs\u002Fen\u002Finstallation.md) | [`docs\u002Fzh\u002Finstallation.md`](docs\u002Fzh\u002Finstallation.md) |\n| 配置 | [`docs\u002Fen\u002Fconfiguration.md`](docs\u002Fen\u002Fconfiguration.md) | [`docs\u002Fzh\u002Fconfiguration.md`](docs\u002Fzh\u002Fconfiguration.md) |\n| 命令 | [`docs\u002Fen\u002Fcommands.md`](docs\u002Fen\u002Fcommands.md) | [`docs\u002Fzh\u002Fcommands.md`](docs\u002Fzh\u002Fcommands.md) |\n| 开发 | [`docs\u002Fen\u002Fdevelopment.md`](docs\u002Fen\u002Fdevelopment.md) | [`docs\u002Fzh\u002Fdevelopment.md`](docs\u002Fzh\u002Fdevelopment.md) |\n| 运维 | [`docs\u002Fen\u002Fusage.md`](docs\u002Fen\u002Fusage.md) | [`docs\u002Fzh\u002Fusage.md`](docs\u002Fzh\u002Fusage.md) |\n| 架构 | [`docs\u002Fen\u002Farchitecture.md`](docs\u002Fen\u002Farchitecture.md) | [`docs\u002Fzh\u002Farchitecture.md`](docs\u002Fzh\u002Farchitecture.md) |\n| 安全 | [`docs\u002Fen\u002Fsecurity.md`](docs\u002Fen\u002Fsecurity.md) | [`docs\u002Fzh\u002Fsecurity.md`](docs\u002Fzh\u002Fsecurity.md) |\n| Gateway API | [`docs\u002Fen\u002Fgateway-api.md`](docs\u002Fen\u002Fgateway-api.md) | [`docs\u002Fzh\u002Fgateway-api.md`](docs\u002Fzh\u002Fgateway-api.md) |\n\n- 专项指南：[`CONTRIBUTING.md`](CONTRIBUTING.md)、[`SECURITY.md`](SECURITY.md)、[`SIGNAL.md`](SIGNAL.md)\n\n## 选择你的路径\n\n| 目标 | 首先打开 | 然后前往 |\n|---|---|---|\n| 英文首次运行 | [`docs\u002Fen\u002FREADME.md`](docs\u002Fen\u002FREADME.md) | [`docs\u002Fen\u002Finstallation.md`](docs\u002Fen\u002Finstallation.md) → [`docs\u002Fen\u002Fconfiguration.md`](docs\u002Fen\u002Fconfiguration.md) → [`docs\u002Fen\u002Fusage.md`](docs\u002Fen\u002Fusage.md) |\n| 中文快速上手 | [`docs\u002Fzh\u002FREADME.md`](docs\u002Fzh\u002FREADME.md) | [`docs\u002Fzh\u002Finstallation.md`](docs\u002Fzh\u002Finstallation.md) → [`docs\u002Fzh\u002Fconfiguration.md`](docs\u002Fzh\u002Fconfiguration.md) → [`docs\u002Fzh\u002Fusage.md`](docs\u002Fzh\u002Fusage.md) |\n| 查找合适的 CLI 命令 | [`docs\u002Fen\u002Fcommands.md`](docs\u002Fen\u002Fcommands.md) \u002F [`docs\u002Fzh\u002Fcommands.md`](docs\u002Fzh\u002Fcommands.md) | `nullclaw help` → 特定任务的子命令页面 |\n| 贡献代码或文档 | [`CONTRIBUTING.md`](CONTRIBUTING.md) | [`docs\u002Fen\u002Fdevelopment.md`](docs\u002Fen\u002Fdevelopment.md) \u002F [`docs\u002Fzh\u002Fdevelopment.md`](docs\u002Fzh\u002Fdevelopment.md) → 相关架构页面 |\n| 部署运维或安全保障 | [`docs\u002Fen\u002Fusage.md`](docs\u002Fen\u002Fusage.md) \u002F [`docs\u002Fzh\u002Fusage.md`](docs\u002Fzh\u002Fusage.md) | [`docs\u002Fen\u002Fsecurity.md`](docs\u002Fen\u002Fsecurity.md) \u002F [`docs\u002Fzh\u002Fsecurity.md`](docs\u002Fzh\u002Fsecurity.md) → Gateway API |\n\n## 阅读本 README 之后\n\n- 新用户：跳转至 [`docs\u002Fen\u002FREADME.md`](docs\u002Fen\u002FREADME.md) 或 [`docs\u002Fzh\u002FREADME.md`](docs\u002Fzh\u002FREADME.md)，并按照引导顺序阅读。\n- 想快速查看命令：打开 [`docs\u002Fen\u002Fcommands.md`](docs\u002Fen\u002Fcommands.md) 或 [`docs\u002Fzh\u002Fcommands.md`](docs\u002Fzh\u002Fcommands.md)。\n- 想提交 PR（Pull Request）：先阅读 [`CONTRIBUTING.md`](CONTRIBUTING.md)，再阅读 [`docs\u002Fen\u002Fdevelopment.md`](docs\u002Fen\u002Fdevelopment.md) 或 [`docs\u002Fzh\u002Fdevelopment.md`](docs\u002Fzh\u002Fdevelopment.md)。\n\n## 快速开始\n\n### 1) 推荐安装方式（Homebrew）\n\n最简单的方式：安装一个开箱即用的二进制文件，无需额外运行时依赖。\n\n```bash\nbrew install nullclaw\nnullclaw --help\n```\n\n### 2) 从源码构建\n\n> **前提条件**：必须使用 **Zig 0.15.2**（精确版本）。  \n> `0.16.0-dev` 及其他 Zig 版本目前不受支持，可能导致构建失败。  \n> 构建前请验证：`zig version` 应输出 `0.15.2`。\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw.git\ncd nullclaw\nzig build -Doptimize=ReleaseSmall\nzig build test --summary all\n```\n\n将 `nullclaw` 添加到 `PATH`：\n\nmacOS\u002FLinux (zsh\u002Fbash):\n\n```bash\nzig build -Doptimize=ReleaseSmall -p \"$HOME\u002F.local\"\necho 'export PATH=\"$HOME\u002F.local\u002Fbin:$PATH\"' >> ~\u002F.zshrc\n# 或 ~\u002F.bashrc\n```\n\nWindows (PowerShell):\n\n```powershell\nzig build -Doptimize=ReleaseSmall -p \"$HOME\\.local\"\n\n$bin = \"$HOME\\.local\\bin\"\n$user_path = [Environment]::GetEnvironmentVariable(\"Path\", \"User\")\nif (-not ($user_path -split \";\" | Where-Object { $_ -eq $bin })) {\n  [Environment]::SetEnvironmentVariable(\"Path\", \"$user_path;$bin\", \"User\")\n}\n$env:Path = \"$env:Path;$bin\"\n```\n\n然后执行：\n\n```bash\nnullclaw --help\n```\n\n### 3) 常用命令\n\n```bash\n\n# 快速设置\nnullclaw onboard --api-key sk-... --provider openrouter\n\n# 或交互式向导\nnullclaw onboard --interactive\n\n# 聊天\nnullclaw agent -m \"Hello, nullclaw!\"\n\n# 交互模式\nnullclaw agent\n\n# 启动网关运行时（包含网关 + 所有已配置的通道\u002F账户 + 心跳 + 调度器）\nnullclaw gateway                # 默认：127.0.0.1:3000\nnullclaw gateway --port 8080    # 自定义端口\n\n# 检查状态\nnullclaw status\n\n# 运行系统诊断\nnullclaw doctor\n\n# 检查通道健康状况\nnullclaw channel status\n\n# 启动特定通道\nnullclaw channel start telegram\nnullclaw channel start discord\nnullclaw channel start signal\n\n# 管理后台服务\n# Linux 支持 systemd 用户服务和 OpenRC\nnullclaw service install\nnullclaw service status\n\n# 从 OpenClaw 迁移记忆数据\nnullclaw migrate openclaw --dry-run\nnullclaw migrate openclaw\n```\n\n## Edge MVP（混合主机 + WASM 逻辑）\n\n如果你想在边缘部署（Cloudflare Worker）中同时使用 Telegram 和 OpenAI，并将智能体策略保留在 WASM 中，请参阅：\n\n`examples\u002Fedge\u002Fcloudflare-worker\u002F`\n\n该模式将网络通信和密钥保留在边缘主机中，只需替换一个小型 Zig WASM 模块即可更新或切换逻辑。\n\n## 架构\n\n每个子系统都是一个 **vtable 接口** —— 只需修改配置即可更换实现，无需更改任何代码。\n\n| 子系统 | 接口 | 内置支持 | 可扩展 |\n|-----------|-----------|------------|--------|\n| **AI 模型** | `Provider` | 50+ 提供商（OpenRouter、Anthropic、OpenAI、Azure OpenAI、Gemini、Vertex AI、Ollama、Venice、Groq、Mistral、xAI、DeepSeek、Together、Fireworks、Perplexity、Cohere、Bedrock 以及众多兼容 OpenAI 的端点） | `custom:https:\u002F\u002Fyour-api.com` —— 任意兼容 OpenAI 的 API |\n| **通道（Channels）** | `Channel` | CLI、Telegram、Signal、Discord、Slack、iMessage、Matrix、WhatsApp、Webhook、IRC、Lark\u002F飞书、OneBot、Line、钉钉、Email、Nostr、QQ、MaixCam、Mattermost | 任意消息 API |\n| **记忆（Memory）** | `Memory` | SQLite（带混合搜索：FTS5 + 向量余弦相似度）、Markdown、ClickHouse、PostgreSQL、Redis、LanceDB、Lucid、LRU、API | 任意持久化后端 |\n| **工具（Tools）** | `Tool` | shell、file_read、file_write、file_edit、file_edit_hashed、file_read_hashed、file_append、memory_store、memory_recall、memory_forget、memory_list、browser_open、screenshot、composio、http_request、web_fetch、web_search、delegate、schedule、hardware_info、hardware_memory、pushover、message、spawn、git、image、i2c、spi 等 | 任意能力 |\n| **可观测性（Observability）** | `Observer` | Noop、Log、File、Multi | Prometheus、OTel |\n| **运行时（Runtime）** | `RuntimeAdapter` | Native、Docker（沙箱）、WASM（wasmtime） | 任意运行时 |\n| **安全（Security）** | `Sandbox` | Landlock、Firejail、Bubblewrap、Docker、自动检测 | 任意沙箱后端 |\n| **身份（Identity）** | `IdentityConfig` | OpenClaw（Markdown）、AIEOS v1.1（JSON） | 任意身份格式 |\n| **隧道（Tunnel）** | `Tunnel` | None、Cloudflare、Tailscale、ngrok、Custom | 任意隧道二进制 |\n| **心跳（Heartbeat）** | Engine | HEARTBEAT.md 中的周期性任务 | — |\n| **技能（Skills）** | Loader | TOML\u002FJSON 清单或 `SKILL.md` 中的 YAML frontmatter | 社区技能包 |\n| **外设（Peripherals）** | `Peripheral` | Serial、Arduino、树莓派 GPIO、STM32\u002FNucleo | 任意硬件接口 |\n| **定时任务（Cron）** | Scheduler | Cron 表达式 + 单次定时器（带 JSON 持久化） | — |\n\n### 记忆系统\n\n核心路径完全自研，无外部依赖：\n\n| 层级 | 实现 |\n|-------|---------------|\n| **向量数据库** | 嵌入向量以 BLOB 形式存储于 SQLite，支持余弦相似度搜索 |\n| **关键词搜索** | 使用 FTS5 虚拟表，基于 BM25 评分 |\n| **混合融合** | 加权融合（可配置向量\u002F关键词权重） |\n| **嵌入模型** | `EmbeddingProvider` vtable —— OpenAI、自定义 URL 或 noop |\n| **数据清理** | 自动归档并清除过期记忆 |\n| **快照** | 支持导出\u002F导入完整记忆状态用于迁移 |\n| **引擎** | SQLite（默认）、Markdown、ClickHouse、PostgreSQL、Redis、LanceDB、Lucid、LRU、API、None |\n\n```json\n{\n  \"memory\": {\n    \"backend\": \"sqlite\",\n    \"auto_save\": true,\n    \"embedding_provider\": \"openai\",\n    \"vector_weight\": 0.7,\n    \"keyword_weight\": 0.3,\n    \"hygiene_enabled\": true,\n    \"snapshot_enabled\": false\n  }\n}\n```\n\n## 安全\n\nnullclaw 在**每一层**都强制实施安全措施。\n\n| # | 项目 | 状态 | 实现方式 |\n|---|------|--------|-----|\n| 1 | **网关默认不对外暴露** | 已完成 | 默认绑定 `127.0.0.1`。除非配置了隧道或显式启用 `allow_public_bind`，否则拒绝绑定 `0.0.0.0`。 |\n| 2 | **配对认证必需** | 已完成 | 启动时生成 6 位一次性验证码。通过 `POST \u002Fpair` 交换获取 bearer token。 |\n| 3 | **文件系统作用域限制** | 已完成 | 默认启用 `workspace_only = true`。阻止空字节注入，检测符号链接逃逸。 |\n| 4 | **仅允许通过隧道访问** | 已完成 | 若无活跃隧道，网关拒绝公开绑定。支持 Tailscale、Cloudflare、ngrok 或自定义隧道。 |\n| 5 | **沙箱隔离** | 已完成 | 自动检测最佳后端：Landlock、Firejail、Bubblewrap 或 Docker。 |\n| 6 | **加密存储密钥** | 已完成 | API 密钥使用本地密钥文件通过 ChaCha20-Poly1305 加密。 |\n| 7 | **资源限制** | 已完成 | 可配置内存、CPU、磁盘及子进程限制。 |\n| 8 | **审计日志** | 已完成 | 带签名的事件追踪，可配置保留策略。 |\n\n### 频道白名单（Channel Allowlists）\n\n- 空白名单 = **拒绝所有入站消息**\n- `\"*\"` = **允许全部**（显式选择加入）\n- 其他情况 = 精确匹配白名单\n\n对于 Nostr 额外说明：无论 `dm_allowed_pubkeys` 如何设置，`owner_pubkey` **始终**被允许。私钥在存储时通过 SecretStore 加密（带有 `enc2:` 前缀），仅在频道运行期间解密到内存中；频道停止时立即清零。\n\n### Nostr 频道设置\n\n`nullclaw` 通过 NIP-17（加密包裹的私信）和 NIP-04（传统私信）原生支持 Nostr，使用 [`nak`](https:\u002F\u002Fgithub.com\u002Ffiatjaf\u002Fnak) 实现。\n\n**前提条件：** 安装 `nak` 并确保其位于 `$PATH` 中。\n\n**通过引导向导设置：**\n\n```bash\nnullclaw onboard --interactive   # 第 7 步配置 Nostr\n```\n\n该向导将：\n1. 为你的机器人生成新密钥对，或导入已有密钥并使用 ChaCha20-Poly1305 加密\n2. 要求输入你的（所有者）公钥（npub 或十六进制格式）——始终可通过 DM 策略\n3. 配置中继（relays）和 DM 中继（kind:10050 收件箱）\n4. 显示机器人的公钥\n\n或者在[配置文件](#configuration)中手动配置。\n\n**工作原理：** 启动时，nullclaw 会广播其 DM 收件箱中继（kind:10050），然后监听传入的 NIP-17 gift wraps 和 NIP-04 加密私信。出站消息将镜像发送方所用协议。多中继谣言去重机制可防止同一消息通过多个中继送达时产生重复响应。\n\n## 配置\n\n配置文件路径：`~\u002F.nullclaw\u002Fconfig.json`（由 `onboard` 命令创建）\n\n> **兼容 OpenClaw：** nullclaw 使用与 [OpenClaw](https:\u002F\u002Fgithub.com\u002Fopenclaw\u002Fopenclaw) 相同的配置结构（snake_case 风格）。模型提供者位于 `models.providers` 下，默认模型位于 `agents.defaults.model.primary`，频道使用 `accounts` 包装器。\n> 不支持顶层的 `default_provider` \u002F `default_model` 键。\n>\n> **Vertex AI 注意事项：** `models.providers.vertex.api_key` 支持以下两种形式：\n> 1. Bearer Token（如 `ya29...`），或\n> 2. 完整的 Google 服务账号 JSON 对象（格式与 Apps Script 中的 `GEMINI_KEY` 相同，包含 `project_id`、`client_email`、`private_key`）。\n>\n> `models.providers.vertex.base_url` 可显式设置（例如 `...\u002Fprojects\u002F\u003Cid>\u002Flocations\u002F\u003Cloc>\u002Fpublishers\u002Fgoogle\u002Fmodels`），若使用服务账号 JSON 则可省略（nullclaw 将从 `project_id` 推导出 URL，默认 `VERTEX_LOCATION` 为 `global`）。\n> 使用服务账号模式时，需确保 `$PATH` 中有 `openssl`，用于 RS256 JWT 签名。\n\n```json\n{\n  \"default_temperature\": 0.7,\n\n  \"models\": {\n    \"providers\": {\n      \"openrouter\": { \"api_key\": \"sk-or-...\" },\n      \"groq\": { \"api_key\": \"gsk_...\" },\n      \"vertex\": {\n        \"api_key\": {\n          \"type\": \"service_account\",\n          \"project_id\": \"your-project\",\n          \"client_email\": \"svc@your-project.iam.gserviceaccount.com\",\n          \"private_key\": \"-----BEGIN PRIVATE KEY-----\\n...\\n-----END PRIVATE KEY-----\\n\"\n        },\n        \"base_url\": \"https:\u002F\u002Faiplatform.googleapis.com\u002Fv1\u002Fprojects\u002Fyour-project\u002Flocations\u002Fglobal\u002Fpublishers\u002Fgoogle\u002Fmodels\"\n      },\n      \"anthropic\": { \"api_key\": \"sk-ant-...\", \"base_url\": \"https:\u002F\u002Fapi.anthropic.com\" }\n    }\n  },\n\n  \"agents\": {\n    \"defaults\": {\n      \"model\": { \"primary\": \"openrouter\u002Fanthropic\u002Fclaude-sonnet-4\" },\n      \"heartbeat\": { \"every\": \"30m\" }\n    },\n    \"list\": [\n      { \"id\": \"researcher\", \"model\": { \"primary\": \"openrouter\u002Fanthropic\u002Fclaude-opus-4\" }, \"system_prompt\": \"...\" }\n    ]\n  },\n\n  \"channels\": {\n    \"telegram\": {\n      \"accounts\": {\n        \"main\": {\n          \"bot_token\": \"123:ABC\",\n          \"allow_from\": [\"user1\"],\n          \"reply_in_private\": true,\n          \"proxy\": \"socks5:\u002F\u002F...\"\n        }\n      }\n    },\n    \"discord\": {\n      \"accounts\": {\n        \"main\": {\n          \"token\": \"disc-token\",\n          \"guild_id\": \"12345\",\n          \"allow_from\": [\"user1\"],\n          \"allow_bots\": false\n        }\n      }\n    },\n    \"irc\": {\n      \"accounts\": {\n        \"main\": {\n          \"host\": \"irc.libera.chat\",\n          \"port\": 6697,\n          \"nick\": \"nullclaw\",\n          \"channel\": \"#nullclaw\",\n          \"tls\": true,\n          \"allow_from\": [\"user1\"]\n        },\n        \"meshrelay\": {\n          \"host\": \"irc.meshrelay.xyz\",\n          \"port\": 6697,\n          \"nick\": \"nullclaw\",\n          \"channels\": [\"#agents\"],\n          \"tls\": true,\n          \"nickserv_password\": \"YOUR_NICKSERV_PASSWORD\",\n          \"allow_from\": [\"*\"]\n        }\n      }\n    },\n    \"slack\": {\n      \"accounts\": {\n        \"main\": {\n          \"bot_token\": \"xoxb-...\",\n          \"app_token\": \"xapp-...\",\n          \"allow_from\": [\"user1\"]\n        }\n      }\n    },\n    \"nostr\": {\n      \"private_key\": \"enc2:...\",\n      \"owner_pubkey\": \"hex-pubkey-of-owner\",\n      \"relays\": [\"wss:\u002F\u002Frelay.damus.io\", \"wss:\u002F\u002Fnos.lol\", \"wss:\u002F\u002Frelay.nostr.band\"],\n      \"dm_allowed_pubkeys\": [\"*\"],\n      \"display_name\": \"NullClaw\",\n      \"about\": \"AI assistant on Nostr\",\n      \"nip05\": \"nullclaw@yourdomain.com\",\n      \"lnurl\": \"lnurl1...\"\n    }\n  },\n\n  \"tools\": {\n    \"media\": {\n      \"audio\": {\n        \"enabled\": true,\n        \"language\": \"ru\",\n        \"models\": [{ \"provider\": \"groq\", \"model\": \"whisper-large-v3\" }]\n      }\n    }\n  },\n\n  \"mcp_servers\": {\n    \"filesystem\": {\n      \"transport\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@modelcontextprotocol\u002Fserver-filesystem\"]\n    },\n    \"remote\": {\n      \"transport\": \"http\",\n      \"url\": \"https:\u002F\u002Fmcp.example.com\u002Frpc\",\n      \"timeout_ms\": 10000,\n      \"headers\": {\n        \"Authorization\": \"Bearer ${MCP_TOKEN}\"\n      }\n    }\n  },\n\n  \"memory\": {\n    \"backend\": \"sqlite\",\n    \"auto_save\": true,\n    \"embedding_provider\": \"openai\",\n    \"vector_weight\": 0.7,\n    \"keyword_weight\": 0.3\n  },\n\n  \"gateway\": {\n    \"port\": 3000,\n    \"require_pairing\": true,\n    \"allow_public_bind\": false\n  },\n\n  \"autonomy\": {\n    \"level\": \"supervised\",\n    \"workspace_only\": true,\n    \"max_actions_per_hour\": 20\n  },\n\n  \"runtime\": {\n    \"kind\": \"native\",\n    \"docker\": {\n      \"image\": \"alpine:3.20\",\n      \"network\": \"none\",\n      \"memory_limit_mb\": 512,\n      \"read_only_rootfs\": true\n    }\n  },\n\n\n  \"tunnel\": { \"provider\": \"none\" },\n  \"secrets\": { \"encrypt\": true },\n  \"identity\": { \"format\": \"openclaw\" },\n\n  \"security\": {\n    \"sandbox\": { \"backend\": \"auto\" },\n    \"resources\": { \"max_memory_mb\": 512, \"max_cpu_percent\": 80 },\n    \"audit\": { \"enabled\": true, \"retention_days\": 90 }\n  }\n}\n```\n\nTelegram 论坛主题：\n\n- 话题（Topic）会话隔离是自动的。你不需要在 `channels.telegram` 下添加 `topic_id` 字段。\n- 最简单的操作流程如下：\n  1. 在 `agents.list` 下定义命名的代理（agent）配置文件\n  2. 打开目标 Telegram 聊天或论坛话题（forum topic）\n  3. 运行 `\u002Fbind \u003Cagent>`\n- 要将特定的 Telegram 论坛话题绑定到特定代理，请在 `bindings[].match.peer.id` 中使用标准线程格式 `\"\u003Cchat_id>:thread:\u003Ctopic_id>\"`。\n- 要将整个 Telegram 群组作为所有其他话题的后备路由，请保留一个使用 `\"\u003Cchat_id>\"` 的普通群组绑定。\n- `\u002Fbind status` 显示当前生效的路由和可用的代理 ID。\n- `\u002Fbind clear` 仅移除当前账号\u002F聊天\u002F话题的精确绑定，并回退到更宽泛的路由。\n- `\u002Fbind` 会为当前 Telegram 账号和对端（peer）持久化一个精确的 `bindings[]` 条目。\n- `\u002Fbind status` 能区分精确的本地覆盖和继承自更宽泛规则的后备路由。\n- 话题专属绑定通过路由优先级胜过群组后备；`bindings[]` 中的顺序无关紧要。\n- `\u002Fbind` 命令在 Telegram 菜单中的可见性由 `channels.telegram.accounts.\u003Cid>.binding_commands_enabled` 控制。\n\n示例：\n\n```json\n{\n  \"bindings\": [\n    {\n      \"agent_id\": \"coder\",\n      \"match\": {\n        \"channel\": \"telegram\",\n        \"account_id\": \"main\",\n        \"peer\": { \"kind\": \"group\", \"id\": \"-1001234567890:thread:42\" }\n      }\n    },\n    {\n      \"agent_id\": \"orchestrator\",\n      \"match\": {\n        \"channel\": \"telegram\",\n        \"account_id\": \"main\",\n        \"peer\": { \"kind\": \"group\", \"id\": \"-1001234567890\" }\n      }\n    }\n  ]\n}\n```\n\n在此配置中，话题 `42` 路由到 `coder`，而论坛其余部分则回退到 `orchestrator`。\n\n命名的代理配置文件与绑定是分开配置的。绑定仅决定哪个命名代理处理给定的聊天\u002F话题。\n\n如果某个命名代理应从其自己的工作区（workspace）运行，请设置 `agents.list[].workspace_path`。  \n相对路径会相对于包含 `config.json` 的目录进行解析，工作区会在首次使用时自动搭建，且该代理会获得一个持久化内存命名空间 `agent:\u003Cagent-id>`。  \n设置 `workspace_path` 不会禁用 `system_prompt`：当两者都配置时，命名配置文件的提示词仍会应用，并且工作区引导文件会从该专用工作区加载。  \n这适用于 `nullclaw agent --agent \u003Cid>`、`\u002Fsubagents spawn --agent \u003Cid>` 以及通过 `bindings` 解析的路由会话。\n\n最小端到端示例：\n\n```json\n{\n  \"agents\": {\n    \"list\": [\n      {\n        \"id\": \"orchestrator\",\n        \"provider\": \"openrouter\",\n        \"model\": \"anthropic\u002Fclaude-sonnet-4\"\n      },\n      {\n        \"id\": \"coder\",\n        \"provider\": \"ollama\",\n        \"model\": \"qwen2.5-coder:14b\",\n        \"system_prompt\": \"You are the coding agent for this topic.\"\n      }\n    ]\n  },\n  \"channels\": {\n    \"telegram\": {\n      \"accounts\": {\n        \"main\": {\n          \"bot_token\": \"123456:ABCDEF\",\n          \"allow_from\": [\"YOUR_TELEGRAM_USER_ID\"],\n          \"binding_commands_enabled\": true,\n          \"topic_commands_enabled\": true,\n          \"topic_map_command_enabled\": true,\n          \"commands_menu_mode\": \"scoped\"\n        }\n      }\n    }\n  },\n  \"bindings\": [\n    {\n      \"agent_id\": \"orchestrator\",\n      \"match\": {\n        \"channel\": \"telegram\",\n        \"account_id\": \"main\",\n        \"peer\": { \"kind\": \"group\", \"id\": \"-1001234567890\" }\n      }\n    }\n  ]\n}\n```\n\n操作流程：\n\n- 在目标论坛话题内发送 `\u002Fbind coder`。\n- `nullclaw` 会为该话题和 Telegram 账号向 `~\u002F.nullclaw\u002Fconfig.json` 写入一个新的精确 `bindings[]` 条目。\n- 该话题中的下一条消息将使用新的路由代理配置文件。\n- `nullclaw` 必须对 `~\u002F.nullclaw\u002Fconfig.json` 具有写权限，才能使 `\u002Fbind` 持久化更改。\n\n关于 `account_id`：\n\n- `account_id` 标识已配置的 Telegram 账号条目，而非话题或代理。\n- 在常规的 `channels.telegram.accounts` 形式中，对象键即为账号 ID。例如，`accounts.main` 表示 `account_id = \"main\"`，`accounts.backup` 表示 `account_id = \"backup\"`。\n- 在 `bindings` 中，`match.account_id` 将该绑定限制为仅匹配一个特定的 Telegram 账号。\n- 如果省略 `match.account_id`，则该绑定可匹配该频道下的任意 Telegram 账号。\n- 仅当你在同一 `nullclaw` 实例中运行多个 Telegram 机器人账号\u002F令牌时，才需要使用不同的账号 ID。\n\n对消息投递的影响：\n\n- 传入的 Telegram 更新由接收它们的账号处理。\n- 路由使用相同的 `account_id`，因此 `match.account_id = \"main\"` 仅匹配由 `channels.telegram.accounts.main` 接收的消息。\n- 回复会通过处理该消息的同一 Telegram 账号\u002F运行时发出。\n- 将一个绑定设为 `account_id = \"main\"`，另一个设为 `account_id = \"sub\"`，并不会自动将一个聊天拆分给两个代理；它只是将每个绑定限定到不同的已配置 Telegram 账号。\n\n### 完整网页搜索 + Shell 访问\n\n当你希望完全控制网页搜索提供者，并启用无限制的 Shell 命令白名单行为时，请使用以下配置：\n\n```json\n{\n  \"http_request\": {\n    \"enabled\": true,\n    \"search_base_url\": \"https:\u002F\u002Fsearx.example.com\",\n    \"search_provider\": \"auto\",\n    \"search_fallback_providers\": [\"jina\", \"duckduckgo\"]\n  },\n  \"autonomy\": {\n    \"level\": \"full\",\n    \"allowed_commands\": [\"*\"],\n    \"allowed_paths\": [\"*\"],\n    \"require_approval_for_medium_risk\": false,\n    \"block_high_risk_commands\": false\n  }\n}\n```\n\n- `http_request.search_base_url` 可接受实例根地址（如 `https:\u002F\u002Fhost`）或显式端点（如 `https:\u002F\u002Fhost\u002Fsearch`）；本地\u002F私有 SearXNG 实例也可使用纯 HTTP，例如 `http:\u002F\u002Flocalhost:8888` 或 `http:\u002F\u002F192.168.1.10:8888\u002Fsearch`。\n- 无效的 `http_request.search_base_url` 现在会在启动时导致配置验证失败（不再对格式错误的 URL 自动回退）。\n- `http_request.search_provider` 支持：`auto`、`searxng`、`duckduckgo`（`ddg`）、`brave`、`firecrawl`、`tavily`、`perplexity`、`exa`、`jina`。\n- `http_request.search_fallback_providers` 是可选的，当主提供者失败时按顺序尝试。\n- 提供者环境变量：`BRAVE_API_KEY`、`FIRECRAWL_API_KEY`、`TAVILY_API_KEY`、`PERPLEXITY_API_KEY`、`EXA_API_KEY`、`JINA_API_KEY`（或在支持的情况下使用共享的 `WEB_SEARCH_API_KEY`）。DuckDuckGo 和 SearXNG 不需要 API 密钥。\n- `allowed_commands` 条目支持 `\"cmd\"`、`\"cmd *\"` 和 `\"*\"` 格式。\n  - `\"cmd\"` 和 `\"cmd *\"` 都允许该命令族通过白名单阶段。\n  - `\"*\"` 允许任何命令通过白名单阶段。\n- `allowed_paths: [\"*\"]` 允许访问工作区以外的路径，但系统保护路径除外。\n\n### Web UI \u002F 浏览器中继（Browser Relay）\n\n使用 `channels.web` 处理浏览器 UI 事件（WebChannel v1）：\n\n```json\n{\n  \"channels\": {\n    \"web\": {\n      \"accounts\": {\n        \"default\": {\n          \"transport\": \"local\",\n          \"listen\": \"127.0.0.1\",\n          \"port\": 32123,\n          \"path\": \"\u002Fws\",\n          \"auth_token\": \"replace-with-long-random-token\",\n          \"message_auth_mode\": \"pairing\",\n          \"allowed_origins\": [\"http:\u002F\u002Flocalhost:5173\", \"chrome-extension:\u002F\u002Fyour-extension-id\"]\n        }\n      }\n    }\n  }\n}\n```\n\n- **本地模式**：保持 `\"listen\": \"127.0.0.1\"`。\n- `message_auth_mode` 控制入站 `user_message` 的认证方式：\n  - `\"pairing\"`（默认）：先发送 `pairing_request`，接收 `pairing_result`，并在每个 `user_message` 中包含 UI 的 `access_token`。\n  - `\"token\"`（仅限本地传输）：在每个 `user_message` 负载中包含 `auth_token`（为兼容性也接受 `access_token`）。\n- `auth_token` 用于加固 WebSocket 升级过程；当绑定非回环地址（non-loopback）时，该字段变为必需。\n- 未经认证的 WebSocket 升级仅允许在回环地址（loopback）上进行。配对优先的本地用户体验适用于 `127.0.0.1`，但若绑定公网或局域网地址，则必须在首次连接 `\u002Fws` 时通过 `?token=\u003Cauth_token>` 或 `Authorization: Bearer \u003Cauth_token>` 进行认证。\n- `\u002Fws` 是 WebSocket 端点。`\u002Fpair` 属于 HTTP 网关 API，不属于 Web Channel 握手流程。\n- **远程\u002F无头主机**：若绑定 `\"listen\": \"0.0.0.0\"`，建议在 TLS\u002F反向代理后使用稳定配置的 token 并设置 `message_auth_mode: \"token\"`；或者保持回环绑定，并通过 SSH 隧道\u002F代理暴露服务。\n- UI\u002F扩展应存放在独立仓库中，并通过此 WebSocket 端点连接。\n- **编排场景**：建议使用本地 token 模式，并从配置或环境变量（`NULLCLAW_WEB_TOKEN`、`NULLCLAW_GATEWAY_TOKEN`、`OPENCLAW_GATEWAY_TOKEN`）中读取稳定 token。\n- **中继传输**（出站代理套接字）通过以下方式配置：\n\n```json\n{\n  \"channels\": {\n    \"web\": {\n      \"accounts\": {\n        \"default\": {\n          \"transport\": \"relay\",\n          \"relay_url\": \"wss:\u002F\u002Frelay.nullclaw.io\u002Fws\u002Fagent\",\n          \"relay_agent_id\": \"default\",\n          \"relay_token\": \"replace-with-relay-token\",\n          \"relay_token_ttl_secs\": 2592000,\n          \"relay_pairing_code_ttl_secs\": 300,\n          \"relay_ui_token_ttl_secs\": 86400,\n          \"relay_e2e_required\": false\n        }\n      }\n    }\n  }\n}\n```\n\n- **中继 token 生命周期**（专用）：`relay_token`（配置） → `NULLCLAW_RELAY_TOKEN`（环境变量） → 持久化凭证 `web-relay-\u003Caccount_id>` → 生成 token。\n- **中继 UI 握手**：发送带一次性 `pairing_code` 的 `pairing_request`，接收包含 UI `access_token` JWT（以及可选的 `set_cookie` 字符串，供中继 HTTP 层使用）的 `pairing_result`。\n- **中继 `user_message`** 必须在 `access_token`（顶层或 `payload.access_token`）中包含有效的 UI JWT。\n- 若启用端到端加密（E2E，即 `relay_e2e_required=true`），UI 与代理将在配对过程中交换 X25519 密钥，并在 `payload.e2e` 中发送加密负载。\n- WebChannel 事件封装格式定义见 [`spec\u002Fwebchannel_v1.json`](spec\u002Fwebchannel_v1.json)。\n\n## 网关 API（Gateway API）\n\n| 端点（Endpoint） | 方法（Method） | 认证（Auth） | 描述（Description） |\n|----------|--------|------|-------------|\n| `\u002Fhealth` | GET | 无 | 健康检查（始终公开） |\n| `\u002Fpair` | POST | `X-Pairing-Code` 请求头 | 使用一次性配对码换取 Bearer Token |\n| `\u002Fwebhook` | POST | `Authorization: Bearer \u003Ctoken>` | 发送消息：`{\"message\": \"your prompt\"}` |\n| `\u002F.well-known\u002Fagent-card.json` | GET | 无 | A2A Agent Card 发现（公开） |\n| `\u002Fa2a` | POST | `Authorization: Bearer \u003Ctoken>` | A2A JSON-RPC 端点（标准方法及旧版斜杠别名） |\n| `\u002Fwhatsapp` | GET | 查询参数 | Meta Webhook 验证 |\n| `\u002Fwhatsapp` | POST | 无（Meta 签名） | WhatsApp 入站消息 Webhook |\n\n### A2A（Agent-to-Agent 协议 v0.3.0）\n\nNullClaw 实现了 Google 的 [A2A 协议](https:\u002F\u002Fgithub.com\u002Fgoogle\u002FA2A) v0.3.0，允许任何兼容 A2A 的代理或客户端通过 JSON-RPC 2.0 发现、认证并与你的实例交互。\n\n在 `~\u002F.nullclaw\u002Fconfig.json` 中启用：\n\n```json\n{\n  \"a2a\": {\n    \"enabled\": true,\n    \"name\": \"nullclaw\",\n    \"description\": \"通用 AI 助手\",\n    \"url\": \"https:\u002F\u002Fexample.com\",\n    \"version\": \"1.0.0\"\n  }\n}\n```\n\n**端点：**\n\n| 端点（Endpoint） | 认证（Auth） | 描述（Description） |\n|----------|------|-------------|\n| `GET \u002F.well-known\u002Fagent-card.json` | 无 | Agent Card 发现（公开） |\n| `POST \u002Fa2a` | Bearer Token | JSON-RPC 2.0 分发 |\n\n**支持的方法：** `message\u002Fsend`、`message\u002Fstream`、`tasks\u002Fget`、`tasks\u002Fcancel`、`tasks\u002Flist`、`tasks\u002Fresubscribe`。\n\n**快速测试：**\n\n```bash\n# 1. 获取 Bearer Token\nTOKEN=$(curl -s -X POST -H \"X-Pairing-Code: 123456\" http:\u002F\u002Flocalhost:3000\u002Fpair | jq -r .token)\n\n# 2. 发现代理\ncurl http:\u002F\u002Flocalhost:3000\u002F.well-known\u002Fagent-card.json\n\n# 3. 发送消息\ncurl -X POST -H \"Authorization: Bearer $TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"message\u002Fsend\",\"params\":{\"message\":{\"messageId\":\"msg-1\",\"role\":\"user\",\"parts\":[{\"kind\":\"text\",\"text\":\"Hello\"}]}}}' \\\n  http:\u002F\u002Flocalhost:3000\u002Fa2a\n```\n\n完整 A2A 参考（包括流式传输、任务生命周期和配置细节）请参阅 [Gateway API 文档](docs\u002Fen\u002Fgateway-api.md)。\n\n## 命令（Commands）\n\n| 命令（Command） | 描述（Description） |\n|---------|-------------|\n| `onboard --api-key sk-... --provider openrouter` | 使用 API Key 和提供商快速设置 |\n| `onboard --interactive` | 完整交互式向导 |\n| `onboard --channels-only` | 仅重新配置通道\u002F允许列表 |\n| `agent -m \"...\"` | 单条消息模式 |\n| `agent` | 交互式聊天模式 |\n| `gateway` | 启动长期运行的运行时（默认：`127.0.0.1:3000`） |\n| `service install\\|start\\|stop\\|restart\\|status\\|uninstall` | 管理后台服务 |\n| `doctor` | 诊断系统健康状况 |\n| `status` | 显示完整系统状态 |\n| `channel list\\|start\\|status\\|add\\|remove` | 管理通道 |\n| `cron list\\|add\\|add-agent\\|once\\|once-agent\\|remove\\|pause\\|resume\\|run\\|update\\|runs` | 管理定时任务 |\n| `skills list\\|install\\|remove\\|info` | 管理技能包（skill packs） |\n| `history list\\|show` | 查看会话对话历史 |\n| `memory stats\\|count\\|reindex\\|search\\|get\\|list\\|drain-outbox\\|forget` | 检查和维护记忆（memory） |\n| `hardware scan\\|flash\\|monitor` | 硬件设备管理 |\n| `models list\\|info\\|benchmark\\|refresh` | 模型目录 |\n| `workspace edit\\|reset-md` | 维护工作区 Markdown\u002F引导文件 |\n| `capabilities [--json]` | 显示运行时能力清单 |\n| `auth login\\|status\\|logout` | 管理 OAuth 认证 |\n| `migrate openclaw [--dry-run] [--source PATH]` | 从 OpenClaw 导入记忆并迁移配置 |\n| `update [--check] [--yes]` | 检查并安装更新 |\n\n## 开发（Development）\n\n构建和测试固定使用 **Zig 0.15.2**。\n\n```bash\nzig build                          # 开发构建\nzig build -Doptimize=ReleaseSmall  # 发布构建（678 KB）\nzig build test --summary all       # 5,300+ 项测试\n```\n\n### Channel Flow Coverage（通道流程覆盖）\n\n通道的客户旅程地图（CJM）覆盖范围（入口解析\u002F过滤、会话密钥路由、账户传播、总线交接）由以下测试验证：\n\n- `src\u002Fchannel_manager.zig`（运行时通道注册\u002F启动语义 + 监听器模式接线）\n- `src\u002Fconfig.zig`（兼容 OpenClaw 的 `channels.*.accounts` 解析、多账户选择\u002F排序、别名）\n- `src\u002Fgateway.zig`（从 webhook 负载中提取 Telegram\u002FWhatsApp\u002FLINE\u002FLark 的路由会话密钥）\n- `src\u002Fdaemon.zig`（Discord\u002FQQ\u002FOneBot\u002FMattermost\u002FMaixCam 的网关循环入站路由解析）\n- `src\u002Fchannels\u002Fdiscord.zig`, `src\u002Fchannels\u002Fmattermost.zig`, `src\u002Fchannels\u002Fqq.zig`, `src\u002Fchannels\u002Fonebot.zig`, `src\u002Fchannels\u002Fsignal.zig`, `src\u002Fchannels\u002Fline.zig`, `src\u002Fchannels\u002Fwhatsapp.zig`（各通道的入站\u002F出站契约）\n\n### 项目统计\n\n```\n语言：        Zig 0.15.2\n源文件数：    ~250\n代码行数：    ~249,000\n测试用例：    5,300+\n二进制大小：  678 KB（ReleaseSmall）\n峰值内存占用：~1 MB\n启动时间：    \u003C2 ms（Apple Silicon）\n依赖项：      0（除 libc 和可选的 SQLite 外）\n```\n\n### 源码结构\n\n```\nsrc\u002F\n  main.zig              CLI 入口点 + 参数解析\n  root.zig              模块层级结构（公共 API）\n  config.zig            JSON 配置加载器 + 30 个子配置结构体\n  agent.zig             Agent 循环、自动压缩、工具分发\n  daemon.zig            带指数退避机制的守护进程监督器\n  gateway.zig           HTTP 网关（限流、幂等性、配对）\n  channels\u002F             19 种通道实现（telegram, signal, discord, slack, nostr, matrix, whatsapp, line, lark, onebot, mattermost, qq, ...）\n  providers\u002F            50+ AI 提供商集成\n  memory\u002F               SQLite 后端、嵌入（embeddings）、向量搜索、数据清理、快照\n  tools\u002F                35+ 工具实现\n  security\u002F             密钥管理（ChaCha20）、沙箱后端（landlock, firejail, ...）\n  cron.zig              带 JSON 持久化的 Cron 调度器\n  health.zig            组件健康状态注册表\n  tunnel.zig            隧道虚函数表（cloudflare, ngrok, tailscale, 自定义）\n  peripherals.zig       硬件外设虚函数表（串口、Arduino、树莓派、Nucleo）\n  runtime.zig           运行时虚函数表（原生、Docker、WASM）\n  skillforge.zig        技能发现（GitHub）、评估、集成\n  ...\n```\n\n## 版本控制\n\nnullclaw 使用 **CalVer**（`YYYY.M.D`）进行版本发布 —— 例如 `v2026.2.20`。\n\n- **标签格式：** `vYYYY.M.D`（每天最多一次发布；如需补丁则使用 `vYYYY.M.D.N` 后缀）\n- **发布版二进制文件的内嵌版本来自 git 标签**（`v...` → `nullclaw --version`）\n- **非发布构建默认为 `dev`**，除非你通过 `zig build -Dversion=...` 覆盖\n- **尚无稳定性保证** —— 项目处于 1.0 之前阶段，配置和 CLI 可能在版本间变动\n- **`nullclaw --version`** 打印当前版本\n\n## 贡献指南\n\n详见 [`CONTRIBUTING.md`](CONTRIBUTING.md)，了解开发环境搭建、工作流程、验证命令和 PR 检查清单。\n\n实现一个虚函数表（vtable）接口并提交 PR：\n\n- 新增 `Provider` → `src\u002Fproviders\u002F`\n- 新增 `Channel` → `src\u002Fchannels\u002F`\n- 新增 `Tool` → `src\u002Ftools\u002F`\n- 新增 `Memory` 后端 → `src\u002Fmemory\u002F`\n- 新增 `Tunnel` → `src\u002Ftunnel.zig`\n- 新增 `Sandbox` 后端 → `src\u002Fsecurity\u002F`\n- 新增 `Peripheral` → `src\u002Fperipherals.zig`\n- 新增 `Skill` → `~\u002F.nullclaw\u002Fworkspace\u002Fskills\u002F\u003Cname>\u002F`\n\n## 中文文档\n\n- [中文文档总览](docs\u002Fzh\u002FREADME.md)\n- [安装指南](docs\u002Fzh\u002Finstallation.md)\n- [配置指南](docs\u002Fzh\u002Fconfiguration.md)\n- [使用与运维](docs\u002Fzh\u002Fusage.md)\n- [架构总览](docs\u002Fzh\u002Farchitecture.md)\n- [安全机制](docs\u002Fzh\u002Fsecurity.md)\n- [Gateway API（中文）](docs\u002Fzh\u002Fgateway-api.md)\n- [命令参考](docs\u002Fzh\u002Fcommands.md)\n- [开发指南](docs\u002Fzh\u002Fdevelopment.md)\n\n## 英文文档\n\n- [English docs overview](docs\u002Fen\u002FREADME.md)\n- [Installation](docs\u002Fen\u002Finstallation.md)\n- [Configuration](docs\u002Fen\u002Fconfiguration.md)\n- [Usage and operations](docs\u002Fen\u002Fusage.md)\n- [Architecture](docs\u002Fen\u002Farchitecture.md)\n- [Security](docs\u002Fen\u002Fsecurity.md)\n- [Gateway API](docs\u002Fen\u002Fgateway-api.md)\n- [Commands](docs\u002Fen\u002Fcommands.md)\n- [Development](docs\u002Fen\u002Fdevelopment.md)\n\n## 免责声明\n\nnullclaw 是一个纯粹的开源软件项目。它**不包含任何代币、加密货币、区块链组件或金融工具**。本项目与任何代币或金融产品均无关联。\n\n## 许可证\n\nMIT — 详见 [LICENSE](LICENSE)\n\n---\n\n**nullclaw** — 零开销。零妥协。随处部署。任意替换。\n\n## Star 历史\n\n[![Star History Chart](https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnullclaw_nullclaw_readme_8b281f1fcc9e.png)](https:\u002F\u002Fwww.star-history.com\u002F#nullclaw\u002Fnullclaw&type=date&legend=top-left)","# nullclaw 中文快速上手指南\n\n## 环境准备\n\n- **系统要求**：支持 ARM、x86、RISC-V 架构，可在任意带 CPU 的设备上运行（包括 $5 开发板）\n- **内存要求**：最低约 1 MB RAM\n- **依赖项**：\n  - 若从源码构建，需 **Zig 0.15.2**（必须精确匹配，其他版本暂不支持）\n    ```bash\n    zig version  # 应输出 0.15.2\n    ```\n  - 若使用预编译二进制，则**无任何运行时依赖**，仅需 libc\n\n> 💡 国内用户建议使用 Homebrew 安装（已自动处理依赖），或从 GitHub Release 下载静态二进制。\n\n## 安装步骤\n\n### 方式一：推荐安装（Homebrew）\n\n```bash\nbrew install nullclaw\nnullclaw --help\n```\n\n### 方式二：从源码构建（需 Zig 0.15.2）\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw.git\ncd nullclaw\nzig build -Doptimize=ReleaseSmall\nzig build test --summary all\n```\n\n将二进制加入 PATH：\n\n**macOS \u002F Linux (zsh\u002Fbash)**：\n```bash\nzig build -Doptimize=ReleaseSmall -p \"$HOME\u002F.local\"\necho 'export PATH=\"$HOME\u002F.local\u002Fbin:$PATH\"' >> ~\u002F.zshrc  # 或 ~\u002F.bashrc\nsource ~\u002F.zshrc\n```\n\n**Windows (PowerShell)**：\n```powershell\nzig build -Doptimize=ReleaseSmall -p \"$HOME\\.local\"\n\n$bin = \"$HOME\\.local\\bin\"\n$user_path = [Environment]::GetEnvironmentVariable(\"Path\", \"User\")\nif (-not ($user_path -split \";\" | Where-Object { $_ -eq $bin })) {\n  [Environment]::SetEnvironmentVariable(\"Path\", \"$user_path;$bin\", \"User\")\n}\n$env:Path = \"$env:Path;$bin\"\n```\n\n验证安装：\n```bash\nnullclaw --help\n```\n\n## 基本使用\n\n### 1. 快速配置（以 OpenRouter 为例）\n\n```bash\nnullclaw onboard --api-key sk-... --provider openrouter\n```\n\n或使用交互式向导：\n```bash\nnullclaw onboard --interactive\n```\n\n### 2. 发送一条消息\n\n```bash\nnullclaw agent -m \"Hello, nullclaw!\"\n```\n\n### 3. 进入交互聊天模式\n\n```bash\nnullclaw agent\n```\n\n### 4. 启动网关服务（默认端口 3000）\n\n```bash\nnullclaw gateway\n# 或指定端口\nnullclaw gateway --port 8080\n```\n\n### 5. 查看状态与诊断\n\n```bash\nnullclaw status\nnullclaw doctor\n```\n\n> 更多命令请参考 [`docs\u002Fzh\u002Fcommands.md`](docs\u002Fzh\u002Fcommands.md) 或运行 `nullclaw help`。","某农业物联网初创团队正在为偏远山区的智能灌溉系统开发边缘AI控制节点，需在成本极低的硬件上实现本地化作物状态分析与自动决策。\n\n### 没有 nullclaw 时\n- 团队尝试部署基于Python的轻量AI代理，但即使最小配置也需100MB以上内存，无法在5美元级ARM开发板（如ESP32-S3或树莓派Zero）上运行。\n- 启动耗时超过30秒，在断电重启后无法及时响应土壤湿度突变，导致灌溉延迟。\n- 依赖复杂的运行时环境（如Python解释器、pip包管理），现场部署和远程维护极其困难。\n- 缺乏统一的安全沙箱机制，设备暴露在野外易受物理篡改或网络攻击。\n- 难以集成多种传感器协议和本地LLM推理后端，扩展性受限。\n\n### 使用 nullclaw 后\n- 凭借仅678KB的静态二进制和约1MB内存占用，nullclaw轻松运行在5美元硬件上，无需额外操作系统支持。\n- 启动时间低于8毫秒，断电恢复后瞬间接管灌溉逻辑，保障作物水分供应实时性。\n- 单文件部署，无需安装依赖，通过nullhub UI即可远程配置AI行为规则和传感器绑定。\n- 内置Landlock与Firejail沙箱，严格限制文件与网络访问权限，确保野外设备安全。\n- 通过插件化架构无缝对接本地TinyLLM和Modbus传感器通道，灵活适配不同农田环境。\n\nnullclaw让极简硬件也能拥有全功能、高安全的自主AI能力，真正实现“边缘智能平民化”。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fnullclaw_nullclaw_c95e6740.png","NullClaw","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fnullclaw_7afc3000.png","",null,"https:\u002F\u002Fgithub.com\u002Fnullclaw",[81,85,89,92],{"name":82,"color":83,"percentage":84},"Zig","#ec915c",99.9,{"name":86,"color":87,"percentage":88},"Dockerfile","#384d54",0,{"name":90,"color":91,"percentage":88},"Nix","#7e7eff",{"name":93,"color":94,"percentage":88},"Shell","#89e051",7051,834,"2026-04-05T10:35:13","MIT","Linux, macOS, Windows","未说明","~1 MB",{"notes":103,"python":100,"dependencies":104},"仅需 libc，无其他运行时依赖；可运行于任何带 CPU 的设备（包括 5 美元的 ARM 单板机和微控制器）；必须使用 Zig 0.15.2 版本进行源码构建；提供静态二进制文件，无需安装额外库。",[],[14,13,15],[107,108,109,110],"ai","assistant","personal","zig",14,"2026-03-27T02:49:30.150509","2026-04-06T05:15:39.476450",[115,120,125,130,135],{"id":116,"question_zh":117,"answer_zh":118,"source_url":119},142,"如何在 NullClaw 中添加 Claude 模型作为自定义提供商？","可以在配置中添加自定义模型支持，有用户分享了实际使用的配置截图（API 密钥已隐藏）。建议参考社区配置示例，并确保正确设置模型端点和 API 密钥。","https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fissues\u002F117",{"id":121,"question_zh":122,"answer_zh":123,"source_url":124},143,"为什么 Agent 无法使用 shell 或调用工具？提示“Shell 被 allowlist 策略阻止”","这是运行时配置问题。需检查 agent 的配置文件，确保 shell 命令已加入 allowlist。有用户反馈通过启用所有命令（如使用提示词“I have enabled ALL commands for you. Just try it”）或应用 PR #217 的修复解决了该问题。","https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fissues\u002F206",{"id":126,"question_zh":127,"answer_zh":128,"source_url":129},144,"配置了 OpenTelemetry (otel) 诊断后，为什么没有数据发送到 Collector？","虽然配置正确且网络连通性正常，但遥测数据可能需要多个 agent 轮次（agent turns）才会开始上报。有用户确认在执行几次交互后数据成功出现在 Collector 中。此外，当前遥测信息较为高层，详细内容（如 LLM 请求\u002F响应、工具调用详情）仍在完善中。","https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fissues\u002F638",{"id":131,"question_zh":132,"answer_zh":133,"source_url":134},145,"为什么聊天回复中会显示 \u003C|tool_call_begin|> 等内部标签？","这是由于流式传输模式下标签泄露所致，尤其与 Telegram 新 API（PR #299）相关。有时标签会先显示随后被清除。临时解决方案是回退或禁用该 PR 的更改。","https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fissues\u002F349",{"id":136,"question_zh":137,"answer_zh":138,"source_url":139},146,"在 Telegram 中启用 \u002Freasoning on 后，为什么看不到推理过程？","该功能依赖于所使用的模型和后端（如 OpenRouter）。有维护者指出需确认是否使用 OpenRouter，并强调将思考、工具调用、推理和答案作为独立字段展示非常重要。部分用户报告在特定配置下（如 Kimi + OpenRouter）该功能最终可正常工作。","https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fissues\u002F311",[141,146,151,156,161,166,171,176,181,186,191,196,201,206,211,216,221,226,231,236],{"id":142,"version":143,"summary_zh":144,"released_at":145},99809,"v2026.4.4","## What's Changed\n* feat(cron): wire up session_target routing for agent jobs by @sanderdewijs in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F666\n* fix(ollama): avoid empty chat responses by default \u002F 修复 Ollama 默认空响应问题 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F668\n* v2026.3.21 by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F670\n* fix(web): clarify public-bind guidance for browser UI \u002F 澄清浏览器 UI 公网绑定使用指引 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F672\n* fix(compatible): enable reasoning for custom vLLM\u002FQwen endpoints \u002F 为自定义 vLLM\u002FQwen 兼容接口启用推理 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F669\n* docs: refine navigation and runtime guidance by @telagod in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F713\n* docs: add reliability and model fallbacks section \u002F 文档：新增可靠性与模型备选配置说明 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F695\n* fix(shell): stop hanging on interactive commands \u002F 修复交互式命令导致挂起的问题 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F673\n* feat(inbound): debounce rapid-fire text across Telegram, Discord, and CLI \u002F 为 Telegram、Discord 与 CLI 的连续文本消息增加入站防抖 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F676\n* provider: resolve explicit custom-url model refs by @juslintek in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F681\n* fix(error_classify): handle msg field and image+not-supported pattern by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F685\n* feat(a2a): multi-modal support — agent card capability, inlineData forwarding, vision probe by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F686\n* fix: respect NULLCLAW_HOME in cron.zig config directory resolution by @realrubberduckdev in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F692\n* fix\u002Fmarkdown timestamp temporal decay clean by @shkarlsson in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F679\n* refactor(main): route Telegram and Signal startup through shared channel loops \u002F 将 Telegram 与 Signal 的启动流程统一到共享轮询循环 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F677\n* feat(gateway): make HTTP body size limit and request timeout configurable by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F687\n* feat(otel): enrich observability with channel attribution, delegation tracing, and skill load spans \u002F 增强 OTEL 观测能力：新增渠道归属、委托追踪及技能加载耗时 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F693\n* feat: integrate sandbox support for shell tool execution by @shkarlsson in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F678\n* fix(gemini-cli): align ACP handshake with Gemini CLI 0.34 \u002F 使 gemini-cli 的 ACP 握手与 Gemini CLI 0.34 对齐 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F675\n* fix: telegram dupes, bifrost compatibility, and tool cache staleness \u002F 修复 Telegram 重复消息、Bifrost 兼容性及工具缓存失效 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F694\n\n## New Contributors\n* @realrubberduckdev made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F692\n* @shkarlsson made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F679\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.3.21...v2026.4.4","2026-04-05T00:43:19",{"id":147,"version":148,"summary_zh":149,"released_at":150},99810,"v2026.3.21","## What's Changed\r\n* v2026.3.18 by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F639\r\n* feat(runtime): add wasm3 interpreter by default by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F568\r\n* feat(agent): support configurable prompt timezone \u002F 特性(agent): 支持可配置的提示词时区 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F546\r\n* fix(security): resolve absolute wasmtime executable path \u002F 修复(security): 解析 wasmtime 可执行文件的绝对路径 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F536\r\n* [OneBot] auth hardening and operational health signal \u002F [OneBot] 认证加固与运行健康信号 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F554\r\n* fix(agent): robustify tool-call parsing for malformed LLM outputs \u002F 修复(agent): 增强对格式错误 LLM 输出的工具调用解析 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F551\r\n* fix(lark): improve websocket reconnect logging and permission diagnostics \u002F 修复(lark): 改进 WebSocket 重连日志与权限诊断 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F552\r\n* [Lark] operations readiness runbook (EN\u002F中文) \u002F [Lark] 运维就绪手册（英\u002F中） by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F556\r\n* [QQ] websocket health signal hardening \u002F [QQ] websocket 健康信号加固 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F555\r\n* [DingTalk] operations readiness runbook (EN\u002F中文) \u002F [DingTalk] 运维就绪手册（英\u002F中） by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F557\r\n* fix(providers): enable native_tools for z.ai\u002Fglm aliases \u002F 修复(providers): 为 z.ai\u002Fglm 别名启用 native_tools by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F577\r\n* feat(wecom+wechat): implement secure callbacks and passive replies \u002F 特性(wecom+wechat): 实现安全回调与被动回复 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F559\r\n* fix(subagent): inject installed skills into delegated subagents \u002F 修复(subagent): 将已安装的技能注入到委派的子代理中 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F558\r\n* fix(providers\u002Fcompatible): return NoResponseContent when all fields are null\u002Fempty by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F584\r\n* fix(fs): avoid statx-dependent makePath for Linux \u003C 4.11 by @juvenn in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F589\r\n* fix(compatible): handle kimi-k2.5 reasoning_content responses \u002F 修复(compatible): 处理 kimi-k2.5 reasoning_content 响应 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F578\r\n* docs(agents): add §8.1 test coverage mandate by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F590\r\n* feat(providers): make max_streaming_prompt_bytes configurable per-provider by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F591\r\n* feat(providers): add Hunyuan (Tencent Cloud) and Baichuan to compat_providers \u002F 特性(providers): 新增混元（腾讯云）与百川提供商 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F595\r\n* feat(security): Tencent platform crypto primitives (AES-256-CBC, TC3-HMAC-SHA256, WeChat SHA-1) \u002F 特性(security): 腾讯平台加密原语 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F593\r\n* fix(providers): detect stalled SSE streams with curl speed-limit; cap non-streaming fallback timeout by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F597\r\n* feat(channels): abstract OutboundPayload port + sendRich for DingTalk and Lark Card 2.0 \u002F 特性(channels): 抽象富消息端口 + DingTalk\u002FLark Card 2.0 sendRich 实现 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F596\r\n* feat(providers): support Ollama cloud API key with Bearer auth by @juvenn in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F615\r\n* docs: clarify workspace_path and system_prompt behavior by @vedmalex in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F620\r\n* fix(memory): make durable recall work across sessions | 修复(memory): 让持久记忆在跨会话场景下正常召回 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F650\r\n* fix(agent): ensure profile-aware hot reload and add \u002Fconfig to telegram menu | 修复(agent): 确保 profile 感知的热重载并将 \u002Fconfig 添加至 Telegram 菜单 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F622\r\n* Add Gemini CLI as a local provider using ACP mode by @mailiam in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F628\r\n* Use portable_atomic.zig to simplify u64 atomic access by @Centauria in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F640\r\n* fix(cron): allow agent jobs to omit command field in cron.json by @yanggf8 in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F643\r\n* fix(providers): fix GLM\u002FZhipuAI thinking mode and native tool_calls by @yanggf8 in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F641\r\n* fix(config): allow http:\u002F\u002F MCP URLs for localhost, private IPs, and Tailscale CGNAT range by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F642\r\n* docs(a2a): expand protocol doc and examples + add config details and method reference by @hfreire in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F649\r\n* fix: nix build error in NixOS-25.11 by @cloudsbit in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F653\r\n* fix(cron): add --account flag to cron add-agent CLI by @yanggf8 in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F645\r\n* fix(config): accept flat O","2026-03-21T14:42:13",{"id":152,"version":153,"summary_zh":154,"released_at":155},99811,"v2026.3.18","## What's Changed\n* v2026.3.17 by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F614\n* feat(providers): add Novita AI as OpenAI-compatible provider by @Alex-wuhu in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F621\n* fix(docker): update container starter config to current schema | 修复(docker): 将容器初始配置更新为当前配置结构 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F636\n* fix(telegram): suppress draft retries for invalid peers | 修复(telegram): 对无效 peer 停止重试草稿请求 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F635\n* fix(matrix): use joined member count for private room detection | 修复(matrix): 使用已加入成员数判断私聊房间 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F634\n* fix(agent): inject configured AIEOS identity into system prompts | 修复(agent): 将已配置的 AIEOS identity 注入系统提示词 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F633\n* fix(nix): pin flake dev shell to Zig 0.15.2 | 修复(nix): 将 flake 开发环境固定为 Zig 0.15.2 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F637\n* fix(a2a): update to v0.3.0 + add new task states + refine message handling and enhance history support by @hfreire in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F630\n\n## New Contributors\n* @Alex-wuhu made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F621\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.3.17...v2026.3.18","2026-03-19T02:57:54",{"id":157,"version":158,"summary_zh":159,"released_at":160},99812,"v2026.3.17","## What's Changed\n* v2026.3.15 by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F582\n* Add runtime observability wiring and OTLP support by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F600\n* feat(channels): add hardened external channel plugins by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F604\n* feat: per-agent workspace isolation by @DNature in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F275\n* refactor(interactions): move command and callback rules into shared core \u002F 重构(interactions): 将命令与回调规则移入共享核心 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F294\n* feat(session): claim-gated per-peer auto-provision with isolated runtimes \u002F 特性(session): 带身份验证的按对等端自动配置与隔离运行时 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F297\n* fix(security): harden browser read URL handling \u002F 修复(security): 加固浏览器读取工具的 URL 处理 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F532\n* fix(matrix): handle invites and sync policy by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F610\n* feat(email): email channel with IMAP IDLE and community example by @sanderdewijs in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F451\n* fix(providers): fall back to non-streaming on CurlWaitError for… by @brunojuliao in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F608\n* fix(security): block yolo autonomy on non-loopback gateway \u002F 修复(security): 在非 loopback 网关上阻止 yolo 自主模式 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F534\n* fix(security): implement secret key rotation \u002F 修复(security): 实现机密密钥轮换 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F538\n* fix(config): encrypt persisted api keys in config.json by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F609\n* fix(security): stop logging pairing code secrets \u002F 修复(security): 停止记录 pairing code 秘钥 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F535\n* feat(service): add OpenRC support on Linux \u002F feat(service): 支持 Linux OpenRC 服务管理 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F605\n* fix(tools): honor http_timeout_secs in http_request \u002F 修复(tools): 在 http_request 中遵循 http_timeout_secs by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F541\n* fix(security): warn on wildcard allowlist usage \u002F 修复(security): 使用通配符白名单时发出警告 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F539\n* feat(channels): extend external plugin message actions by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F611\n* fix(cron): improve diagnostics when cron tasks are not running (fixes #592) by @yassinebkr in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F598\n\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.3.15...v2026.3.17","2026-03-18T02:18:46",{"id":162,"version":163,"summary_zh":164,"released_at":165},99813,"v2026.3.15","## What's Changed\n* Bump version to 2026.3.14 by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F513\n* fix(cron): handle InvalidExe on macOS after in-place binary replacement by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F522\n* Use portable Atomic for Slack channel by @Centauria in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F523\n* fix(config): normalize legacy #topic: peer IDs in binding config by @vedmalex in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F529\n* fix(security): redact oversized sensitive header names by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F542\n* feat(http_request): include curl stderr in failure diagnostics by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F544\n* fix(onboard): add yolo autonomy option to wizard by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F545\n* fix(web): make websocket handshake size configurable by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F573\n* docs: fix typos, sync zh\u002Fen parity, update stats and command table by @telagod in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F563\n* fix(gateway): add port conflict detection before listen() by @lighterEB in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F515\n* feat(providers): auto discover qwen-portal oauth token by @juvenn in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F524\n* fix(http_request): make redaction buffer ownership explicit \u002F 修复(http_request): 明确脱敏缓冲区的内存所有权 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F543\n* refactor(http_request): remove dead std.http migration helpers \u002F 重构(http_request): 移除过时的 std.http 迁移辅助代码 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F560\n* fix(agent): suppress orphan closing tool-call tag from user-visible reply by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F570\n* fix(mcp): ensure MCP tools are initialized in all tool-building paths by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F567\n* refactor: remove dead code and redundant compilation tests \u002F 重构: 移除过时代码与冗余编译测试 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F562\n* docs: add Discord channel documentation by @msb090219 in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F528\n* fix(session): persist runtime slash settings across restores \u002F 修复(session): 在会话恢复时持久化运行时斜杠命令设置 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F530\n* fix(security): use constant-time bearer token comparison \u002F 修复(security): 使用等时比较验证 bearer 令牌 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F531\n* fix(security): enforce secrets encryption \u002F 修复(security): 强制执行机密加密 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F537\n* docs(config): subagent routing and AIEOS identity examples \u002F 文档(config): 子代理路由与 AIEOS 身份配置示例 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F547\n* fix(telegram): preserve attachment context when media processing fails \u002F 修复(telegram): 媒体处理失败时保留附件上下文 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F548\n* fix(errors): actionable provider network error guidance \u002F 修复(errors): 可操作的提供商网络错误指导 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F561\n* fix(http_request): reorder checks, allowlist SSRF bypass, HTTPS-only by @lighterEB in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F526\n* fix(agent): prevent redundant tool execution via turn-scoped deduplication \u002F 修复(agent): 通过轮次作用域去重防止冗余工具执行 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F572\n* feat(agent): hot reload for config and skills \u002F 特性(agent): 支持配置与技能的热重载 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F571\n* feat(mcp): support stateful streaming-compatible MCP over HTTP by @sheauhuu in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F566\n* fix(web): restore local WebChannel on Windows and vendor dependencies \u002F 修复(web): 恢复 Windows 本地 WebChannel 并同步依赖项 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F550\n* docs: add Discord community links by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F581\n* fix(lark): stabilize card action callback in websocket mode by @Yandre97 in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F564\n\n## New Contributors\n* @msb090219 made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F528\n* @sheauhuu made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F566\n* @Yandre97 made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F564\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.3.14...v2026.3.15\n\n","2026-03-16T02:11:57",{"id":167,"version":168,"summary_zh":169,"released_at":170},99814,"v2026.3.14","## What's Changed\n* Fix\u002Fmemory by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F486\n* fix(claude-cli): scope resume sessions to nullclaw sessions by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F478\n* fix(claude-cli): harden resume session handling by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F481\n* feat(onboard): use models.dev for model discovery by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F480\n* fix(websocket): stop TLS connections from closing prematurely on empty reads by @kuzeofficial in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F487\n* docs(agents): align naming contract with actual codebase conventions by @juvenn in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F483\n* Add the binary file to the PATH in installation guide for Windows by @neoliuhua in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F489\n* docs: ecosystem integration analysis and roadmap by @vedmalex in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F501\n* fix(session): resolve dangling provider pointer in named-agent sessions by @vedmalex in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F500\n* fix(agent): move single-message status lines to log.debug by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F491\n* Make skill installation continue on individual skill failures by @EdmondFrank in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F494\n* feat: integrate tunnel module into gateway startup by @lighterEB in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F502\n* feat(channels): add Microsoft Teams channel by @ethanbrown3 in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F438\n* fix(slack): persist interactive callbacks across HTTP requests by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F505\n* feat(config): auto-detect file paths in agent system_prompt by @vedmalex in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F459\n* fix(cli): honor --help for agent and gateway subcommands by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F511\n* fix(sse): accept no-space SSE data prefix by @BioniCosmos in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F509\n\n## New Contributors\n* @kuzeofficial made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F487\n* @EdmondFrank made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F494\n* @lighterEB made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F502\n* @BioniCosmos made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F509\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.3.13...v2026.3.14","2026-03-14T01:27:20",{"id":172,"version":173,"summary_zh":174,"released_at":175},99815,"v2026.3.13","## What's Changed\n* fix(agent): avoid immediate retries after rate limits by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F474\n* v2026.3.12 by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F476\n* 增加了windows用户直接使用二进制文件的说明 by @neoliuhua in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F479\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.3.12...v2026.3.13\n","2026-03-13T04:02:28",{"id":177,"version":178,"summary_zh":179,"released_at":180},99816,"v2026.3.12","## What's Changed\n* v2026.3.11 by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F443\n* fix: harden Telegram forum topics and configurable command menus by @vedmalex in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F436\n* fix(lark): use HEAVY_RUNTIME_STACK_SIZE for websocket thread to fix bus error on startup by @Nauxscript in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F445\n* Fix Codex OpenAI onboarding and probe flow by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F461\n* feat(tools): Hashline v3 - Context-Aware and Shift-Resilient Precision Editing by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F444\n* fix: support Telegram topic-specific agent bindings by @vedmalex in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F450\n* feat(skills): parse skill metadata from YAML frontmatter by @juvenn in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F446\n* docs: update stats, add history command, sync zh\u002Fen parity by @telagod in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F454\n* refactor: route structured assistant replies through the rich channel port by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F458\n* Add A2A (Agent-to-Agent) protocol support with JSON-RPC endpoints and configuration by @hfreire in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F456\n* feat: implement a full-duplex DingTalk stream mode channel by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F457\n* fix(fs): avoid statx-dependent file I\u002FO on Linux \u003C4.11 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F462\n* feat(discord): sender identity in ConversationContext + reply detection by @TheRefreshCNFT in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F460\n* docs(docker): document the official container install path by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F463\n* fix(cron): support anchored step schedules by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F464\n* docs(readme): label Chinese doc links in English by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F465\n* fix(onboard): prefer interactive chat in next steps by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F466\n* fix(service): report Windows service state to SCM by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F467\n* fix(onebot): run websocket gateway loop by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F469\n* 增加了windows系统中升级与卸载的内容 by @neoliuhua in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F471\n* docs(termux): add dedicated Android guide by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F470\n* feat: add Max messenger channel by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F468\n* Fix\u002Fmemory by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F472\n* Add update and uninstallation guide for windows users by @neoliuhua in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F475\n\n## New Contributors\n* @TheRefreshCNFT made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F460\n* @neoliuhua made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F471\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.3.11...v2026.3.12","2026-03-13T02:19:27",{"id":182,"version":183,"summary_zh":184,"released_at":185},99817,"v2026.3.11","## What's Changed\n* CI Release Flow optimization by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F421\n* fix(memory): harden ClickHouse engine ordering and transport checks by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F432\n* fix(lark): use correct websocket config endpoint URL (no open-apis path) by @Nauxscript in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F431\n* feat(telegram): add \u002Fallowlist and \u002Fskill to bot command menu by @juvenn in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F430\n* fix(agent): avoid double-free after history ownership transfer by @wanderingmeow in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F428\n* Add debug and error logging for curl operations in HTTP utilities by @hfreire in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F433\n* Feature\u002Fhub history memory skills cli by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F439\n* fix: recover malformed quoted tool names in XML tool calls by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F440\n* fix(subagent): avoid double-free of system prompt in runTaskWithTools by @ethanbrown3 in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F437\n* fix(skills): accept direct skill manifest paths by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F441\n* feat(tools): implement Hashline for precise and verifiable code editing by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F442\n\n## New Contributors\n* @Nauxscript made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F431\n* @ethanbrown3 made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F437\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.3.10...v2026.3.11","2026-03-12T01:24:25",{"id":187,"version":188,"summary_zh":189,"released_at":190},99818,"v2026.3.10","## What's Changed\n* fix(discord): accept replies to bot when require_mention is enabled by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F382\n* fix(streaming): hide pipe-delimited tool control tokens by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F384\n* fix(telegram): restore \u002Fstatus token count after session reload by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F383\n* fix(sse): support older curl fail-fast flag by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F385\n* fix(service): use stable Homebrew path for macOS launchd by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F398\n* Fix scheduled reminder delivery and chat routing for multi-account channels by @0akess in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F366\n* feat(provider): add support for azure openai provider by @kunalk16 in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F365\n* docs(readme): refresh project metrics and test counts by @0akess in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F368\n* feat(skills): improve skills system prompt with structured guidance by @juvenn in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F363\n* Support http:\u002F\u002F URLs for search_base_url configuration by @hfreire in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F370\n* Fix local slash commands being suppressed in streaming REPL by @yuanmao1 in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F374\n* feat(shell): sandbox-validated path environment variables by @jmylchreest in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F377\n* fix(security): scope git -C handling and support Signal Note to Self by @jmylchreest in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F378\n* fix(lark): bootstrap websocket via callback endpoint by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F386\n* fix(agent): strip fabricated tool results from XML turns by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F387\n* fix: enable Ollama native tool calling by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F388\n* fix: narrow compatible responses fallback by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F389\n* tune(prompt): remove duplicate tools listing in system prompt by @juvenn in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F390\n* fix(daemon): upgrade heartbeat thread stack to prevent stack overflow crashes by @sanderdewijs in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F392\n* fix(qq): localize inbound image attachments before vision processing by @gula00 in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F395\n* fix(config): accept named agent objects in agents section by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F399\n* docs(installation): clarify Termux native vs Android cross-build by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F397\n* fix(android): fail early with actionable build guidance by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F401\n* Fix delegate agent model refs without explicit provider by @juslintek in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F404\n* Add daemon-level auto-routing from model_routes by @juslintek in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F405\n* fix(session): Race Condition in Session Eviction Causes SIGSEGV by @wanderingmeow in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F406\n* fix: preserve configured exec policy on reset by @vedmalex in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F412\n* feat(prompt): enhance safety guidelines for system prompts with expli… by @chenhlSH in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F410\n* fix: enforce single-question channel choice menus by @vedmalex in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F414\n* fix: keep Telegram choice menus on split long replies by @vedmalex in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F415\n* fix(tools): fix PowerShell command execution on Windows by avoiding cmd.exe pipe interpretation by @qxo in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F416\n* fix(cron): enable agent message delivery to channels (#310) by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F362\n* Harden direct skill routing and Telegram delivery by @vedmalex in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F409\n\n## New Contributors\n* @kunalk16 made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F365\n* @hfreire made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F370\n* @jmylchreest made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F377\n* @sanderdewijs made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F392\n* @juslintek made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F404\n* @wanderingmeow made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F406\n* @vedmalex made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F412\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.3.8...v2026.3.10","2026-03-11T01:44:23",{"id":192,"version":193,"summary_zh":194,"released_at":195},99819,"v2026.3.8","## What's Changed\n* docs: improve onboarding and align CLI help with command docs by @telagod in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F347\n* file-read shows clear message on error by @ats-bcon in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F336\n* fix(status,threads): estimate fallback tokens and align runtime stack budgets by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F340\n* feat(slack): add reply_to_mode for thread-aware replies by @kokuyouwind in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F342\n* fix(prompt): cap total injected bootstrap context by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F346\n* refactor(telegram): extract control plane, api client, and update ingress by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F345\n* fix: skip vision-incapable providers in ReliableProvider routing loop by @kronk307 in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F352\n* Feat screenshot on windows by @qxo in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F350\n* fix: avoid NameTooLong on Windows by @yuanmao1 in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F353\n* fix(telegram): debounce split long messages across getUpdates polls by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F333\n* fix(threads): raise daemon\u002Fsession thread stacks to 1024KiB by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F335\n* fix(shell): normalize Windows tool output to avoid follow-up error.CurlFailed by @yuanmao1 in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F357\n* feat(file_read): add binary file detection to prevent garbled output by @qxo in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F358\n\n## New Contributors\n* @kronk307 made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F352\n* @yuanmao1 made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F353\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.3.7...v2026.3.8\n\n","2026-03-09T02:19:38",{"id":197,"version":198,"summary_zh":199,"released_at":200},99820,"v2026.3.7","## What's Changed\n* agent: accept \u002Fthink on as medium alias by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F330\n* fix(telegram): require non-empty text for sendMessageDraft by @juvenn in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F329\n* feat: add yolo autonomy level by @DNature in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F332\n* fix(slack): apply markdown-to-mrkdwn conversion in sendMessage by @kokuyouwind in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F325\n\n## New Contributors\n* @DNature made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F332\n* @kokuyouwind made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F325\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.3.5...v2026.3.7","2026-03-07T04:05:10",{"id":202,"version":203,"summary_zh":204,"released_at":205},99821,"v2026.3.5","## What's Changed\n* fix(agent): suppress malformed tool_call markup in channel replies by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F296\n* fix(security): allow null-sink redirects in shell policy by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F303\n* fix(onboard): make BOOTSTRAP lifecycle path handling Windows-safe by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F302\n* fix(security): honor full autonomy with empty allowed_commands by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F305\n* Feat\u002Fwizard by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F315\n* fix: align web_fetch allowlist enforcement with http_request (closes #202) by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F306\n* feat(telegram): stream partial responses via sendMessageDraft by @juvenn in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F299\n* fix(lark): honor receive_mode for listener registration by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F300\n* fix(providers): surface API error detail on AllProvidersFailed by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F304\n* chore(logs): disambiguate truncated marker in diagnostics by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F309\n* fix(providers): unify reasoning request+parse across providers by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F318\n* Telegram \u002Fstop hard-stop: interrupt in-flight tools and report effective interruptions by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F321\n\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.3.4...v2026.3.5","2026-03-06T01:29:24",{"id":207,"version":208,"summary_zh":209,"released_at":210},99822,"v2026.3.4","## What's Changed\n* allow safe bootstrap deletion via rm\u002Ftrash by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F264\n* fix(arm32): harden 32-bit compatibility across runtime and CI by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F261\n* fix(http_request): preload CA bundle before TLS connect (#242) by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F258\n* fix(cron): persist last status for cron runs by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F267\n* gateway: assemble HTTP requests incrementally to avoid aborted connections by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F259\n* onboard: make AGENTS memory guidance backend-aware by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F262\n* memory: preserve archive\u002Fconversation content before hygiene deletion by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F266\n* fix(agent): prevent ContextLengthExceeded on legacy gpt-4 by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F268\n* fix(sqlite): detect 9p\u002FNFS\u002FCIFS and fall back to DELETE journal mode by @illustris in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F269\n* feat(providers): add Vertex AI Gemini provider by @akfpnd in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F270\n* fix: Cast dim_idx to u64 without truncation by @Centauria in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F273\n* fix(openai-codex): send request body via stdin to curl by @gula00 in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F276\n* docs(zh): add comprehensive Chinese documentation by @telagod in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F278\n* feat(agent): per-turn MCP tool filtering via tool_filter_groups by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F281\n* fix(compatible): strip leaked \u003Cthink> reasoning content by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F280\n* fix(capabilities): populate runtime_loaded in CLI --json output by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F284\n* fix(examples): build cloudflare worker wasm with build-exe by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F285\n* fix(compatible): expose think-tag reasoning to \u002Freasoning output by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F286\n* Fix: URL Special Characters (`?` and `&`) in Command Strings by @brunojuliao in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F287\n* fix(shell): handle markdown-fenced tool command payloads by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F288\n* chore(core): reduce helper duplication across agent\u002Fchannels\u002Ftools by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F295\n\n## New Contributors\n* @akfpnd made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F270\n* @gula00 made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F276\n* @telagod made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F278\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.3.3...v2026.3.4","2026-03-05T00:40:04",{"id":212,"version":213,"summary_zh":214,"released_at":215},99823,"v2026.3.3","## What's Changed\n* feat: Config.load() respects NULLCLAW_HOME env for config directory by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F237\n* usage ledger by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F244\n* feat(onboard): add custom:prefix to support OpenAI-compatible providers easily and add --model flag for onboard command by @qxo in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F239\n* Feat support net proxy and API error truncation limit configurable  via env var by @qxo in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F240\n* allowlist pattern by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F248\n* guard streaming path when stream context is missing by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F247\n* update zig2nix lock by @illustris in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F246\n* fix windows console utf8 input for interactive agent by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F249\n* issue 190 spawn agent profile by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F252\n* Update README.md by @planktonfun in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F250\n* Fix tool-call leakage and duplicated outbound text in malformed tool outputs by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F251\n* issue 190 subagent slash command by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F254\n* fix: harden auth\u002Fcron\u002Ftunnel\u002Fwebsocket paths from issue #243 by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F257\n* Vector search: exact top-k optimization + optional sqlite_ann prefilter (#194) by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F256\n\n## New Contributors\n* @qxo made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F239\n* @illustris made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F246\n* @planktonfun made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F250\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.3.2...v2026.3.3","2026-03-04T00:46:44",{"id":217,"version":218,"summary_zh":219,"released_at":220},99824,"v2026.3.2","## What's Changed\n* Feat\u002Fexport manifest by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F232\n* fix(http_util): free stdout on all error paths in curlPostWithProxy by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F211\n* feat(tools): add PushoverTool for push notifications by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F212\n* build: static link by @phanen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F213\n* fix(gemini): retain env var API key instead of discarding it by @optimistengineer in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F214\n* Add Smart Reply, Parallel Processing, User-Agent Config, and Fix Cron Delivery by @sbfkcel in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F216\n* Fix allowed_commands and autonomy not working properly. by @rikur in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F217\n* Use portable Atomic for channels\u002Fqq.zig by @Centauria in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F219\n* add: \u002Fstatus shows nullclaw version + emoticons by @ats-bcon in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F224\n* \"nullclaw cron runs\" now shows human readable UTC time by @ats-bcon in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F226\n* fix(git): support multiple paths for git operations by @juvenn in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F227\n* Fireworks.ai max_tokens fix. Also fixed the check. by @brunojuliao in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F231\n\n## New Contributors\n* @optimistengineer made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F214\n* @sbfkcel made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F216\n* @rikur made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F217\n* @ats-bcon made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F224\n* @brunojuliao made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F231\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.3.1...v2026.3.2\n\n## What's Changed\n* Feat\u002Fexport manifest by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F232\n* fix(http_util): free stdout on all error paths in curlPostWithProxy by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F211\n* feat(tools): add PushoverTool for push notifications by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F212\n* build: static link by @phanen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F213\n* fix(gemini): retain env var API key instead of discarding it by @optimistengineer in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F214\n* Add Smart Reply, Parallel Processing, User-Agent Config, and Fix Cron Delivery by @sbfkcel in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F216\n* Fix allowed_commands and autonomy not working properly. by @rikur in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F217\n* Use portable Atomic for channels\u002Fqq.zig by @Centauria in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F219\n* add: \u002Fstatus shows nullclaw version + emoticons by @ats-bcon in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F224\n* \"nullclaw cron runs\" now shows human readable UTC time by @ats-bcon in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F226\n* fix(git): support multiple paths for git operations by @juvenn in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F227\n* Fireworks.ai max_tokens fix. Also fixed the check. by @brunojuliao in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F231\n\n## New Contributors\n* @optimistengineer made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F214\n* @sbfkcel made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F216\n* @rikur made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F217\n* @ats-bcon made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F224\n* @brunojuliao made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F231\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.3.1...v2026.3.2\n\n## What's Changed\n* Feat\u002Fexport manifest by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F232\n* fix(http_util): free stdout on all error paths in curlPostWithProxy by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F211\n* feat(tools): add PushoverTool for push notifications by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F212\n* build: static link by @phanen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F213\n* fix(gemini): retain env var API key instead of discarding it by @optimistengineer in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F214\n* Add Smart Reply, Parallel Processing, User-Agent Config, and Fix Cron Delivery by @sbfkcel in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F216\n* Fix allowed_commands and autonomy not working properly. by @rikur in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F217\n* Use portable Atomic for channels\u002Fqq.zig by @Centauria in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F219\n* add: \u002Fstatus shows nullclaw version + emoticons by @ats-bcon in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fn","2026-03-02T23:31:36",{"id":222,"version":223,"summary_zh":224,"released_at":225},99825,"v2026.3.1","## What's Changed\n* Codex\u002Fissue 135 GitHub skill install by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F139\n* feat(telegram): merge consecutive messages from same sender by @sleep3r in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F145\n* fix(build): stabilize sqlite3 dependency for ReleaseSmall builds by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F147\n* cron: execute shell jobs from configured workspace cwd by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F148\n* Add Telegram interactive choices support by @0akess in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F153\n* feat(config): add workspace_dir_override for user-specified workspace path by @chenhlSH in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F154\n* Patch fix: enhance agent stability, robustify tool parsing, and enable web tools by @manelsen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F157\n* feat(observability): add detail field to tool_call events by @jsj in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F158\n* fix(tools): include command in ApprovalRequired error message by @jsj in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F159\n* feat(session): add reloadSkillsAll for hot-reloading skills by @jsj in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F160\n* feat(gateway): add tool event tracking to webhook responses by @jsj in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F161\n* fix(websocket): read HTTP 101 response byte-by-byte to prevent frame data loss by @vernonstinebaker in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F162\n* Feat\u002Fnostr channel clean by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F175\n* fix(update): curl error.StdoutStreamTooLong in self-update by @juvenn in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F165\n* fix(update): stream download to file to avoid memory limit by @jd316 in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F166\n* feat: add web channel (WebSocket server) by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F151\n* Feat\u002Fweb channel by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F177\n* feat(lark): add WebSocket support for Lark channel by @ekil1100 in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F168\n* feat(onboard): add claude-cli and codex-cli to provider selection by @zangzhicong in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F170\n* Add portable Atomic wrapper and switch to it by @Centauria in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F176\n* fix(agent): honor --provider\u002F--model CLI overrides by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F178\n* feat: full web search provider stack and wildcard shell settings by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F179\n* fix(slack): harden auth handling and token compatibility checks by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F180\n* fix(security): harden autonomy wildcard allowlist matching by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F181\n* agent: add actionable hint for openai-codex auth mismatch by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F182\n* build: fix illegal-instruction startup on Windows\u002FLinux x86_64 releases by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F184\n* feat(cron): run real agent jobs and add add-agent commands by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F208\n* feat: add Telnyx as AI provider + voice transcription by @a692570 in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F185\n* Add Modal + Matrix multi-agent deployment example by @TanGentleman in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F187\n* feat: Add IRC to integration catalog + MeshRelay as agent communication provider by @0xultravioleta in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F188\n* fix: use HTTP PUT for Matrix send and typing endpoints by @TanGentleman in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F189\n* docs: add CLAUDE.md with build commands, architecture, and conventions by @renato-umeton in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F199\n* feat(qq): implement WebSocket gateway loop and v2 auth by @phanen in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F197\n* chore(provider): surface error response for custom provider by @juvenn in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F200\n* signal: keep daemon default and add REST mode compatibility by @TanGentleman in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F143\n* feat: add restart option to service command by @Rastrian in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F207\n\n## New Contributors\n* @chenhlSH made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F154\n* @manelsen made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F157\n* @jsj made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F158\n* @vernonstinebaker made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F162\n* @juvenn made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F165\n* @ekil1100 made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F168\n* @zangzhicong made their first contribution in https:\u002F\u002Fgithub.com\u002F","2026-03-02T00:36:04",{"id":227,"version":228,"summary_zh":229,"released_at":230},99826,"v2026.2.26","## What's Changed\n* fix\u002Fclaude_cli: --verbose is required when output-format=stream-json by @xinzhengzhang in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F125\n* fix(signal): keep typing indicator alive for the full duration of processing by @ibhagwan in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F124\n* feat(providers): add OpenRouter streaming support by @yassinebkr in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F126\n* feat(providers): add Gemini streaming support by @yassinebkr in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F127\n* fix(telegram): add curl timeouts to all network calls by @sleep3r in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F134\n* feat: add wasm build target and edge telegram worker mvp by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F132\n* feat(providers): add Gemini OAuth token refresh and GEMINI_OAUTH_TOKEN env var by @yassinebkr in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F128\n* feat(diagnostics): add log toggles for tool calls and message receipts by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F133\n* fix(gateway): enforce security policy in daemon\u002Fchannel runtime by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F138\n\n## New Contributors\n* @xinzhengzhang made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F125\n* @yassinebkr made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F126\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.2.25...v2026.2.26","2026-02-27T01:43:08",{"id":232,"version":233,"summary_zh":234,"released_at":235},99827,"v2026.2.25","## What's Changed\n* fix(providers): respect base_url and add native_tools toggle for custom providers by @sleep3r in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F119\n* config: preserve extended fields on save by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F118\n* fix(discord): keep typing indicator alive for the full duration of processing by @TanGentleman in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F115\n* stop scaffolding unused persona and rules files by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F121\n* feat(channels\u002Fsignal): add attachment upload support by @ibhagwan in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F120\n* [Feature]Memory by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F123\n\n## New Contributors\n* @TanGentleman made their first contribution in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F115\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.2.24...v2026.2.25","2026-02-26T01:16:45",{"id":237,"version":238,"summary_zh":239,"released_at":240},99828,"v2026.2.24","## What's Changed\n* Codex\u002Fissue 97 arm64 daemon crash by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F99\n* Codex\u002Fissue 96 service install filenotfound by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F98\n* fix(cron): reload runtime jobs and honor cron expressions by @DonPrus in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F101\n* fix(docker): add OCI source label for ghcr visibility by @streambinder in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F103\n* fix(docker): build and push multi-arch image (amd64 + arm64) by @streambinder in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F106\n* feat(signal): implement streaming SSE for real-time message delivery by @ibhagwan in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F95\n* feat(telegram): add document\u002Ffile message handling with media group s… by @sleep3r in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F104\n* fix(docker): use bare IPv6 address :: instead of bracketed [::] by @dkd-dobberkau in https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fpull\u002F108\n\n\n**Full Changelog**: https:\u002F\u002Fgithub.com\u002Fnullclaw\u002Fnullclaw\u002Fcompare\u002Fv2026.2.23...v2026.2.24","2026-02-25T00:18:46"]