Исправь, пожалуйста, следующее расширение Visual Studio Code, убери весь незадействованный в расширении код и добавь иконку в SideBar для этого расширения, которая бы при нажатии открывало окно этого расширения, дай подробное описание этого расширения:
package.json
```
{
  "name": "genagent",
  "displayName": "GenAgent",
  "description": "Расширение для отправки данных на локальный сервис",
  "version": "0.0.1",
  "publisher": "your-publisher-name",
  "engines": {
      "vscode": "^1.94.2"
  },
  "categories": [
      "Other"
  ],
  "activationEvents": [
  ],
  "main": "./out/extension.js",
  "contributes": {
      "commands": [{
          "command": "genagent.shoсwPanel",
          "title": "Открыть GenAgent"
      }],
      "menus": {
          "view/title": [
              {
                  "command": "genagent.showPanel",
                  "when": "view == genagentPanel",
                  "group": "navigation"
              }
          ],
          "commandPalette": [
              {
                  "command": "genagent.showPanel",
                  "when": "true"
              }
          ],
          "activityBar": [
              {
                  "command": "genagent.showPanel",
                  "when": "true",
                  "group": "1_genagent",
                  "icon": {
                      "light": "media/icon-light.png",
                      "dark": "media/icon-dark.png"
                  },
                  "tooltip": "Открыть GenAgent"
              }
          ]
      }
  },
  "scripts": {
      "vscode:prepublish": "npm run compile",
      "compile": "tsc -p ./",
      "watch": "tsc -watch -p ./",
      "pretest": "npm run compile && npm run lint",
      "lint": "eslint src --ext ts",
      "test": "node ./out/test/runTest.js"
  },
  "devDependencies": {
      "@types/glob": "^7.2.0",
      "@types/mocha": "^10.0.1",
      "@types/node": "^20.4.0",
      "@types/vscode": "^1.94.2",
      "@vscode/test-electron": "^2.4.0",
      "eslint": "^8.45.0",
      "glob": "^8.1.0",
      "mocha": "^10.2.0",
      "typescript": "^5.0.4"
  }
}
```
src/extension. ts
```
import * as vscode from 'vscode';

let currentPanel: vscode.WebviewPanel | undefined = undefined;

export function activate(context: vscode.ExtensionContext) {
    const disposable = vscode.commands.registerCommand('genagent.showPanel', () => {
        if (currentPanel) {
            // Если панель уже существует, показываем ее
            currentPanel.reveal(vscode.ViewColumn.One);
        } else {
            // Создаем и показываем новую панель
            currentPanel = vscode.window.createWebviewPanel(
                'genagentPanel',
                'GenAgent',
                vscode.ViewColumn.One,
                {
                    enableScripts: true,
                    localResourceRoots: [vscode.Uri.file(context.extensionPath)]
                }
            );

            const iconPath = vscode.Uri.file(context.asAbsolutePath('media/icon.png'));
            currentPanel.iconPath = iconPath;
            const nonce = getNonce();
            const html = getWebviewContent(iconPath, nonce);
            currentPanel.webview.html = html;

            // Обрабатываем сообщения от webview
            currentPanel.webview.onDidReceiveMessage(
                message => {
                    switch (message.command) {
                        case 'processData':
                            handleProcessData(message.text, message.file, context);
                            return;
                    }
                },
                undefined,
                context.subscriptions
            );

            // Обрабатываем закрытие панели
            currentPanel.onDidDispose(
                () => {
                    currentPanel = undefined;
                },
                undefined,
                context.subscriptions
            );
        }
    });

    context.subscriptions.push(disposable);
}

function getNonce() {
    let text = '';
    const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    for (let i = 0; i < 32; i++) {
        text += possible.charAt(Math.floor(Math.random() * possible.length));
    }
    return text;
}

function getWebviewContent(iconPath: vscode.Uri, nonce: string) {
    return `<!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src ${iconPath.with({ scheme: 'vscode-resource' }).toString()}; script-src 'nonce-${nonce}'; style-src 'nonce-${nonce}';">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>GenAgent</title>
        <style nonce="${nonce}">
            body { font-family: sans-serif; margin: 0; padding: 10px; background-color: #1e1b26; color: #e0e0e0; }
            #chat { border: 1px solid #383540; padding: 10px; height: 300px; overflow-y: auto; margin-bottom: 10px; background-color: #2d2a38; }
            #input { width: calc(100% - 130px); margin-right: 10px; padding: 5px; background-color: #383540; color: #e0e0e0; border: 1px solid #383540; }
            #send { width: 110px; padding: 5px; background-color: #7289da; color: white; border: none; cursor: pointer; }
            .message { margin-bottom: 10px; padding: 8px 12px; border-radius: 10px; }
            .user-message { background-color: #383540; align-self: flex-end; text-align: right; }
            .service-message { background-color: #2d2a38; align-self: flex-start; text-align: left; }
            .error-message { background-color: #5c1616; align-self: center; text-align: center; color: white; }
            .message-container { display: flex; flex-direction: column; }
        </style>
    </head>
    <body>
        <div id="chat" class="message-container"></div>
        <input id="input" type="text" placeholder="Введите текст...">
        <input id="file" type="file">
        <button id="send">Отправить</button>

        <script nonce="${nonce}">
            (function () {
                const vscode = acquireVsCodeApi();

                const chat = document.getElementById('chat');
                const input = document.getElementById('input');
                const fileInput = document.getElementById('file');
                const sendButton = document.getElementById('send');

                function addMessageToChat(message, isUser, isError) {
                    const messageElement = document.createElement('div');
                    messageElement.classList.add('message', isUser ? 'user-message' : isError ? 'error-message' : 'service-message');
                    messageElement.textContent = message;
                    chat.appendChild(messageElement);
                    chat.scrollTop = chat.scrollHeight;
                }

                sendButton.addEventListener('click', () => {
                    const text = input.value;
                    const file = fileInput.files[0];
                    addMessageToChat(text, true, false);
                    if (file) {
                        const reader = new FileReader();
                        reader.onload = function(e) {
                            vscode.postMessage({
                                command: 'processData',
                                text: text,
                                file: e.target.result
                            });
                        };
                        reader.readAsDataURL(file);
                    } else {
                        vscode.postMessage({
                            command: 'processData',
                            text: text,
                            file: null
                        });
                    }
                    input.value = '';
                    fileInput.value = '';
                });

                window.addEventListener('message', event => {
                    const message = event.data;
                    addMessageToChat(message, false, false);
                });
            }());
        </script>
    </body>
    </html>`;
}

async function handleProcessData(text: string, file: string | null, context: vscode.ExtensionContext) {
    try {
        const response = await fetch('http://localhost:3000/process', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({ text, file })
        });

        if (!response.ok) {
            throw new Error(`Ошибка: ${response.statusText}`);
        }

        const result = await response.text();

        // Отправляем ответ в webview, если панель все еще существует
        if (currentPanel) {
            currentPanel.webview.postMessage(result);
        }

        // Сохраняем ответ в глобальном состоянии (опционально)
        context.globalState.update('lastResponse', result);
    } catch (error) {
        if (error instanceof Error) {
            if (currentPanel) {
                currentPanel.webview.postMessage(error.message);
            }
        } else {
            if (currentPanel) {
                currentPanel.webview.postMessage('Произошла неизвестная ошибка');
            }
        }
    }
}

export function deactivate() {}
```