# USER
## 依頼内容
VS Code拡張機能の開発において、TreeViewのメニュー（アイテム）の表示名を動的に変更するための、TypeScriptの実装サンプル`extension.ts` および `TreeDataProvider` 周辺のコードブロック）を作成してください。
## 現状の構成と仕様
現在`extension.ts` 内から `TreeView` を使用してメニューを表示しています。以下の処理フローを満たす実装をお願いします。
### 実装したい処理フロー
1. **モデルの選択（実装済）**
   コマンド `command/executeListModels`（モデル一覧表示・選択）で利用するLLMを設定する。
2. **モデル名の取得（実装済）**
   設定されたモデル名を `tools:getModel()` で取得する。
   `export function getModel(): string`
3. **表示名の動的変更**
   `getModel()` で取得したモデル名（例: `gpt-4o`, `gemini-1.5-pro` など）を用いて、TreeView上のメニュー表示名「モデル（未選択）」を「利用確認（<モデル名>）」に動的に変更する。
4. **TreeViewの更新**
   表示名の変更後`onDidChangeTreeData` イベントを発行し、TreeViewを再表示（リフレッシュ）する。
## 期待する出力
- `TreeDataProvider`（または `TreeItem`）側でモデル名の変更を検知し、表示名を書き換えて再描画する一連のTypeScriptコード。
- `extension.ts` 側でコマンド実行後にTreeViewの更新をトリガーする際の実装例。
--------------- extension.tsーーーーー        
```typescript
import * as vscode from 'vscode';        
import OpenAI from 'openai';        
import {        
  executeModelConfirmation,        
  executeListModels,        
  executeChatWithProgram,        
  executeCreateComment,        
  executeCodeReview        
} from './commands';        
import { getModel,initializeOpenAI } from './commands/tools';        
export function activate(context: vscode.ExtensionContext) {        
  initializeOpenAI();        
  const treeDataProvider = new AIAssistantMenuProvider();        
  context.subscriptions.push(        
    vscode.window.registerTreeDataProvider('aiAssistantMenu', treeDataProvider)        
  );        
  // 各機能のコマンドを登録        
context.subscriptions.push(        
    vscode.commands.registerCommand('extension.executeModelConfirmation', () => executeModelConfirmation(context)),        
    vscode.commands.registerCommand('extension.executeListModels', () => executeListModels(context)),        
    vscode.commands.registerCommand('extension.executeChatWithProgram', () => executeChatWithProgram(context)),        
    vscode.commands.registerCommand('extension.executeCreateComment', () => executeCreateComment(context)),        
    vscode.commands.registerCommand('extension.executeCodeReview', () => executeCodeReview(context))        
  );        
}        
class AIAssistantMenuProvider implements vscode.TreeDataProvider<string> {        
  getTreeItem(element: string): vscode.TreeItem {        
    return {        
      label: element,        
      command: {        
        command:        
          element === '利用確認（モデル確認）'        
            ? 'extension.executeModelConfirmation'        
            : element === 'モデル一覧表示・選択'        
            ? 'extension.executeListModels'        
            : element === 'チャット（プログラム）'        
            ? 'extension.executeChatWithProgram'        
            : element === 'コメント作成'        
            ? 'extension.executeCreateComment'        
            : 'extension.executeCodeReview',        
        title: 'AIAssistant'        
      }        
    };        
  }        
  getChildren(): Thenable<string[]> {        
    return Promise.resolve([        
      '利用確認（モデル確認）',        
      'モデル一覧表示・選択',        
      'チャット（プログラム）',        
      'コメント作成',        
      'コードレビュー'        
    ]);        
  }        
}        
export function deactivate() {}
```

# ASSISTANT
以下に、`TreeView` のメニュー表示名を動的に変更するためのTypeScriptの実装例を示します。この実装では、モデル名が設定されると `AIAssistantMenuProvider` でそれを検知し、TreeViewの表示名を更新します。

### TreeDataProvider側 (`TreeItem` の動的変更)

まず、`AIAssistantMenuProvider` クラス内でモデル名に応じてメニューの表示名を設定するように修正します。また、モデル名が変更された場合は `onDidChangeTreeData` を発行してTreeViewを更新します。

```typescript
class AIAssistantMenuProvider implements vscode.TreeDataProvider<string> {
  private model: string = "未選択"; // 初期状態としてモデル名を設定

  constructor() {
    this.onDidChangeTreeDataEmitter = new vscode.EventEmitter<void>();
    this.onDidChangeTreeData = this.onDidChangeTreeDataEmitter.event;
  }

  private onDidChangeTreeDataEmitter: vscode.EventEmitter<void>;

  // モデル名を動的に変更するメソッド
  public updateModelName(newModelName: string) {
    if (this.model !== newModelName) {
      this.model = newModelName;
      this.onDidChangeTreeDataEmitter.fire();
    }
  }

  getTreeItem(element: string): vscode.TreeItem {
    let label = element;

    // モデル名に応じて表示名を更新
    if (element === '利用確認（モデル未選択）') {
      label = `利用確認（${this.model}）`;
    }

    return {
      label: label,
      command: {
        command:
          element === '利用確認（' + this.model + '）'
            ? 'extension.executeModelConfirmation'
            : element === 'モデル一覧表示・選択'
              ? 'extension.executeListModels'
              : element === 'チャット（プログラム）'
                ? 'extension.executeChatWithProgram'
                : element === 'コメント作成'
                  ? 'extension.executeCreateComment'
                  : 'extension.executeCodeReview',
        title: 'AIAssistant'
      }
    };
  }

  getChildren(): Thenable<string[]> {
    return Promise.resolve([
      `利用確認（${this.model}）`,
      'モデル一覧表示・選択',
      'チャット（プログラム）',
      'コメント作成',
      'コードレビュー'
    ]);
  }
}
```

### extension.ts 側 (TreeViewの更新をトリガー)

次に、`extension.ts` 内でモデル名が設定された後に `updateModelName()` メソッドを呼び出し、表示名を動的に変更します。

```typescript
export function activate(context: vscode.ExtensionContext) {
  initializeOpenAI();
  
  const treeDataProvider = new AIAssistantMenuProvider();
  context.subscriptions.push(
    vscode.window.registerTreeDataProvider('aiAssistantMenu', treeDataProvider)
  );

  // モデル名の選択コマンドを登録
  context.subscriptions.push(
    vscode.commands.registerCommand('extension.executeListModels', () => {
      executeListModels(context);

      // カスタムロジックでモデル名を取得（この部分は実際の機能に応じて適宜変更）
      const modelName = getModel();
      
      // モデル名を更新してTreeViewを再描画
      treeDataProvider.updateModelName(modelName);
    })
  );

  // 他のコマンドも登録...
}
```

このようにすることで、ユーザーがモデル一覧から選択を行った際にTreeViewの表示名が動的に更新されます。`executeListModels()` の実装内で、取得したモデル名を `updateModelName()` で設定することで変更を反映します。

この例では、メニューの一部だけが動的に更新されています。全ての必要な場所（例: モデル名以外のアイテムも他の条件に応じて変更する等）で同様のロジックを適用してください。

