6b0cc81ded
Records the approved four-part design (store, collection, BFF API, bell UI) and the current implementation status. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2.4 KiB
2.4 KiB
用户错误日志设计方案
2026-07-31 确认的方案。目标:显示当前用户的错误日志,删除也只删除当前用户的错误日志。 范围决策:记录全部错误(含前端 toast 错误与服务端 BFF 错误);查看入口放在顶部通知图标。
1. 存储(服务端,按用户隔离)
复用 userStore/usageStore 的 better-sqlite3 模式:src/lib/server/errorLogStore.ts,库文件 ~/.evoscientist/webui-error-logs.sqlite3。
- 表:
id, user_id, created_at, source, code, message, details - 按
user_id查询/删除;每用户保留最近 200 条,超出自动裁剪 - 用户身份来自现有 auth session(与 userStore 同一套,
requireActor的actor.sub;未启用认证时为内置local-admin)
2. 采集(两端上报)
- 前端:
src/lib/errorReporter.ts提供reportError()(fire-and-forget POST)与errorToast()(toast.error + 上报);逐点接入 useChat、ThreadList、各面板。纯表单校验提示仍用toast.error,不上报。 - 服务端:BFF 路由错误在
src/lib/server/routeErrors.ts统一出口处顺带写入(调用方传入 actor 时);旧格式{error}路由逐步纳入。 - 字段:
source(如chat.send/api)、code(可选)、message、details(可选 stack/context)。
3. BFF API
src/app/api/error-logs/route.ts:
GET /api/error-logs?limit=100— 当前用户的日志(id 倒序)POST /api/error-logs— 前端上报入口DELETE /api/error-logs— 清空当前用户全部日志
4. UI(顶部通知图标)
- 头部加铃铛图标 + 未读角标(新错误到达 +1,打开面板清零,
localStorage记录已读游标,key:evoscientist.errorLogs.lastSeenId) - 点击弹出下拉面板:时间、来源、消息列表;底部"Clear all"按钮(二次确认后调 DELETE)
- SWR 轮询(30s)+ 随错误上报即时刷新(
subscribeErrorLogged)
主要取舍
- 服务端 sqlite 按用户存储(跨设备可见、与现有 auth 一致),代价是新增一个 store 模块
- 未读角标用 localStorage 游标,简单但换浏览器会重置
实施状态(2026-07-31)
- 第 1–3 部分已完成并提交:
61c2aba(store)、8d455a0(API)、dd4b63a(前端上报接入)、09d9f49(routeErrors 写入) - 第 4 部分(铃铛 UI)见实施计划:
docs/superpowers/plans/2026-07-31-error-log-bell.md