feat(sync): 将桌面人设绑定到 Vault 记录

This commit is contained in:
2026-09-09 06:55:35 +08:00
parent a751d80459
commit b83e8dfc2d
10 changed files with 217 additions and 9 deletions
+9
View File
@@ -80,3 +80,12 @@ Host 在写入 journal、捕获外部修改和上传前验证记录;未知字
`opennexus-records/v1/layout/sidebars.json` 使用 schema=1、kind=layout、id=sidebars。data 仅包含 primaryExpanded 布尔值、workspaceWidth 与 chatWidth 两个 200–520 的像素数值;允许小数以保留指针拖动结果。未知字段、窗口路径或越界宽度均拒绝。记录使用相同的 Vault 草稿、CAS 和冲突解决机制,初始上传/合并准备包含当前布局。
本机已有三项侧栏 localStorage 值仍作为初始偏好读取并保存,不删除来源。组件共享布局状态,远端值立即反映在侧栏;窗口可用空间不足时仅收窄渲染宽度,不改写同步偏好,恢复空间后恢复偏好宽度。布局记录不含本机窗口坐标、显示器信息、已打开文件路径或执行权限。本版本未支持的旧客户端不能被视作已验证兼容,跨版本发布兼容验收仍需覆盖新增记录类别。
## 工作区人设记录 v1
桌面端使用 `opennexus-records/v1/persona/default.json`schema=1、kind=persona、id=default。data 白名单为 version02^531 整数)、name(最多 128 Unicode 标量)、system_prompt(最多 16000 Unicode 标量)、dialogue_pairs(最多 20 对,每对仅 user/assistant,各最多 8000 Unicode 标量);整条记录仍受 1 MiB 字节限制。人设正文是用户内容,不自动赋予权限或启动任务。未知字段一律拒绝。
Core 通过绑定 Vault 的 workspace.persona.get/write RPC 读写;Host 先校验 Vault、路径和数据,再执行现有 CAS journal。设置 HTTP DTO 增加 revision 内容摘要,供表单保存时作为 expected;此摘要不写入逻辑 data。整数 version 用作显示版本,不能代替摘要 CAS。重复 operation_id 与同一输入返回持久回执,回执包含所提交记录的实际摘要。过期摘要以 PERSONA_VERSION_CONFLICT 返回,表单保留错误状态。
桌面运行的聊天/Agent 获取当前 Vault 人设,缺失记录得到空人设,不回退全局 SQLite。Web 模式保持原来的全局存储。旧全局数据保留,不自动复制到任意 Vault;明确归属的迁移/导入仍待完成。表单加载时保留 Vault 身份,切换 Vault 后禁止提交旧表单。头像仍只在本机保存,不在此记录内。真实双设备人设收敛、旧数据导入与跨版本兼容需另行验收。
@@ -681,3 +681,13 @@ Core 的独立数据目录目前不等于已授权 Vault。Python 旧笔记写
- 定向前端 4 项通过,包括远端布局不回流、本地布局写入、两个侧栏宽度分离、窄窗口限制不污染偏好。新增 Rust 测试覆盖布局记录完整信封/允许路径、非法宽度和设备字段拒绝。完整前端 101 文件、526 项通过,日志 .build/layout-sync-frontend.log。
- 本轮覆盖现有侧栏布局,不代表全部逻辑数据已经完成:Skills、对话、Agent/人设、Provider 非秘密参数和安装清单仍需各自适配;真实双设备 UI 与旧版本新增记录兼容验收尚未完成。
- 最终 desktop Rust 全目标 137 通过、12 ignored(库 122、Host 8、其余集成 7),日志 .build/layout-sync-rust.log;全目标 Clippy -D warnings 与前端 type-check 均通过,日志 .build/layout-sync-clippy.log、.build/layout-sync-types.log。没有改动用户 Vault 内容,完整生产化验收仍未完成。
## 增量:桌面人设读取当前 Vault 记录
- 增加 persona/default 严格逻辑记录与 workspace.persona.get/write 专用 Core RPC。保留 Task RPC 范围,新增入口仍核验 Vault 和记录 kind/id。记录回执增加原始已提交 bytes 的 hash,以便响应丢失重放时返回正确摘要。
- 桌面 persona_settings 经 Host 读取/保存,并以 revision 摘要作为 expected;数据 version 仅作为显示版本递增,不替代内容 CAS。调用方 operation_id 原样传递给 Host,未知提交结果不自动换 ID 重试。API 读写 handler 改为同步函数,由 FastAPI 工作线程执行阻塞 Host RPC。
- 原来全局 SQLite 人设不猜测所属 Vault:桌面空库返回空人设,Web 仍使用全局存储且旧数据保留。聊天/Agent 的 apply_global_persona 沿既有调用链获取此作用域的数据。UI 显示工作区人设说明,并保留 revision;Vault 切换或迟到的旧 Vault 加载响应不能让旧表单保存到新 Vault。
- Python 定向 5 项通过,覆盖全局原有行为、桌面摘要保存、过期摘要映射、Host operation_id、旧全局保留/不自动导入。Host 新测试覆盖真实 Workspace 重开、操作重放、CAS、未知字段和跨 Vault 拒绝。前端新增表单摘要往返与切 Vault 拒绝测试,定向 4 项通过;完整前端此前 526 项通过,类型检查通过,新加测试单独运行通过。
- 该能力仍需真实双设备人设同步/冲突与明确归属旧数据导入验收,不能据此声明全部逻辑数据同步或生产化完成。
- 最终 Python 全套 902 通过、1 项依赖弃用警告,105.26 秒;desktop Rust 全目标 138 通过、12 ignored(库 123、Host 8、其余集成 7),Clippy -D warnings 通过。日志 .build/persona-sync-python.log、.build/persona-sync-rust.log、.build/persona-sync-clippy.log;前端日志 .build/persona-sync-frontend.log 和 .build/persona-sync-types.log。完整目标继续保持未完成。