Skip to content

feat: 局域网设备同步与冲突合入 - #49

Open
KraHsu wants to merge 5 commits into
codex/desktop-experience-p9from
codex/device-sync-p10
Open

KraHsu wants to merge 5 commits into
codex/desktop-experience-p9from
codex/device-sync-p10

Conversation

@KraHsu

@KraHsu KraHsu commented Oct 30, 2026 •

Copy link
Copy Markdown
Owner

桌面版现在可在「设置 → 连接 → 设备同步」配对局域网设备、交换学习库更新并预览确认合入。两端离线编辑或复习后,重复传输不会重复评分,冲突保留双方内容和历史,由用户明确选择后续内容或复习安排。

本 PR 基于尚未合并的 #48(codex/desktop-experience-p9),集中包含本阶段功能、回归与使用说明。

改动

  • 默认关闭的 TLS 1.3 直连,限时一次性邀请、人工批准、证书固定及后续双向 TLS;支持暂停、撤销设备、取消和退出组。设备私钥与授权留在设备上,切换工作目录立即隔离旧请求。
  • 以事务级领域事件和因果向量同步,不复制正在使用的 SQLite 文件。增量捕获保持普通评分不扫描全库;持久日志、事件身份和设备写入进度支持去重、乱序、离线及旧副本恢复。
  • 接收只暂存事件和对象,用户预览并确认后才使用既有学习库事务提交。修订号、外部文件冲突、当前学习/编辑状态及资源完整性均在应用前复核;失败不提前推进应用进度。
  • 独立字段自动三方合并,同字段和删除/编辑冲突明确选择。并发复习保留双方评分历史,后续调度选择一个真实分支,不伪造 FSRS 回放;退役项保留原 ID、完整历史及代码。
  • 图片、音频及材料版本原件分块校验、暂存和断点续传,完整哈希校验后登记,确认合入时发布附件;包含损坏、重复块、磁盘满和不安全文件引用的回归。
  • 同步公开 SDK 插件配置和 JSON 数据,保留未知/停用插件内容;插件代码、私有文件、凭据和信任不通过此通道传播。
  • 设置页使用共享绿色 B 控件;冲突显示内容名称和可读复习时间/次数,技术详情折叠。应用生命周期统一持有控制器,旧预览、连锁冲突选择及同库设置缓存竞态均有回归。
  • 首次创建同步组将 SQLite 写入门槛升至 18;只读网页可读取学习内容,静态产物不包含原生同步入口。

使用说明:局域网设备同步。

验证

  • 最终本地宿主全量 176 文件、1229 项通过、1 项原有跳过;UTC 相关 76 项通过,覆盖连锁冲突、候选版本反转及调度摘要。
  • 原生跨语言全量 4 文件、49 项通过,包括真实 Rust 进程、SQLite、文件、TypeScript Repository 的双工作目录合入与附件链路。
  • Workspace Rust 66 单元 + 43 集成通过;Tauri 主程序 114 项通过、2 项既有 ignored。独立 TLS harness 再执行相同 9 个原生连接案例通过。
  • SDK/官方插件 274 项、Windows 发布规则 28 项通过;两个 Rust crate 的全部 targets Clippy、fmt,以及最终类型、格式检查通过。
  • 静态和桌面前端生产构建通过,静态原生接口隔离与预缓存检查通过。
  • 真实 Vue/Nuxt UI 浏览器组件验证覆盖浅色、深色、窄窗及内容/调度冲突,控制台无错误,640px 无横向溢出。

最终提交 43b45f5 的轻量 Unit CI已通过,仅运行该轻量工作流。

验证边界

真实多台设备的局域网、防火墙、断网恢复和 Windows/macOS/Linux 原生行为仍待人工验证;单机 TCP/TLS、双工作目录和浏览器组件证据不等于安装包或多机验收。没有使用 computer-use、手动触发功能分支重型 CI/Desktop、合并或发布。

单次预览上限为 10 万事务、10 万记录变更和 64 MiB 事件内容,超限明确拒绝且不部分应用,目前不自动拆分超限待处理集合。笔记中宿主模型之外的 YAML、注释和原始排版模板不映射到新设备,完整文件保真仍使用备份或目录复制;具体边界见使用说明。

This branch has not been deployed

No deployments
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.

1 participant