# 計画: フォルダ監視の拡張

## 目的

現在の `RecommendedWatcher`（ネイティブ監視）一本の実装を拡張し、ネットワーク FS 対応・パフォーマンス改善・エラーハンドリング強化を行う。

関連仕様: [14_folder_monitor.md](../specification/14_folder_monitor.md)

---

## 1. PollWatcher フォールバック（ネットワーク FS 対応）

### 背景

多くのネットワーク FS（SMB/CIFS・NFS 等）では `RecommendedWatcher` のネイティブ通知が発火しない（[notify Known Problems](https://docs.rs/notify/latest/notify/#known-problems)）。WSL 上で Windows パスを監視する場合も同様。

### 方針

`RecommendedWatcher` が使えない環境では **`PollWatcher`** にフォールバックする。

| 条件 | Watcher |
|------|---------|
| ローカル FS | `RecommendedWatcher`（ネイティブ） |
| SMB/CIFS・NFS 等 | `PollWatcher`（`poll_interval: 30s`） |
| WSL 上の Windows パス | `PollWatcher` |

### ネットワークパスの判定

以下のいずれかで判定する:

- **パス prefix**: Windows の `\\`（UNC）、Linux の `/mnt/`・`/media/`、macOS の `/Volumes/`
- **watch 登録結果**: `RecommendedWatcher` の `watch()` 失敗時、または一定時間イベントが来ない場合にフォールバック
- **OS マウント情報**: `/proc/mounts`（Linux）、`getfsstat`（macOS）等で判定（任意の拡張）

### notify Config

| オプション | 用途 | 想定値 |
|-----------|------|--------|
| `with_poll_interval(dur)` | 再スキャン間隔 | 30 秒（大容量ツリーは 60 秒） |
| `with_compare_contents(bool)` | mtime が信用できない FS 向け（`/proc` 等） | 通常 false |

---

## 2. 大容量フォルダの初期スキャン

### 問題

モニター先追加時の初期スキャンは再帰走査 + 逐次取込のため、大量ファイルがあると長時間かかる。

### 対策案

- プログレス表示（取込済み / 全体のカウントを UI に送信）
- バッチ制御（一定数ごとに `yield` して他の処理をブロックしない）
- 初期スキャンをバックグラウンドタスク化し、監視は先に開始する

---

## 3. 権限エラー時の UI フィードバック

### 問題

監視対象フォルダへの読み取り権限がない場合、`watch()` や `read_dir()` がエラーを返すが、ユーザーへの通知が `log::warn` のみ。

### 対策案

- 設定保存時にパスの存在・読み取り権限をチェックし、UI にエラーを表示
- 監視開始時のエラーをフロントに通知し、設定パネルで該当行をハイライト

---

## 4. パス正規化

### 問題

シンボリックリンク・ジャンクション・バインドマウントを経由した場合、同一ファイルが異なるパスで検知され、二重登録になる可能性がある。

### 対策案

- `std::fs::canonicalize()` でパスを正規化してから DB パスと照合
- `Config::with_follow_symlinks(false)` でリンクをたどらない選択肢

---

## 優先度

| 項目 | 優先度 |
|------|--------|
| PollWatcher フォールバック | 中 |
| 大容量フォルダ初期スキャン | 低 |
| 権限エラー UI | 低 |
| パス正規化 | 低 |
