Skip to content

fix(kbrain): 旧会话迁移失败时给出可见清单,启动不再反复上传注定失败的会话 - #951

Merged
xiaozhou26 merged 2 commits into
Stack-Cairn:v2-kbrianfrom
AlphaCatMeow:fix-kbrain-history-migration-failures
Oct 10, 2026
Merged

xiaozhou26 merged 2 commits into
Stack-Cairn:v2-kbrianfrom
AlphaCatMeow:fix-kbrain-history-migration-failures

Conversation

@AlphaCatMeow

Copy link
Copy Markdown
Contributor

Closes #947

问题

旧会话迁移失败时,控制台只打一行 Legacy history migration incomplete Array(16),原因显示成 Failed to fetch,用户在界面上看不到哪些会话没迁移、为什么失败。

失败的会话每次启动都会整份重传。本机实测:15 个会话的迁移请求体在 5.3–29.7 MB 之间,都超过了 K-brain 的 4 MB 请求体上限(根因见 Stack-Cairn/K-brain#20)。K-brain 读到一半直接断开连接,所以浏览器只看到 Failed to fetch。每次启动因此多传约 216 MB,启动画面要停约 48 秒。

改动

  • 新增 lib/kbrain/historyMigrationFailures.ts:
    • 失败分四类:过大、冲突(409)、被拒(其它 4xx)、暂时性。连接被断开且请求体超过 4 MB 时判定为「过大」。
    • 按「会话 id + 迁移指纹」把失败记录存在本地。
  • historyMigration.ts:
    • 发送前计算请求体大小,并对失败分类。只有导入 POST 失败才参与分类;前置的存在性检查(GET)失败,一律按暂时性处理。
    • 启动时跳过内容没变、注定还会失败的会话;暂时性失败下次启动仍会重试。
    • 新增 retryKnownFailures 选项。手动「导入旧版对话」会打开它,全部重试;导入成功后清掉对应记录。
  • main.tsx:控制台只报本次新出现的失败,跳过的不再重复刷屏。
  • 设置页「旧版对话迁移」列出失败会话:标题、短 id、请求大小、失败原因和处理建议。
  • 主界面新增提示条,带「查看详情」入口。关闭前弹框确认:关闭后不再提示,此操作不可撤销。设置里的清单仍然保留。会话内容变化后如果再次失败,会重新提示。
  • 新增 test/providers/kbrain-history-migration-failures.test.mjs,6 条用例,其中一条覆盖完整流程:启动跳过 → 手动重试 → 成功后清除记录。

验证

  • pnpm typecheck 通过;迁移相关单测(新增 6 条加原有的)共 16 条全部通过。
  • 本地调试客户端:
    • 首次启动记下 16 条失败,其中 15 条过大、1 条冲突。

    • 第二次启动和修复前对比:

      修复前 修复后
      启动画面停留 ~48 秒 ~12 秒
      迁移上传量 216 MB 26 MB
    • 提示条、详情清单、关闭确认都已人工验收。

剩下的 26 MB 来自已经迁移成功、但文件回滚记录不完整的会话。它们没进缓存,所以每次启动还会重发。这是现有逻辑,不在本 PR 范围内。

截图

主界面提示条:

提示条

设置页失败清单(会话标题已替换为占位文字):

失败清单

说明

这些会话本身还是迁移不进去,要等 K-brain 支持更大或分批的导入(Stack-Cairn/K-brain#20)。本 PR 只处理前端:失败可见、不再反复上传、用户可以选择忽略。

AlphaCatMeow and others added 2 commits October 9, 2026 20:40
此前迁移失败只有一行 `Legacy history migration incomplete`,原因被透传成
`Failed to fetch`;而且每次启动都会把失败的会话整份重传。实测本机 15 个会话的
迁移请求体在 5.3–29.7 MB 之间,全部超过 K-brain 的 4 MB 上限,每次启动多上传
约 216 MB,启动界面要停留约 48 秒(根因见 Stack-Cairn/K-brain#20)。

- 新增 `lib/kbrain/historyMigrationFailures.ts`:把失败分为过大、冲突、
  被拒、暂时性四类,按「会话 id + 迁移指纹」持久化记录。
- `historyMigration.ts`:发送前计算请求体大小;连接被断开且请求体超过 4 MB
  判定为过大。只有导入 POST 的失败才参与判定,前置的存在性检查失败一律按暂时性处理。
  启动时跳过内容未变、且确定会再次失败的会话;手动「导入旧版对话」仍会全部重试。
  导入成功后清除对应记录。
- 设置页「旧版对话迁移」列出失败会话:标题、短 id、大小,以及按类别给出的原因和处理建议。
- 主界面新增提示条,可以跳转到详情;关闭前会弹框确认,关闭后不再提示,此操作不可撤销。
- 新增单测,覆盖分类、记录合并、关闭,以及「启动跳过、手动重试、成功后清除」的完整流程。

Closes Stack-Cairn#947
@xiaozhou26

Copy link
Copy Markdown
Contributor

复核时补修 8ba339f:配合 K-brain #24 的 64 MiB 导入支持,删除旧的 4 MiB 网络错误推断,仅 HTTP 413 判为超限;可恢复 HTTP 错误不永久跳过;缓存版本升级,旧的误判记录不会阻止重新迁移;文案不再硬编码 4 MB。新增超过 4 MiB 网络失败自动重试、可恢复状态、旧缓存失效回归测试。与 #950/#952 联合验证:GUI 全套 3035 passed / 1 skipped,类型检查通过;Chrome 桌面/手机宽度验证横幅、设置失败清单、关闭持久化和模拟桌面接口的手动重试清除失败记录。等待新 head CI 后合并。

@xiaozhou26
xiaozhou26 merged commit 0daa3b9 into Stack-Cairn:v2-kbrian Oct 10, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants