gongxiangp2/docs/desktop-native-cloud-sync.md

81 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 原生工程云备份与网页查看
客户端承担编辑、模型请求、排版、预览图和导出。平台仅鉴权、保留私有工程及恢复附件、分发已上传的预览;不解压、不渲染 `.pcraft`。网页 `/assets/detail-generator` 只查看项目和草稿,允许经确认联动删除,编辑回到客户端。
## 授权与版本
继续使用素材库网页登录授权产生的客户端 Bearer 会话,不能传入用户的 98k Key。每次调用实时检查会话、撤销、账号状态和当前内测权限;工程流上传开始与结束各检查一次。浏览器查看接口使用素材库 Cookie 会话,不向页面发放桌面写令牌。
`GET /api/desktop/capabilities` 声明 `documentVersions: [1,2,3]`、`projectDeletion: true`、`nativeFiles` 限制。旧 v1/v2 项目继续可读,v3 原生工程禁止被旧版本格式覆盖。
## v3 项目
沿用 `PUT /api/desktop/projects/desktop/{projectId}`:
```json
{
"revision": 2,
"status": "draft",
"conversation": [],
"composer": "",
"document": {
"version": 3,
"id": "project-id",
"name": "产品详情页",
"native": {
"format": "photocraft",
"schemaVersion": 1,
"documentSource": "native:<canvas文件的完整SHA256>",
"files": [
{"path": "canvas.pcraft", "source": "native:<完整SHA256>", "sha256": "<完整SHA256>", "size": 123456},
{"path": "context.json", "source": "native:<完整SHA256>", "sha256": "<完整SHA256>", "size": 1234},
{"path": "session-backup.json", "source": "native:<完整SHA256>", "sha256": "<完整SHA256>", "size": 4567}
]
},
"screens": [
{"id": "hero", "name": "首屏", "width": 1440, "height": 2200, "previewSource": "local:<预览SHA256>"}
]
}
}
```
可选 `document.creation` 使用现有 v2 的经验证创作资料、事实、卖点批次、方案和规则快照。原生恢复附件由客户端生成白名单备份,排除登录授权、Key 和系统凭据;服务端不解析其中的文件。
首次同步先以 `revision:0` 创建 `draft` 占位:`native.documentSource:null, native.files:[]`、分屏 `previewSource:null`。然后上传附件和预览,最后以服务器最新 `revision` 提交完整引用。已有项目先上传新内容,最终一次修改版本;断线或 409 时保留本机草稿与旧云端版本,不覆盖其他设备成果。
完整原生工程同时包含 `canvas.pcraft`、`context.json`、`session-backup.json`。完结状态额外要求每屏预览已上传。服务器提交前核对所有文件属于本账户本项目,且长度、SHA256、类型一致。列表以 `backupState:pending|ready` 区分未完成的首次同步;不能把占位显示为完整备份。
标记完结时,服务器与任务登记使用同一账户事务锁,复核本项目的任务表:排队、执行中、待应用、结果未知及仍持有效租约的任务均返回 `409 task_busy`。持久化会话或本次摘要中的 `pending`/`unknown` 也会阻止完结,不能通过省略摘要覆盖旧证据。草稿仍可同步并保留原请求身份;无未结任务的完结项目正常保存不会被降级。
`conversation` 仅存待处理请求的有限摘要;完整会话在私有恢复附件。存在未知请求时保留原任务 ID,并带 `unknown:true`;服务端会拒绝删除这样的项目。恢复只能查询原请求,不能自动重发模型调用。
## 原生文件传输
上传路径:`PUT /api/desktop/projects/desktop/{projectId}/native/native:{sha256}`。
- `Authorization: Bearer <素材库客户端会话>`。
- `Content-Type: application/octet-stream`。
- `Content-Length` 为实际字节数,单文件最多 512 MiB。
- `X-Content-SHA256` 必须等于路径中的 64 位小写 SHA256。
- 原始文件作为请求流发送;不能使用 Base64 JSON 或 multipart。
- 成功返回 `{source,sha256,bytes,existing}`。已存在相同内容返回 `existing:true`;不同内容必须使用不同哈希来源。
- 同项目同时只接收一份工程文件流,冲突返回 `409 upload_busy`;单次最多 10 分钟、连续无数据最多 60 秒。
下载使用同路径 `GET`,支持单段 `Range: bytes=start-end` / 后缀范围,返回 200 或 206,带 `Content-Length`、`Accept-Ranges` 和 `X-Content-SHA256`。服务器分块读写,应用内存不随整份原生文件大小增长。客户端必须核对下载长度与哈希后再恢复工程。
预览继续沿用 `PUT /api/desktop/projects/desktop/{projectId}/assets/local:{id}`,仅 PNG/JPEG/WebP,每张最多 20 MiB。建议使用稳定图片哈希作 ID;预览可缩小,但 `screens.width/height` 保留原画布坐标。网页只取这些预览,不取得原生附件或完整会话。
每项目云资源含保留旧内容总量最多 1 GiB、160 个文件;达到上限返回 `413 project_quota`。不自动删除当前版本、待提交的新文件或未知请求证据。上传未完成、校验失败、会话被撤销或项目已删除时清理本次临时文件;已提交结果不明时先查数据库引用,避免误删有效原件。
## 查看、删除与恢复
浏览器 `GET /api/detail-projects` 返回项目列表;`GET /api/detail-projects/{web|desktop}/{id}` 返回经裁剪的只读资料、分屏与图片引用。原生 manifest、存储键、模型绑定、请求诊断与完整会话不传给页面。只读图片使用 `GET .../assets/{source}`,每次重新核对账户与项目归属。
网页 `DELETE /api/detail-projects/{source}/{id}` 与客户端 `DELETE /api/desktop/projects/{source}/{id}` 均传 `{revision}`,先显示删除范围确认。服务端原子软删除 Web 项目及其客户端续作;运行、排队或结果未知的任务阻止删除。过期版本返回 409。列表保留删除墓碑供其他设备同步;已删项目不能被旧设备保存重建。本机工程由客户端移入可恢复区域,不直接销毁。
## 2026-10-22 验证范围
定向测试覆盖 v3 合同、完整引用、版本冲突、关联墓碑、账户隔离、真实临时磁盘流式传输/去重/Range、末尾撤权与删除清理、并发上传和提交时额度复核。Web 本地独立 fixture 实测 1280×900 与 390×844,检查首屏封面、草稿/完结、半同步提示、原生预览、分屏切换和删除确认取消。证据位于 `output/native-web-completion-20261022/`;该 fixture 不代表生产跨端验收。
收尾复核增加服务端完结保护:7 套 37 项定向测试通过;独立本地 PostgreSQL 的 4 组实际事务验收验证任务锁竞态、未知证据保留、账户隔离、完结保持和只删除本轮合成项目。测试无模型调用,原未知请求未修改;证据位于 `output/native-closeout-recheck-20261022/`。工作树另有未发布的知识库迁移草稿,发布迁移闭包继续以已提交的 39 项为准,HEAD 隔离闭包 20 项测试通过。