# 通知設計書 65-WINDOW_APPLY_WHITOUT_SETTING

## 概要

本ドキュメントは、Lua Language Server における `WINDOW_APPLY_WHITOUT_SETTING` 通知の設計仕様を定義する。この通知は、サードパーティライブラリの設定を適用する際に、設定ファイルへの永続化を伴わない（メモリ内のみの）選択肢としてユーザーに表示されるボタンラベルとして使用される。

### 本通知の処理概要

**業務上の目的・背景**：Lua Language Serverは、ユーザーが使用しているサードパーティライブラリを自動検出し、適切な設定を適用する機能を持つ。ユーザーによっては、一時的にライブラリの補完機能を使用したいが、設定ファイルを永続的に変更したくない場合がある。本通知は、設定を現在のセッションにのみ適用し、設定ファイルには保存しない選択肢のボタンラベルとして使用される。

**通知の送信タイミング**：サードパーティライブラリが検出され、ユーザーに設定適用の確認を求める際に、`window/showMessageRequest`の選択肢の一つとして表示される。

**通知の受信者**：IDEやエディタを使用している開発者（ユーザー）に対して、ダイアログのボタンとして表示される。

**通知内容の概要**：「設定を変更せずに適用」という意味のボタンラベル。このボタンを選択すると、サードパーティライブラリの設定が現在のセッションにのみ適用され、設定ファイルには保存されない。

**期待されるアクション**：ユーザーがこのボタンをクリックすると、サードパーティライブラリの設定（ライブラリパスの追加、プラグインの有効化など）が現在のセッションにのみ適用される。次回エディタを起動した際には設定は保持されない。

## 通知種別

アプリ内通知（LSP window/showMessageRequestの選択肢ボタン）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 非同期（ユーザー入力待ち） |
| 優先度 | 中（Info） |
| リトライ | 無 |

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

LSPプロトコルを通じて、接続中のクライアント（IDE/エディタ）に直接送信される。

## 通知テンプレート

### メール通知の場合

該当なし（LSP通知のみ）

### 本文テンプレート

英語:
```
Apply but do not modify settings
```

日本語:
```
設定を変更せずに適用します
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| なし | テンプレート変数は使用されない | - | - |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| ファイル更新 | ファイル保存時にサードパーティライブラリのキーワード検出 | checkThirdParty設定が'Ask'の場合 | check3rdByWords関数で検出 |
| ファイル更新 | ファイル名パターンによるサードパーティライブラリ検出 | checkThirdParty設定が'Ask'の場合 | check3rdByFileName関数で検出 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| checkThirdParty='Disable' | サードパーティチェックが無効化されている |
| checkThirdParty='Apply' | 自動適用が有効で、ダイアログ表示しない |
| checkThirdParty='ApplyInMemory' | メモリ内適用が有効で、ダイアログ表示しない |
| hasAsked[cfg.name]=true | 既にそのライブラリについて確認済み |
| ライブラリが既に設定済み | workspace.libraryに既に含まれている |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[ファイル更新イベント] --> B[check3rd呼び出し]
    B --> C{サードパーティライブラリ検出?}
    C -->|No| D[終了]
    C -->|Yes| E{checkThirdParty設定}
    E -->|Disable| D
    E -->|Apply| F[apply3rd自動適用]
    E -->|ApplyInMemory| G[メモリ内適用]
    E -->|Ask| H[askFor3rd呼び出し]
    H --> I[window/showMessageRequest送信]
    I --> J{ユーザー選択}
    J -->|WINDOW_APPLY_WHIT_SETTING| K[apply3rdで永続化]
    J -->|WINDOW_APPLY_WHITOUT_SETTING| L[apply3rdでメモリ内のみ適用]
    J -->|WINDOW_DONT_SHOW_AGAIN| M[checkThirdParty無効化]
    K --> D
    L --> D
    M --> D
    F --> D
    G --> D
```

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

### 参照テーブル一覧

該当なし（データベースは使用しない）

### 更新テーブル一覧

該当なし（メモリ内のみの変更）

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 該当なし | メモリ内適用のため、エラーケースは限定的 | - |

### リトライ仕様

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

## 配信設定

### レート制限

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

### 配信時間帯

制限なし（随時送信）

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

- メモリ内のみの適用であり、永続的なファイル変更は行われない
- 現在のセッションでのみ有効なため、次回起動時には再度確認が行われる
- サードパーティライブラリの設定変更は、ユーザーの明示的な同意を得てから行われる

## 備考

- このボタンは`WINDOW_ASK_APPLY_LIBRARY`メッセージとともに表示される
- `WINDOW_APPLY_WHIT_SETTING`（設定を変更して適用）と`WINDOW_DONT_SHOW_AGAIN`（再度表示しない）との3択で表示される
- 一時的にライブラリを試したい場合や、プロジェクト固有の設定を避けたい場合に有用

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | library.lua | `script/library.lua` | サードパーティライブラリの設定構造（cfg）を理解する |

**読解のコツ**: `loadSingle3rdConfig`関数（340-383行目）で読み込まれる設定構造を確認する

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | library.lua | `script/library.lua` | check3rd関数（604-626行目）がサードパーティライブラリ検出の起点 |

**主要処理フロー**:
1. **609-615行**: checkThirdParty設定値の確認
2. **620-621行**: load3rdConfigでサードパーティ設定を読み込み

#### Step 3: ダイアログ表示ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | library.lua | `script/library.lua` | askFor3rd関数（476-517行目）でダイアログが表示される |

**主要処理フロー**:
- **491行**: WINDOW_APPLY_WHITOUT_SETTINGがボタンラベルとして設定される
- **493-495行**: window/showMessageRequestの送信
- **504-505行**: このボタンが選択された場合、apply3rd(uri, cfg, true)が呼び出される（onlyMemory=true）

#### Step 4: 設定適用ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | library.lua | `script/library.lua` | apply3rd関数（420-473行目）で設定が適用される |

**主要処理フロー**:
- **420行**: onlyMemoryパラメータで永続化の有無を制御
- **472行**: client.setConfig(changes, onlyMemory)で設定を適用

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

```
files.watch (658行)
    |
    └─ check3rd (605行)
           |
           ├─ load3rdConfig (620行)
           |
           ├─ check3rdByWords (624行)
           |      └─ askFor3rd (558行)
           |             |
           |             ├─ WINDOW_APPLY_WHITOUT_SETTING (491行)
           |             |
           |             └─ apply3rd (505行, onlyMemory=true)
           |                    └─ client.setConfig (472行)
           |
           └─ check3rdByFileName (625行)
                  └─ askFor3rd (598行)
```

### データフロー図

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

ファイル更新       ───▶  check3rd                 ───▶  (サードパーティ未検出)
                           |
                           v
                    load3rdConfig
                           |
                           v
                  check3rdByWords/FileName
                           |
                           v
                    askFor3rd (491行)
                           |
                           v
                window/showMessageRequest ───▶ ユーザー選択待ち
                           |
                           v (WINDOW_APPLY_WHITOUT_SETTING選択)
                    apply3rd (onlyMemory=true)
                           |
                           v
                  client.setConfig ───▶ メモリ内設定のみ更新
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| library.lua | `script/library.lua` | ソース | サードパーティライブラリ検出と設定適用 |
| client.lua | `script/client.lua` | ソース | 設定変更処理（onlyMemory対応） |
| script.lua | `locale/en-us/script.lua` | ローカライズ | 英語メッセージテンプレート |
| script.lua | `locale/ja-jp/script.lua` | ローカライズ | 日本語メッセージテンプレート |
