方針: 監視の「やり方」を共通プロトコル(トレイト/インターフェース)で定義し、OS・ファイルシステム・ネットワーク種別ごとにドライバを用意する。
watch(path, recursive) → ハンドル、EventStream またはコールバックで Create / Remove / Modify を受け取る、unwatch / stop。notify::recommended_watcher() + デバウンス。中で OS 別 API(ReadDirectoryChangesW / FSEvents / inotify)は notify が担当。PollWatcher + Config(poll_interval, 必要なら compare_contents)。ネットワーク FS・WSL・擬似 FS 等で使用。notify クレート(現行安定版 8.x、crates.io、docs.rs)を採用する。クロスプラットフォームで同一 API が使え、各 OS のネイティブ API を利用する。ReadDirectoryChangesWmacos_kqueue で kqueue に切り替え可能。notify::recommended_watcher() で、そのプラットフォームに最適な実装(RecommendedWatcher)を取得する。イベント駆動で CPU 負荷が低い。EventKind の Create, Remove, Modify 等を区別して扱う。RecursiveMode::Recursive でサブディレクトリも監視可能。notify-debouncer-mini(docs.rs)を利用する。new_debouncer(Duration::from_secs(2), callback) のように時間幅を指定し、その間のイベントを集約してコールバックに渡す。notify-debouncer-full を検討する。TelosDB では「追加・削除・更新」の 3 種で十分な場合は mini で足りる。spawn_blocking や専用スレッドでラップし、結果をチャンネルで async 側に渡す構成が無難。PollWatcher バックエンドを使う。notify::Config::default().with_poll_interval(Duration::from_secs(30)) でポーリング間隔を指定し、notify::WatcherKind::PollWatcher で明示的に PollWatcher を生成する。デフォルトのポーリング間隔は 30 秒。大容量ツリーでは負荷が高いため、間隔の調整や「ネットワークパス用」の別ワッチャーとして扱う設計がよい。/proc や /sys などの擬似 FS、macOS で「自分が所有していないファイル」を FSEvents で追う場合(FileSystemEventSecurity)。RecommendedWatcher で監視を開始し、ネイティブ監視が失敗するか、ネットワークパスであることを検出した場合に、同じ設定オブジェクトで PollWatcher に切り替えるフォールバックを用意する。ネットワークパスかどうかは、パスがマウントポイントか、または watch 登録時のエラー種別で判断する。max_user_watches(デフォルト 8192、カーネルによっては 1048576)を超えると「No space left on device」や「upper limit on inotify watches reached」が出る。再帰監視では「監視対象ディレクトリ内のファイル・フォルダ数」がそのまま watch 数に効く。sysctl fs.inotify.max_user_watches=524288 等の増設を案内するか、監視対象が大きい場合は初めから PollWatcher を使う選択肢を設ける。PollWatcher は inotify の上限に縛られない。com.apple.security.temporary-exception.files.home-relative-path.read-only 等の entitlement を検討する。Tauri アプリがサンドボックスを有効にする場合、ユーザーが「監視フォルダ」を選択したパスがその例外に含まれるようにする必要がある。Config::with_poll_interval(dur): PollWatcher 用。再スキャン間隔(デフォルト 30 秒)。ツリーが大きい場合は 60 秒などに延ばす検討。Config::with_compare_contents(true): PollWatcher 用。変更検知を mtime ではなくファイル内容のハッシュで行う。/proc 等で有効。通常のローカル/ネットワークではオフでよい(パフォーマンス影響大)。Config::with_follow_symlinks(bool): シンボリックリンクをたどって監視するか。デフォルトは true。同一実体の二重登録を防ぐなら false にする選択肢がある。search_text や get_document_count 等で現在状態を取得すれば足りる(01 スコープ)。documents / items / vec_items / FTS 登録)を呼び出す。documents から削除(関連 items / vec_items / FTS も連動削除)。/a/b/ 以下の削除イベントを受け取るには親 /a を watch する必要がある。再帰監視では通常その前提が満たされるが、直下のみ監視する場合は注意する(notify ドキュメント)。%APPDATA%\com.telosdb.app\、macOS/Linux は各 OS のアプリ設定ディレクトリ、または既存の localStorage と連携する API)に永続化する。C:\、macOS/Linux の /、ネットワークの // や /mnt/ 等)をそのまま保存し、実行環境に応じて正しく解釈する。