跳转到内容

ADR 0006:服务端只做中转——去掉登录,历史记录放到用户设备上

  • 状态:已采纳(2026-09-28);第 1 条「共享口令」已由 ADR 0008 取代
  • 决策者:zhibo li
  • 取代:YOUT-186 的 Google 登录(迁移 006)
  • 延续:ADR 0005(大模型调用放到用户设备上)、YOUT-188(Multica 令牌只存在本机 daemon)

YOUT-186 给桌面端加了 Google 登录,服务端保存用户和会话令牌。但事件从来没有按用户分开,登录只是一道门。ADR 0005 之后,大模型的 API Key、Multica 令牌都只存在用户自己的设备上;只有以后用我们自己的 Key 生成简报时才需要账号,目前不计划这样做。

历史记录原来存在服务端:agent_events 保存汇报原文、cwd、标题,briefs 保存简报,multica_reports.reply_content / daemon_replies.content 保存用户的回复,GET /v1/history 分页返回。这些是用户的隐私,放在服务端有泄露风险。

  1. 去掉登录。 删除 /v1/auth/google、/v1/auth/me、/v1/auth/logout、users / sessions 表(迁移 008)和 GOOGLE_* 环境变量。/v1/* 只接受服务端的共享口令,客户端在「设置 → 服务连接」填服务地址和这个令牌,只存在本机。新增 GET /v1/auth/check(令牌有效返回 204),本机 outbrief-daemon 用它校验桌面端请求 http://127.0.0.1:8790/multica/* 时带的令牌。
  2. 服务端只做中转,不做存档。
    • 待接听的来电完整保存,直到客户端回写 completed / dismissed。
    • 回写结果时擦掉标题、汇报原文(空字符串)、cwd、简报(brief: null)和 Multica 任务标题,只留下回复要用的路由信息:来源、sessionId、上报的机器、Multica 工作区 / issue / 评论 id。这样挂断后隔一段时间再从历史里回复也能送达。
    • 回复排队期间保存全文,投递成功或失败后擦掉;multica.reply 只剩评论 id 和时间,删掉 reply_content 列。
    • 删除 GET /v1/history。迁移 009 把已经结束的来电按上面的规则擦掉。
  3. 历史记录存在客户端。 来电结束时,客户端把整个事件(汇报、简报)连同通话记录、回复内容和投递状态存在本机(outbrief.call.<eventId>,最多 100 条),历史页只读本机。之后收到的投递状态更新只合并状态字段,不会用服务端擦过的事件覆盖本地内容。
  • 同一个人的多台设备各自保存自己接过的来电,不再有跨设备的历史;在 A 设备接听的来电不会出现在 B 设备的历史里。
  • 迁移 009 执行后,服务端原有的历史记录不再能从服务端读到。这些记录之前也没有存到客户端,升级后历史页从空开始。
  • 本机历史存在 webview 的 localStorage 里,卸载 App 或清理 webview 数据会丢失。
  • 共享口令同时给 hook、daemon 配对和客户端用。以后要多用户时,再按用户发各自的令牌并把事件分区,那时再考虑账号。
  • 兜底 TTS 的每日字数仍按 sha256(Bearer) 计数,所有客户端共用一个额度。