Skip to content

会话变更自动同步#444

Merged
chiimagnus merged 15 commits into
mainfrom
crh1
May 25, 2026
Merged

会话变更自动同步#444
chiimagnus merged 15 commits into
mainfrom
crh1

Conversation

@chiimagnus
Copy link
Copy Markdown
Member

背景

  • 会话写入、图片回填和评论变更只更新本地数据,没有统一的自动同步入口,外部 provider 侧内容会停留在上一次手动同步的状态。
  • Notion、Obsidian、Feishu 的同步调度分散在各自实现里,队列和 alarm 策略无法统一,触发时机容易不一致。
  • 设置页没有 provider 级自动同步开关,用户只能手动同步,无法按 provider 控制自动下发。

变更

事件接入与后台调度

  • 在 conversation/comment 写入路径里统一调用 autoSync.onConversationChanged(...),把 upsert、消息写入、图片回填和 comments 增删改移都转成按 conversationId 的入队事件。
  • background-services 按 provider 的自动同步开关和 sync-provider gate 决定是否入队;写入侧用 fireAndForget,避免同步调度拖慢主写入链路。
  • 新的调度核心 createAutoSyncSchedulerCore 统一处理去重、去抖、队列上限、最近到期 alarm 和 flush;当 sync 已在运行时会把到期项重新延后,避免并发重入。
  • Notion 额外做了 preflight:先确认 OAuth token 和 parent_page_id,失败时落一条可见的失败 job,避免静默丢失同步结果。

设置与运行时契约

  • Settings 页面补上 Notion / Obsidian / Feishu 的自动同步开关,并且只在对应 provider 的“同步”开关开启时展示;controller 负责从 storage 读取、回写和监听状态变更。
  • wxt.config.ts 增加 alarms 权限,让 MV3 可以在 debounce 到期后唤醒并 flush 队列。
  • 文档补充了自动同步是事件驱动、按 provider 存储开关、只同步受影响 conversationId 的契约说明。

测试

  • 做同一 conversation 连续两次入队,期望队列里仍只保留一条记录且 dueAt 被推后。
  • 做两个 conversation 依次入队,期望 alarm 取最早到期时间。
  • 做到期队列 flush,期望只同步到期的 conversationId 且已处理项从队列移除。
  • 做 provider 关闭或自动同步关闭后 flush,期望不调用 provider sync 且到期项被清空。
  • 做 Notion token 缺失且队列到期的 flush,期望不调用 orchestrator,并写入一条可见的失败 job。

@chiimagnus chiimagnus merged commit 52814ca into main May 25, 2026
1 check passed
@chiimagnus chiimagnus deleted the crh1 branch May 25, 2026 09:42
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