协作
SOP 工作室支持实时协同编辑,允许多个用户同时编辑同一个 SOP。更改通过 WebSocket 连接同步,冲突自动解决。
启用协作
协作需要一个启用了 WebSocket 支持的注册中心实例。确保启动注册中心时启用了 WebSocket:
export KP_WEBSOCKET_ENABLED=true
bun run registry/src/index.ts
共享 SOP
- 在编辑器中打开一个 SOP。
- 点击工具栏中的"共享"按钮。
- 复制生成的共享链接或通过代理 ID 邀请协作者。
访问级别
| 级别 | 权限 |
|---|---|
| 查看者 | 只读访问 SOP |
| 编辑者 | 可修改节点、边线和属性 |
| 所有者 | 完全控制,包括共享和删除 |
实时编辑
当多个用户编辑同一个 SOP 时:
- 光标显示 -- 每个协作者的光标在画布上以彩色指示器和其代理 ID 显示。
- 节点锁定 -- 当用户选中一个节点时,该节点显示彩色边框,表示谁在编辑。其他用户仍可查看但无法修改该节点,直到它被取消选择。
- 实时更新 -- 节点增删、边线更改和属性编辑在毫秒内同步。
WebSocket 连接
SOP 工作室与注册中心保持持久的 WebSocket 连接以实现实时更新。
连接生命周期
1. 客户端打开 SOP → WebSocket 连接到 /v1/sop/:id/ws
2. 服务器发送当前状态 + 活跃协作者
3. 客户端以 JSON 补丁形式发送编辑
4. 服务器将补丁广播给所有已连接的客户端
5. 客户端关闭标签页 → 服务器从在线列表中移除
重新连接
如果连接中断,SOP 工作室会以指数退避策略自动尝试重新连接:
| 尝试次数 | 延迟 |
|---|---|
| 1 | 1 秒 |
| 2 | 2 秒 |
| 3 | 4 秒 |
| 4+ | 8 秒(最大值) |
断开连接期间的编辑将在本地排队,并在重新连接后回放。
冲突解决
SOP 工作室使用操作变换(OT)策略进行冲突解决:
- 属性编辑 -- 基于时间戳的后写入优先。如果两个用户同时编辑同一节点属性,最近的编辑优先。
- 结构变更 -- 节点的增加和删除是可交换的。一个用户添加节点,同时另一个用户删除不同节点,两个更改都会正确应用。
- 边线冲突 -- 如果一个节点被删除,而另一个用户同时创建了指向该节点的边线,则边线创建将被拒绝并通知用户。
在线状态指示器
编辑器顶部的协作者栏显示:
- 每个活跃协作者的头像或首字母
- 颜色编码的圆点表示其状态(绿色 = 活跃,黄色 = 空闲)
- 悬停提示显示代理 ID 和当前选择
权限与安全
- 所有 WebSocket 连接在初始 HTTP 升级请求中需要有效的 API 密钥。
- 协作者至少需要
read权限。编辑需要write权限。 - SOP 可见性设置(
private、org、network)控制谁可以访问共享链接。 - WebSocket 消息使用与 REST API 相 同的 Zod 模式进行验证。