Skip to content

fix(web): restore unloaded native Thread descendants - #855

Merged
BytePioneer-AI merged 1 commit into
BytePioneer-AI:mainfrom
YanYunCY:fix/web-restore-unloaded-native-descendants
Nov 15, 2026
Merged

BytePioneer-AI merged 1 commit into
BytePioneer-AI:mainfrom
YanYunCY:fix/web-restore-unloaded-native-descendants

Conversation

@YanYunCY

Copy link
Copy Markdown
Contributor

Summary

修复 Web 恢复父 Thread 时漏掉未加载归档页中的原生后代。改动集中在 Web Server 的归档级联逻辑,并补充回归测试和现有功能文档。

  1. 父 Thread 恢复成功,后续归档页中的原生子 Thread 仍保持归档
    • 失败:新建 Web 实例只加载父 Thread 所在的归档页,再调用 workspace/unarchiveSession 或 session/unarchive,RPC 返回成功,但没有向未加载的原生子 Thread 发送恢复请求。
    • 根因:b65ae255b 的跳过条件把“不在 Web 已加载归档 ID 集合中”当作“已恢复”。Host 契约明确规定,原生归档 ID 只描述返回页,集合外的后代状态仍是未知。
    • 修法:恢复未知状态后代前读取包含归档的 Host 目录,设置 officialCursor.live:null 并跟随 officialCursor.archived 到结束;确认未归档后才跳过。一次级联共用一次确认,读取失败或重复游标按现有部分失败语义报告,其他已知归档后代继续恢复。
    • 为何采用目录确认:Host 原样转发原生 thread/unarchive;核对到的原生实现会在没有归档 rollout 时返回错误,不能假设重复恢复是 no-op。归档方向的跳过条件与原行为一致,父 Thread 的原生错误也保留。

Related issues

Test plan

  • 修复前:node --import tsx --test packages/web-server/test/ch-thread-tree-restore.test.ts,两个恢复入口均复现失败(0 passed / 2 failed,child must be restored with parent)。
  • 修复后:同一组回归先 2/2 通过;补齐边界后的 catalog/history/tree 定向测试共 76/76 通过,含 6 项新增测试。
  • npm run typecheck 通过。
  • npm run lint 通过,包含包边界检查;最终改动 TS 文件的定向 ESLint 通过。
  • 改动 TS 文件的 Prettier 检查、git diff --check 和预提交格式检查通过。
  • 未实机运行 Codex CLI/Desktop/真实 Harness;使用 Web RPC 与 Host 线协议夹具验证。原生重复恢复行为静态核对于 openai/codex@b1573f102413e96a6481087922bf425231222dee。
  • 本地为 Windows x64,未在 macOS/Linux 执行;未跑全仓 npm test、Rust 或浏览器套件。

定向测试命令:

node --import tsx --test packages/web-server/test/ch-thread-tree-restore.test.ts packages/web-server/test/ch-archived-threads.test.ts packages/web-server/test/ch-session-pagination.test.ts packages/web-server/test/ch-thread-tree.test.ts packages/web-server/test/ch-thread-history.test.ts packages/web-server/test/ch-catalog-updates.test.ts apps/web-ui/packages/client/ui-workspace/test/thread-tree.test.ts

@coderabbitai

coderabbitai Bot commented Nov 14, 2026 •

Copy link
Copy Markdown

Explain Change →

No actionable comments were generated in the recent review.

Summary

Summary by CodeRabbit

  • 修复
    • 恢复线程时,会正确处理已归档的后代线程,并跳过确认未归档的后代。
    • 归档状态无法确认时,会报告恢复失败,避免将状态未知的线程误判为已恢复。
  • 文档
    • 补充线程树级联恢复的状态确认规则及失败处理说明。

恢复线程树时,服务端会分页读取 Host 归档目录,确认未加载的后代状态。新增测试覆盖跨页恢复、存活后代跳过、目录读取失败和所选线程恢复失败。

Changes: 线程树恢复级联

Layer / File(s) Summary
归档目录分页读取
packages/web-server/src/ch-thread-tree.ts
新增 readArchivedIds,通过归档游标收集归档线程 ID。遇到重复游标时抛出 host/catalog-invalid。
恢复级联状态确认
packages/web-server/src/ch-thread-tree.ts, packages/web-server/test/ch-thread-tree-restore.test.ts, docs/architecture/web-thread-tree.md
恢复时,只有确认后代未归档才跳过。测试覆盖跨页读取、存活后代跳过、确认失败和所选线程恢复失败。文档补充归档状态确认流程。

Estimated code review effort: 3 (Moderate) | ~20 minutes

Change: Bug fix

Sequence Diagram(s)

sequenceDiagram
  participant archive
  participant readArchivedIds
  participant HostCatalog
  participant setArchived
  archive->>readArchivedIds: 确认未加载到的后代状态
  readArchivedIds->>HostCatalog: 按 officialCursor.archived 分页读取
  HostCatalog-->>readArchivedIds: 返回归档页和游标
  readArchivedIds-->>archive: 返回归档 ID 集合或读取错误
  archive->>setArchived: 恢复已归档的后代
Loading

Suggested reviewers: bytepioneer-ai

Merge Risk: Minimal · up to c91b5

The change makes restoring a Thread also restore archived descendants that sit on pages the Web instance never loaded, and it reports a failure when their status cannot be confirmed. The focused tests cover the main paths, and no actionable merge-blocking issue remains. One narrow edge case remains: when the native runtime is unavailable in an externalOnly Host, descendants may not be restored. That case is not worth blocking the merge.

Pre-merge checks: Passed 4

Check name Status Explanation
Title check Passed 标题 "fix(web): restore unloaded native Thread descendants" 与变更集主要内容一致。变更修复了父 Thread 恢复时,未加载归档页中的原生后代未被恢复的问题。代码改动位于 ch-thread-tree.ts,新增归档目录读取与确认逻辑,并补充了对应回归测试和文档。标题简洁,并指出了主要修复点。
Description check Passed 描述说明了修复目标:Web 恢复父 Thread 时遗漏未加载归档页中的原生后代。描述还给出根因、修复方法(读取包含归档的 Host 目录并跟随 officialCursor.archived)、测试计划和验证范围。这些内容与变更集直接相关。
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Finishing Touches

Generate unit tests (beta)

  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

Recent review info

Run configuration

Commits

Reviewing files that changed from the base of the PR and between 9f4141a and c91b5f0.

Files selected for processing: 3

  • docs/architecture/web-thread-tree.md
  • packages/web-server/src/ch-thread-tree.ts
  • packages/web-server/test/ch-thread-tree-restore.test.ts

Included review availability: This review used your included allowance. Your plan provides up to 8 included reviews per hour; 7 remain after this review.

Recent review details

Context from checks skipped due to timeout: 5

  • GitHub Check: CodeRabbit
  • GitHub Check: Check macos-26
  • GitHub Check: Check ubuntu-22.04
  • GitHub Check: Check windows-latest
  • GitHub Check: Check Linux ARM64

@BytePioneer-AI
BytePioneer-AI merged commit cc18bbb into BytePioneer-AI:main Nov 15, 2026
5 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