メインコンテンツへ

ワークスペース

一言でいうと

workspace はテナント内のドキュメントツリー・テーブル・その他リソースを収める「器」の CRUD を管理するモジュール。ワークスペース自体はコンテンツを持たず、kind(USER / ASTAR / MAIL / GUEST)でシステム予約か否かを識別し、storageMode(CLOUD / LOCAL / NETWORK_DRIVE / EXTERNAL_CLOUD)でドキュメントの実体がどこにあるかを決める。実際のツリー構造・テーブル・レコードはそれぞれ editor モジュール・table モジュールが持つ。

主要ドメイン概念

概念役割
Workspace器そのもの。テナント内で一意な名前・kindstorageMode を持つ
WorkspaceKindUSER(通常・自由にリネーム/削除可)/ ASTAR(AIハーネス用の .astar 予約ワークスペース)/ MAIL(メール受信用の個人ワークスペース)/ GUEST(DEMO用シングルトン)。USER 以外は isProtected == true でリネーム/削除禁止
StorageModeCLOUD(既定、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/: WorkspaceWorkspaceKindStorageModeOrphanReconciliationReport
  • domain/event/: WorkspaceCreatedEvent(新規ワークスペース作成時に発火。organize モジュールなど他モジュールがワークスペース単位のフォルダをブートストラップするために購読する)、WorkspaceStorageLinkedEvent / WorkspaceStorageUnlinkedEvent(agent-based デバイスへのリンク/解除。リンク時は既存NASファイルの再スキャンをトリガーする)

Frontend 構造

  • components/: WorkspaceCard.vueWorkspaceForm.vueWorkspaceScreen.vueWorkspaceTrashSection.vueCloudProviderPicker.vue(EXTERNAL_CLOUD プロバイダ選択)、CloudSyncStatusBadge.vue
  • composables/: useWorkspaceCruduseWorkspaceListuseWorkspaceFormuseWorkspaceContext(現在のワークスペースのグローバル状態)、useWorkspaceCardActionsuseDeletedWorkspacesuseWorkspaceCloudSync / useCloudSyncOnOpen / useCloudSyncStatus(EXTERNAL_CLOUD の同期状態)、useInitialSyncBannerState
  • repositories/: 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つの判定軸を参照)。