# 通知設計書 1-MWS_NOT_SUPPORT

## 概要

本ドキュメントは、Lua Language Server におけるマルチワークスペース非対応通知（MWS_NOT_SUPPORT）の設計仕様を定義する。

### 本通知の処理概要

この通知は、クライアント（VSCode等のエディタ）がマルチワークスペース機能をサポートしていない場合に、ユーザーに対して再起動が必要であることを通知する機能である。

**業務上の目的・背景**：Lua Language Server は複数のワークスペースフォルダを同時に扱うマルチワークスペース機能を持つが、一部のクライアントやエディタ拡張はこの機能に完全対応していない。新しいワークスペースが追加された場合、適切に認識されず言語サーバーの機能が正しく動作しない可能性がある。この通知により、ユーザーは問題を認識し、再起動によって新しいワークスペースを適切に反映させることができる。

**通知の送信タイミング**：マルチワークスペースが有効化された際に、クライアントがマルチワークスペースをサポートしていないと判断された場合に送信される。具体的には、ワークスペースフォルダが追加された際に、クライアントの capabilities を確認して判定する。

**通知の受信者**：エディタを使用している開発者（ユーザー）。クライアント側で表示されるメッセージダイアログとして受信する。

**通知内容の概要**：「{クライアント名} は現在マルチワークスペースをサポートしていません。新しいワークスペースを反映するには再起動が必要な場合があります。」というメッセージと、再起動ボタンが表示される。

**期待されるアクション**：ユーザーは「再起動」ボタンをクリックして言語サーバーを再起動するか、メッセージを無視して現状の機能で作業を継続する。再起動を選択した場合、新しいワークスペースが適切に認識される。

## 通知種別

アプリ内通知（LSP window/showMessageRequest）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（LSP request） |
| 優先度 | 中 |
| リトライ | 無 |

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

LSP クライアント（エディタ）に対して直接送信される。受信者はエディタを使用している開発者。

## 通知テンプレート

### メッセージ通知の場合

| 項目 | 内容 |
|-----|------|
| メッセージタイプ | Warning |
| ボタン | 再起動（MWS_RESTART） |

### 本文テンプレート

```
{client_name} does not support multi workspace for now, I may need to restart to support the new workspace ...
```

日本語:
```
現在 {client_name} はマルチワークスペースをサポートしていません。新しいワークスペースを反映するためには再起動が必要になる場合があります。
```

### 添付ファイル

なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| client_name | クライアント名 | client.info.clientInfo.name | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| システムイベント | ワークスペースフォルダ追加 | クライアントがマルチワークスペース非対応 | 新しいワークスペースが追加されたが、クライアントが対応していない場合 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| クライアントがマルチワークスペース対応 | capabilities でサポートが確認された場合は送信しない |
| 既に通知済み | 同一セッションで既に通知した場合は再送信しない |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[ワークスペースフォルダ追加イベント] --> B{マルチワークスペース対応?}
    B -->|対応| C[通常処理継続]
    B -->|非対応| D[MWS_NOT_SUPPORT通知生成]
    D --> E[window/showMessageRequest送信]
    E --> F{ユーザー選択}
    F -->|再起動| G[言語サーバー再起動]
    F -->|キャンセル| H[現状維持]
    G --> I[終了]
    H --> I
    C --> I
```

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

### 参照テーブル一覧

本通知はデータベースを使用しない（インメモリ処理）。

### 更新テーブル一覧

なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 送信失敗 | LSP通信エラー | ログに記録し、処理を継続 |
| クライアント情報取得失敗 | clientInfo が nil | デフォルト値を使用 |

### リトライ仕様

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

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| セッションあたり上限 | 1回 |
| 重複送信 | 抑止 |

### 配信時間帯

制限なし（リアルタイム通知）

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

- 個人情報は含まれない
- クライアント名のみを表示するため、機密情報の漏洩リスクなし

## 備考

- この通知は MWS_RESTART（No.2）と組み合わせて使用される
- 再起動ボタンの実装はクライアント側に依存する

---

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

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

### 推奨読解順序

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

まず、通知メッセージの定義とローカライズ機構を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | script.lua | `locale/en-us/script.lua` | 189-192行目: MWS_NOT_SUPPORT, MWS_RESTART の定義 |
| 1-2 | language.lua | `script/language.lua` | ローカライズシステムの仕組み、lang.script() の動作 |

**読解のコツ**: locale フォルダ以下の各言語ファイルで同一キーが定義されている。formatAsArray/formatAsTable で {} 内の変数が置換される。

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

クライアント通知の送信機構を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | client.lua | `script/client.lua` | 102-145行目: showMessage, requestMessage 関数の実装 |

**主要処理フロー**:
1. **102-113行**: showMessage - 単純なメッセージ表示（window/showMessage）
2. **119-145行**: requestMessage - ボタン付きメッセージ（window/showMessageRequest）
3. **133行**: proto.request で LSP リクエスト送信

#### Step 3: 通知送信元を理解する

マルチワークスペース関連の通知がどこから送信されるかを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | workspace.lua | `script/workspace/workspace.lua` | ワークスペース管理とイベント処理 |

**主要処理フロー**:
- **47-58行**: workspace.create - ワークスペース作成時の処理
- **574-585行**: config.watch - 設定変更監視

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

```
workspace.create (workspace.lua:47)
    │
    ├─ scope.createFolder (scope.lua)
    │
    ├─ client.showMessage (client.lua:102)
    │      └─ proto.notify('window/showMessage')
    │
    └─ client.requestMessage (client.lua:119)
           └─ proto.request('window/showMessageRequest')
                  └─ callback処理 (再起動等)
```

### データフロー図

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

ワークスペース     ───▶  client.requestMessage()  ───▶  LSPクライアント
フォルダ追加              │                              (エディタ)
                         ├─ lang.script('MWS_NOT_SUPPORT')
                         │   (メッセージテンプレート取得)
                         │
                         └─ proto.request()
                             (LSPリクエスト送信)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| script.lua | `locale/en-us/script.lua` | ローカライズ | 英語メッセージ定義（189-192行） |
| script.lua | `locale/ja-jp/script.lua` | ローカライズ | 日本語メッセージ定義（189-192行） |
| client.lua | `script/client.lua` | ソース | クライアント通信・メッセージ送信 |
| language.lua | `script/language.lua` | ソース | 多言語対応機構 |
| workspace.lua | `script/workspace/workspace.lua` | ソース | ワークスペース管理 |
| proto.lua | `script/proto/proto.lua` | ソース | LSPプロトコル実装 |
