# 機能設計書 7-サーバー情報取得 (served/getInfo)

## 概要

本ドキュメントは、serve-d LSPサーバーにおけるサーバー情報取得 (served/getInfo) 機能の設計を記述する。サーバーバージョン・設定・モジュールインデックス・ワークスペース状態・実行中タスク等の情報を返却する。

### 本機能の処理概要

カスタムLSPメソッド `served/getInfo` を処理し、serve-dサーバーの包括的な状態情報を返却する。リクエストパラメータのフラグに応じて、設定情報・モジュールインデックス・実行中タスク一覧をオプションで含めることができる。デバッグやステータス表示のための診断API。

**業務上の目的・背景**：D言語開発者やserve-d開発者がサーバーの現在の動作状態を把握するために、サーバー内部の詳細情報を取得できるAPIが必要である。これにより、設定の反映状況、インデックスの構築状態、ワークスペースの初期化状態、バックグラウンドタスクの状況を一括確認できる。

**機能の利用シーン**：エディタの「serve-d info」コマンド実行時や、問題発生時の診断情報収集時に利用される。

**主要な処理内容**：
1. サーバー情報（名前・バージョン）の取得
2. 現在の設定値の取得（includeConfig=true時）
3. モジュールインデックスのダンプ（includeIndex=true時）
4. 実行中タスク一覧の収集（includeTasks=true時）
5. グローバルワークスペースと全ワークスペースの状態情報の取得
6. 選択中ワークスペースのインデックス特定

**関連システム・外部連携**：LSPクライアント。IndexComponent（モジュールインデックス）。FiberManager（タスク管理）。

**権限による制御**：特に権限制御は存在しない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 66 | サーバー情報取得（served/getInfo） | 主機能 | サーバー情報を返却する主処理 |

## 機能種別

データ取得（サーバー診断情報）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| params | ServedInfoParams | Yes | 情報取得オプション | なし |
| params.includeConfig | bool | No | 現在の設定値を含めるか | デフォルトfalse |
| params.includeIndex | bool | No | モジュールインデックスを含めるか | デフォルトfalse |
| params.includeTasks | bool | No | 実行中タスク一覧を含めるか | デフォルトfalse |

### 入力データソース

LSPクライアントからのJSON-RPCリクエスト（メソッド名: "served/getInfo"）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| serverInfo | ServerInfo | サーバー名とバージョン |
| currentConfiguration | Configuration | 現在の設定値（includeConfig=true時のみ） |
| moduleIndex | string[][string] | モジュールのリバースインポート情報（includeIndex=true時のみ） |
| runningTasks | Task[] | 実行中タスク一覧（includeTasks=true時のみ） |
| runningTasks[].name | string | タスク名 |
| runningTasks[].queued | double | キューからの経過秒数 |
| runningTasks[].started | double | 開始からの経過秒数 |
| runningTasks[].ended | double | 終了からの経過秒数 |
| runningTasks[].timeSpent | double | 実行に費やした時間（秒） |
| runningTasks[].numSteps | int | 実行ステップ数 |
| runningTasks[].running | bool | 現在実行中かどうか |
| globalWorkspace | WorkspaceState | グローバル（フォールバック）ワークスペースの状態 |
| workspaces | WorkspaceState[] | 全ワークスペースの状態一覧 |
| selectedWorkspaceIndex | int | 選択中ワークスペースのインデックス（-1: 未選択） |

### 出力先

LSPクライアントへのJSON-RPCレスポンス

## 処理フロー

### 処理シーケンス

```
1. レスポンス初期化
   └─ ServedInfoResponse構造体を初期化
2. サーバー情報取得
   └─ makeServerInfo()でサーバー名・バージョンを取得
3. 設定情報取得（条件付き）
   └─ includeConfig=trueの場合: config(selectedWorkspaceUri)で現在の設定を取得
4. モジュールインデックス取得（条件付き）
   └─ includeIndex=trueの場合:
      └─ 選択中ワークスペースのIndexComponentからdumpReverseImports()を取得
5. タスク一覧取得（条件付き）
   └─ includeTasks=trueの場合:
      └─ lspRouter.fibers.fiberInfosからタスク情報を収集
      └─ ネストされたタスクも再帰的に収集
6. ワークスペース状態取得
   └─ fallbackWorkspace.describeStateでグローバルワークスペース状態
   └─ workspaces.map!"a.describeState"で全ワークスペース状態
7. 選択中ワークスペースインデックス特定
   └─ selectedフラグがtrueのワークスペースを検索
8. レスポンス返却
```

### フローチャート

```mermaid
flowchart TD
    A[getInfoリクエスト受信] --> B[ServerInfo取得]
    B --> C{includeConfig?}
    C -->|Yes| D[現在の設定値取得]
    C -->|No| E{includeIndex?}
    D --> E
    E -->|Yes| F[モジュールインデックス取得]
    E -->|No| G{includeTasks?}
    F --> G
    G -->|Yes| H[実行中タスク収集]
    G -->|No| I[ワークスペース状態取得]
    H --> I
    I --> J[選択中ワークスペースIndex特定]
    J --> K[ServedInfoResponse返却]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 選択ワークスペース未設定 | 選択中ワークスペースが存在しない場合、selectedWorkspaceIndexは-1を返す | selectedフラグがtrueのワークスペースが存在しない場合 |
| BR-02 | ネストタスク再帰収集 | タスク情報にnestedフィールドがある場合、再帰的に子タスクも収集する。タスク名にはプレフィックス（"親タスク名 > "）を付加 | info.nestedがnullでない場合 |
| BR-03 | 時間計算 | 全時間値はhnsecs（100ナノ秒）からseconds（double）に変換される | includeTasks=true時 |

### 計算ロジック

- **toSeconds変換**: `d.total!"hnsecs" / 10_000_000.0`

## データベース操作仕様

本機能ではデータベース操作は発生しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| なし | - | 特段のエラーケースなし。インデックスが利用不可の場合はnullが返る | - |

### リトライ仕様

リトライは不要。

## トランザクション仕様

トランザクションは存在しない。

## パフォーマンス要件

includeIndexを指定した場合、IndexComponentのdumpReverseImportsが呼ばれるため、インデックスサイズに応じて時間がかかる可能性がある。

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

サーバーの設定情報やファイルパスが含まれるため、レスポンスの取り扱いに注意が必要。

## 備考

- recentlyEndedタスク（最近終了したタスク）もタスク一覧に含まれる。runningフラグがfalseで区別可能。
- WorkspaceStateにはuri, name, initialized, selected, pendingErrorsが含まれる。

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | types.d | `source/served/types.d` | Workspace.describeState（301-318行目）: WorkspaceState構造体の生成 |

**読解のコツ**: ServedInfoParamsとServedInfoResponseの型定義はLSPプロトコル拡張として定義されている。`@property`アトリビュートはD言語のプロパティメソッドで、フィールドのようにアクセスできる。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | extension.d | `source/served/extension.d` | getServedInfo関数（1226-1314行目）: @protocolMethod("served/getInfo")ハンドラ |

**主要処理フロー**:
1. **1229-1234行目**: serverInfo取得（makeServerInfo）
2. **1236-1240行目**: includeConfig処理 - 設定取得
3. **1242-1262行目**: includeIndex処理 - IndexComponentからdumpReverseImports
4. **1264-1300行目**: includeTasks処理 - FiberManagerからタスク情報収集
5. **1302-1303行目**: ワークスペース状態取得
6. **1305-1311行目**: 選択ワークスペースインデックス特定

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

```
getServedInfo(ServedInfoParams)  [@protocolMethod("served/getInfo")]
    |
    +-- makeServerInfo()
    |
    +-- [includeConfig] config(selectedWorkspaceUri)
    |
    +-- [includeIndex] IndexComponent.dumpReverseImports()
    |
    +-- [includeTasks] addTasks(lspRouter.fibers) [再帰]
    |       +-- FiberManager.fiberInfos
    |       +-- FiberManager.recentlyEnded
    |
    +-- fallbackWorkspace.describeState
    +-- workspaces.map!"a.describeState"
    |
    +-- [返却] ServedInfoResponse
```

### データフロー図

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

ServedInfoParams  ────────> getServedInfo()
  .includeConfig  ────────>   config()           ──> currentConfiguration
  .includeIndex   ────────>   dumpReverseImports ──> moduleIndex
  .includeTasks   ────────>   fiberInfos収集     ──> runningTasks[]
                              describeState()     ──> workspaces[]
                                                  ──> ServedInfoResponse
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| extension.d | `source/served/extension.d` | ソース | getServedInfo関数の実装 |
| types.d | `source/served/types.d` | ソース | Workspace.describeState、Configuration構造体の定義 |
| index.d | `source/served/commands/index.d` | ソース | IndexComponent（dumpReverseImports） |
