[{"data":1,"prerenderedAt":758},["ShallowReactive",2],{"navigation":3,"doc-/modules/storage":217,"docs-all-paths":703},[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":156,"body":219,"description":697,"extension":698,"meta":699,"navigation":700,"path":157,"seo":701,"stem":158,"__hash__":702},"docs/07.modules/06.storage.md",{"type":220,"value":221,"toc":687},"minimark",[222,225,229,257,260,364,368,374,457,461,474,570,574,596,599,663],[223,224,156],"h1",{"id":156},[226,227,228],"h2",{"id":228},"一言でいうと",[230,231,232,236,237,241,242,245,246,249,250,253,254,256],"p",{},[233,234,235],"code",{},"storage"," は「テナントのドキュメントがどこに実体として存在するか」を表す ",[238,239,240],"strong",{},"StorageDevice","（+ その配下の複数ルート ",[233,243,244],{},"StorageDeviceRoot","）を管理するモジュール。LOCAL（ユーザーのPC・Tauriデスクトップアプリ経由）と NETWORK_DRIVE（事務所のNAS・Go agent 経由）はどちらも ",[238,247,248],{},"agent-based","（WebSocket 常時接続）で、\"あるメンバーのローカルにしかない\" という状態は存在しない — オンラインなデバイス上のファイルは接続中の全メンバーに配信される。実際のファイル同期処理そのものは ",[233,251,252],{},"sync"," モジュールが担当し、",[233,255,235],{}," はデバイスのライフサイクル（登録・接続状態・ルート構成）を管理する。",[226,258,259],{"id":259},"主要ドメイン概念",[261,262,263,276],"table",{},[264,265,266],"thead",{},[267,268,269,273],"tr",{},[270,271,272],"th",{},"概念",[270,274,275],{},"役割",[277,278,279,297,314,332,350],"tbody",{},[267,280,281,286],{},[282,283,284],"td",{},[233,285,240],{},[282,287,288,289,292,293,296],{},"1台の物理/仮想ストレージ拠点。",[233,290,291],{},"type","（LOCAL / NETWORK_DRIVE）と ",[233,294,295],{},"connectionMode","（AGENT / CLI）を持つ",[267,298,299,303],{},[282,300,301],{},[233,302,244],{},[282,304,305,306,309,310,313],{},"デバイス内の名前付きサブツリー（マルチルート）。",[233,307,308],{},"rootKey == \"\""," は multi-root 導入前からの legacy root で ",[233,311,312],{},"/"," に固定マウントされる",[267,315,316,321],{},[282,317,318],{},[233,319,320],{},"ConnectionMode",[282,322,323,324,327,328,331],{},"AGENT（",[233,325,326],{},"astar-agent"," 常駐・WebSocket 常時接続・ファイル同期あり）/ CLI（本人PCの ",[233,329,330],{},"astar"," CLI・トークン疎通のみでファイル同期なし）",[267,333,334,344],{},[282,335,336,339,340,343],{},[233,337,338],{},"StorageMode","（",[233,341,342],{},"workspace"," モジュール側）",[282,345,346,347],{},"ワークスペースがどのストレージを使うか。CLOUD（既定）/ LOCAL / NETWORK_DRIVE / EXTERNAL_CLOUD の4種、詳細は ",[348,349,164],"a",{"href":165},[267,351,352,355],{},[282,353,354],{},"WebDAV 資格情報",[282,356,357,360,361,363],{},[233,358,359],{},"core/webdav"," が発行するネットワークドライブマウント用の認証情報。UI は ",[233,362,235],{}," モジュールに同居",[226,365,367],{"id":366},"backend-構造","Backend 構造",[230,369,370,373],{},[233,371,372],{},"core/storage/"," は規約どおりの3層構造。",[375,376,377,399,412,433,449],"ul",{},[378,379,380,383,384,339,387,390,391,394,395,398],"li",{},[233,381,382],{},"api/controller/",": ",[233,385,386],{},"StorageController",[233,388,389],{},"GET /local-path"," — DocumentNode をエージェントホストの絶対パスへ解決し、Tauri opener や ",[233,392,393],{},"ms-word:ofe|u|..."," URI でネイティブアプリを起動する）、",[233,396,397],{},"StorageDeviceController","（デバイス CRUD、ルート CRUD、接続トークン発行・再発行、登録コード発行、Codex device-auth フロー、SSE ストリーム）",[378,400,401,383,404,407,408,411],{},[233,402,403],{},"domain/service/",[233,405,406],{},"StorageDeviceService","（デバイス作成・接続状態記録・ハートビート・ルート追加/削除・トークン検証・削除）、",[233,409,410],{},"LocalPathResolutionService","（上記 local-path 解決。CLOUD モードのワークスペースは 503 で拒否し、呼び出し元に in-app 編集へのフォールバックを促す）",[378,413,414,383,417,419,420,419,422,419,425,419,427,419,430],{},[233,415,416],{},"domain/model/",[233,418,240],{},"・",[233,421,244],{},[233,423,424],{},"StorageDeviceType",[233,426,320],{},[233,428,429],{},"AgentUpdateStatus",[233,431,432],{},"LocalPathResolution",[378,434,435,383,438,441,442,445,446],{},[233,436,437],{},"domain/event/",[233,439,440],{},"StorageDeviceConnectedEvent","（エージェントが WebSocket 認証されオンラインになった時に発火。",[233,443,444],{},"AFTER_COMMIT"," で消費され、デバイスオフライン中に失敗した処理をオンライン復帰時にリトライさせる）、",[233,447,448],{},"StorageDeviceDeletedEvent",[378,450,451,383,454],{},[233,452,453],{},"infrastructure/adapter/",[233,455,456],{},"StorageTenantResolutionAdapter",[226,458,460],{"id":459},"frontend-構造","Frontend 構造",[230,462,463,466,467,419,470,473],{},[233,464,465],{},"app/modules/storage/"," は規約の4分類に加えて ",[233,468,469],{},"stores",[233,471,472],{},"utils"," を持つ。",[375,475,476,527,558],{},[378,477,478,383,481,484,485,488,489,492,493,488,496,492,499,502,503,488,506,488,509,488,512,488,515,492,518,488,521,488,524],{},[233,479,480],{},"components/",[233,482,483],{},"StorageDeviceList.vue","（デバイス一覧・選択の共通UI）、",[233,486,487],{},"StorageDeviceListPanel.vue","、",[233,490,491],{},"StorageDeviceForm.vue"," / ",[233,494,495],{},"StorageDeviceEditDialog.vue",[233,497,498],{},"StorageDeviceRootsEditor.vue",[233,500,501],{},"StorageDeviceRootRow.vue","（マルチルート編集）、",[233,504,505],{},"StorageDeviceReconnectDialog.vue",[233,507,508],{},"NasFolderPickerField.vue",[233,510,511],{},"MountDriveLetterDialog.vue",[233,513,514],{},"WinFspGuidanceDialog.vue",[233,516,517],{},"WorkspaceMountCard.vue",[233,519,520],{},"WorkspaceMountCardBody.vue",[233,522,523],{},"AgentSidecarBadge.vue",[233,525,526],{},"StorageUsageSummary.vue",[378,528,529,383,532,535,536,488,539,488,542,545,546,492,549,488,552,488,555],{},[233,530,531],{},"composables/",[233,533,534],{},"useStorageDevices","（デバイス一覧取得）、",[233,537,538],{},"useStorageStats",[233,540,541],{},"useCodexDeviceAuth",[233,543,544],{},"useWinFspCheck","（Windows の WinFsp 前提条件チェック）、",[233,547,548],{},"useWorkspaceAutoReconnect",[233,550,551],{},"useWorkspaceMountPreferences",[233,553,554],{},"useStableOfflineDevices",[233,556,557],{},"useNasTreePickerDataLoader",[378,559,560,383,563,488,566,569],{},[233,561,562],{},"repositories/",[233,564,565],{},"StorageDeviceRepository",[233,567,568],{},"WebDavCredentialRepository","（WebDAV 資格情報の発行・一覧・失効）",[226,571,573],{"id":572},"webdav-corewebdav","WebDAV (core/webdav)",[230,575,576,578,579,581,582,585,586,589,590,592,593,595],{},[233,577,359],{}," はテナントのドキュメントツリーを WebDAV サーバーとして公開するバックエンド専用モジュール（frontend モジュールは持たず、UI は ",[233,580,235],{}," に同居）。",[233,583,584],{},"api/servlet/WebDavServlet"," が実際の WebDAV プロトコル（PROPFIND/PUT/LOCK 等）を処理し、",[233,587,588],{},"api/controller/WebDavCredentialController"," が資格情報の発行/一覧/失効 API を提供する。frontend 側は ",[233,591,568],{}," 経由で ",[233,594,511],{}," などから呼び出す。",[226,597,598],{"id":598},"他モジュールとの辺",[375,600,601,627,635,647],{},[378,602,603,383,605,607,608,610,611,614,615,618,619,621,622,618,624,626],{},[233,604,252],{},[233,606,235],{}," はデバイスの存在・接続状態・ルート構成を管理し、実際のファイルスキャン・同期は ",[233,609,252],{},"（+ ",[233,612,613],{},"core/agent"," の WebSocket ハンドラ）が行う。デバイス追加 UI（",[233,616,617],{},"DeviceConnectDialog.vue","）は ",[233,620,252],{}," モジュール側にあり、デバイス選択・一覧 UI（",[233,623,483],{},[233,625,235],{}," 側にある",[378,628,629,383,631,634],{},[233,630,342],{},[233,632,633],{},"WorkspaceStorageLinkedEvent"," を受けてワークスペースが agent-based デバイスに紐づいた際に再スキャンを起動する",[378,636,637,383,640,642,643,646],{},[233,638,639],{},"editor",[233,641,410],{}," は ",[233,644,645],{},"DocumentNodeRepository"," を使い、ノードのローカルファイルパスを解決する",[378,648,649,652,653,656,657,659,660,662],{},[233,650,651],{},"agent",": WebSocket 接続そのもの（",[233,654,655],{},"AgentWebSocketHandler"," 等）は ",[233,658,613],{}," が持ち、",[233,661,235],{}," はその上のデバイスレコードを管理する",[664,665,667],"callout",{"type":666},"warning",[230,668,669,670,673,674,676,677,488,679,673,682,676,684,686],{},"共通デバイス選択 UI は2つのモジュールに分かれている（自作禁止）— ",[238,671,672],{},"選択・一覧","は ",[233,675,235],{}," モジュールの ",[233,678,483],{},[238,680,681],{},"新規追加",[233,683,252],{},[233,685,617],{},"。デバイス関連 UI を新設するときにどちらか一方だけを見て「同種コンポーネントがない」と誤判定しやすいので、両モジュールを横断して確認すること。",{"title":688,"searchDepth":689,"depth":689,"links":690},"",2,[691,692,693,694,695,696],{"id":228,"depth":689,"text":228},{"id":259,"depth":689,"text":259},{"id":366,"depth":689,"text":367},{"id":459,"depth":689,"text":460},{"id":572,"depth":689,"text":573},{"id":598,"depth":689,"text":598},"ストレージデバイスとファイルアップロード/ダウンロード。backend core/storage ⇄ frontend app/modules/storage の深掘り。WebDAV (core/webdav) にも触れる。","md",{},true,{"title":156,"description":697},"GZQU_zPHpXzOQ9IpySj43RhBHvpfArL6NQD56_8bHhw",[704,706,707,709,710,711,712,713,714,715,716,717,719,720,721,722,723,725,726,727,728,729,731,733,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,753,754,755,756],{"path":13,"title":705},"Astar とは何か（5分で）",{"path":17,"title":16},{"path":6,"title":708},"ようこそ",{"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":718},"システムアーキテクチャ",{"path":73,"title":72},{"path":77,"title":76},{"path":81,"title":80},{"path":85,"title":84},{"path":65,"title":724},"バックエンドガイド",{"path":97,"title":96},{"path":101,"title":100},{"path":105,"title":104},{"path":109,"title":108},{"path":89,"title":730},"フロントエンドガイド",{"path":121,"title":732},"Go agent — NAS 同期エージェント",{"path":125,"title":734},"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":752},"モジュール索引",{"path":205,"title":204},{"path":209,"title":208},{"path":197,"title":201},{"path":213,"title":757},"docs/ 地図",1785452455350]