fix: auto-enable leader summary routing

This commit is contained in:
inman committed 2026-09-07 16:02:24 +08:00
1 parent 8fb066f345
commit 0b3aa5c42d
14 files changed
+618 -623

No files matched your search

+2 -2
View File
@@ -89,7 +89,7 @@ Auto 一旦发生 AI fallback,任务会永久绑定原 AI 会话。每次解
- `POST /api/tasks/:taskId/reparse`
- `PUT /api/parser-decisions/:decisionId/review`
迁移 `013_business_parser_modes` 增加内部固定范围的路由设置、任务快照和加密的 `parse_decisions`;迁移 `014_task_input_attachments` 增加名单输入附件元数据、加密 canonical TSV 与 `awaiting_attachment` 索引;迁移 `015_account_roles_and_task_audit` 增加账号角色、密码更新时间、输入/附件操作者、任务归档和账号级幂等(历史 `must_change_password` 列仅保留兼容,当前流程不启用首次强制改密);迁移 `016_team_lead_operations_dashboard` 增加组长角色与人工指令看板索引;迁移 `017_user_business_route_authorizations` 增加逐账号业务白名单、授权人和乐观并发 revision;迁移 `018_agentbus_account_workers` 增加 ERP 账号、渠道归属、任务执行归属、唯一在线 worker 与 ERP 身份核验字段;迁移 `020_leader_task_summary_notifications` 增加默认关闭的组长订阅和独立加密通知 outbox。原文、完整程序/AI 候选、名单 canonical 中间文本、人工说明和待发组长摘要使用字段加密保存;统计、全局审计和运行日志不复制明文业务输入。
迁移 `013_business_parser_modes` 增加内部固定范围的路由设置、任务快照和加密的 `parse_decisions`;迁移 `014_task_input_attachments` 增加名单输入附件元数据、加密 canonical TSV 与 `awaiting_attachment` 索引;迁移 `015_account_roles_and_task_audit` 增加账号角色、密码更新时间、输入/附件操作者、任务归档和账号级幂等(历史 `must_change_password` 列仅保留兼容,当前流程不启用首次强制改密);迁移 `016_team_lead_operations_dashboard` 增加组长角色与人工指令看板索引;迁移 `017_user_business_route_authorizations` 增加逐账号业务白名单、授权人和乐观并发 revision;迁移 `018_agentbus_account_workers` 增加 ERP 账号、渠道归属、任务执行归属、唯一在线 worker 与 ERP 身份核验字段;迁移 `020_leader_task_summary_notifications` 增加内部失败关闭的组长路由快照和独立加密通知 outbox,是否启用由运行时角色与渠道核对自动维护。原文、完整程序/AI 候选、名单 canonical 中间文本、人工说明和待发组长摘要使用字段加密保存;统计、全局审计和运行日志不复制明文业务输入。
## AgentBus Bot 接入
@@ -99,7 +99,7 @@ Auto 一旦发生 AI fallback,任务会永久绑定原 AI 会话。每次解
每个启用渠道会连接 `AGENTBUS_WS_URL?ready=1`,使用该渠道自己的 `Authorization: Bearer <channel-agentbus-key>`,等待 `session.ready` 后接收普通 `event` 消息。普通任务发送一次持久化受理通知(`task.progress`,`status=accepted`)并在完成时返回一次 `task.result`。名单任务的首次文字指令改为返回明确的等待附件提示,附件入站改为返回“名单附件已收到,正在校验并处理”;最终结果只归属触发解析的最新附件消息,因此不会因文字与附件两条入站帧重复发送成功回执。解析完成、等待确认或进入 ERP 等内部进度不外发。`GET /health/ready` 和 `GET /api/status` 的 `agentbus.channels` 字段可用于确认每个 listener 与 session 是否建立。
管理员还可以在 `/channels` 配置组长任务摘要抄送。`GET /api/settings/leader-summary-subscriptions` 返回不含明文目标的设置与投递健康状态,`PUT /api/settings/leader-summary-subscriptions/:leaderUserId` 使用 revision 乐观并发保存。订阅固定读取同组织其他非管理员归属人的人工/AgentBus 任务,只从保存后的 `task.updated` 稳定结果投影,不回补历史。主动帧为无 `reply_to` 的 `task.summary`,使用组长自己的渠道、显式收件地址和微信会话 ID;员工回执始终优先。摘要正文只含员工、业务、稳定状态、公共任务编号、上海提交时间以及白名单团号/订单号,不含原始指令、人员资料、附件或技术错误。目标与正文加密,日志只留指纹。该功能启用前要求人工核对桥接目标,发送为至少一次语义且微信消息不可撤回;当前实现不提供会产生真实外发的“测试发送”接口。
`/channels` 只读展示组长任务摘要抄送状态,不再维护单独的订阅开关、收件地址或微信会话 ID。有效 `team_lead` 账号拥有已启用且可连接的 AgentBus 渠道时,服务会自动启用组织范围摘要;优先采用该账号经此渠道最近一次有效入站帧的 `from` 与 `conversation_id`,尚无入站记录时使用渠道 `external_user_ref` 并按普通回复规则生成会话键。没有任何可用路由时保持等待,首条有效组长消息到达后自动学习;渠道换绑账号时会清空旧外部用户标识,且历史入站路由只有任务归属仍是当前组长时才能复用,避免抄送到原渠道所有者。`GET /api/settings/leader-summary-subscriptions` 只返回不含明文目标的投递健康状态,没有人工修改或真实测试发送接口。角色、账号、渠道归属、渠道启停或路由变化会建立新的生效时间与 revision,取消旧路由未发送摘要,且永不回补历史。摘要固定读取同组织其他非管理员归属人的人工和 AgentBus 任务,只从自动生效后的 `task.updated` 稳定结果投影。主动帧为无 `reply_to` 的 `task.summary`,员工回执始终优先。正文只含员工、业务、稳定状态、公共任务编号、上海提交时间以及白名单团号/订单号,不含原始指令、人员资料、附件或技术错误;路由与正文加密,日志只留指纹。发送为至少一次语义且微信消息不可撤回。
对微信来源,listener 在调用 `TaskService.ingestMessage()` 前执行上述严格信封解包,因此手工正文与 AgentBus 正文进入同一个业务 route resolver、任务级 mode snapshot 和 parser orchestrator;`Conversation` 只属于传输路由,不会再污染业务字段签名。