ワークスペース
一言でいうと
workspace はテナント内のドキュメントツリー・テーブル・その他リソースを収める「器」の CRUD を管理するモジュール。ワークスペース自体はコンテンツを持たず、kind(USER / ASTAR / MAIL / GUEST)でシステム予約か否かを識別し、storageMode(CLOUD / LOCAL / NETWORK_DRIVE / EXTERNAL_CLOUD)でドキュメントの実体がどこにあるかを決める。実際のツリー構造・テーブル・レコードはそれぞれ editor モジュール・table モジュールが持つ。
主要ドメイン概念
| 概念 | 役割 |
|---|---|
Workspace | 器そのもの。テナント内で一意な名前・kind・storageMode を持つ |
WorkspaceKind | USER(通常・自由にリネーム/削除可)/ ASTAR(AIハーネス用の .astar 予約ワークスペース)/ MAIL(メール受信用の個人ワークスペース)/ GUEST(DEMO用シングルトン)。USER 以外は isProtected == true でリネーム/削除禁止 |
StorageMode | CLOUD(既定、Astar ホスト)/ LOCAL(Tauri経由の個人PC)/ NETWORK_DRIVE(NAS agent 経由)/ EXTERNAL_CLOUD(Google Drive等のテナント所有クラウド)。LOCAL と NETWORK_DRIVE のみ isAgentBased() == true(WebSocket常時接続)、EXTERNAL_CLOUD はサーバー側 REST ポーリングで同期しエージェントを使わない |
OrphanReconciliationReport | ストレージ側の実ファイルとワークスペースのリンク状態のズレを検出・修復するレポート |
Backend 構造
core/workspace/ は規約どおりの3層構造。
api/controller/:WorkspaceController(ワークスペース CRUD、ゴミ箱、クラウド同期状態)、AdminStorageReconciliationController(管理者向け孤立リンク修復エンドポイント)domain/service/:WorkspaceService(作成・更新・論理削除。WorkspaceKind.isProtectedに基づいて予約ワークスペースの改変を拒否する)、WorkspaceStorageReconciliationService(ストレージ側の実態とワークスペースのリンク状態を突合・修復)domain/model/:Workspace・WorkspaceKind・StorageMode・OrphanReconciliationReportdomain/event/:WorkspaceCreatedEvent(新規ワークスペース作成時に発火。organizeモジュールなど他モジュールがワークスペース単位のフォルダをブートストラップするために購読する)、WorkspaceStorageLinkedEvent/WorkspaceStorageUnlinkedEvent(agent-based デバイスへのリンク/解除。リンク時は既存NASファイルの再スキャンをトリガーする)
Frontend 構造
components/:WorkspaceCard.vue、WorkspaceForm.vue、WorkspaceScreen.vue、WorkspaceTrashSection.vue、CloudProviderPicker.vue(EXTERNAL_CLOUD プロバイダ選択)、CloudSyncStatusBadge.vuecomposables/:useWorkspaceCrud、useWorkspaceList、useWorkspaceForm、useWorkspaceContext(現在のワークスペースのグローバル状態)、useWorkspaceCardActions、useDeletedWorkspaces、useWorkspaceCloudSync/useCloudSyncOnOpen/useCloudSyncStatus(EXTERNAL_CLOUD の同期状態)、useInitialSyncBannerStaterepositories/:WorkspaceRepository
他モジュールとの辺
editor: ワークスペースはドキュメントツリーの器。実際のノード階層はeditorモジュールが持つtable: ワークスペース内に配置されるテーブルはtableモジュールが持つstorage: agent-based ワークスペースはStorageDeviceにリンクされる。リンク/解除はWorkspaceStorageLinkedEvent/WorkspaceStorageUnlinkedEventで他モジュールに通知されるorganize:WorkspaceCreatedEventを購読し、/整理ひな型/など OrganizeSchema テンプレート用フォルダをワークスペース作成時にブートストラップするcloudstorage: EXTERNAL_CLOUD の実際のプロバイダ連携(OAuth・delta sync)はcloudstorageモジュールが持つ
storageMode は4種類あるが「agent-based かどうか」で二分すると3通りに分かれる — CLOUD と EXTERNAL_CLOUD はどちらも非 agent-based だが、CLOUD は Astar ホスト、EXTERNAL_CLOUD はテナント所有の外部プロバイダで同期方式もサーバー側 REST ポーリング(cloudstorage モジュール)と全く別物。「クラウドだから同じ実装で良い」という早合点をしないこと(StorageMode.isAgentBased() / isExternalStorage() の2つの判定軸を参照)。