### 亮点
- 命令行界面:`clawdbot status` 现改为表格形式,并显示操作系统/更新/网关/守护进程/代理/会话信息;`status --all` 会添加一份完整的只读调试报告(表格、日志尾部、Tailscale 摘要以及通过 OSC-9 + 旋转光标显示的扫描进度)。
- 命令行后端:增加了带有断点续传支持(文本输出)和用于新运行的 JSONL 解析功能的 Codex CLI 备用方案,以及一个实时的 CLI 续传探测功能。
- 命令行界面:增加了 `clawdbot update`(相对安全的 git checkout 更新)以及 `--update` 简写形式。(#673)——感谢 @fm1randa。
- 网关:增加了兼容 OpenAI 的 `/v1/chat/completions` HTTP 端点(认证、SSE 流式传输、按代理路由)。(#680)——感谢 @steipete。
### 变更
- 入门引导/模型:增加了对 Z.AI (GLM) 的一等认证支持(`zai-api-key`)以及 `--zai-api-key` 标志。
- 命令行界面/入门引导:在配置/引导过程中增加了 OpenRouter API 密钥认证选项。(#703)——感谢 @mteam88。
- 代理:在区块回复之间增加了模拟人工延迟的节奏(模式:关闭/自然/自定义,可按代理配置)。(#446)——感谢 @tony-freedomology。
- 代理/浏览器:增加了 `browser.target`(沙箱/主机/自定义),通过 `agents.defaults.sandbox.browser.allowHostControl` 进行沙箱主机控制门控,为自定义控制 URL/主机/端口设置了允许列表,并扩展了浏览器工具文档(远程控制、配置文件、内部机制)。
- 入门引导/模型:在入门引导和配置中增加了基于目录的默认模型选择器。(#611)——感谢 @jonasjancarik。
- 代理/OpenCode Zen:更新了备用模型和默认设置,保留了旧的别名映射。(#669)——感谢 @magimetal。
- 提供商:统一了各提供商的群组历史上下文包装器,支持按提供商/按账户覆盖 `historyLimit`(回退到 `messages.groupChat.historyLimit`)。设置为 `0` 以禁用。(#672)——感谢 @steipete。
- 网关/心跳:可选择性地传递心跳的 `Reasoning:` 输出(`agents.defaults.heartbeat.includeReasoning`)。(#690)
- Docker:在 `docker-setup.sh` 中允许可选的主目录卷和额外的绑定挂载。(#679)——感谢 @gabriel-trigo。
### 修复
- 命令行界面/状态:将表格扩展至终端全宽;澄清了提供商设置与运行时警告的区别;更详细的提供商信息;在 `status` 中显示令牌预览,同时保持 `status --all` 的编辑版本;添加了故障排除链接页脚;保持日志尾部可粘贴;在可到达时显示所使用的网关认证;展示提供商运行时错误(Signal/iMessage/Slack);强化 `tailscale status --json` 的解析;使 `status --all` 的扫描进度确定化;并将页脚替换为三行的“后续步骤”建议(分享/调试/探测)。
- 命令行界面/网关:澄清 `clawdbot gateway status` 报告的是 RPC 健康状态(连接 + RPC),并分别显示 RPC 故障和连接故障。
- 命令行界面/更新:根据标准输出是否为 TTY 来控制进度旋转光标的显示,并对齐清理检查步骤的标签。(#701)——感谢 @bjesuiter。
- Telegram:增加了 `/whoami` 和 `/id` 命令以显示发送者 ID 用于允许列表;在 `allowFrom` 提示中允许使用 `@用户名` 和带前缀的 ID(带有稳定性警告)。
- 控制界面:停止自动写入 `telegram.groups["*"]`,并在启用通配符群组前发出警告/要求确认。
- WhatsApp:仅对已处理的消息发送确认反应,并忽略旧的 `messages.ackReaction`(doctor 会将其复制到 `whatsapp.ackReaction`)。(#629)——感谢 @pasogott。
- 沙箱/技能:将技能镜像到沙箱工作区作为只读挂载,以便 `SKILL.md` 保持可访问。
- 终端/表格:支持 ANSI 安全换行,防止表格截断或颜色丢失;增加了回归测试覆盖。
- Docker:允许在构建镜像时安装可选的 apt 软件包,并记录了该构建参数。(#697)——感谢 @gabriel-trigo。
- 网关/心跳:即使主心跳回复是 `HEARTBEAT_OK`,也传递推理内容。(#694)——感谢 @antons。
- macOS:在签名重启时清除未签名的 launchd 覆盖设置,并在设置了仅附加/禁用标记时通过 doctor 发出警告。(#695)——感谢 @jeffersonwarrior。
- 代理:强制执行单写入者会话锁,并丢弃孤立的工具结果,以防止工具调用 ID 失败(适用于 MiniMax/Anthropic 兼容 API)。
- 文档:将 `clawdbot status` 作为首要诊断步骤,澄清 `status --deep` 的行为,并记录了 `/whoami` 和 `/id`。
- 文档/测试:澄清了实时工具和图像探测的方法,以及如何列出可测试的 `提供商/模型` ID。
- 测试/实时:使网关的 bash+读取探测能够适应不同提供商的格式,同时仍能验证真实的工具调用。
- WhatsApp:使用 authDir 反向映射检测群组中的 @lid 提及,并为提及门控解析自己的 JID E.164。(#692)——感谢 @peschee。
- 网关/认证:在入门引导期间默认在环回地址上使用令牌认证,增加了 doctor 令牌生成流程,并将音频转录配置收紧为仅限 Whisper。
- 提供商:跨提供商对入站消息进行去重,以避免因重新投递或重连导致重复的 LLM 运行。(#689)——感谢 @adam91holt。
- 代理:从隐藏的推理输出中剥离 `<thought>`/`<antthinking>` 标签,并在测试中覆盖标签变体。(#688)——感谢 @theglove44。
- macOS:将模型选择器的选择保存为标准化的提供商/模型 ID,并使手动输入保持一致。(#683)——感谢 @benithors。
- 代理:将“使用限制”错误识别为故障转移的速率限制。(#687)——感谢 @evalexpr。
- 命令行界面:在跳过守护进程重启时避免显示成功消息。(#685)——感谢 @carlulsoe。
- 命令:默认禁用 `/config` 和 `/debug`;通过 `commands.config`/`commands.debug` 进行门控,并从原生注册/帮助输出中隐藏。
- 代理/系统:澄清子代理仍处于沙箱中,不能使用提升的主机访问权限。
- 网关:默认禁用兼容 OpenAI 的 `/v1/chat/completions` 端点;通过 `gateway.http.endpoints.chatCompletions.enabled=true` 启用。
- macOS:稳定桥接隧道,在断开连接时保护调用发送者,并清空标准输出/标准错误以避免死锁。(#676)——感谢 @ngutman。
- 代理/系统:在系统提示中澄清沙箱运行时环境,并在沙箱化时提示提升权限的可用性。
- 自动回复:优先使用 `RawBody` 进行命令/指令解析(WhatsApp + Discord),并防止备用运行干扰并发的会话更新。(#643)——感谢 @mcinteerj。
- WhatsApp:通过保留历史记录中的消息 ID 和发送者 JID 来修复群组反应;在对外反应中将参与者电话号码标准化为 JID。(#640)——感谢 @mcinteerj。
- WhatsApp:向模型公开群组参与者 ID,以便反应能够针对正确的发送者。
- Cron:`wakeMode: "now"` 会等待心跳完成(并在主通道繁忙时重试)。(#666)——感谢 @roshanasingh4。
- 代理/OpenAI:修复了仅工具调用的响应 → 后续回合的处理(避免独立的 `reasoning` 项触发 400 “required following item”错误),并在仅工具调用回合的响应/Codex 响应历史中重播推理项。
- 沙箱:增加了 `clawdbot sandbox explain`(有效的策略检查器 + 修复键);改进了“沙箱限制”工具策略/提升权限错误,提供了可操作的配置键路径;链接到文档。
- 钩子/Gmail:将 Tailscale 服务路径保持在 `/`,同时保留公共路径。(#668)——感谢 @antons。
- 钩子/Gmail:允许 Tailscale 目标 URL 保留内部服务路径。
- 认证:在刷新同步期间就地更新 Claude Code 钥匙串凭证;共享 JSON 文件辅助函数;增加 CLI 备用覆盖。
- 认证:限制外部 CLI 凭证同步频率(Claude/Codex),减少钥匙串读取,并在缓存凭证仍然有效时跳过同步。
- 命令行界面:`clawdbot status` 和 `clawdbot sessions` 命令现在遵循 `CLAWDBOT_STATE_DIR` 环境变量。
- 命令行界面:`clawdbot sessions` 现在在表格输出中包含 `elev:*` 和 `usage:*` 标志。
- 命令行界面/配对:为 `pairing list|approve` 接受位置参数形式的提供商(兼容 npm-run);更新文档/机器人提示。
- 品牌:将面向用户的 “ClawdBot”/“CLAWDBOT” 统一为标准大小写 “Clawdbot”(命令行界面、状态、文档)。
- 自动回复:修复了原生 `/model` 命令无法更新实际聊天会话的问题(Telegram/Slack/Discord)。(#646)
- Doctor:在 git 安装情况下,提供首先运行 `clawdbot update` 的选项(使 doctor 输出与最新版本保持一致)。
- Doctor:当安装目录为 `~/clawdbot` 时,避免错误的旧工作区警告。(#660)
- iMessage:修复了跨私信的推理持久性问题;在启用推理时避免部分/重复回复。(#655)——感谢 @antons。
- 模型/认证:允许 MiniMax API 配置在没有 `models.providers.minimax.apiKey` 的情况下工作(使用认证配置文件或 `MINIMAX_API_KEY` 环境变量)。(#656)——感谢 @mneves75。
- 代理:避免在消息工具发送时产生重复回复。(#659)——感谢 @mickahouan。
- 代理:强化了 Cloud Code Assist 工具 ID 的清理工作(toolUse/toolCall/toolResult),并清除了多余的 JSON Schema 约束。(#665)——感谢 @sebslight。
- 代理:在上下文构建时清理工具结果和 Cloud Code Assist 工具 ID(防止在运行中途因严格的提供商要求而被拒绝请求)。
- 代理/工具:解析相对于工作区的读/写/编辑路径;使 bash 的默认当前目录与工作区对齐。(#642)——感谢 @mukhtharcm。
- Discord:在代理会话上下文中包含转发的消息快照。(#667)——感谢 @rubyrunsstuff。
- Telegram:增加了 `telegram.draftChunk` 以调整 `streamMode: "block"` 时的草稿流式传输分块大小。(#667)——感谢 @rubyrunsstuff。
- 测试/代理:增加了对工作区工具路径解析和 bash 默认当前目录的回归测试覆盖。
- iOS/Android:启用更严格的并发/代码检查;修复了 Swift 6 严格并发问题以及 Android 代码检查错误(ExifInterface,过时的 SDK 检查)。(#662)——感谢 @KristijanJovanovski。
- iOS/macOS:共享 `AsyncTimeout`,在连接时需要显式提供 `bridgeStableID`,并强化工具显示默认设置(避免回退到缺少资源的标签)。
- Telegram:序列化媒体组处理,以避免在高负载下丢失相册。
- Signal:处理 `dataMessage.reaction` 事件(signal-cli SSE),以避免错误的附件错误。(#637)——感谢 @neist。
- 文档:增加了 ParentPay、R2 Upload、iOS TestFlight 和 Oura Health 的展示条目。(#650)——感谢 @henrino3。
- 代理:通过在整个历史记录中丢弃重复的工具结果来修复会话记录(在重试后解除了 Anthropic 兼容 API 的阻塞)。
- 测试/实时:在模型运行之间重置网关会话,以避免跨提供商的记录不兼容问题(特别是 OpenAI Responses 的推理重放规则)。
### Highlights
- CLI: `clawdbot status` now table-based + shows OS/update/gateway/daemon/agents/sessions; `status --all` adds a full read-only debug report (tables, log tails, Tailscale summary, and scan progress via OSC-9 + spinner).
- CLI Backends: add Codex CLI fallback with resume support (text output) and JSONL parsing for new runs, plus a live CLI resume probe.
- CLI: add `clawdbot update` (safe-ish git checkout update) + `--update` shorthand. (#673) — thanks @fm1randa.
- Gateway: add OpenAI-compatible `/v1/chat/completions` HTTP endpoint (auth, SSE streaming, per-agent routing). (#680) — thanks @steipete.
### Changes
- Onboarding/Models: add first-class Z.AI (GLM) auth choice (`zai-api-key`) + `--zai-api-key` flag.
- CLI/Onboarding: add OpenRouter API key auth option in configure/onboard. (#703) — thanks @mteam88.
- Agents: add human-delay pacing between block replies (modes: off/natural/custom, per-agent configurable). (#446) — thanks @tony-freedomology.
- Agents/Browser: add `browser.target` (sandbox/host/custom) with sandbox host-control gating via `agents.defaults.sandbox.browser.allowHostControl`, allowlists for custom control URLs/hosts/ports, and expand browser tool docs (remote control, profiles, internals).
- Onboarding/Models: add catalog-backed default model picker to onboarding + configure. (#611) — thanks @jonasjancarik.
- Agents/OpenCode Zen: update fallback models + defaults, keep legacy alias mappings. (#669) — thanks @magimetal.
- Providers: unify group history context wrappers across providers with per-provider/per-account `historyLimit` overrides (fallback to `messages.groupChat.historyLimit`). Set `0` to disable. (#672) — thanks @steipete.
- Gateway/Heartbeat: optionally deliver heartbeat `Reasoning:` output (`agents.defaults.heartbeat.includeReasoning`). (#690)
- Docker: allow optional home volume + extra bind mounts in `docker-setup.sh`. (#679) — thanks @gabriel-trigo.
### Fixes
- CLI/Status: expand tables to full terminal width; clarify provider setup vs runtime warnings; richer per-provider detail; token previews in `status` while keeping `status --all` redacted; add troubleshooting link footer; keep log tails pasteable; show gateway auth used when reachable; surface provider runtime errors (Signal/iMessage/Slack); harden `tailscale status --json` parsing; make `status --all` scan progress determinate; and replace the footer with a 3-line “Next steps” recommendation (share/debug/probe).
- CLI/Gateway: clarify that `clawdbot gateway status` reports RPC health (connect + RPC) and shows RPC failures separately from connect failures.
- CLI/Update: gate progress spinner on stdout TTY and align clean-check step label. (#701) — thanks @bjesuiter.
- Telegram: add `/whoami` + `/id` commands to reveal sender id for allowlists; allow `@username` and prefixed ids in `allowFrom` prompts (with stability warning).
- Control UI: stop auto-writing `telegram.groups["*"]` and warn/confirm before enabling wildcard groups.
- WhatsApp: send ack reactions only for handled messages and ignore legacy `messages.ackReaction` (doctor copies to `whatsapp.ackReaction`). (#629) — thanks @pasogott.
- Sandbox/Skills: mirror skills into sandbox workspaces for read-only mounts so SKILL.md stays accessible.
- Terminal/Table: ANSI-safe wrapping to prevent table clipping/color loss; add regression coverage.
- Docker: allow optional apt packages during image build and document the build arg. (#697) — thanks @gabriel-trigo.
- Gateway/Heartbeat: deliver reasoning even when the main heartbeat reply is `HEARTBEAT_OK`. (#694) — thanks @antons.
- macOS: clear unsigned launchd overrides on signed restarts and warn via doctor when attach-only/disable markers are set. (#695) — thanks @jeffersonwarrior.
- Agents: enforce single-writer session locks and drop orphan tool results to prevent tool-call ID failures (MiniMax/Anthropic-compatible APIs).
- Docs: make `clawdbot status` the first diagnostic step, clarify `status --deep` behavior, and document `/whoami` + `/id`.
- Docs/Testing: clarify live tool+image probes and how to list your testable `provider/model` ids.
- Tests/Live: make gateway bash+read probes resilient to provider formatting while still validating real tool calls.
- WhatsApp: detect @lid mentions in groups using authDir reverse mapping + resolve self JID E.164 for mention gating. (#692) — thanks @peschee.
- Gateway/Auth: default to token auth on loopback during onboarding, add doctor token generation flow, and tighten audio transcription config to Whisper-only.
- Providers: dedupe inbound messages across providers to avoid duplicate LLM runs on redeliveries/reconnects. (#689) — thanks @adam91holt.
- Agents: strip `<thought>`/`<antthinking>` tags from hidden reasoning output and cover tag variants in tests. (#688) — thanks @theglove44.
- macOS: save model picker selections as normalized provider/model IDs and keep manual entries aligned. (#683) — thanks @benithors.
- Agents: recognize "usage limit" errors as rate limits for failover. (#687) — thanks @evalexpr.
- CLI: avoid success message when daemon restart is skipped. (#685) — thanks @carlulsoe.
- Commands: disable `/config` + `/debug` by default; gate via `commands.config`/`commands.debug` and hide from native registration/help output.
- Agents/System: clarify that sub-agents remain sandboxed and cannot use elevated host access.
- Gateway: disable the OpenAI-compatible `/v1/chat/completions` endpoint by default; enable via `gateway.http.endpoints.chatCompletions.enabled=true`.
- macOS: stabilize bridge tunnels, guard invoke senders on disconnect, and drain stdout/stderr to avoid deadlocks. (#676) — thanks @ngutman.
- Agents/System: clarify sandboxed runtime in system prompt and surface elevated availability when sandboxed.
- Auto-reply: prefer `RawBody` for command/directive parsing (WhatsApp + Discord) and prevent fallback runs from clobbering concurrent session updates. (#643) — thanks @mcinteerj.
- WhatsApp: fix group reactions by preserving message IDs and sender JIDs in history; normalize participant phone numbers to JIDs in outbound reactions. (#640) — thanks @mcinteerj.
- WhatsApp: expose group participant IDs to the model so reactions can target the right sender.
- Cron: `wakeMode: "now"` waits for heartbeat completion (and retries when the main lane is busy). (#666) — thanks @roshanasingh4.
- Agents/OpenAI: fix Responses tool-only → follow-up turn handling (avoid standalone `reasoning` items that trigger 400 “required following item”) and replay reasoning items in Responses/Codex Responses history for tool-call-only turns.
- Sandbox: add `clawdbot sandbox explain` (effective policy inspector + fix-it keys); improve “sandbox jail” tool-policy/elevated errors with actionable config key paths; link to docs.
- Hooks/Gmail: keep Tailscale serve path at `/` while preserving the public path. (#668) — thanks @antons.
- Hooks/Gmail: allow Tailscale target URLs to preserve internal serve paths.
- Auth: update Claude Code keychain credentials in-place during refresh sync; share JSON file helpers; add CLI fallback coverage.
- Auth: throttle external CLI credential syncs (Claude/Codex), reduce Keychain reads, and skip sync when cached credentials are still fresh.
- CLI: respect `CLAWDBOT_STATE_DIR` for node pairing + voice wake settings storage. (#664) — thanks @azade-c.
- Onboarding/Gateway: persist non-interactive gateway token auth in config; add WS wizard + gateway tool-calling regression coverage.
- Gateway/Control UI: make `chat.send` non-blocking, wire Stop to `chat.abort`, and treat `/stop` as an out-of-band abort. (#653)
- Gateway/Control UI: allow `chat.abort` without `runId` (abort active runs), suppress post-abort chat streaming, and prune stuck chat runs. (#653)
- Gateway/Control UI: sniff image attachments for chat.send, drop non-images, and log mismatches. (#670) — thanks @cristip73.
- macOS: force `restart-mac.sh --sign` to require identities and keep bundled Node signed for relay verification. (#580) — thanks @jeffersonwarrior.
- Gateway/Agent: accept image attachments on `agent` (multimodal message) and add live gateway image probe (`CLAWDBOT_LIVE_GATEWAY_IMAGE_PROBE=1`).
- CLI: `clawdbot sessions` now includes `elev:*` + `usage:*` flags in the table output.
- CLI/Pairing: accept positional provider for `pairing list|approve` (npm-run compatible); update docs/bot hints.
- Branding: normalize user-facing “ClawdBot”/“CLAWDBOT” → “Clawdbot” (CLI, status, docs).
- Auto-reply: fix native `/model` not updating the actual chat session (Telegram/Slack/Discord). (#646)
- Doctor: offer to run `clawdbot update` first on git installs (keeps doctor output aligned with latest).
- Doctor: avoid false legacy workspace warning when install dir is `~/clawdbot`. (#660)
- iMessage: fix reasoning persistence across DMs; avoid partial/duplicate replies when reasoning is enabled. (#655) — thanks @antons.
- Models/Auth: allow MiniMax API configs without `models.providers.minimax.apiKey` (auth profiles / `MINIMAX_API_KEY`). (#656) — thanks @mneves75.
- Agents: avoid duplicate replies when the message tool sends. (#659) — thanks @mickahouan.
- Agents: harden Cloud Code Assist tool ID sanitization (toolUse/toolCall/toolResult) and scrub extra JSON Schema constraints. (#665) — thanks @sebslight.
- Agents: sanitize tool results + Cloud Code Assist tool IDs at context-build time (prevents mid-run strict-provider request rejects).
- Agents/Tools: resolve workspace-relative Read/Write/Edit paths; align bash default cwd. (#642) — thanks @mukhtharcm.
- Discord: include forwarded message snapshots in agent session context. (#667) — thanks @rubyrunsstuff.
- Telegram: add `telegram.draftChunk` to tune draft streaming chunking for `streamMode: "block"`. (#667) — thanks @rubyrunsstuff.
- Tests/Agents: add regression coverage for workspace tool path resolution and bash cwd defaults.
- iOS/Android: enable stricter concurrency/lint checks; fix Swift 6 strict concurrency issues + Android lint errors (ExifInterface, obsolete SDK check). (#662) — thanks @KristijanJovanovski.
- iOS/macOS: share `AsyncTimeout`, require explicit `bridgeStableID` on connect, and harden tool display defaults (avoids missing-resource label fallbacks).
- Telegram: serialize media-group processing to avoid missed albums under load.
- Signal: handle `dataMessage.reaction` events (signal-cli SSE) to avoid broken attachment errors. (#637) — thanks @neist.
- Docs: showcase entries for ParentPay, R2 Upload, iOS TestFlight, and Oura Health. (#650) — thanks @henrino3.
- Agents: repair session transcripts by dropping duplicate tool results across the whole history (unblocks Anthropic-compatible APIs after retries).
- Tests/Live: reset the gateway session between model runs to avoid cross-provider transcript incompatibilities (notably OpenAI Responses reasoning replay rules).