feat: 通过绑定的工作区路由 Core 笔记并保存持久操作回执
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
| `workspace_tree` | Markdown 与目录树;file_id/path/hash/revision/deleted/is_folder |
|
||||
| `workspace_read` | path,返回条目与 UTF-8 content |
|
||||
| `workspace_write` | path、expected(SHA-256)、content;返回新条目 |
|
||||
| `workspace_operation` | vault_id、operation_id;返回 pending/committed/conflict 与提交时条目,未知 ID 返回 null |
|
||||
| `workspace_rename` | path、destination、expected;文件 ID 保持不变 |
|
||||
| `workspace_delete` | path、expected;正文保存在 `.ainote/trash` |
|
||||
| `workspace_mkdir` | path,相对当前授权 Vault |
|
||||
@@ -33,6 +34,10 @@ Windows 使用独立隐藏窗口注册 WTS 会话通知,锁屏、注销及本
|
||||
|
||||
## 写入及恢复
|
||||
|
||||
Workspace schema 2 新增持久操作回执。`workspace_write` 可选 operation_id(UUID),同 ID、同载荷重放返回原提交条目;不同载荷返回 OPERATION_PAYLOAD_CONFLICT。回执与文件元数据、outbox 在同一 SQLite 事务提交,即使之后再次编辑,查询仍返回对应操作的原始结果。schema 1 升级前用 SQLite VACUUM INTO 保存一致备份;旧 schema 1 Host 拒绝写入 schema 2。
|
||||
|
||||
Core 的 `workspace.list/read/write/mutate/operation` RPC 通过受控管道转发,严格拒绝未知字段并校验 Host HTTP 请求捕获的 vault_id。切换或撤销工作区后旧任务返回 VAULT_PERMISSION_CHANGED。普通 HTTP 与 SSE 均由 Rust 添加工作区头,WebView 不能指定。Core 笔记 CRUD 不再写入 unbound-vault,也不从旧 Core 笔记索引回退读取;Markdown 元数据随正文保存,笔记 ID 使用 Rust file_id。当前 Core 笔记 RPC 单篇上限 1 MiB,管道帧上限 8 MiB;大媒体传输与检索投影另行实现,不宣称已满足完整 A-03。
|
||||
|
||||
OS 文件锁配合 Rust Mutex 维持单实例 Vault 写入。Web `serialized_vault_mutation` 使用同一 OS 文件锁;发现 `.ainote/host.sqlite3` 后拒绝 Web 写入,不自动降级。已有个人 Vault 不会被测试读取或迁移。
|
||||
|
||||
保存前对比实际磁盘 SHA-256,先持久化包含内容的 journal,再同目录临时文件刷盘和替换,最后提交元数据及 outbox。文件已替换但数据库未提交时,启动恢复补齐同一 operation_id。摘要不匹配则保留 journal 冲突及外部正文。remote origin 不再次入 outbox。outbox 目前只持久化,**尚无上传/拉取循环**。
|
||||
|
||||
Reference in New Issue
Block a user