跳到主要内容

协作

SOP 工作室支持实时协同编辑,允许多个用户同时编辑同一个 SOP。更改通过 WebSocket 连接同步,冲突自动解决。

启用协作

协作需要一个启用了 WebSocket 支持的注册中心实例。确保启动注册中心时启用了 WebSocket:

export KP_WEBSOCKET_ENABLED=true
bun run registry/src/index.ts

共享 SOP

  1. 在编辑器中打开一个 SOP。
  2. 点击工具栏中的"共享"按钮。
  3. 复制生成的共享链接或通过代理 ID 邀请协作者。

访问级别

级别权限
查看者只读访问 SOP
编辑者可修改节点、边线和属性
所有者完全控制,包括共享和删除

实时编辑

当多个用户编辑同一个 SOP 时:

  • 光标显示 -- 每个协作者的光标在画布上以彩色指示器和其代理 ID 显示。
  • 节点锁定 -- 当用户选中一个节点时,该节点显示彩色边框,表示谁在编辑。其他用户仍可查看但无法修改该节点,直到它被取消选择。
  • 实时更新 -- 节点增删、边线更改和属性编辑在毫秒内同步。

WebSocket 连接

SOP 工作室与注册中心保持持久的 WebSocket 连接以实现实时更新。

连接生命周期

1. 客户端打开 SOP → WebSocket 连接到 /v1/sop/:id/ws
2. 服务器发送当前状态 + 活跃协作者
3. 客户端以 JSON 补丁形式发送编辑
4. 服务器将补丁广播给所有已连接的客户端
5. 客户端关闭标签页 → 服务器从在线列表中移除

重新连接

如果连接中断,SOP 工作室会以指数退避策略自动尝试重新连接:

尝试次数延迟
11 秒
22 秒
34 秒
4+8 秒(最大值)

断开连接期间的编辑将在本地排队,并在重新连接后回放。

冲突解决

SOP 工作室使用操作变换(OT)策略进行冲突解决:

  • 属性编辑 -- 基于时间戳的后写入优先。如果两个用户同时编辑同一节点属性,最近的编辑优先。
  • 结构变更 -- 节点的增加和删除是可交换的。一个用户添加节点,同时另一个用户删除不同节点,两个更改都会正确应用。
  • 边线冲突 -- 如果一个节点被删除,而另一个用户同时创建了指向该节点的边线,则边线创建将被拒绝并通知用户。

在线状态指示器

编辑器顶部的协作者栏显示:

  • 每个活跃协作者的头像或首字母
  • 颜色编码的圆点表示其状态(绿色 = 活跃,黄色 = 空闲)
  • 悬停提示显示代理 ID 和当前选择

权限与安全

  • 所有 WebSocket 连接在初始 HTTP 升级请求中需要有效的 API 密钥。
  • 协作者至少需要 read 权限。编辑需要 write 权限。
  • SOP 可见性设置(privateorgnetwork)控制谁可以访问共享链接。
  • WebSocket 消息使用与 REST API 相同的 Zod 模式进行验证。