# 画面設計書 66-サーバー情報取得（served/getInfo）

## 概要

本ドキュメントは、serve-d LSPサーバーのカスタムリクエスト `served/getInfo` の画面設計書である。サーバーのバージョン情報・設定・モジュールインデックス・ワークスペース状態・実行中タスク等の包括的な情報を返却する。

### 本画面の処理概要

本リクエストは、serve-dサーバーの現在の状態を包括的に返却するデバッグ・診断向けのリクエストである。

**業務上の目的・背景**：serve-dの動作状態を確認するため、サーバーのバージョン情報・現在の設定・モジュールインデックスの内容・ワークスペースの状態・実行中のタスク一覧等をまとめて取得する必要がある。これはデバッグやトラブルシューティング、サーバーの健全性確認に使用される。リクエストパラメータで返却する情報を選択的に指定できるため、不要なデータの取得を避けることができる。

**画面へのアクセス方法**：LSPクライアントから `served/getInfo` カスタムリクエストを送信することでアクセスする。

**主要な操作・処理内容**：
1. クライアントからリクエストパラメータ（includeConfig, includeIndex, includeTasks）を受信する
2. サーバー情報（バージョン等）を取得する
3. includeConfigがtrueの場合、選択中ワークスペースの設定を取得する
4. includeIndexがtrueの場合、アクティブワークスペースのモジュールインデックスを取得する
5. includeTasksがtrueの場合、実行中・最近完了したタスクの一覧を取得する
6. グローバルワークスペースと全ワークスペースの状態を取得する
7. 選択中ワークスペースのインデックスを設定する
8. 全情報を ServedInfoResponse として返却する

**画面遷移**：
- 遷移元：エディタのserve-d情報表示UI、デバッグコンソール
- 遷移先：なし（情報返却のみ）

**権限による表示制御**：特になし。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 7 | サーバー情報取得 (served/getInfo) | 主機能 | サーバーバージョン・設定・モジュールインデックス・ワークスペース状態・実行中タスク等の情報を返却する |
| 66 | バックグラウンドインデックス | 補助機能 | サーバー情報にモジュールインデックスの内容を含めて返却する |

## 画面種別

カスタムLSPリクエスト（診断情報返却型）

## URL/ルーティング

LSPカスタムメソッド: `served/getInfo`

## 入出力項目

### リクエストパラメータ（ServedInfoParams）

| 項目名 | 型 | 必須 | デフォルト | 説明 |
|--------|------|------|----------|------|
| includeConfig | bool | いいえ | false | 現在の設定情報を含めるか |
| includeIndex | bool | いいえ | false | モジュールインデックスを含めるか |
| includeTasks | bool | いいえ | false | 実行中タスク一覧を含めるか |

### レスポンス（ServedInfoResponse）

| 項目名 | 型 | 説明 |
|--------|------|------|
| serverInfo | ServerInfo | サーバーのバージョン情報 |
| currentConfiguration | Configuration (optional) | 現在の設定（includeConfig=true時のみ） |
| moduleIndex | string[][string] (optional) | モジュールインデックス（includeIndex=true時のみ） |
| globalWorkspace | WorkspaceState | グローバルワークスペースの状態 |
| workspaces | WorkspaceState[] | 全ワークスペースの状態配列 |
| selectedWorkspaceIndex | int | 選択中ワークスペースのインデックス（-1でグローバル） |
| runningTasks | Task[] | 実行中・完了タスク（includeTasks=true時のみ） |

### Task構造

| 項目名 | 型 | 説明 |
|--------|------|------|
| name | string | タスク名（関数名またはLSPリクエスト名） |
| queued | double | キューに入れられてからの経過秒数 |
| started | double | 開始からの経過秒数 |
| ended | double | 終了からの経過秒数（0は実行中） |
| running | bool | 現在実行中かどうか |
| numSteps | int | 再開回数 |
| timeSpent | double | 実行に費やした合計秒数 |

## 表示項目

クライアント側でserve-dのデバッグ情報表示に使用される。

## イベント仕様

### 1-サーバー情報取得リクエスト受信

1. クライアントから `served/getInfo` リクエストを受信する
2. `makeServerInfo()` でサーバーバージョン情報を取得してレスポンスに設定する
3. `includeConfig` がtrueの場合：
   - `selectedWorkspaceUri` で選択中ワークスペースURIを取得
   - `config(uri, false)` で設定を取得してレスポンスに設定
4. `includeIndex` がtrueの場合：
   - 各ワークスペースを走査し、`selected` が true のものを見つける
   - そのインスタンスの `IndexComponent.dumpReverseImports()` でモジュールインデックスを取得
5. `includeTasks` がtrueの場合：
   - `lspRouter.fibers.fiberInfos` と `recentlyEnded` を走査
   - 各ファイバーの名前・キュー時間・開始時間・終了時間・実行状態・ステップ数・実行時間を収集
   - ネストされたファイバーも再帰的に処理
6. `fallbackWorkspace.describeState` でグローバルワークスペース状態を取得
7. `workspaces.map!"a.describeState"` で全ワークスペース状態を取得
8. 選択中ワークスペースのインデックスを設定（未選択の場合は-1）
9. レスポンスを返却する

## データベース更新仕様

### 操作別データベース影響一覧

本リクエストはデータベースへの更新を行わない。サーバーの現在の状態を読み取り専用で返却する。

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| サーバー情報取得 | なし | SELECT（読み取り） | サーバー内部状態の読み取り |

## メッセージ仕様

| メッセージID | 種別 | 表示条件 | メッセージ内容 |
|-------------|------|---------|--------------|
| なし | - | - | 本リクエストはエラーメッセージを直接クライアントに表示しない |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| 選択中ワークスペースが存在しない | selectedWorkspaceIndexを-1に設定 |
| IndexComponentが未ロード | moduleIndexを空のままにする |

## 備考

- ServedInfoParamsの全フィールドは `@serdeOptional` であり、省略可能
- タスク情報はネストされたファイバーも含む。ネストされたタスクは "親タスク名 > 子タスク名" の形式で表示される
- モジュールインデックスは逆引き形式（キー: モジュール名、値: そのモジュールに依存するモジュール一覧）で返却される
- `version (unittest)` ブロックではserverInfoの生成がスキップされる

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | protoext.d | `source/served/lsp/protoext.d` | 行355-413のServedInfoParams, ServedInfoResponse, Task構造体 |

**読解のコツ**: ServedInfoResponseは多くのオプショナルフィールドを持ち、リクエストパラメータに応じて含める情報が変わる。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | extension.d | `source/served/extension.d` | `getServedInfo` 関数（行1226-1314）がエントリーポイント |

**主要処理フロー**:
1. **行1226-1227**: `@protocolMethod("served/getInfo")` で定義
2. **行1229-1234**: serverInfoの設定（unittestビルドではスキップ）
3. **行1236-1240**: includeConfig=trueの場合の設定情報取得
4. **行1242-1262**: includeIndex=trueの場合のモジュールインデックス取得
5. **行1264-1299**: includeTasks=trueの場合のタスク一覧取得（ネスト対応の再帰処理）
6. **行1302-1303**: ワークスペース状態の取得
7. **行1305-1311**: 選択中ワークスペースインデックスの設定

#### Step 3: タスク情報収集の再帰処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | extension.d | `source/served/extension.d` | 行1277-1299のaddTasks関数（内部関数） |

**主要処理フロー**:
- **行1279**: fiberInfosとrecentlyEndedを結合して走査
- **行1284-1291**: Task構造体の各フィールドを計算
- **行1294-1295**: ネストされたファイバーマネージャがある場合は再帰呼び出し

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

```
served/getInfo リクエスト
    |
    +-- getServedInfo(ServedInfoParams)              [extension.d:1227]
           |
           +-- makeServerInfo()                       [サーバーバージョン情報]
           |
           +-- config(uri, false)                     [設定取得（optional）]
           |
           +-- IndexComponent.dumpReverseImports()    [モジュールインデックス（optional）]
           |
           +-- lspRouter.fibers.fiberInfos            [タスク情報（optional）]
           |      +-- addTasks() [再帰]
           |
           +-- fallbackWorkspace.describeState()      [グローバルWS状態]
           +-- workspaces.map!"a.describeState"       [全WS状態]
```

### データフロー図

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

ServedInfoParams ---------> getServedInfo()               --> ServedInfoResponse
  |                            |                                   |
  +-- includeConfig            +-- makeServerInfo()                +-- serverInfo
  +-- includeIndex             +-- config()                        +-- currentConfiguration
  +-- includeTasks             +-- dumpReverseImports()            +-- moduleIndex
                               +-- fiberInfos走査                  +-- globalWorkspace
                               +-- describeState()                 +-- workspaces[]
                                                                   +-- selectedWorkspaceIndex
                                                                   +-- runningTasks[]
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| extension.d | `source/served/extension.d` | ソース | getServedInfo関数の実装 |
| protoext.d | `source/served/lsp/protoext.d` | ソース | ServedInfoParams, ServedInfoResponse構造体の定義 |
| types.d | `source/served/types.d` | ソース | Workspace, Configuration等の共通型定義 |
