AionUi 反馈数据库诊断Feedback DB Diagnostics面向隐私安全的对话/模型/团队故障快照设计【免费下载链接】AionUi免费、本地、开源的 24/7 全天候 Cowork 应用以及适用于 Gemini CLI、Claude Code、Codex、OpenCode、Qwen Code、Goose CLI、Auggie 等的 OpenClaw | 喜欢就点star吧项目地址: https://gitcode.com/iOfficeAI/AionUi导读用户反馈User Feedback是 AionUi 桌面端排查问题的重要通道但传统上仅凭 Sentry 事件中的模块、描述、日志与截图往往不足以还原一次对话失败时的最终落库状态turns 是否失败、消息处于什么状态、选了哪个 Provider/Model、ACP 会话配置如何、团队 backlog 里积压了什么。本文基于 docs/prds/settings/feedback-db-diagnostics.md 这份 PRD完整讲解 AionUi 如何在反馈报告中附加一份小型、隐私安全的数据库快照db-diagnostics.json/db-diagnostics.json.gz包括 AionUi 与 aionCore 的职责边界、五个诊断 Profile 的输出白名单与红线清单、前端路由/模块上下文的采集链路以及配套的单测与 E2E 验证。读完你不仅能理解该机制的设计取舍还能掌握其在 submitFeedbackReport.ts 等源码中的真实实现细节。背景为什么日志和截图不够用PRD 开篇点明了动机Sentry 中的用户反馈已经包含typeuser-feedback、所选模块、描述、日志和截图但真实反馈样本表明对于对话 / 模型 / 团队类问题这些信息常常不足日志能说明某个 turn 失败了却不一定能展示最终持久化的会话状态无法确知消息的状态字段、用户实际选中的Provider/Model缺少ACP 会话配置mode/model/effort 等非机密配置项与团队 backlog任务/信箱计数的快照。因此 PRD 提出反馈报告需要附带一个诊断附件——由 aionCore 生成、经过严格脱敏的数据库快照。它的红线非常明确不得上传 SQLite 数据库文件本身、不得执行任意 SQL、不得包含 prompt、消息内容、Provider API Key 或原始错误消息。职责边界AionUi 只做编排aionCore 掌握全部诊断逻辑这是本 PRD 最重要的架构约束它把「谁来采集、谁来生成」划分得泾渭分明归属职责AionUi渲染进程捕获route_at_open与route_at_submit发送用户选择的模块从反馈入口显式发送安全 IDconversation_id、provider_id、team_id、agent_id、mcp_server_id等调用 aionCore 的GET /api/system/diagnostics/feedback-report将返回的 JSON 在支持 gzip 时附为db-diagnostics.json.gz否则附为db-diagnostics.jsonaionCore主进程侧后端路由/模块/Profile 解析路由派生 Profile、模块派生 Profile 与显式 Profile 的并集unionSQL 选择用户隔离脱敏与字段白名单响应 Schema两个硬性约束值得注意AionUi 主进程不得读取 SQLite也不得暴露feedback:collect-db-diagnosticsIPC——采集逻辑完全收敛在 aionCore 的 HTTP 接口之后前端只做「传参 → 收 JSON → 打包附件」。诊断路径必须走HTTP 而非 IPC这既隔离了数据库访问权限也保证了 Web 构建下无window.electronAPI依然能工作。前端实现对照在渲染进程中反馈模态框FeedbackReportModal.tsx提交时构造collectDbDiagnostics输入交给 submitFeedbackReport.ts 的collectDbDiagnosticsAttachment使用httpRequest(GET, ...)请求诊断接口并对400/401/403/404/500/502/503/504静默处理避免诊断失败打断主反馈提交流程buildFeedbackDiagnosticsPath第 178-192 行通过URLSearchParams把route_at_open、route_at_submit、selected_module、profiles逗号拼接的显式 Profile以及conversation_id、provider_id、agent_id、team_id、mcp_server_id拼进查询串encodeDiagnosticsAttachmentPayload第 201-226 行先TextEncoder序列化 JSON再检测CompressionStream是否可用可用则经CompressionStream(gzip)压缩产出db-diagnostics.json.gzapplication/gzip不可用或压缩异常则回退为db-diagnostics.jsonapplication/json。采集状态会被记录进随附日志collected / empty / failed / skipped / unavailable失败时反馈照常提交只是附件缺失——诊断是尽力而为的增强不是提交的硬依赖。Profile 解析路由上下文优先于用户所选模块PRD 给出了一个关键设计决策路由上下文比所选模块更可信因为用户可能选错模块但所选模块仍是有价值的用户意图。因此 aionCore 必须取以下来源的并集提交时的路由route_at_submit打开时的路由route_at_open所选模块selected_module显式 Profile 提示profiles恒定的global-summaryPRD 给出示例若反馈在#/conversations/conv-1页面打开、用户却选了system-settings则附件应至少包含conversation-session、model-auth、mcp-tools与global-summary四个 Profile——即「路由说这是对话问题、用户觉得是设置问题」两者都要覆盖。前端的路由捕获与 ID 推导前端侧的路由采集在 routeContext.tscaptureFeedbackRoute()优先取window.location.hash否则回退到pathname search hashfeedbackDiagnosticsContextFromRoute(route)用正则/^#?\/(conversation|team)\/([^/?#])/从路由直接推导teamId或conversationId已做decodeURIComponent与空值防御。这两个能力被 FeedbackContext.tsx 的openFeedback组装打开模态框瞬间捕获routeAtOpen并推导路由 ID与调用方传入的diagnosticsContext合并调用方字段覆盖路由推导值最终在提交时由模态框补上routeAtSubmit与selectedModule。此外标题栏反馈按钮还会通过 resolveFeedbackModule.ts 的ROUTE_MODULE_MAP如/conversation→conversation-session、/team→agent-team、/settings/model→model-auth、/settings/tools→mcp-tools按当前页面预选模块该映射对应用户可见的 FEEDBACK_MODULES 模块列表并有 feedback-route-module.e2e.ts 覆盖各路由的预选行为。五个诊断 Profile 详解PRD 为 aionCore 定义了五个 Profile每个都明确了「详细键detailed key」、适用场景、允许输出与禁止输出清单。下面按原文完整展开并结合实现说明。conversation-session会话详细键conversation_id。适用场景Sentry 中真实见到的问题Provider 认证失败日志出现UserLlmProviderAuthFailedOpenCode 模式/模型确认超时回合以空输出或隐藏输出结束图片/文件输入类投诉需要消息元数据与附件计数。允许输出当前会话的 id/title/type/status/source/model provider id/model id/timestamps/name 长度同一用户作用域内、被报告会话附近的近期会话当前为24 小时窗口、上限 20 行含标题、id、状态、model/provider id、消息计数与最近错误码按 type/status/hidden 聚合的消息计数近期消息元数据id、msg id、type、status、position、内容字节长度、文本长度、附件/图片/工具调用计数近期错误元数据错误码、归属、是否可重试、解决类型/目标、是否建议反馈ACP 会话元数据agent id/source/status、session id 是否存在、运行时当前 mode/model、非机密配置选择值mode/model/effortagent 元数据计数可用 mode/model/command/配置项数量、最近检查状态/错误码assistant 快照元数据与数组计数。禁止输出原始messages.content、prompts、原始session_config、rules_content、Provider API Key、原始错误消息。model-auth模型认证详细键provider_id或由conversation_id推导。允许输出provider id/platform/name/enabledapi_key_configured布尔值只回答「有没有配」绝不回显 Keybase URL 的主机部分不含路径/查询串模型总数、被禁用模型数、不健康模型数能力capability计数与时间戳。禁止输出api_key_encrypted、完整 URL、URL 查询字符串、bearer token、Bedrock 配置。agent-teamAgent 团队详细键team_id或由conversation_id推导。允许输出team id、name 长度、工作区模式、会话模式、agent 数量、lead agent id、agents 版本、时间戳按状态统计的任务计数按类型/已读状态统计的信箱计数。禁止输出工作区绝对路径、任务 subject/description、信箱内容、信箱摘要。mcp-toolsMCP 工具详细键mcp_server_id。允许输出server id/name/enabled/builtin/传输类型transport type工具数量最近测试状态与最近连接时间戳传输配置字节长度与原始 JSON 字节长度只报长度不报内容。禁止输出原始传输配置、原始 JSON、headers、env 值、token。global-summary全局摘要始终作为低成本上下文附带输出仅包含当前用户的聚合计数当前用户的会话数当前用户会话的消息数Provider 数量Agent 数量活跃 MCP server 数量。隐私要求保留诊断价值剔除凭据风险PRD 明确响应必须在保留诊断价值的同时排除真正构成隐私/凭据风险的少数类别不输出原始数据库文件不执行任意前端 SQL不输出providers.api_key_encrypted不输出users.password_hash、users.jwt_secret、users.email不输出 OAuth 或远程 agent token不输出原始 prompt/消息内容不输出原始错误消息不输出带 userinfo/查询串的完整 URL。一个容易被误解的点会话标题conversation titles是允许输出的因为需要它来将数据库快照与截图、Sentry 反馈相互关联标题不会单独按sk-...、token、bearer之类的字符串形态做二次脱敏也就是说若用户把密钥写进了标题标题本身不会被额外清洗——这是文档明确写出的取舍。aionCore 的响应必须包含一个privacy块作为自证声明{ raw_content_included: false, api_keys_included: false }测试则必须断言具有代表性的 Provider API Key、加密的 Provider Key、原始 prompt 文本与原始错误消息不会出现在序列化后的诊断响应中。测试与验证从单测到 E2E仓库为这套链路提供了多层次的验证submitFeedbackReport.test.ts 的单测会 stubfetch断言请求路径包含/api/system/diagnostics/feedback-report?、route_at_open、route_at_submit、selected_module、conversation_id等查询参数且方法为GET并断言附件文件名匹配/^db-diagnostics\.json(?:\.gz)?$/、contentType 匹配^application\/(?:gzip|json)$当fetch抛错如db locked时反馈仍正常提交且附件为空。feedback-route-module.e2e.ts 覆盖标题栏反馈按钮按路由预选模块的行为如/scheduled预选scheduled-task、/settings/model预选model-auth、/settings兜底system-settings。FeedbackReportModal.dom.test.tsx 等 DOM 测试覆盖模态框的模块选择、截图预填、路由上下文透传等交互细节。总结AionUi 的 Feedback DB Diagnostics 是一份「小而安全」的故障快照设计AionUi 渲染进程只负责捕获路由与显式 ID、调用 aionCore 的GET /api/system/diagnostics/feedback-report并把 JSON 打包为gzip 优先的db-diagnostics.json附件所有 SQL、Profile 并集、用户隔离、脱敏与字段白名单全部收敛在 aionCore 侧。五个 Profileconversation-session、model-auth、agent-team、mcp-tools、global-summary各自明确了 detailed key、允许输出的诊断字段与绝对禁止的凭据/内容字段最终以privacy块自证raw_content_included: false与api_keys_included: false。它既显著提升了对话/模型/团队类问题的可诊断性又严守了「不上传 DB 文件、不执行任意 SQL、不泄露密钥与消息内容」的隐私底线——这一边界在 submitFeedbackReport.ts 与配套测试中有完整、可复核的实现支撑。【免费下载链接】AionUi免费、本地、开源的 24/7 全天候 Cowork 应用以及适用于 Gemini CLI、Claude Code、Codex、OpenCode、Qwen Code、Goose CLI、Auggie 等的 OpenClaw | 喜欢就点star吧项目地址: https://gitcode.com/iOfficeAI/AionUi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考