# 画面設計書 15-設定更新通知

## 概要

`coded/updateSetting` 通知でクライアントの設定を更新する（DCDパス設定等）処理を担当する通知画面の設計書である。

### 本画面の処理概要

本画面は、serve-dサーバー側でDCDの更新処理が完了した際に、クライアントのエディタ設定を更新するために `coded/updateSetting` 通知を送信する処理を担当する。主にDCDのクライアントパスとサーバーパスの設定を更新するために使用される。また、DUB依存関係のダウンロード設定（forceDownloadDependencies）の更新にも使用される。

**業務上の目的・背景**：DCDのインストール先パスはプラットフォームやインストール方法により異なるため、サーバー側でDCDの更新が完了した後、正しいパスをクライアント設定に反映する必要がある。これにより、次回のサーバー起動時に正しいDCDバイナリを使用できるようになる。

**画面へのアクセス方法**：本通知はDCD更新処理（updateDCD関数）の完了時に自動的にトリガーされる。また、DUB依存関係のダウンロード確認ダイアログで「Always」または「Never」が選択された場合にも送信される。

**主要な操作・処理内容**：
1. DCD更新処理（updateDCD）が完了する
2. DCDクライアントパスとサーバーパスを `coded/updateSetting` 通知で送信する
3. クライアント側で設定が反映され、設定変更処理（No.7）が再トリガーされる

**画面遷移**：DCD更新処理（No.39）からの遷移で本通知が発生する。通知を受けたクライアントが設定変更処理（No.7）を再度トリガーする可能性がある。

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 63 | DCD更新 (served/updateDCD) | 主機能 | DCD更新完了時にcoded/updateSetting通知でDCDパス設定をクライアントに反映する |
| 5 | 設定変更処理 | 補助機能 | 設定更新通知を受けたクライアントが設定変更処理を再度トリガーする |

## 画面種別

通知（カスタム通知）

## URL/ルーティング

LSPカスタム通知: `coded/updateSetting`（サーバーからクライアントへの通知）

パラメータ: `UpdateSettingParams` 構造体

## 入出力項目

| 項目名 | 型 | 入力/出力 | 説明 |
|--------|-----|----------|------|
| section | string | 出力 | 設定セクション名（例: "dcdClientPath", "dcdServerPath", "forceDownloadDependencies"） |
| value | JsonValue | 出力 | 設定値（パス文字列またはオプション文字列） |
| global | bool | 出力 | trueの場合、全インスタンス共通の設定更新 |

## 表示項目

| 項目名 | 表示形式 | 説明 |
|--------|----------|------|
| なし | なし | 本通知はクライアントの設定値を更新するものであり、直接的なUI表示は伴わない |

## イベント仕様

### 1-DCD更新完了時の設定通知

updateDCD関数の完了時に、成功・失敗に関わらずDCDパス設定を送信する。

1. **270行目**: `coded/updateSetting` で `dcdClientPath` を送信（global=true）
2. **272行目**: `coded/updateSetting` で `dcdServerPath` を送信（global=true）
3. 成功時はインストール先のフルパス、失敗時はデフォルトの "dcd-client" / "dcd-server" を送信

### 2-DUB依存関係ダウンロード設定の更新

delayedProjectActivation関数内で、ユーザーが "Always" または "Never" を選択した場合:

1. **832行目**: `coded/updateSetting` で `forceDownloadDependencies` に "always" を送信（global=true）
2. **838行目**: `coded/updateSetting` で `forceDownloadDependencies` に "never" を送信（global=true）

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| なし | なし | なし | データベースアクセスなし |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 条件 |
|-------------|------|---------------|------|
| MSG-15-01 | 設定更新 | UpdateSettingParams("dcdClientPath", finalDestinationClient, true) | DCD更新完了時 |
| MSG-15-02 | 設定更新 | UpdateSettingParams("dcdServerPath", finalDestinationServer, true) | DCD更新完了時 |
| MSG-15-03 | 設定更新 | UpdateSettingParams("forceDownloadDependencies", "always", true) | ユーザーがAlways選択時 |
| MSG-15-04 | 設定更新 | UpdateSettingParams("forceDownloadDependencies", "never", true) | ユーザーがNever選択時 |

## 例外処理

| 例外条件 | 処理内容 |
|----------|----------|
| DCD更新失敗 | デフォルトパス（"dcd-client", "dcd-server"）で設定更新通知を送信 |

## 備考

- coded/updateSettingはserve-d独自のカスタムLSP通知であり、標準LSPプロトコルには含まれない
- UpdateSettingParams構造体はsection, value, globalの3フィールドを持つ
- globalフラグがtrueの場合、全ワークスペースに共通の設定として反映される

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | protoext.d | `source/served/lsp/protoext.d` | UpdateSettingParams構造体（42-50行目）：section, value, globalの3フィールド |

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | dcd_update.d | `source/served/commands/dcd_update.d` | updateDCD関数（270-273行目）でDCDパス設定を送信 |
| 2-2 | extension.d | `source/served/extension.d` | delayedProjectActivation関数（832, 838行目）でダウンロード設定を送信 |

**主要処理フロー（updateDCD）**:
1. **270行目**: `rpc.notifyMethod("coded/updateSetting", UpdateSettingParams("dcdClientPath", ...))`
2. **272行目**: `rpc.notifyMethod("coded/updateSetting", UpdateSettingParams("dcdServerPath", ...))`

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

```
served/updateDCD [dcd_update.d:82]
    |
    +-- DCD更新処理（コンパイル/ダウンロード）
    |
    +-- rpc.notifyMethod("coded/updateSetting", dcdClientPath) [dcd_update.d:270]
    +-- rpc.notifyMethod("coded/updateSetting", dcdServerPath) [dcd_update.d:272]

delayedProjectActivation() [extension.d:727]
    |
    +-- DUB依存関係不足検出
    |
    +-- [Always選択] rpc.notifyMethod("coded/updateSetting", forceDownloadDependencies) [extension.d:832]
    +-- [Never選択] rpc.notifyMethod("coded/updateSetting", forceDownloadDependencies) [extension.d:838]
```

### データフロー図

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

DCD更新完了            +-- updateDCD()                  +-- coded/updateSetting通知
（パス確定）                |                                  (dcdClientPath)
                             +-- UpdateSettingParams構築    +-- coded/updateSetting通知
                                                                (dcdServerPath)

ユーザー選択           +-- delayedProjectActivation()   +-- coded/updateSetting通知
（Always/Never）            +-- UpdateSettingParams構築     (forceDownloadDependencies)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| dcd_update.d | `source/served/commands/dcd_update.d` | ソース | updateDCD関数内でDCDパス設定通知（270-273行目） |
| extension.d | `source/served/extension.d` | ソース | delayedProjectActivation内でダウンロード設定通知（832, 838行目） |
| protoext.d | `source/served/lsp/protoext.d` | ソース | UpdateSettingParams構造体定義（42-50行目） |
