# 通知設計書 20-served/reindexAll

## 概要

本ドキュメントは、カスタム通知 `served/reindexAll` の設計仕様を定義する。この通知はクライアント（エディタ）からサーバー（serve-d）に送信され、全ファイルの再インデックスをサーバーに要求する。

### 本通知の処理概要

`served/reindexAll` 通知は、サーバーに対して全ワークスペースのソースファイルのインデックス再構築を要求する通知である。インデックスはシンボル参照解決、リバースインポート解析などに使用される。`index.d` モジュールの `reindexAll` 関数がハンドラとして登録されている。

**業務上の目的・背景**：serve-dはソースコードのインデックスを保持し、参照解決やシンボル検索に使用する。インデックスが古くなった場合や破損した場合、ユーザーが手動で全インデックスの再構築を要求できる必要がある。また、DCD（D Completion Daemon）サーバーの起動後にもバックグラウンドで自動的にインデックス再構築が実行される。

**通知の送信タイミング**：ユーザーがエディタのコマンドパレットなどから明示的に再インデックスを要求した場合に送信される。また、`backgroundIndex` 関数から `setImmediate` 経由で内部的にも呼び出される。

**通知の受信者**：serve-dサーバープロセスが受信者である。`index.d` モジュールの `reindexAll` 関数がハンドラとして登録されている。

**通知内容の概要**：パラメータなし。全ワークスペースの再インデックスを要求する。

**期待されるアクション**：サーバーは全ワークスペースのソースファイルを走査し、インデックスを再構築する。構築後、インデックスはファイルに保存される。

## 通知種別

LSPカスタム通知（JSON-RPC notification）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 非同期（Fiber上で実行） |
| 優先度 | 低（バックグラウンド処理） |
| リトライ | 無し |

### 送信先決定ロジック

クライアントからサーバーへの一方向通知。LSP接続で確立されたサーバープロセスに固定。

## 通知テンプレート

### JSON-RPC通知メッセージ

| 項目 | 内容 |
|-----|------|
| メソッド名 | `served/reindexAll` |
| パラメータ型 | なし |
| レスポンス | なし（通知） |

### メッセージ構造

```json
{
  "jsonrpc": "2.0",
  "method": "served/reindexAll"
}
```

### 添付ファイル

該当なし。

## テンプレート変数

該当なし（パラメータなし）。

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| 画面操作 | ユーザーコマンド | なし | エディタのコマンドパレットからの再インデックス要求 |
| 内部処理 | backgroundIndex関数 | DCD起動後 | startDCDServer完了後にbackgroundIndex経由で呼び出し（extension.d L1015） |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| d.enableIndex==false | ワークスペースの設定でインデックスが無効の場合、reindexAll内でスキップ |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A{トリガー} --> B[ユーザーコマンド]
    A --> C[backgroundIndex]
    B --> D[served/reindexAll通知受信]
    C --> E[setImmediate]
    E --> D
    D --> F[reindexAll関数実行]
    F --> G[各ワークスペースを走査]
    G --> H{d.enableIndex?}
    H -->|No| I[スキップ]
    H -->|Yes| J[IndexComponent.autoIndexSources]
    J --> K[開いているドキュメントの再インデックス]
    K --> L[インデックス統計ログ出力]
    L --> M[遅延インデックス保存: 2.5秒後]
    M --> N[終了]
    I --> G
```

## データベース参照・更新仕様

### 参照テーブル一覧

該当なし（データベースを使用しない）。インデックスファイルとインメモリインデックスが使用される。

### 更新テーブル一覧

該当なし。`IndexComponent` が管理するインメモリインデックスが再構築され、2.5秒の遅延後にファイルに保存される。

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| IndexComponent不在 | ワークスペースにIndexComponentが存在しない | 該当ワークスペースの処理をスキップ |
| ファイル読み込み失敗 | ソースファイルが見つからない | 個別ファイルの例外は上位でキャッチ |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（リトライなし） |
| リトライ間隔 | N/A |
| リトライ対象エラー | N/A |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし。

## セキュリティ考慮事項

- パラメータなしのため、個人情報漏洩のリスクはない
- インデックス処理はサーバー内部で完結し、外部通信は発生しない

## 備考

- `backgroundIndex` 関数（index.d L16-21）は `setImmediate` を使って `reindexAll` を呼び出す。これはDCDサーバー起動後など、内部的にインデックス再構築が必要なタイミングで使用される
- インデックス保存は `delayedSaveIndex` 関数（index.d L117-123）で2.5秒の遅延後に実行される（頻繁な保存を防ぐデバウンス）
- `textDocument/didChange` 通知と `textDocument/didSave` 通知でも個別ファイルのインデックス更新が行われる（index.d L72-114）
- `traceIndexerStats` 関数（index.d L125-137）でインデックスの統計情報（失敗ファイル数、モジュール数、定義数、インポート数）がログ出力される
- GC.collect/GC.minimize がインデックス統計出力前に呼ばれ、メモリ使用量の最適化が行われる

---

## コードリーディングガイド

本通知を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

本通知にはパラメータがないが、IndexComponentのインデックスデータ構造を理解しておくとよい。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | index.d (workspace-d) | `workspace-d/source/workspaced/com/index.d` | IndexComponentの基本的なインデックスデータ構造 |

#### Step 2: エントリーポイントを理解する

reindexAll関数のハンドラ登録と実装を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | index.d | `source/served/commands/index.d` | `reindexAll` 関数（L23-69）の全体実装 |

**主要処理フロー**:
1. **L23**: `@protocolNotification("served/reindexAll")` でハンドラ登録
2. **L26-37**: 各ワークスペースに対して `IndexComponent.autoIndexSources` を実行
3. **L39-54**: 開いているドキュメントの再インデックス
4. **L56-68**: インデックス統計ログ出力と遅延保存

#### Step 3: 内部呼び出しの仕組みを理解する

backgroundIndex関数からの内部呼び出しを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | index.d | `source/served/commands/index.d` | `backgroundIndex` 関数（L16-21）のsetImmediateによるreindexAll呼び出し |

**主要処理フロー**:
- **L18-20**: `setImmediate` でreindexAllを次のFiberイテレーションで実行

#### Step 4: 個別ファイルの再インデックスを理解する

textDocument/didChange/didSaveでのインデックス更新を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | index.d | `source/served/commands/index.d` | `reindexOnChange`（L72-94）と `reindexOnSave`（L96-114）の個別ファイルインデックス更新 |

### プログラム呼び出し階層図

```
[外部トリガー: served/reindexAll通知]
reindexAll (index.d:24)
    |
    +-- [各ワークスペースに対して]
    |       |
    |       +-- IndexComponent.autoIndexSources(stdlib, true) (L35)
    |
    +-- [開いているドキュメントに対して]
    |       |
    |       +-- IndexComponent.reindex(filePath, now, ...) (L52)
    |
    +-- [各ワークスペースに対して]
            |
            +-- traceIndexerStats(indexer) (L64)
            +-- delayedSaveIndex(indexer) (L66)
                    |
                    +-- setTimeout(2500ms)
                            +-- index.saveIndex() (L121)

[内部トリガー: backgroundIndex]
backgroundIndex (index.d:16)
    |
    +-- setImmediate
            |
            +-- reindexAll() (L19)
```

### データフロー図

```
[入力]                       [処理]                          [出力]

served/reindexAll        reindexAll()                   インメモリインデックス
(パラメータなし)      --> (index.d:24-69)             --> (再構築)
                         |                                  |
                         +-- autoIndexSources()             +-> インデックスファイル
                         |   (stdlibパス + ソース)               (2.5秒遅延保存)
                         |
                         +-- reindex()                      +-> トレースログ
                             (開いているドキュメント)              (統計情報)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| index.d | `source/served/commands/index.d` | ソース | reindexAll/backgroundIndex関数の実装、reindexOnChange/reindexOnSave |
| extension.d | `source/served/extension.d` | ソース | startDCDServerからbackgroundIndexの呼び出し（L1015） |
| index.d (workspace-d) | `workspace-d/source/workspaced/com/index.d` | ソース | IndexComponentの実装（autoIndexSources/reindex/saveIndex） |
