### 亮点
- **钩子**:新增钩子系统,包含捆绑钩子、CLI工具和文档。(#1028)——感谢 @ThomsenDrake。https://docs.clawd.bot/hooks
- **媒体**:新增对入站媒体(图片/音频/视频)的理解能力,支持提供商 + CLI 回退。https://docs.clawd.bot/nodes/media-understanding
- **插件**:新增 Zalo 个人插件 (`@clawdbot/zalouser`),并为插件统一了渠道目录。(#1032)——感谢 @suminhthanh。https://docs.clawd.bot/plugins/zalouser
- **模型**:新增 Vercel AI Gateway 认证选项及入门引导更新。(#1016)——感谢 @timolins。https://docs.clawd.bot/providers/vercel-ai-gateway
- **会话**:新增 `session.identityLinks`,用于跨平台 DM 会话关联。(#1033)——感谢 @thewilloftheshadow。https://docs.clawd.bot/concepts/session
- **网络搜索**:新增 `country`/`language` 参数(架构 + Brave API)及文档。(#1046)——感谢 @YuriNachos。https://docs.clawd.bot/tools/web
### 不兼容变更
- **不兼容变更:** `clawdbot message` 和消息工具现在需要 `target` 参数(目标地址不再使用 `to`/`channelId`)。(#1034)——感谢 @tobalsan。
- **不兼容变更:** 渠道认证现在优先使用配置文件,其次才是环境变量(针对 Discord/Telegram/Matrix,环境变量仅作回退)。(#1040)——感谢 @thewilloftheshadow。
- **不兼容变更:** 弃用旧的 `chatType: "room"`;请使用 `chatType: "channel"`。
- **不兼容变更:** 移除旧的、特定于提供商的目标解析回退机制;目标解析现在通过插件提示和目录查找集中处理。
- **不兼容变更:** `clawdbot hooks` 命令现已更名为 `clawdbot webhooks`;钩子相关功能现在位于 `clawdbot hooks` 命令下。https://docs.clawd.bot/cli/webhooks
- **不兼容变更:** `clawdbot plugins install <path>` 现在会将插件复制到 `~/.clawdbot/extensions` 目录下(如需保持基于路径的加载方式,请使用 `--link` 参数)。
### 变更
- **插件**:默认禁用已捆绑的插件,并允许通过已安装的版本进行覆盖。(#1066)——感谢 @ItzR3NO。
- **插件**:新增捆绑的 Antigravity、Gemini CLI OAuth 和 Copilot Proxy 提供商插件。(#1066)——感谢 @ItzR3NO。
- **工具**:使用 Readability 改进了 `web_fetch` 的提取能力(并保留回退方案)。
- **工具**:当配置了 Firecrawl 时,为 `web_fetch` 添加了 Firecrawl 回退方案。
- **工具**:`web_fetch` 默认发送类似 Chrome 的请求头,以改善在反机器人站点上的提取效果。
- **工具**:Firecrawl 回退方案现在默认使用机器人规避技术 + 缓存;当提取失败时,不再使用基础的 HTML 回退方案。
- **工具**:`exec` 工具默认启用退出通知,并自动将旧的 `tools.bash` 配置迁移到 `tools.exec`。
- **工具**:为 `exec` 工具添加了 PTY(伪终端)支持,以实现交互式会话。https://docs.clawd.bot/tools/exec
- **工具**:为 PTY 会话添加了 tmux 风格的 `process send-keys` 命令和括号粘贴辅助功能。
- **工具**:添加了 `process submit` 辅助功能,用于向 PTY 会话发送回车符。
- **工具**:现在可以响应 PTY 的光标位置查询,以解除交互式 TUI 的阻塞状态。
- **工具**:在详细模式下包含工具输出,并扩展了详细的工具反馈信息。
- **技能**:更新了编码助手指南,优先使用支持 PTY 的 exec 运行,并简化了 tmux 的使用。
- **TUI**:在会话运行完成或失败后,刷新会话令牌计数。(#1079)——感谢 @d-ploutarchos。
- **状态**:将 `/status` 命令精简为仅显示当前提供商的使用情况,并移除了 OAuth/令牌相关的信息块。
- **目录**:统一了 `clawdbot directory` 命令在普通渠道和插件渠道中的行为。
- **UI**:现在可以在控制界面中删除会话。
- **技能**:新增了用户可调用的技能命令,并扩展了技能命令的注册方式。
- **Telegram**:默认将反应级别设为最低,并默认启用反应通知。
- **Telegram**:允许回复链中的消息绕过群组中的提及限制。(#1038)——感谢 @adityashaw2。
- **iMessage**:为虚拟机/SSH 部署添加了远程附件支持。
- **消息**:在解析目标地址时,刷新实时目录缓存的结果。
- **消息**:将已发送的出站文本/媒体镜像记录到会话记录中。(#1031)——感谢 @TSavo。
- **消息**:避免 iMessage 和 Signal 群聊中产生重复的发送者信封信息。(#1080)——感谢 @tyler6204。
- **媒体**:标准化了 Deepgram 音频上传的字节格式,以确保兼容性。
- **定时任务**:隔离的定时任务现在每次运行都会创建一个新的会话 ID,以防止上下文累积。
- **文档**:新增 `/help` 帮助中心、Node/npm PATH 指南,并扩展了目录 CLI 的文档。
- **配置**:支持在配置值中进行环境变量替换。(#1044)——感谢 @sebslight。
- **健康检查**:新增每个代理的会话摘要和账户级别的健康详情,并允许选择性探测。(#1047)——感谢 @gumadeiras。
- **钩子**:新增钩子包安装功能(支持 npm/路径/zip/tar 格式),包含 `clawdbot.hooks` 清单文件和 `clawdbot hooks install/update` 命令。
- **插件**:新增 zip 包安装方式,以及 `--link` 参数以避免复制本地路径。
### 修复
- **macOS**:在等待子进程前先清空其管道,以避免死锁。(#1081)——感谢 @thesash。
- **详细模式**:仅在支持 Markdown 的渠道中将工具摘要/输出用 Markdown 包裹。
- **Telegram**:接受 tg/group/telegram 前缀 + 话题目标用于内联按钮验证。(#1072)——感谢 @danielz1z。
- **Telegram**:将过长的标题拆分为多条后续消息发送。
- **配置**:在配置无效时阻止启动,保留尽最大努力生成的 doctor 配置,并保持滚动配置备份。(#1083)——感谢 @mukhtharcm。
- **子代理**:标准化公告发送来源,并按 accountId 对队列进行分组,以保持多账户路由的稳定性。(#1061, #1058)——感谢 @adam91holt。
- **会话**:在 sessions.list 中包含 deliveryContext,并在公告/重启回退时重用标准化的发送路由。(#1058)
- **会话**:将 deliveryContext 传播到最后路由的更新中,以保持账户/渠道路由的稳定性。(#1058)
- **会话**:在 `/new` 重置时保留覆盖设置。
- **内存**:防止监视/间隔同步失败时出现未处理的拒绝异常。(#1076)——感谢 @roshanasingh4。
- **内存**:避免在嵌入模型返回 429/配额不足错误时导致网关崩溃(禁用工具并显示错误)。(#1004)
- **网关**:遵守明确的发送目标,不再隐式回退到 accountId;保留 lastAccountId 用于隐式路由。
- **网关**:当请求的渠道不同时,避免重用 last-to/accountId;使 deliveryContext 与最后路由字段同步。
- **构建**:允许在支持的平台上构建 `@lydell/node-pty`。
- **仓库**:修正 oxlint 配置文件名称,并将忽略模式移至配置文件中。(#1064)——感谢 @connorshea。
- **消息**:`/stop` 命令现在会硬中止队列中的后续消息和子代理运行;抑制计数为零的停止通知。
- **消息**:在去重发送时,遵循消息工具中指定的渠道。
- **消息**:跨渠道为实时群组消息包含发送者标签,使其与队列/历史消息的格式一致。(#1059)
- **会话**:在 `/new` 和 `/reset` 时重置 `compactionCount`,并保留 `sessions.json` 文件的权限模式(0600)。
- **会话**:在内嵌提示之前修复孤立的用户轮次。
- **会话**:`sessions.delete` 清理操作现在会硬停止相关进程。
- **渠道**:在支持的渠道中,将对机器人的回复视为隐式提及。
- **渠道**:在渠道能力解析中,标准化了对象格式的能力表示。
- **安全**:默认拒绝斜杠/控制命令,除非渠道计算得出 `CommandAuthorized`(修复了意外的“开放”行为),并确保 WhatsApp 和 Zalo 插件渠道正确拦截行内的 `/…` 令牌。https://docs.clawd.bot/gateway/security
- **安全**:在网关 WebSocket 日志中对敏感文本进行脱敏处理。
- **工具**:限制待处理的 `exec` 进程输出,以避免缓冲区无限增长。
- **CLI**:通过避免在标准化渠道 ID 时导入繁重的插件,加快了 `clawdbot sandbox-explain` 命令的速度。
- **浏览器**:远程配置文件标签页操作现在优先使用持久化的 Playwright 实例,并避免静默的 HTTP 回退。(#1057)——感谢 @mukhtharcm。
- **浏览器**:远程配置文件标签页操作的后续改进:共享 Playwright 加载器、基于 Playwright 的焦点功能,以及更多的覆盖范围(包括可选的实时 Browserless 测试)。(#1057 的后续)——感谢 @mukhtharcm。
- **浏览器**:导航后刷新扩展中继标签页的元数据,以确保 `/json/list` 信息保持最新。(#1073)——感谢 @roshanasingh4。
- **WhatsApp**:限定自言自语响应的前缀范围;仅注入待处理的群组历史消息,并在处理任何消息后清除。
- **WhatsApp**:在 `describeAccount` 中包含 `linked` 字段。
- **代理**:丢弃未签名的 Gemini 工具调用,并避免 JSON Schema 中 `format` 关键字的冲突。
- **代理**:当主要模型已支持图像时,隐藏图像工具。
- **代理**:避免在 `message` 工具发送后,又通过回复 `NO_REPLY` 造成重复发送。
- **认证**:子代理继承/合并主代理的认证配置文件。
- **网关**:为安全探测解析本地认证,并验证网关令牌/密码文件的权限模式。(#1011, #1022)——感谢 @ivanrvpereira, @kkarimi。
- **Signal/iMessage**:将传输就绪等待时间限制为 30 秒,并定期记录日志。(#1014)——感谢 @Szpadel。
- **iMessage**:避免 RPC 重启循环。
- **OpenAI 图像生成**:处理 URL + `b64_json` 响应,并移除已弃用的 `response_format`(改用 URL 下载)。
- **CLI**:当通过包管理器安装时,自动更新全局安装。
- **路由**:将旧的 `accountID` 绑定迁移到 `accountId`,并移除旧的回退查找逻辑。(#1047)——感谢 @gumadeiras。
- **Discord**:将技能命令描述截断为 100 个字符,以满足斜杠命令的长度限制。(#1018)——感谢 @evalexpr。
- **安全**:将 `tar` 依赖包升级到 7.5.3 版本。
- **模型**:对齐 ZAI 思考功能的切换开关。
- **iMessage/Signal**:为非队列群组消息包含发送者元数据。(#1059)
- **Discord**:在分割长消息时保留空白字符,以确保分割后的消息保持原有的间距。
- **技能**:修复了技能监视器忽略列表的类型定义问题(tsc)。
### Highlights
- Hooks: add hooks system with bundled hooks, CLI tooling, and docs. (#1028) — thanks @ThomsenDrake. https://docs.clawd.bot/hooks
- Media: add inbound media understanding (image/audio/video) with provider + CLI fallbacks. https://docs.clawd.bot/nodes/media-understanding
- Plugins: add Zalo Personal plugin (`@clawdbot/zalouser`) and unify channel directory for plugins. (#1032) — thanks @suminhthanh. https://docs.clawd.bot/plugins/zalouser
- Models: add Vercel AI Gateway auth choice + onboarding updates. (#1016) — thanks @timolins. https://docs.clawd.bot/providers/vercel-ai-gateway
- Sessions: add `session.identityLinks` for cross-platform DM session li nking. (#1033) — thanks @thewilloftheshadow. https://docs.clawd.bot/concepts/session
- Web search: add `country`/`language` parameters (schema + Brave API) and docs. (#1046) — thanks @YuriNachos. https://docs.clawd.bot/tools/web
### Breaking
- **BREAKING:** `clawdbot message` and message tool now require `target` (dropping `to`/`channelId` for destinations). (#1034) — thanks @tobalsan.
- **BREAKING:** Channel auth now prefers config over env for Discord/Telegram/Matrix (env is fallback only). (#1040) — thanks @thewilloftheshadow.
- **BREAKING:** Drop legacy `chatType: "room"` support; use `chatType: "channel"`.
- **BREAKING:** remove legacy provider-specific target resolution fallbacks; target resolution is centralized with plugin hints + directory lookups.
- **BREAKING:** `clawdbot hooks` is now `clawdbot webhooks`; hooks live under `clawdbot hooks`. https://docs.clawd.bot/cli/webhooks
- **BREAKING:** `clawdbot plugins install <path>` now copies into `~/.clawdbot/extensions` (use `--link` to keep path-based loading).
### Changes
- Plugins: ship bundled plugins disabled by default and allow overrides by installed versions. (#1066) — thanks @ItzR3NO.
- Plugins: add bundled Antigravity + Gemini CLI OAuth + Copilot Proxy provider plugins. (#1066) — thanks @ItzR3NO.
- Tools: improve `web_fetch` extraction using Readability (with fallback).
- Tools: add Firecrawl fallback for `web_fetch` when configured.
- Tools: send Chrome-like headers by default for `web_fetch` to improve extraction on bot-sensitive sites.
- Tools: Firecrawl fallback now uses bot-circumvention + cache by default; remove basic HTML fallback when extraction fails.
- Tools: default `exec` exit notifications and auto-migrate legacy `tools.bash` to `tools.exec`.
- Tools: add `exec` PTY support for interactive sessions. https://docs.clawd.bot/tools/exec
- Tools: add tmux-style `process send-keys` and bracketed paste helpers for PTY sessions.
- Tools: add `process submit` helper to send CR for PTY sessions.
- Tools: respond to PTY cursor position queries to unblock interactive TUIs.
- Tools: include tool outputs in verbose mode and expand verbose tool feedback.
- Skills: update coding-agent guidance to prefer PTY-enabled exec runs and simplify tmux usage.
- TUI: refresh session token counts after runs complete or fail. (#1079) — thanks @d-ploutarchos.
- Status: trim `/status` to current-provider usage only and drop the OAuth/token block.
- Directory: unify `clawdbot directory` across channels and plugin channels.
- UI: allow deleting sessions from the Control UI.
- Skills: add user-invocable skill commands and expanded skill command registration.
- Telegram: default reaction level to minimal and enable reaction notifications by default.
- Telegram: allow reply-chain messages to bypass mention gating in groups. (#1038) — thanks @adityashaw2.
- iMessage: add remote attachment support for VM/SSH deployments.
- Messages: refresh live directory cache results when resolving targets.
- Messages: mirror delivered outbound text/media into session transcripts. (#1031) — thanks @TSavo.
- Messages: avoid redundant sender envelopes for iMessage + Signal group chats. (#1080) — thanks @tyler6204.
- Media: normalize Deepgram audio upload bytes for fetch compatibility.
- Cron: isolated cron jobs now start a fresh session id on every run to prevent context buildup.
- Docs: add `/help` hub, Node/npm PATH guide, and expand directory CLI docs.
- Config: support env var substitution in config values. (#1044) — thanks @sebslight.
- Health: add per-agent session summaries and account-level health details, and allow selective probes. (#1047) — thanks @gumadeiras.
- Hooks: add hook pack installs (npm/path/zip/tar) with `clawdbot.hooks` manifests and `clawdbot hooks install/update`.
- Plugins: add zip installs and `--link` to avoid copying local paths.
### Fixes
- macOS: drain subprocess pipes before waiting to avoid deadlocks. (#1081) — thanks @thesash.
- Verbose: wrap tool summaries/output in markdown only for markdown-capable channels.
- Telegram: accept tg/group/telegram prefixes + topic targets for inline button validation. (#1072) — thanks @danielz1z.
- Telegram: split long captions into follow-up messages.
- Config: block startup on invalid config, preserve best-effort doctor config, and keep rolling config backups. (#1083) — thanks @mukhtharcm.
- Sub-agents: normalize announce delivery origin + queue bucketing by accountId to keep multi-account routing stable. (#1061, #1058) — thanks @adam91holt.
- Sessions: include deliveryContext in sessions.list and reuse normalized delivery routing for announce/restart fallbacks. (#1058)
- Sessions: propagate deliveryContext into last-route updates to keep account/channel routing stable. (#1058)
- Sessions: preserve overrides on `/new` reset.
- Memory: prevent unhandled rejections when watch/interval sync fails. (#1076) — thanks @roshanasingh4.
- Memory: avoid gateway crash when embeddings return 429/insufficient_quota (disable tool + surface error). (#1004)
- Gateway: honor explicit delivery targets without implicit accountId fallback; preserve lastAccountId for implicit routing.
- Gateway: avoid reusing last-to/accountId when the requested channel differs; sync deliveryContext with last route fields.
- Build: allow `@lydell/node-pty` builds on supported platforms.
- Repo: fix oxlint config filename and move ignore pattern into config. (#1064) — thanks @connorshea.
- Messages: `/stop` now hard-aborts queued followups and sub-agent runs; suppress zero-count stop notes.
- Messages: honor message tool channel when deduping sends.
- Messages: include sender labels for live group messages across channels, matching queued/history formatting. (#1059)
- Sessions: reset `compactionCount` on `/new` and `/reset`, and preserve `sessions.json` file mode (0600).
- Sessions: repair orphaned user turns before embedded prompts.
- Sessions: hard-stop `sessions.delete` cleanup.
- Channels: treat replies to the bot as implicit mentions across supported channels.
- Channels: normalize object-format capabilities in channel capability parsing.
- Security: default-deny slash/control commands unless a channel computed `CommandAuthorized` (fixes accidental “open” behavior), and ensure WhatsApp + Zalo plugin channels gate inline `/…` tokens correctly. https://docs.clawd.bot/gateway/security
- Security: redact sensitive text in gateway WS logs.
- Tools: cap pending `exec` process output to avoid unbounded buffers.
- CLI: speed up `clawdbot sandbox-explain` by avoiding heavy plugin imports when normalizing channel ids.
- Browser: remote profile tab operations prefer persistent Playwright and avoid silent HTTP fallbacks. (#1057) — thanks @mukhtharcm.
- Browser: remote profile tab ops follow-up: shared Playwright loader, Playwright-based focus, and more coverage (incl. opt-in live Browserless test). (follow-up to #1057) — thanks @mukhtharcm.
- Browser: refresh extension relay tab metadata after navigation so `/json/list` stays current. (#1073) — thanks @roshanasingh4.
- WhatsApp: scope self-chat response prefix; inject pending-only group history and clear after any processed message.
- WhatsApp: include `linked` field in `describeAccount`.
- Agents: drop unsigned Gemini tool calls and avoid JSON Schema `format` keyword collisions.
- Agents: hide the image tool when the primary model already supports images.
- Agents: avoid duplicate sends by replying with `NO_REPLY` after `message` tool sends.
- Auth: inherit/merge sub-agent auth profiles from the main agent.
- Gateway: resolve local auth for security probe and validate gateway token/password file modes. (#1011, #1022) — thanks @ivanrvpereira, @kkarimi.
- Signal/iMessage: bound transport readiness waits to 30s with periodic logging. (#1014) — thanks @Szpadel.
- iMessage: avoid RPC restart loops.
- OpenAI image-gen: handle URL + `b64_json` responses and remove deprecated `response_format` (use URL downloads).
- CLI: auto-update global installs when installed via a package manager.
- Routing: migrate legacy `accountID` bindings to `accountId` and remove legacy fallback lookups. (#1047) — thanks @gumadeiras.
- Discord: truncate skill command descriptions to 100 chars for slash command limits. (#1018) — thanks @evalexpr.
- Security: bump `tar` to 7.5.3.
- Models: align ZAI thinking toggles.
- iMessage/Signal: include sender metadata for non-queued group messages. (#1059)
- Discord: preserve whitespace when chunking long lines so message splits keep spacing intact.
- Skills: fix skills watcher ignored list typing (tsc).