Feat/AGC错误报告 #240

Merged
kdletters merged 64 commits from feat/error-report into master 2026-09-03 10:02:05 +08:00
Member

实现:
在rust内存里维护错误事件队列, webview调用tauri command传入, 后台任务agent工具等直接插入
把rust , webview console的日志统一写到AppData文件夹下的(滚动保存的)日志文件.
rust对传入的错误进行筛选,脱敏, 防抖,后通知前端提醒用户.
用户提醒是一个不阻塞的小UI, 展开后可以选择错误上报, 可以附加文字描述
上传时附带最近日志, 错误堆栈等信息

元数据存在数据库, 考虑到字符串信息很难查询, 所以在api server打包成zip存在OSS.
管理页面新增错误报告的查看页面

shotmd-1788328504.jpg
shotmd-1788328495.jpg
shotmd-1788328222.jpg
shotmd-1788328230.jpg

实现: 在rust内存里维护错误事件队列, webview调用tauri command传入, 后台任务agent工具等直接插入 把rust , webview console的日志统一写到AppData文件夹下的(滚动保存的)日志文件. rust对传入的错误进行筛选,脱敏, 防抖,后通知前端提醒用户. 用户提醒是一个不阻塞的小UI, 展开后可以选择错误上报, 可以附加文字描述 上传时附带最近日志, 错误堆栈等信息 元数据存在数据库, 考虑到字符串信息很难查询, 所以在api server打包成zip存在OSS. 管理页面新增错误报告的查看页面 ![shotmd-1788328504.jpg](/attachments/641b43c8-deed-47d8-8c78-36adb9a2548f) ![shotmd-1788328495.jpg](/attachments/33c6ada3-dd4d-44b6-9859-f18f944eb653) ![shotmd-1788328222.jpg](/attachments/59267df9-f624-4e47-bb9b-b69d77f595c4) ![shotmd-1788328230.jpg](/attachments/63ea6a86-9a51-412b-a98c-dce454bcc968)
k88936 self-assigned this 2026-09-01 19:39:53 +08:00
k88936 added this to the 陶泥儿gameAgent project 2026-09-01 19:39:53 +08:00
k88936 added 36 commits 2026-09-01 19:39:54 +08:00
新增错误事件、日志和批量提交 DTO。

增加 AGC 错误报告模块导出。

增加 agc OSS 前缀以生成私有诊断包对象 key。
新增登录态错误报告批量提交与管理员查询接口。

生成 JSONL 诊断归档并支持私有 OSS 上传及状态记录。

接入 AppState、路由和后台 Tab 权限审计。
在当前进程按指纹合并客户端错误并持久化应用诊断日志。

新增登录态批量提交、用户说明和可选日志上传面板。

将 /bug-report 快捷入口改为打开报告问题面板并更新端到端断言。
增加错误报告列表、详情和状态筛选页面。

支持管理员受控下载诊断包并接入错误报告 Tab 权限。

补充前端 API 类型、客户端请求和详情弹窗样式。
记录错误事件、诊断日志、JSONL 归档和私有 OSS key 约定。

同步 /bug-report 面板行为与后台查看器入口说明。

在文档索引和项目决策日志中登记错误报告方案。
Rust app_log 输出同时保留 stderr 并写入 AppData application.log。

将 WebView console 输出镜像到同一普通文本日志并保留滚动备份。

移除结构化错误事件写盘路径,事件仅在内存中合并并于提交时生成 events.jsonl。

清理旧 Tauri command、共享类型和同步更新诊断上传文档。
统一错误报告打开事件常量并补充快捷入口断言

修复后台详情竞态、下载兼容性、状态选项和错误提示

加强客户端脱敏、指纹降级并过滤预期鉴权错误
按用户隔离提交幂等并处理重复日志名

拒绝 agc 私有前缀的公共对象读写与链接日志读取

保持归档和元数据清理时间一致并补充回归测试

同步错误报告技术文档与项目决策记录
补充单实例文件锁和内存 ZIP 生命周期注释

区分管理员详情 404 与归档存储 500

同步错误报告技术方案与项目决策记录
使用 try/finally 确保错误报告事件监听器始终移除
防止列表请求过期响应覆盖当前筛选结果

为报告行增加键盘打开详情支持

截断详情事件预览并延迟回收下载对象 URL
覆盖 Bearer 授权值并在 WebView 日志桥接处执行二次脱敏

使用首个调用点参与指纹,避免相同消息合并不同调用位置
复用异步错误采集 helper 并在打开面板前完成事件登记
统一普通与二进制请求的服务端错误报告逻辑
移除不存在的 header 段落选择器和 flex 下无效的 grid 列定义
按 RFC3339 时间值排序后台报告列表

拒绝 . 与 .. 日志名以避免归档路径歧义
删除 startup_log 始终为空时永远不会执行的重复记录
记录指纹调用点、日志二次脱敏和后台预览行为
导入 useCallback 以通过客户端类型检查
覆盖评审文件并记录十项需要产品或架构决策的问题
扩展管理员列表契约支持 offset、total 和 hasMore

后台页面增加页码状态、上一页和下一页操作
使用本地元数据索引支持幂等查找和分页读取

拒绝缺失 events.jsonl 的损坏归档并区分管理员更新错误状态

将 OSS 归档 key 固定为仅含报告 UUID 的路径并跳过 ready 重放上传
记录 UUID OSS key、元数据索引和分页响应约定

从 review.txt 移除已完成的 2、4、5、6、9 项
记录元数据索引、分页、UUID OSS key 和归档完整性约定
锁定归档路径只含固定前缀和 UUID 文件名
移除决策记录中已废弃的日期路径
新增 SpacetimeDB error_report 表及 CRUD procedure

生成并接入 spacetime-client 错误报告 facade 与 mapper
移除 api-server 本地文件存储并改为内存 ZIP 单请求上传 OSS

管理员查询详情下载改读 SpacetimeDB 元数据与 OSS 对象

增加 OSS 内部读取删除能力与每日过期清理

同步更新错误报告技术方案、表目录和决策记录
删除本地文件与同步 I/O 的过期实现口径

保留 OSS 与数据库当前架构说明
OSS 未配置或删除失败时保留数据库元数据
删除 OSS 失败写入 failed 状态的过期描述
删除 /bug-report 聊天命令与崩溃页报告按钮

同步项目摘要文案和 AGC 错误报告方案
新增五秒聚合的非阻塞错误通知

支持事件选择并在日志读取完成前禁止提交

扩大移动端关闭按钮触控区域
排除预期四xx认证失败

增加显式 Tauri 诊断调用辅助函数
覆盖预期认证四xx与可报告网络状态
接入显式 Tauri 诊断采集
Project CI / Backend tests (pull_request) Failing after 22s
Project CI / Repository checks (pull_request) Failing after 9s
Project CI / Frontend tests (pull_request) Successful in 3m40s
Project CI / Native shell tests (pull_request) Successful in 16m47s
2f0005ecad
为 GDD 审批失败使用 diagnostic invoke 包装器

更新命令静态检查器识别诊断调用
k88936 added 2 commits 2026-09-01 19:58:43 +08:00
新增 Rust 内存错误队列、脱敏、通知聚合和 Tauri commands

前端改用 bridge,拆分通知与报告弹窗 UI

补充 Vitest、Rust 单测及错误报告技术方案
补齐 AGC 错误通知重载恢复
Project CI / Repository checks (pull_request) Failing after 11s
Project CI / Backend tests (pull_request) Failing after 11s
Project CI / Frontend tests (pull_request) Failing after 2m23s
Project CI / Native shell tests (pull_request) Has been cancelled
7f0d4605eb
挂载时读取 Rust 错误快照并恢复未通知事件

提交报告时移除 Rust 内部 notified 字段
kdletters requested changes 2026-09-01 20:04:24 +08:00
kdletters left a comment
Member

审查 head 7f0d4605eb9e92d01f05f0efb007d6380a5ca00b:存在一个明确的通知丢失问题。定时任务先将未通知事件标记为 notified=true,随后才通过一次性 error-report-updated 事件通知 WebView;若 WebView 尚未监听或重载错过事件,重新挂载时按 notified=false 过滤,事件将永久不再显示,用户无法上报。建议改为可重放通知或前端确认后再标记。

审查 head `7f0d4605eb9e92d01f05f0efb007d6380a5ca00b`:存在一个明确的通知丢失问题。定时任务先将未通知事件标记为 notified=true,随后才通过一次性 error-report-updated 事件通知 WebView;若 WebView 尚未监听或重载错过事件,重新挂载时按 notified=false 过滤,事件将永久不再显示,用户无法上报。建议改为可重放通知或前端确认后再标记。
Member

先标记 notified 再 emit,错过事件会永久隐藏;应改为可重放或确认后标记。

先标记 notified 再 emit,错过事件会永久隐藏;应改为可重放或确认后标记。
k88936 marked this conversation as resolved
k88936 added a new dependency 2026-09-01 20:07:53 +08:00
k88936 added 3 commits 2026-09-02 10:05:37 +08:00
移除 Rust 错误队列 notified 状态与标记命令

将 error-report-updated 收敛为 generation 唤醒并补齐竞态重试

让 WebView 通过快照查询、重载恢复并新增回归测试

同步更新 AGC 错误报告技术方案
Rust Runtime 终态失败、预算耗尽和启动确认失败统一进入错误队列

Direct Codex 与专业 Agent 前台裸 invoke 补充采集并统一上下文去重

归一化 Codex app-server 错误类别并新增回归测试与技术方案
修复错误报告审查中的次要问题
Project CI / Backend tests (pull_request) Failing after 14s
Project CI / Repository checks (pull_request) Failing after 14s
Project CI / Frontend tests (pull_request) Failing after 3m16s
Project CI / Native shell tests (pull_request) Failing after 6m16s
3cde591b67
修复后台错误报告刷新竞态、下载并发与查询参数构建复用。

修复错误报告清理分页、归档大小限制、分页总数和下载响应头异常。

修复 OSS 流式读取上限与 Codex 高频调试日志阻塞。

同步错误报告技术方案与项目决策记录,并在 review.txt 保留待决 breaking 项。
Member

Close #221

Close #221
kdletters removed a dependency 2026-09-02 11:07:13 +08:00
k88936 added 2 commits 2026-09-02 11:10:41 +08:00
错误报告查询和管理 procedure 增加 runtime service identity 授权。

删除 user_id 与 now_micros 旧输入字段并改用服务端身份和时间。

增加 fingerprint、source、管理员备注和凭据脱敏校验。

收紧错误报告 OSS 对象键范围并同步生成绑定与技术文档。
Merge remote-tracking branch 'origin/master' into feat/error-report
Project CI / Repository checks (pull_request) Failing after 1m40s
Project CI / Frontend tests (pull_request) Failing after 2m37s
Project CI / Backend tests (pull_request) Failing after 5m16s
Project CI / Native shell tests (pull_request) Failing after 5m26s
97eabbf4c6
# Conflicts:
#	apps/ai-game-creator-shell/src-tauri/src/main.rs
#	apps/ai-game-creator-shell/src-tauri/src/ui_editor/commands/merge.rs
#	apps/ai-game-creator-shell/src-tauri/src/ui_editor/commands/recognition.rs
#	apps/ai-game-creator-shell/src-tauri/src/ui_editor/commands/ui_design_suggestion.rs
#	docs/technical/【后台管理】多账号与Tab访问权限方案-2026-07-14.md
k88936 added 3 commits 2026-09-02 11:41:58 +08:00
错误报告桥在浏览器和未初始化 WebView 中安全降级
优先复用全局 Tauri 事件桥并收口订阅拒绝
新增无 Tauri 环境回归测试
补充事件桥 fail-safe 排障记忆
同步不支持对象前缀测试与当前 OSS 校验文案。
调整 ErrorReportLogInput 的导入顺序
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
a699638a1d
k88936 added 1 commit 2026-09-02 11:42:41 +08:00
Merge branch 'master' into feat/error-report
Project CI / Repository checks (pull_request) Successful in 3m6s
Project CI / Frontend tests (pull_request) Successful in 4m12s
Project CI / Native shell tests (pull_request) Failing after 5m5s
Project CI / Backend tests (pull_request) Successful in 6m40s
45d8bad188
k88936 added 1 commit 2026-09-02 13:18:57 +08:00
稳定 GDD 恢复弹层测试时序
Project CI / Repository checks (pull_request) Successful in 3m47s
Project CI / Frontend tests (pull_request) Successful in 5m14s
Project CI / Backend tests (pull_request) Successful in 7m38s
Project CI / Native shell tests (pull_request) Successful in 15m45s
24ab773283
等待初始 hydrate 完成后再断言提交按钮可用
保留恢复期间禁用提交和输入内容回归验证
Member

审查 head 24ab7732839aee4d3540e7ee0c039c62325a8554:本地 ack 失败会误报并导致错误报告重复提交;见 ErrorReportDialog.tsx:68。

审查 head `24ab7732839aee4d3540e7ee0c039c62325a8554`:本地 ack 失败会误报并导致错误报告重复提交;见 ErrorReportDialog.tsx:68。
kdletters requested changes 2026-09-02 13:26:05 +08:00
kdletters left a comment
Member

审查 head 24ab7732839aee4d3540e7ee0c039c62325a8554:提交成功后再调用 markClientErrorEventsSubmitted,但 ack 失败也进入同一个 catch(ErrorReportDialog.tsx:68),界面显示“提交失败”,而服务端报告已经落库。用户再次点击提交会生成新的 submissionId,导致同一错误重复创建报告;原事件仍在本地队列。建议将服务端提交成功与本地 ack 解耦:提交成功后显示成功并关闭,ack 失败仅记录/重试;或复用稳定 submissionId。

审查 head `24ab7732839aee4d3540e7ee0c039c62325a8554`:提交成功后再调用 `markClientErrorEventsSubmitted`,但 ack 失败也进入同一个 catch(`ErrorReportDialog.tsx:68`),界面显示“提交失败”,而服务端报告已经落库。用户再次点击提交会生成新的 submissionId,导致同一错误重复创建报告;原事件仍在本地队列。建议将服务端提交成功与本地 ack 解耦:提交成功后显示成功并关闭,ack 失败仅记录/重试;或复用稳定 submissionId。
@@ -0,0 +65,4 @@
logs: includeLogs ? logs : [],
userDescription: description,
});
await markClientErrorEventsSubmitted(selectedEvents);
Member

审查 head 24ab7732839aee4d3540e7ee0c039c62325a8554:提交成功后再调用 markClientErrorEventsSubmitted,但 ack 失败也进入同一个 catch(ErrorReportDialog.tsx:68),界面显示“提交失败”,而服务端报告已经落库。用户再次点击提交会生成新的 submissionId,导致同一错误重复创建报告;原事件仍在本地队列。建议将服务端提交成功与本地 ack 解耦:提交成功后显示成功并关闭,ack 失败仅记录/重试;或复用稳定 submissionId。

审查 head `24ab7732839aee4d3540e7ee0c039c62325a8554`:提交成功后再调用 `markClientErrorEventsSubmitted`,但 ack 失败也进入同一个 catch(`ErrorReportDialog.tsx:68`),界面显示“提交失败”,而服务端报告已经落库。用户再次点击提交会生成新的 submissionId,导致同一错误重复创建报告;原事件仍在本地队列。建议将服务端提交成功与本地 ack 解耦:提交成功后显示成功并关闭,ack 失败仅记录/重试;或复用稳定 submissionId。
k88936 marked this conversation as resolved
k88936 added 2 commits 2026-09-02 14:41:00 +08:00
服务端报告成功后立即反馈成功,不再让本地队列 ack 失败覆盖提交结果。

为同一批事件复用稳定 submissionId,并对本地 ack 增加有限重试和日志记录。

补充客户端回归测试与错误报告链路文档。
将错误报告组件样式迁移至 Tailwind
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
b9fb811fe5
错误提示改用内联 Tailwind 类

错误报告对话框改用内联 Tailwind 类

移除对应全局 CSS 规则
k88936 added 1 commit 2026-09-02 14:42:23 +08:00
Merge branch 'master' into feat/error-report
Project CI / Repository checks (pull_request) Successful in 3m25s
Project CI / Frontend tests (pull_request) Successful in 5m4s
Project CI / Backend tests (pull_request) Successful in 10m10s
Project CI / Native shell tests (pull_request) Successful in 18m20s
64f3a75ba0
k88936 marked the pull request as ready for review 2026-09-02 14:42:33 +08:00
k88936 requested review from kdletters 2026-09-02 15:12:17 +08:00
kdletters requested changes 2026-09-02 15:56:48 +08:00
kdletters left a comment
Member

当前 head 的行内阻塞意见(请按代码位置修复并补回归测试)。

当前 head 的行内阻塞意见(请按代码位置修复并补回归测试)。
@@ -0,0 +196,4 @@
batch_id: record.batch_id,
submission_id: record.submission_id,
status: "ready".into(),
accepted_event_ids: payload.events.into_iter().map(|e| e.event_id).collect(),
Member

[P2] 幂等命中旧记录时,响应仍使用本次请求的 payload.events 生成 accepted_event_ids,但持久化记录没有保存事件 ID 集或 payload 摘要。若相同 submissionId 被不同 payload 重放,客户端会 ack 未写入旧归档的事件,造成数据丢失/语义不一致。请保存并比较事件集合摘要,拒绝不一致重放,或返回原报告对应的 accepted IDs。

[P2] 幂等命中旧记录时,响应仍使用本次请求的 `payload.events` 生成 `accepted_event_ids`,但持久化记录没有保存事件 ID 集或 payload 摘要。若相同 submissionId 被不同 payload 重放,客户端会 ack 未写入旧归档的事件,造成数据丢失/语义不一致。请保存并比较事件集合摘要,拒绝不一致重放,或返回原报告对应的 accepted IDs。
k88936 marked this conversation as resolved
@@ -0,0 +557,4 @@
fn sanitize_report_text_with_limit(v: &str, max: usize) -> String {
let l = v.to_ascii_lowercase();
let normalized = l
.chars()
Member

[P1] 凭据脱敏不能只依赖 ASCII 空白。这里用 is_ascii_whitespace() 归一化后再查找 marker,token = secretAuthorization: Bearer secret 会绕过检测,随后原文进入 ZIP/OSS。请按 Unicode whitespace/规范化处理后再匹配,并补回归测试覆盖 NBSP、EM SPACE 等输入。

[P1] 凭据脱敏不能只依赖 ASCII 空白。这里用 `is_ascii_whitespace()` 归一化后再查找 marker,`token = secret` 或 `Authorization: Bearer secret` 会绕过检测,随后原文进入 ZIP/OSS。请按 Unicode whitespace/规范化处理后再匹配,并补回归测试覆盖 NBSP、EM SPACE 等输入。
k88936 marked this conversation as resolved
@@ -0,0 +137,4 @@
}
#[spacetimedb::procedure]
pub fn create_error_report_and_return(
Member

[P1] 这里把报告 user_id 写成 ctx.sender().to_hex(),但 api-server 使用的是进程级 SpacetimeClient 服务 token;Bearer JWT 中的真实用户 ID 只被拼进 idempotency_key,没有传入 procedure。因此所有用户可能共用同一个归属,且 (user_id, submission_id) 去重会跨用户命中并返回他人报告。请传入由认证层取得的真实用户 ID(不要信任请求体),或明确调整字段/契约以反映服务身份语义。

[P1] 这里把报告 user_id 写成 `ctx.sender().to_hex()`,但 api-server 使用的是进程级 SpacetimeClient 服务 token;Bearer JWT 中的真实用户 ID 只被拼进 idempotency_key,没有传入 procedure。因此所有用户可能共用同一个归属,且 `(user_id, submission_id)` 去重会跨用户命中并返回他人报告。请传入由认证层取得的真实用户 ID(不要信任请求体),或明确调整字段/契约以反映服务身份语义。
k88936 marked this conversation as resolved
k88936 added 10 commits 2026-09-02 19:30:41 +08:00
修复 Agent Runtime 失败上报脱敏与过期会话误报

修复错误通知忽略 ack、队列快照竞态和管理后台分页

修复诊断日志读取、路径清理、归档大小及时间戳处理

修复 OSS object key 使用、重复 Tauri 注册和重复错误上报

整理 spacetime-client active 模块路径并缓存诊断正则
PATCH 更新直接返回元数据,避免重复下载归档

管理后台保留已加载详情并合并最新状态
仅将明确不存在的 OSS 或报告映射为 404

将请求无效、上游和 SpacetimeDB 故障映射为对应错误状态
创建 procedure 增加服务身份校验

增加单 identity 每小时 100 次提交配额并保留幂等重试
创建输入接收并校验 API 注入的登录用户 ID

同步 SpacetimeDB module、client facade 与生成绑定字段
限制 OSS object key、SHA-256、归档大小及事件日志计数

在开发期直接启用新校验,不增加迁移兼容层
在管理员详情弹窗提供备注编辑器

支持独立保存备注并保留状态更新流程
无过滤列表改用 created_at BTree 索引读取

保留过滤查询语义并减少全量排序开销
记录开发期用户归属、身份限流与元数据校验

同步管理员更新响应、备注编辑器和列表索引行为
Merge remote-tracking branch 'origin/master' into feat/error-report
Project CI / Repository checks (pull_request) Successful in 2m30s
Project CI / Frontend tests (pull_request) Successful in 3m42s
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
ad775aaaee
# Conflicts:
#	docs/project-memory/shared-memory/decision-log.md
k88936 added 2 commits 2026-09-02 20:02:03 +08:00
幂等命中时读取原归档并返回原事件 ID

相同 submissionId 重放事件集合不一致时返回 409
加强错误报告凭据脱敏
Project CI / Repository checks (pull_request) Successful in 2m35s
Project CI / Backend tests (pull_request) Successful in 5m56s
Project CI / Frontend tests (pull_request) Successful in 3m20s
Project CI / Native shell tests (pull_request) Successful in 16m51s
beda813a59
使用 Unicode 空白归一化匹配凭据标记

补充 NBSP 和 EM SPACE 回归测试并同步技术文档
k88936 requested review from kdletters 2026-09-02 20:02:52 +08:00
kdletters added 1 commit 2026-09-03 09:58:59 +08:00
Merge branch 'master' into feat/error-report
Project CI / Repository checks (pull_request) Successful in 2m31s
Project CI / Frontend tests (pull_request) Successful in 3m54s
Project CI / Backend tests (pull_request) Successful in 8m16s
Project CI / Native shell tests (pull_request) Successful in 18m32s
f07a8806fa
kdletters merged commit 422c8931d6 into master 2026-09-03 10:02:05 +08:00
kdletters deleted branch feat/error-report 2026-09-03 10:02:06 +08:00
Sign in to join this conversation.