コラボレーション
SOP Studio はリアルタイムの共同編集をサポートしており、複数のユーザーが同じ SOP を同時に編集できます。変更は WebSocket 接続を介して同期され、競合は自動的に解決されます。
コラボレーションの有効化
コラボレーションには WebSocket サポートが有効なレジストリが必要です。レジストリインスタンスを WebSocket 有効で起動してください:
export KP_WEBSOCKET_ENABLED=true
bun run registry/src/index.ts
SOP の共有
- エディターで SOP を開きます。
- ツールバーの「Share」ボタンをクリックします。
- 生成された共有リンクをコピーするか、エージェント ID でコラボレーターを招待します。
アクセスレベル
| レベル | 権限 |
|---|---|
| Viewer | SOP への読み取り専用アクセス |
| Editor | ノード、エッジ、プロパティの変更が可能 |
| Owner | 共有や削除を含む完全な制御 |
リアルタイム編集
複数のユーザーが同じ SOP を編集する場合:
- カーソルプレゼンス -- 各コラボレーターのカーソルがキャンバス上にカラーインジケーターとエージェント ID で表示されます。
- ノードロック -- ユーザーがノードを選択すると、誰が編集中かを示すカラーボーダーが表示されます。他のユーザーは閲覧できますが、選択が解除されるまでそのノードを変更できません。
- ライブアップデート -- ノードの追加、削除、エッジの変更、プロパティの編集がミリ秒単位で同期されます。
WebSocket 接続
SOP Studio はリアルタイム更新のためにレジストリへの永続的な WebSocket 接続を維持します。
接続ライフサイクル
1. クライアントが SOP を開く → /v1/sop/:id/ws に WebSocket CONNECT
2. サーバーが現在の状態とアクテ ィブなコラボレーターを送信
3. クライアントが JSON パッチとして編集を送信
4. サーバーが接続されたすべてのクライアントにパッチをブロードキャスト
5. クライアントがタブを閉じる → サーバーがプレゼンスリストから削除
再接続
接続が切断された場合、SOP Studio はエクスポネンシャルバックオフで自動的に再接続を試みます:
| 試行回数 | 遅延 |
|---|---|
| 1 | 1秒 |
| 2 | 2秒 |
| 3 | 4秒 |
| 4以降 | 8秒(最大) |
切断中の編集はローカルにキューイングされ、再接続時にリプレイされます。
競合解決
SOP Studio は競合解決にオペレーショナルトランスフォーメーション(OT)戦略を使用します:
- プロパティの編集 -- タイムスタンプ順の Last-Write-Wins。2人のユーザーが同じノードのプロパティを同時に編集した場合、最新の編集が優先されます。
- 構造の変更 -- ノードの追加と削除は可換的です。あるユーザーがノードを追加し、別のユーザーが別のノードを削除した場合、両方の変更がクリーンに適用されます。
- エッジの競合 -- あるユーザーがノードを削除し、別のユーザーがそのノードへのエッジを作成した場合、エッジの作成は拒否され、ユーザーに通知されます。
プレゼンスインジケーター
エディター上部のコラボレーターバーには以下が表示されます:
- 各アクティブなコラボレーターのアバターまたはイニシャル
- ステータスを示すカラードット(緑 = アクティブ、黄 = アイドル)
- エージェント ID と現在の選択を表示するツールチップ
権限とセキュリティ
- すべての WebSocket 接続は、初回の HTTP アップグレードリクエスト経由で有効な API キーが必要です。
- コラボレーターには少なくとも
readスコープが必要です。編集にはwriteスコープが必要です。 - SOP の可視性設定(
private、org、network)が共有リンクにアクセスできる対象を制御します。 - WebSocket メッセージは REST API と同じ Zod スキーマに対してバリデーションされます。