安全与权限

Chat Access

了解 Chat 用户进入 Agent 前的准入模型

Chat Access

Chat Access 是 Chat Plugin 的准入能力,只回答一个问题:某个外部 Chat 用户的私聊或群聊消息,是否可以进入指定 Agent。

它不是 Agent Core 权限,也不是通用 Role/Permission 系统。用户通过准入后,Chat Plugin 只把消息交给 Agent,不会向 Session 或其他 Plugin 传播角色和权限。

核心规则

  • 默认拒绝:没有明确 allow Grant 时,消息不会进入 Agent。
  • 按 Agent 隔离:访问 Agent A 的批准不会自动允许访问 Agent B。
  • 按 Chat 账号隔离:身份键由 channel + issuer + subject_id 组成,同一用户通过两个 Bot 访问时是两个 Principal。
  • 范围明确:持久化 Grant 只有 directgroup;管理命令中的 all 会展开为两条 Grant。
  • denyrevoke 不同:拒绝后不再生成请求;撤销后用户可以再次请求。

批准流程

未批准用户发送私聊消息时,Chat Plugin 会创建或复用一个 pending Request,并返回类似命令:

downcity chat access approve req_xxx --agent assistant

管理员也可以先查看请求:

downcity chat access requests --agent assistant --status pending

群聊中的未批准消息默认静默拒绝,pending Request 仍会进入同一个管理列表。

数据保存位置

每个 Agent 独立保存:

<agent_project>/.downcity/chat/access.db

数据库包含 Principal、Request、Allow/Deny Grant 和审计事件,不包含 Bot Token、App Secret 或消息正文。Chat 账号和密钥仍保存在 City 全局数据库 ~/.downcity/downcity.db,Agent 配置只保存绑定的 channelAccountId

与 City Auth 的区别

City Auth 负责 HTTP/Console 控制面的登录认证和路由权限,例如谁能调用管理 API。Chat Access 负责外部 Telegram、飞书或 QQ 用户能否向某个 Agent 发送消息。两者数据、身份和判定路径互不混用。

相关文档