NAS同期
一言でいうと
sync は agent-based ストレージ(LOCAL / NETWORK_DRIVE)上のファイルと、Astar 側のドキュメントツリー・全文検索インデックスとの同期状態を管理するモジュール。WebSocket の接続・認証・メッセージルーティングそのものは core/agent が持ち、sync はその上で「どのドキュメントがどこまで同期済みか」というドメイン状態(SCANNING → INDEXING → COMPLETE のフェーズ遷移、進捗、コンフリクト)を扱う。Go agent(Go agent と CLI)はこのモジュールの直接の相手方で、NAS 上のファイルシステムを WebSocket 越しにスキャンして Astar backend へストリーミングする。
主要ドメイン概念
| 概念 | 役割 |
|---|---|
SyncPhase | 同期操作のフェーズ(SCANNING → INDEXING → COMPLETE、後方遷移不可) |
ScanProgressData / IndexingProgressData | 各フェーズの進捗(受信チャンク数、処理済みファイル数、インデックス済み件数など) |
DocumentSyncStatus / SyncState | 1ドキュメント単位の同期状態(ローカル変更・クラウド変更・同期済み・チェックサム) |
SyncOperation | 1台のデバイスに対する1回のスキャン+インデックス操作 |
| マルチルート同期 | デバイスが複数の StorageDeviceRoot(ストレージ 参照)を持つ場合、同期は設定済みの全ルートに対して行われる |
Backend 構造
api/controller/:DocumentSyncController(ワークスペース単位の同期ステータス取得)domain/service/:DocumentSyncService(ドキュメント単位の同期ステータス CRUD — ローカル変更記録・クラウド変更記録・同期完了マーク)、SyncProgressService(SyncPhaseの遷移管理、スキャン/インデックス進捗の集計、SSE 配信元)、StorageDataMigrationService(ストレージモード移行時のデータ移行)domain/model/:SyncOperation・SyncState・DocumentSyncStatus・MigrationModelsdomain/port/:SyncProgressPort
WebSocket メッセージ経路(core/agent との境界)
Go agent との WebSocket 接続・認証・メッセージのルーティングは core/sync ではなく core/agent/infrastructure/websocket/ が持つ(AgentWebSocketHandler・AgentRequestRouter・FileEventRouter・AgentMessages)。エージェントがファイルチャンクを送ってくると FileEventRouter がそれを解釈し、sync の SyncProgressService / DocumentSyncService を呼び出してドメイン状態を更新する、という分担。「同期まわりのバグ」を追うときは WebSocket 層(core/agent)とドメイン状態層(core/sync)のどちらの問題かをまず切り分けること。
Frontend 構造
app/modules/sync/ はデバイス接続のセットアップ UI と同期状態表示を持つ。
components/:DeviceConnectDialog.vue/DeviceConnectButton.vue(新規デバイス接続の入口 UI)、QuickDeviceSetupCard.vue、NetworkDriveSetupWizard.vue+network-drive/(Docker/SSH 経由のセットアップ手順を段階的に表示)、LocalModeSetupDialog.vue、StorageSetupDialog.vue、SyncStatusBadge.vue、AiRuntimeConnectDialog.vue/AiRuntimeConnectPanel.vue(AI ランタイムをデバイス上で動かす接続)composables/:useSyncStatuses(ワークスペース単位の同期ステータス購読)、useSyncProgress(進捗 SSE の購読とグローバル状態)、useCurrentStorageMode、useQuickLocalDeviceSetup、useRegistrationCodeSetuprepositories/:SyncRepository
他モジュールとの辺
storage: デバイスそのもの(StorageDevice/StorageDeviceRoot)の CRUD・接続状態管理はstorageモジュールの責務。syncはそのデバイス上のファイルの同期状態のみを扱うagent: WebSocket ハンドラ・メッセージルーティングはcore/agentが持つ(上記参照)editor: 同期完了したファイルはドキュメントツリー(editor)のノードとして反映されるsearch: 同期でインデックスフェーズに入ったドキュメントは全文検索インデックスに反映される
sync モジュールを見ても WebSocket の接続処理そのもの(認証・ハートビート・メッセージディスパッチ)は出てこない — それは core/agent(backend のみ、frontend モジュール対応なし)にある。「NAS 同期のコードはどこ?」と core/sync だけを探すと接続層が見つからず迷う。両方を合わせて「NAS 同期」の全体像になる。