[{"data":1,"prerenderedAt":672},["ShallowReactive",2],{"navigation":3,"doc-/modules/sync":217,"docs-all-paths":617},[4,19,39,63,87,111,127,195,211],{"title":5,"path":6,"stem":7,"children":8},"Welcome","/welcome","01.welcome",[9,11,15],{"title":5,"path":6,"stem":10},"01.welcome/index",{"title":12,"path":13,"stem":14},"Astar とは（5分）","/welcome/product-in-5-min","01.welcome/01.product-in-5-min",{"title":16,"path":17,"stem":18},"事業文脈","/welcome/business-context","01.welcome/02.business-context",{"title":20,"path":21,"stem":22,"children":23},"Getting Started","/getting-started","02.getting-started",[24,27,31,35],{"title":25,"path":21,"stem":26},"はじめかた","02.getting-started/index",{"title":28,"path":29,"stem":30},"リポジトリ取得と環境構築","/getting-started/repo-setup","02.getting-started/01.repo-setup",{"title":32,"path":33,"stem":34},"日々の開発ループ","/getting-started/dev-loop","02.getting-started/02.dev-loop",{"title":36,"path":37,"stem":38},"検証の 4 層","/getting-started/verification-tiers","02.getting-started/03.verification-tiers",{"title":40,"path":41,"stem":42,"children":43},"Architecture","/architecture","03.architecture",[44,47,51,55,59],{"title":45,"path":41,"stem":46},"アーキテクチャ","03.architecture/index",{"title":48,"path":49,"stem":50},"マルチテナンシーと RLS","/architecture/multi-tenancy-rls","03.architecture/01.multi-tenancy-rls",{"title":52,"path":53,"stem":54},"認可モデル","/architecture/authorization","03.architecture/02.authorization",{"title":56,"path":57,"stem":58},"AI サブシステム","/architecture/ai-subsystem","03.architecture/03.ai-subsystem",{"title":60,"path":61,"stem":62},"データモデル","/architecture/data-model","03.architecture/04.data-model",{"title":64,"path":65,"stem":66,"children":67},"Backend","/backend","04.backend",[68,71,75,79,83],{"title":69,"path":65,"stem":70},"バックエンド","04.backend/index",{"title":72,"path":73,"stem":74},"層構造","/backend/layering","04.backend/01.layering",{"title":76,"path":77,"stem":78},"規約","/backend/conventions","04.backend/02.conventions",{"title":80,"path":81,"stem":82},"テスト","/backend/testing","04.backend/03.testing",{"title":84,"path":85,"stem":86},"マイグレーション","/backend/migrations","04.backend/04.migrations",{"title":88,"path":89,"stem":90,"children":91},"Frontend","/frontend","05.frontend",[92,95,99,103,107],{"title":93,"path":89,"stem":94},"フロントエンド","05.frontend/index",{"title":96,"path":97,"stem":98},"モジュール内部構造","/frontend/module-anatomy","05.frontend/01.module-anatomy",{"title":100,"path":101,"stem":102},"API アクセスの一本道","/frontend/api-access-chain","05.frontend/02.api-access-chain",{"title":104,"path":105,"stem":106},"i18n","/frontend/i18n","05.frontend/03.i18n",{"title":108,"path":109,"stem":110},"デザインシステム","/frontend/design-system","05.frontend/04.design-system",{"title":112,"path":113,"stem":114,"children":115},"Go Agent And Cli","/go-agent-and-cli","06.go-agent-and-cli",[116,119,123],{"title":117,"path":113,"stem":118},"Go agent と CLI","06.go-agent-and-cli/index",{"title":120,"path":121,"stem":122},"Go agent","/go-agent-and-cli/go-agent","06.go-agent-and-cli/01.go-agent",{"title":124,"path":125,"stem":126},"CLI","/go-agent-and-cli/cli","06.go-agent-and-cli/02.cli",{"title":128,"path":129,"stem":130,"children":131},"Modules","/modules","07.modules",[132,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191],{"title":133,"path":129,"stem":134},"モジュール","07.modules/index",{"title":136,"path":137,"stem":138},"テーブル","/modules/table","07.modules/01.table",{"title":140,"path":141,"stem":142},"ドキュメントツリー","/modules/document","07.modules/02.document",{"title":144,"path":145,"stem":146},"AIチャット","/modules/ai","07.modules/03.ai",{"title":148,"path":149,"stem":150},"認証・権限","/modules/auth","07.modules/04.auth",{"title":152,"path":153,"stem":154},"AI取込","/modules/organize","07.modules/05.organize",{"title":156,"path":157,"stem":158},"ストレージ","/modules/storage","07.modules/06.storage",{"title":160,"path":161,"stem":162},"NAS同期","/modules/sync","07.modules/07.sync",{"title":164,"path":165,"stem":166},"ワークスペース","/modules/workspace","07.modules/08.workspace",{"title":168,"path":169,"stem":170},"テナントとメンバーシップ","/modules/tenant-membership","07.modules/09.tenant-membership",{"title":172,"path":173,"stem":174},"検索","/modules/search","07.modules/10.search",{"title":176,"path":177,"stem":178},"表示ビュー","/modules/display","07.modules/11.display",{"title":180,"path":181,"stem":182},"テンプレート","/modules/template","07.modules/12.template",{"title":184,"path":185,"stem":186},"メール","/modules/mail","07.modules/13.mail",{"title":188,"path":189,"stem":190},"電話","/modules/phone","07.modules/14.phone",{"title":192,"path":193,"stem":194},"リアルタイム","/modules/realtime","07.modules/15.realtime",{"title":196,"path":197,"stem":198,"children":199},"Infra And Deploy","/infra-and-deploy","08.infra-and-deploy",[200,203,207],{"title":201,"path":197,"stem":202},"インフラとデプロイ","08.infra-and-deploy/index",{"title":204,"path":205,"stem":206},"環境の種類","/infra-and-deploy/environments","08.infra-and-deploy/01.environments",{"title":208,"path":209,"stem":210},"セルフホスト構成","/infra-and-deploy/self-host","08.infra-and-deploy/02.self-host",{"title":212,"path":213,"stem":214,"children":215},"docs-map","/docs-map","09.docs-map/index",[216],{"title":212,"path":213,"stem":214},{"id":218,"title":160,"body":219,"description":611,"extension":612,"meta":613,"navigation":614,"path":161,"seo":615,"stem":162,"__hash__":616},"docs/07.modules/07.sync.md",{"type":220,"value":221,"toc":599},"minimark",[222,226,230,253,256,349,353,409,414,455,459,465,537,540,584],[223,224,160],"h1",{"id":225},"nas同期",[227,228,229],"h2",{"id":229},"一言でいうと",[231,232,233,237,238,241,242,244,245,248,249,252],"p",{},[234,235,236],"code",{},"sync"," は agent-based ストレージ（LOCAL / NETWORK_DRIVE）上のファイルと、Astar 側のドキュメントツリー・全文検索インデックスとの同期状態を管理するモジュール。WebSocket の接続・認証・メッセージルーティングそのものは ",[234,239,240],{},"core/agent"," が持ち、",[234,243,236],{}," はその上で「どのドキュメントがどこまで同期済みか」というドメイン状態（",[234,246,247],{},"SCANNING → INDEXING → COMPLETE"," のフェーズ遷移、進捗、コンフリクト）を扱う。Go agent（",[250,251,117],"a",{"href":121},"）はこのモジュールの直接の相手方で、NAS 上のファイルシステムを WebSocket 越しにスキャンして Astar backend へストリーミングする。",[227,254,255],{"id":255},"主要ドメイン概念",[257,258,259,272],"table",{},[260,261,262],"thead",{},[263,264,265,269],"tr",{},[266,267,268],"th",{},"概念",[266,270,271],{},"役割",[273,274,275,297,311,324,334],"tbody",{},[263,276,277,283],{},[278,279,280],"td",{},[234,281,282],{},"SyncPhase",[278,284,285,286,289,290,289,293,296],{},"同期操作のフェーズ（",[234,287,288],{},"SCANNING"," → ",[234,291,292],{},"INDEXING",[234,294,295],{},"COMPLETE","、後方遷移不可）",[263,298,299,308],{},[278,300,301,304,305],{},[234,302,303],{},"ScanProgressData"," / ",[234,306,307],{},"IndexingProgressData",[278,309,310],{},"各フェーズの進捗（受信チャンク数、処理済みファイル数、インデックス済み件数など）",[263,312,313,321],{},[278,314,315,304,318],{},[234,316,317],{},"DocumentSyncStatus",[234,319,320],{},"SyncState",[278,322,323],{},"1ドキュメント単位の同期状態（ローカル変更・クラウド変更・同期済み・チェックサム）",[263,325,326,331],{},[278,327,328],{},[234,329,330],{},"SyncOperation",[278,332,333],{},"1台のデバイスに対する1回のスキャン+インデックス操作",[263,335,336,339],{},[278,337,338],{},"マルチルート同期",[278,340,341,342,345,346,348],{},"デバイスが複数の ",[234,343,344],{},"StorageDeviceRoot","（",[250,347,156],{"href":157}," 参照）を持つ場合、同期は設定済みの全ルートに対して行われる",[227,350,352],{"id":351},"backend-構造","Backend 構造",[354,355,356,367,386,401],"ul",{},[357,358,359,362,363,366],"li",{},[234,360,361],{},"api/controller/",": ",[234,364,365],{},"DocumentSyncController","（ワークスペース単位の同期ステータス取得）",[357,368,369,362,372,375,376,345,379,381,382,385],{},[234,370,371],{},"domain/service/",[234,373,374],{},"DocumentSyncService","（ドキュメント単位の同期ステータス CRUD — ローカル変更記録・クラウド変更記録・同期完了マーク）、",[234,377,378],{},"SyncProgressService",[234,380,282],{}," の遷移管理、スキャン/インデックス進捗の集計、SSE 配信元）、",[234,383,384],{},"StorageDataMigrationService","（ストレージモード移行時のデータ移行）",[357,387,388,362,391,393,394,393,396,393,398],{},[234,389,390],{},"domain/model/",[234,392,330],{},"・",[234,395,320],{},[234,397,317],{},[234,399,400],{},"MigrationModels",[357,402,403,362,406],{},[234,404,405],{},"domain/port/",[234,407,408],{},"SyncProgressPort",[410,411,413],"h3",{"id":412},"websocket-メッセージ経路coreagent-との境界","WebSocket メッセージ経路（core/agent との境界）",[231,415,416,417,420,421,424,425,393,428,393,431,393,434,437,438,440,441,443,444,304,446,448,449,451,452,454],{},"Go agent との WebSocket 接続・認証・メッセージのルーティングは ",[234,418,419],{},"core/sync"," ではなく ",[234,422,423],{},"core/agent/infrastructure/websocket/"," が持つ（",[234,426,427],{},"AgentWebSocketHandler",[234,429,430],{},"AgentRequestRouter",[234,432,433],{},"FileEventRouter",[234,435,436],{},"AgentMessages","）。エージェントがファイルチャンクを送ってくると ",[234,439,433],{}," がそれを解釈し、",[234,442,236],{}," の ",[234,445,378],{},[234,447,374],{}," を呼び出してドメイン状態を更新する、という分担。「同期まわりのバグ」を追うときは WebSocket 層（",[234,450,240],{},"）とドメイン状態層（",[234,453,419],{},"）のどちらの問題かをまず切り分けること。",[227,456,458],{"id":457},"frontend-構造","Frontend 構造",[231,460,461,464],{},[234,462,463],{},"app/modules/sync/"," はデバイス接続のセットアップ UI と同期状態表示を持つ。",[354,466,467,507,529],{},[357,468,469,362,472,304,475,478,479,482,483,486,487,490,491,482,494,482,497,482,500,304,503,506],{},[234,470,471],{},"components/",[234,473,474],{},"DeviceConnectDialog.vue",[234,476,477],{},"DeviceConnectButton.vue","（新規デバイス接続の入口 UI）、",[234,480,481],{},"QuickDeviceSetupCard.vue","、",[234,484,485],{},"NetworkDriveSetupWizard.vue"," + ",[234,488,489],{},"network-drive/","（Docker/SSH 経由のセットアップ手順を段階的に表示）、",[234,492,493],{},"LocalModeSetupDialog.vue",[234,495,496],{},"StorageSetupDialog.vue",[234,498,499],{},"SyncStatusBadge.vue",[234,501,502],{},"AiRuntimeConnectDialog.vue",[234,504,505],{},"AiRuntimeConnectPanel.vue","（AI ランタイムをデバイス上で動かす接続）",[357,508,509,362,512,515,516,519,520,482,523,482,526],{},[234,510,511],{},"composables/",[234,513,514],{},"useSyncStatuses","（ワークスペース単位の同期ステータス購読）、",[234,517,518],{},"useSyncProgress","（進捗 SSE の購読とグローバル状態）、",[234,521,522],{},"useCurrentStorageMode",[234,524,525],{},"useQuickLocalDeviceSetup",[234,527,528],{},"useRegistrationCodeSetup",[357,530,531,362,534],{},[234,532,533],{},"repositories/",[234,535,536],{},"SyncRepository",[227,538,539],{"id":539},"他モジュールとの辺",[354,541,542,560,569,578],{},[357,543,544,547,548,304,551,553,554,556,557,559],{},[234,545,546],{},"storage",": デバイスそのもの（",[234,549,550],{},"StorageDevice",[234,552,344],{},"）の CRUD・接続状態管理は ",[234,555,546],{}," モジュールの責務。",[234,558,236],{}," はそのデバイス上のファイルの同期状態のみを扱う",[357,561,562,565,566,568],{},[234,563,564],{},"agent",": WebSocket ハンドラ・メッセージルーティングは ",[234,567,240],{}," が持つ（上記参照）",[357,570,571,574,575,577],{},[234,572,573],{},"editor",": 同期完了したファイルはドキュメントツリー（",[234,576,573],{},"）のノードとして反映される",[357,579,580,583],{},[234,581,582],{},"search",": 同期でインデックスフェーズに入ったドキュメントは全文検索インデックスに反映される",[585,586,588],"callout",{"type":587},"warning",[231,589,590,592,593,595,596,598],{},[234,591,236],{}," モジュールを見ても WebSocket の接続処理そのもの（認証・ハートビート・メッセージディスパッチ）は出てこない — それは ",[234,594,240],{},"（backend のみ、frontend モジュール対応なし）にある。「NAS 同期のコードはどこ？」と ",[234,597,419],{}," だけを探すと接続層が見つからず迷う。両方を合わせて「NAS 同期」の全体像になる。",{"title":600,"searchDepth":601,"depth":601,"links":602},"",2,[603,604,605,609,610],{"id":229,"depth":601,"text":229},{"id":255,"depth":601,"text":255},{"id":351,"depth":601,"text":352,"children":606},[607],{"id":412,"depth":608,"text":413},3,{"id":457,"depth":601,"text":458},{"id":539,"depth":601,"text":539},"Go agent 経由の NAS ファイル同期。backend core/sync ⇄ frontend app/modules/sync の深掘り。WebSocket メッセージとマルチルートに触れる。","md",{},true,{"title":160,"description":611},"LOowSIeUQBp6qowPp4MzJkMAiKJDU3WpullTlYbFERc",[618,620,621,623,624,625,626,627,628,629,630,631,633,634,635,636,637,639,640,641,642,643,645,647,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,667,668,669,670],{"path":13,"title":619},"Astar とは何か（5分で）",{"path":17,"title":16},{"path":6,"title":622},"ようこそ",{"path":29,"title":28},{"path":33,"title":32},{"path":37,"title":36},{"path":21,"title":25},{"path":49,"title":48},{"path":53,"title":52},{"path":57,"title":56},{"path":61,"title":60},{"path":41,"title":632},"システムアーキテクチャ",{"path":73,"title":72},{"path":77,"title":76},{"path":81,"title":80},{"path":85,"title":84},{"path":65,"title":638},"バックエンドガイド",{"path":97,"title":96},{"path":101,"title":100},{"path":105,"title":104},{"path":109,"title":108},{"path":89,"title":644},"フロントエンドガイド",{"path":121,"title":646},"Go agent — NAS 同期エージェント",{"path":125,"title":648},"astar CLI",{"path":113,"title":117},{"path":137,"title":136},{"path":141,"title":140},{"path":145,"title":144},{"path":149,"title":148},{"path":153,"title":152},{"path":157,"title":156},{"path":161,"title":160},{"path":165,"title":164},{"path":169,"title":168},{"path":173,"title":172},{"path":177,"title":176},{"path":181,"title":180},{"path":185,"title":184},{"path":189,"title":188},{"path":193,"title":192},{"path":129,"title":666},"モジュール索引",{"path":205,"title":204},{"path":209,"title":208},{"path":197,"title":201},{"path":213,"title":671},"docs/ 地図",1785452455395]