外观
安全与合规设计
zclaw 以你本人的身份发消息,所以默认收得很紧:能不能发由你逐项确认,任何一项检查不通过就停下。本页说明这些设计,以及两处需要你特别留意的放权能力。
同事单聊召唤默认开启
配置项 peer_summon_enabled 默认为 true。当你打开召唤通道(self_command_enabled)、配置了你的名字并启用了高权限档 Agent 后,任何不在黑名单里、能和你单聊的人,在单聊里发「@你的名字 任务」,都能以高权限档启动一次任务,结果发回给这个人。
- 任务内容由对方书写;转述一句 @ 了你的话,同样会触发。
- 高权限档的回复不做链接、凭据类内容过滤,见下文「权限分档」。
不需要时,在配置中设置 "peer_summon_enabled": false。zclaw 每一轮都会重新读取配置,无需重启。
高权限档不经逐次审批
高权限档的 Agent 可以不经审批执行命令、读写文件,并使用它配置目录中的 MCP 和技能。「不修改线上数据」这类要求只写在提示词里,没有系统层面的强制。
- 只在你信任其工具与权限的机器上启用高权限档。
- 为分身设置独立的 Agent 配置目录(
agent_config_home);留空时,分身直接使用你本人的 Agent 配置、技能和 MCP。
默认不发送
init生成的配置中发送开关关闭,也不会加载后台服务。- 发送前必须依次完成:验证钉钉接口(
verify-contracts)、验证 Agent 模板(verify-template),最后由你执行enable-sending --yes。 - 验证结果只能通过带
--attest --yes的命令写入,任何一项探测未通过都不会写入。 enable-sending只在其余检查全部通过时才会打开发送。
检查不通过就停下
出现以下任一情况时,这一轮不拉取消息、不调用模型、不发送:
- 发送开关未打开,或所开功能用到的钉钉接口没有验证;
- AI 标识文字为空,或没有配置本人的钉钉 ID;
- dws 未安装、未登录或令牌失效,或者登录的组织、账号与配置不一致;
- 配置没有限定到单一组织;
- dws 或 Agent 的可执行文件不归你所有,或可以被其他用户修改;
- 已启用的 Agent 命令与内置模板不完全一致,或没有验证;
- 关闭了未读闸门,却没有打开防止「对方改口后被答复两次」的配套开关。
此外:
- 配置文件权限不是 0600 或是符号链接时,拒绝加载。
- 状态数据库绑定组织和发送身份,换账号或换组织会拒绝启动。
- 每次发送前重新读取配置、确认身份没有变化,并在锁内复查黑名单:黑名单添加成功后,不会再有发给这个人的新消息。
- 发送结果不确定时标记为待核对,不自动重发。
回复哪些消息
- 单聊处理全部消息;群聊只处理 @你 的消息。
- 忽略你自己、机器人和黑名单里的人发来的消息。黑名单按不可变钉钉 ID 匹配,由你自己维护,产品不内置任何人选。
- 默认只处理你还没读过的消息(未读闸门),并跳过 15 分钟以前的消息。
- 分身模式设为
summon时,只处理你召唤过的会话。 - Agent 可以判断某条消息不需要回复。
每条消息都带 AI 标识
- 正文前固定加上「[AI 分身代发]」。标识文字可以修改,但不能为空,发送前的检查会拒绝空标识。
- 纯文本消息同时带有钉钉原生的 AI 标记,标题为「AI 辅助回复」。
权限分档
| 档位 | 谁会触发 | 能力 | 每日调用额度 |
|---|---|---|---|
普通档 restricted | 默认情况下的所有发送者 | 不能使用工具:各 Agent 以关闭工具、关闭 MCP 或只读沙箱方式运行,只加载边界类技能 | 100 |
白名单档 standard | tier_standard_user_ids 中的人 | 与普通档相同的工具限制,加载全部技能 | 30 |
高权限档 privileged | 你本人的召唤,以及开启后的同事召唤 | 不经审批执行命令、读写文件、使用 MCP 和技能 | 20 |
- 普通档和白名单档的回复中,如果出现链接、@、疑似凭据、「已发布」「已修复」这类未经核实的完成声明,或者模型自评风险高、置信度低于 0.5,会被替换为「需要进一步核实或人工处理」的说明。
- 高权限档的回复只防止再次触发召唤,不做上述过滤。
init只配置普通档,默认没有高权限档。启用高权限档需要在配置的agents中添加privileged条目,并运行dingclawd verify-template --agent <Agent> --tier privileged --attest --yes。- 当天额度用完后,分身回复一句固定说明,不再调用 Agent。
召唤
召唤通道的总开关 self_command_enabled 默认关闭。打开后:
| 你发送的 | 效果 |
|---|---|
@me,或 @ 你自己 | 处理这个会话里等着的消息 |
@me <任务> | 把任务交给高权限档执行,结果发回这个会话 |
- 召唤只认你本人的不可变钉钉 ID,名字本身不构成授权。
- 回复发回你召唤的会话:在和同事的单聊里召唤,同事能看到回复;在群里召唤,回复发进群。
其他人可以触发的召唤:
| 方式 | 默认 | 生效条件 | 结果 |
|---|---|---|---|
| 单聊中「@你的名字 任务」 | 开启 | 召唤通道已打开、配置了你的名字、启用了高权限档 | 以高权限档执行,回复发给对方 |
| 群里真实 @你,后跟「分身」和任务 | 关闭 | 同上,并打开 group_avatar_summon_enabled | 以高权限档执行,回复公开发进群 |
- 同事发
@me指的是同事自己,不会触发;只有 @ 而没有任务时,按普通消息处理。 - 黑名单、机器人过滤、会话静音和消息时效,对这些召唤同样生效。
紧急停止
立即停止后台服务:
bashlaunchctl bootout gui/$(id -u)/com.dingclaw.<标识>或在配置中把
send_enabled改为false,下一次发送前生效。不再回复某个人:
bashdingclawd blacklist add --user-id <userId>
数据与凭据
- zclaw 只连接两类外部服务:通过 dws 访问钉钉,通过你选择的 Agent 访问模型服务。它本身不直接发起网络请求,也没有遥测。
- 不附带、不转存 dws 凭据。dws 的登录状态由 dws 管理,各 Agent 的凭据由 Agent 自己保存。
- 调用 Agent 时,只向子进程传递白名单内的环境变量。
- 状态数据库
~/.local/state/dingclaw/state.db保存消息正文、任务、跳过原因和发送记录,用于去重、恢复投递和追溯;所在目录权限为 0700,文件权限为 0600。 - 运行日志为 JSONL 格式,位于同一目录,每一行都带时间戳。