2026-03-07-123-atlas-done.md

Coco 收件箱

#123 后端完成报告 — M31B仪表盘实时化(Atlas部分)

执行人:Atlas🐻 | 完成时间:2026-03-07 | 状态:后端已完成,等待Pixel前端


交付物

1. m31_dispatcher.py 修改

新增函数emit_exec_log(agent, message, level, task_id, tokens) - 位置:文件顶部(logger初始化之后,路径配置之前) - 推送事件:agent_exec_log - 错误保护:try-except,失败只记录warning,不影响主流程

插入推送调用(_dispatch_task_inner(): 1. 任务派发开始时 → emit_exec_log(assignee, "接收任务 #id title[:40]") 2. 模型路由推荐时 → emit_exec_log(assignee, "路由推荐模型: {recommended}")(已有router时才触发) 3. 任务文件写入收件箱时 → emit_exec_log(assignee, "任务文件已写入收件箱") 4. 专用事件 → socketio.emit("agent_task_start", {...})

插入推送调用(scan_completions(): 1. 检测到任务完成 → emit_exec_log(assignee, "任务 #task_id 已完成") 2. 专用事件 → socketio.emit("agent_task_complete", {...})

2. agent_executor.py 修改

新增方法_on_task_update(self, agent_name, task_id, message, tokens=0) - 位置:_emit()方法之后(WebSocket推送区域) - 推送事件:agent_exec_log - 错误保护:try-except,pass静默失败

插入推送调用(execute_task(): - task_started事件之后追加:_on_task_update() + agent_task_start专用事件

插入推送调用(_run_claude(): - task_completed事件之后追加:_on_task_update() + agent_task_complete专用事件


WebSocket事件规格(给Pixel)

agent_exec_log

{
  "timestamp": "HH:MM:SS",
  "agent": "Agent名称",
  "level": "info | warning | error",
  "message": "日志消息",
  "task_id": "任务ID或null",
  "tokens": "Token数或null"
}

触发场景:dispatch收件箱写入、模型路由推荐、scan任务完成、execute_task启动、_run_claude完成

agent_task_start

{
  "agent": "Agent名称",
  "task_id": "任务ID",
  "task_title": "任务标题",
  "timestamp": "HH:MM:SS"
}

触发场景:m31_dispatcher收件箱写入完成 / agent_executor任务提交

agent_task_complete

{
  "agent": "Agent名称",
  "task_id": "任务ID",
  "tokens": null,
  "timestamp": "HH:MM:SS"
}

触发场景:scan_completions检测到output文件 / _run_claude subprocess正常退出


验收确认


注意事项

  1. 重启Flask服务才能生效(端口8082)
  2. tokens字段当前为null(claude CLI stream-json格式返回的是cost_usd,非token数),后续可从audit_logger补全
  3. agent_executor.py中两个推送来源(dispatcher + executor)可能对同一任务产生重复的agent_task_start事件,前端需做去重处理(以task_id为key)

Atlas🐻 完成 | 2026-03-07