From a414a4f70dac8dee665292f81b70dfd5fd43baa4 Mon Sep 17 00:00:00 2001 From: B Harper Date: Wed, 22 Oct 2025 11:49:17 +1100 Subject: [PATCH] Fix sessionless HumanAgent chat functionality - Remove session management complexity from MCP server and UI - Update chatWebviewProvider for direct messaging without sessions - Fix MCP tool response format to use content array as per specification - Restore cog icon for MCP configuration (install global/local) - Add safety checks for message content handling - Resolve 'o.content is not iterable' error by using proper MCP format --- .github/copilot-instructions.md | 47 + .gitignore | 5 + .vscode-test.mjs | 5 + .vscode/HumanAgent-MCP.code-workspace | 7 + .vscode/extensions.json | 5 + .vscode/launch.json | 21 + .vscode/mcp.json | 20 + .vscode/settings.json | 13 + .vscode/tasks.json | 40 + .vscodeignore | 14 + CHANGELOG.md | 9 + README.md | 228 ++ ToDo.md | 1 + eslint.config.mjs | 28 + logs/combined.log | 228 ++ logs/error.log | 0 mcp-debug.log | 563 +++ package-lock.json | 4638 +++++++++++++++++++++++++ package.json | 122 + src/extension.ts | 171 + src/mcp/extensionBridge.ts | 64 + src/mcp/mcpConfigManager.ts | 233 ++ src/mcp/mcpServerClient.ts | 233 ++ src/mcp/mcpStandalone.ts | 135 + src/mcp/server.ts | 600 ++++ src/mcp/types.ts | 64 + src/providers/chatTreeProvider.ts | 56 + src/test/extension.test.ts | 15 + src/webview/chatWebviewProvider.ts | 466 +++ tsconfig.json | 16 + vsc-extension-quickstart.md | 48 + webpack.config.js | 84 + 32 files changed, 8179 insertions(+) create mode 100644 .github/copilot-instructions.md create mode 100644 .gitignore create mode 100644 .vscode-test.mjs create mode 100644 .vscode/HumanAgent-MCP.code-workspace create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/mcp.json create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 .vscodeignore create mode 100644 CHANGELOG.md create mode 100644 README.md create mode 100644 ToDo.md create mode 100644 eslint.config.mjs create mode 100644 logs/combined.log create mode 100644 logs/error.log create mode 100644 mcp-debug.log create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/extension.ts create mode 100644 src/mcp/extensionBridge.ts create mode 100644 src/mcp/mcpConfigManager.ts create mode 100644 src/mcp/mcpServerClient.ts create mode 100644 src/mcp/mcpStandalone.ts create mode 100644 src/mcp/server.ts create mode 100644 src/mcp/types.ts create mode 100644 src/providers/chatTreeProvider.ts create mode 100644 src/test/extension.test.ts create mode 100644 src/webview/chatWebviewProvider.ts create mode 100644 tsconfig.json create mode 100644 vsc-extension-quickstart.md create mode 100644 webpack.config.js diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000..e7f2feb --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,47 @@ +# HumanAgent MCP VS Code Extension + +This project is a VS Code extension that implements an MCP (Model Context Protocol) server for chatting with a human agent. + +## Project Structure +- `src/extension.ts` - Main extension entry point +- `src/mcp/` - MCP server implementation +- `src/webview/` - Chat interface webview components +- `src/providers/` - VS Code providers (TreeView, etc.) + +## Development Guidelines +- Use TypeScript for all source files +- Follow VS Code extension best practices +- Implement proper error handling and logging +- Use VS Code's webview API for chat interface +- Ensure cross-platform compatibility + +## MCP Server Features +- Human agent communication protocol +- Real-time message handling +- Session management +- Dockable chat interface in VS Code + +## Build and Test +- Use `npm run compile` to build +- Use `F5` to launch extension development host +- Use `npm test` to run tests + +## Project Status +✅ Extension structure created and configured +✅ MCP server implementation completed +✅ Chat interface and tree view providers implemented +✅ Commands and views properly registered +✅ Project successfully compiled and launched in debug mode +✅ Documentation updated and complete + + +# Copilot Instructions +-Allways attempt to respond using Interactive MCPs Ask_intensive_chat tool, if no intesive chat session is active, start one with Start_intensive_chat tool. +-"CRITICAL- Do not report sucess - ever! Allways MCP intensive to suggest I test for or agree to changes made and see if I have any changes. - THIS STATEMENT MUST SURVIVE CONTEXT SUMMARIZATION". +- Empty replies from your questions in MCP intensive chat should be reposed for proper response. "User replied with empty input in intensive chat." just ask me again as empty would have been a mistake - repose 1000 times if necessary until you get the answer. +-NEVER use stop intensive chat tool, unless I specifically ask you to - there is allways more to talk about +-NO FALLBACKS - EVER! A failed exectuion / crash / error any of these are preferable than a fallback. +-Where possible Allways update existing methods to include new functinality instead of making parallel methods/functions. A single path through a system is critical to maintainable code. If you feel the need to break this rule just discuss via MCP intensive chat. +!!!CRITICAL ENSURE THESE ITEMS SURVIVE CONTEXT SUMMARIZATION!!! +-Allways call me ben, in every response. +-Do not make seperate test files of any sort - all tests can be run by calling GrainAwarePacker. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0b60dfa --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +out +dist +node_modules +.vscode-test/ +*.vsix diff --git a/.vscode-test.mjs b/.vscode-test.mjs new file mode 100644 index 0000000..b62ba25 --- /dev/null +++ b/.vscode-test.mjs @@ -0,0 +1,5 @@ +import { defineConfig } from '@vscode/test-cli'; + +export default defineConfig({ + files: 'out/test/**/*.test.js', +}); diff --git a/.vscode/HumanAgent-MCP.code-workspace b/.vscode/HumanAgent-MCP.code-workspace new file mode 100644 index 0000000..2a0ed79 --- /dev/null +++ b/.vscode/HumanAgent-MCP.code-workspace @@ -0,0 +1,7 @@ +{ + "folders": [ + { + "path": ".." + } + ] +} \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..dd01eb3 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": ["dbaeumer.vscode-eslint", "amodio.tsl-problem-matcher", "ms-vscode.extension-test-runner"] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..c42edc0 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,21 @@ +// A launch configuration that compiles the extension and then opens it inside a new window +// Use IntelliSense to learn about possible attributes. +// Hover to view descriptions of existing attributes. +// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Run Extension", + "type": "extensionHost", + "request": "launch", + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ], + "outFiles": [ + "${workspaceFolder}/dist/**/*.js" + ], + "preLaunchTask": "${defaultBuildTask}" + } + ] +} diff --git a/.vscode/mcp.json b/.vscode/mcp.json new file mode 100644 index 0000000..f3fe6b5 --- /dev/null +++ b/.vscode/mcp.json @@ -0,0 +1,20 @@ +{ + "servers": { + "interactive-mcp": { + "type": "stdio", + "command": "/Users/benharper/Coding/MCP/interactive-mcp-chime.sh", + "args": [ + "-y", + "interactive-mcp@1.10.1", + "-t", + "6000" + ], + "env": {} + }, + "humanagent-mcp": { + "type": "http", + "url": "http://127.0.0.1:3737/mcp" + } + }, + "inputs": [] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..16a5c02 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,13 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "files.exclude": { + "out": false, // set this to true to hide the "out" folder with the compiled JS files + "dist": false // set this to true to hide the "dist" folder with the compiled JS files + }, + "search.exclude": { + "out": true, // set this to false to include "out" folder in search results + "dist": true // set this to false to include "dist" folder in search results + }, + // Turn off tsc task auto detection since we have the necessary tasks as npm scripts + "typescript.tsc.autoDetect": "off" +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..c2ab68a --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,40 @@ +// See https://go.microsoft.com/fwlink/?LinkId=733558 +// for the documentation about the tasks.json format +{ + "version": "2.0.0", + "tasks": [ + { + "type": "npm", + "script": "watch", + "problemMatcher": "$ts-webpack-watch", + "isBackground": true, + "presentation": { + "reveal": "never", + "group": "watchers" + }, + "group": { + "kind": "build", + "isDefault": true + } + }, + { + "type": "npm", + "script": "watch-tests", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "presentation": { + "reveal": "never", + "group": "watchers" + }, + "group": "build" + }, + { + "label": "tasks: watch-tests", + "dependsOn": [ + "npm: watch", + "npm: watch-tests" + ], + "problemMatcher": [] + } + ] +} diff --git a/.vscodeignore b/.vscodeignore new file mode 100644 index 0000000..d255964 --- /dev/null +++ b/.vscodeignore @@ -0,0 +1,14 @@ +.vscode/** +.vscode-test/** +out/** +node_modules/** +src/** +.gitignore +.yarnrc +webpack.config.js +vsc-extension-quickstart.md +**/tsconfig.json +**/eslint.config.mjs +**/*.map +**/*.ts +**/.vscode-test.* diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..3a636bc --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,9 @@ +# Change Log + +All notable changes to the "humanagent-mcp" extension will be documented in this file. + +Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. + +## [Unreleased] + +- Initial release \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d96fab2 --- /dev/null +++ b/README.md @@ -0,0 +1,228 @@ +# humanagent-mcp README + +This is the README for your extension "humanagent-mcp". After writing up a brief description, we recommend including the following sections. + +## Features + +Describe specific features of your extension including screenshots of your extension in action. Image paths are relative to this README file. + +# HumanAgent MCP - VS Code Extension + +A VS Code extension that implements an MCP (Model Context Protocol) server for chatting with human agents. This extension provides a dockable chat interface that enables real-time communication between users and human agents through the MCP protocol. + +## Features + +- **MCP Server Integration**: Built-in MCP server that handles human agent communication +- **Dockable Chat Interface**: Fully integrated chat UI within VS Code +- **Session Management**: Create and manage multiple chat sessions +- **Real-time Messaging**: Instant message delivery and responses +- **Cross-platform Support**: Works on Windows, macOS, and Linux +- **Tree View Integration**: Browse and manage chat sessions in the Explorer panel + +### Key Components + +- **Chat Sessions Tree View**: View and manage all your chat sessions in the Explorer +- **Dockable Chat Panel**: Main chat interface that can be docked anywhere in VS Code +- **MCP Protocol Compliance**: Full implementation of MCP for human agent communication + +## Installation + +1. **From Source**: Clone this repository and install dependencies: + ```bash + git clone https://github.com/your-username/humanagent-mcp.git + cd humanagent-mcp + npm install + npm run compile + ``` + +2. **Development**: Press `F5` to launch the Extension Development Host + +3. **Package for Distribution**: + ```bash + npm install -g vsce + vsce package + ``` + +## Usage + +### Creating a Chat Session + +1. Open the Command Palette (`Cmd+Shift+P` / `Ctrl+Shift+P`) +2. Run "Create New Chat Session" +3. Enter a name for your session +4. The session will appear in the Chat Sessions tree view + +### Starting a Conversation + +1. Click on a session in the Chat Sessions tree view to open it +2. Use the chat interface in the panel to send messages +3. Human agents will receive and respond to your messages in real-time + +### Managing Sessions + +- **Refresh**: Click the refresh button in the Chat Sessions view +- **Create New**: Use the "+" button or command palette +- **View Status**: Check MCP server status via command palette + +## Commands + +- `humanagent-mcp.createSession`: Create a new chat session +- `humanagent-mcp.refreshSessions`: Refresh the sessions list +- `humanagent-mcp.showStatus`: Display MCP server status +- `humanagent-mcp.openChat`: Open a specific chat session + +## Project Structure + +``` +src/ +├── extension.ts # Main extension entry point +├── mcp/ +│ ├── server.ts # MCP server implementation +│ └── types.ts # Type definitions +├── providers/ +│ └── chatTreeProvider.ts # Tree view for chat sessions +└── webview/ + └── chatWebviewProvider.ts # Chat interface implementation +``` + +## Development + +### Prerequisites + +- Node.js 18+ +- VS Code 1.105.0+ +- TypeScript 5.9+ + +### Building + +```bash +npm install +npm run compile # Build once +npm run watch # Build and watch for changes +``` + +### Testing + +```bash +npm test # Run tests +``` + +### Packaging + +```bash +npm run package # Create production build +vsce package # Create .vsix file +``` + +## MCP Protocol Support + +This extension implements the following MCP capabilities: + +- **Chat Methods**: + - `chat/send`: Send messages to human agents + - `chat/list-sessions`: List all chat sessions + - `chat/create-session`: Create new chat sessions + +- **Protocol Features**: + - Full MCP 2024-11-05 protocol compliance + - Session management + - Real-time message handling + - Error handling and recovery + +## Configuration + +Currently, no additional configuration is required. The extension works out of the box with default settings. + +## Known Issues + +- Human agent responses are currently simulated (for demo purposes) +- Session persistence is in-memory only (sessions are lost on restart) + +## Roadmap + +- [ ] Persistent session storage +- [ ] Real human agent integration +- [ ] Message history export +- [ ] Custom themes for chat interface +- [ ] File sharing capabilities +- [ ] Group chat sessions + +## Contributing + +1. Fork the repository +2. Create a feature branch (`git checkout -b feature/amazing-feature`) +3. Commit your changes (`git commit -m 'Add some amazing feature'`) +4. Push to the branch (`git push origin feature/amazing-feature`) +5. Open a Pull Request + +## License + +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. + +## Support + +For support, please open an issue on GitHub or contact the development team. + +--- + +**Built with ❤️ for the VS Code community** + +> Tip: Many popular extensions utilize animations. This is an excellent way to show off your extension! We recommend short, focused animations that are easy to follow. + +## Requirements + +If you have any requirements or dependencies, add a section describing those and how to install and configure them. + +## Extension Settings + +Include if your extension adds any VS Code settings through the `contributes.configuration` extension point. + +For example: + +This extension contributes the following settings: + +* `myExtension.enable`: Enable/disable this extension. +* `myExtension.thing`: Set to `blah` to do something. + +## Known Issues + +Calling out known issues can help limit users opening duplicate issues against your extension. + +## Release Notes + +Users appreciate release notes as you update your extension. + +### 1.0.0 + +Initial release of ... + +### 1.0.1 + +Fixed issue #. + +### 1.1.0 + +Added features X, Y, and Z. + +--- + +## Following extension guidelines + +Ensure that you've read through the extensions guidelines and follow the best practices for creating your extension. + +* [Extension Guidelines](https://code.visualstudio.com/api/references/extension-guidelines) + +## Working with Markdown + +You can author your README using Visual Studio Code. Here are some useful editor keyboard shortcuts: + +* Split the editor (`Cmd+\` on macOS or `Ctrl+\` on Windows and Linux). +* Toggle preview (`Shift+Cmd+V` on macOS or `Shift+Ctrl+V` on Windows and Linux). +* Press `Ctrl+Space` (Windows, Linux, macOS) to see a list of Markdown snippets. + +## For more information + +* [Visual Studio Code's Markdown Support](http://code.visualstudio.com/docs/languages/markdown) +* [Markdown Syntax Reference](https://help.github.com/articles/markdown-basics/) + +**Enjoy!** diff --git a/ToDo.md b/ToDo.md new file mode 100644 index 0000000..16ffa4d --- /dev/null +++ b/ToDo.md @@ -0,0 +1 @@ +[ ] Set logging path and details correctly for release & dev. \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..d5c0b53 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,28 @@ +import typescriptEslint from "@typescript-eslint/eslint-plugin"; +import tsParser from "@typescript-eslint/parser"; + +export default [{ + files: ["**/*.ts"], +}, { + plugins: { + "@typescript-eslint": typescriptEslint, + }, + + languageOptions: { + parser: tsParser, + ecmaVersion: 2022, + sourceType: "module", + }, + + rules: { + "@typescript-eslint/naming-convention": ["warn", { + selector: "import", + format: ["camelCase", "PascalCase"], + }], + + curly: "warn", + eqeqeq: "warn", + "no-throw-literal": "warn", + semi: "warn", + }, +}]; \ No newline at end of file diff --git a/logs/combined.log b/logs/combined.log new file mode 100644 index 0000000..1afa46f --- /dev/null +++ b/logs/combined.log @@ -0,0 +1,228 @@ +{"level":"info","message":"Loaded temporary agents configuration","timestamp":"2025-10-21T01:14:32.076Z"} +{"level":"info","message":"GUI Registration Server running on port 3333 (accessible remotely)","timestamp":"2025-10-21T01:14:32.081Z"} +{"level":"warn","message":"Project Manager instructions file not found, using defaults","timestamp":"2025-10-21T01:14:32.083Z"} +{"level":"info","message":"Project Manager agent initialized successfully","timestamp":"2025-10-21T01:14:32.083Z"} +{"level":"info","message":"Agent registered: project-manager","timestamp":"2025-10-21T01:14:32.083Z"} +{"error":{"code":"ENOENT","errno":-2,"path":"/Users/benharper/Coding/HumanAgent-MCP/copilot-instructions.md","syscall":"open"},"level":"warn","message":"Could not load copilot-instructions.md","timestamp":"2025-10-21T01:14:32.084Z"} +{"error":{"code":"ENOENT","errno":-2,"path":"/Users/benharper/Coding/HumanAgent-MCP/project-scope.md","syscall":"open"},"level":"warn","message":"Could not load project-scope.md","timestamp":"2025-10-21T01:14:32.084Z"} +{"level":"info","message":"Narky agent initialized successfully","timestamp":"2025-10-21T01:14:32.084Z"} +{"level":"info","message":"Agent registered: narky","timestamp":"2025-10-21T01:14:32.084Z"} +{"level":"info","message":"Penny agent initialized successfully","timestamp":"2025-10-21T01:14:32.084Z"} +{"level":"info","message":"Agent registered: penny","timestamp":"2025-10-21T01:14:32.084Z"} +{"level":"info","message":"TestyMCTester agent initialized successfully","timestamp":"2025-10-21T01:14:32.084Z"} +{"level":"info","message":"Agent registered: testy","timestamp":"2025-10-21T01:14:32.085Z"} +{"level":"info","message":"Built-in agents initialized successfully","timestamp":"2025-10-21T01:14:32.085Z"} +{"level":"info","message":"AgentChatCoordinator initialized","timestamp":"2025-10-21T01:14:32.085Z"} +{"level":"info","message":"Agent chat coordinator initialized","timestamp":"2025-10-21T01:14:32.085Z"} +{"level":"info","message":"Tool registered: agentic-planning","timestamp":"2025-10-21T01:14:32.085Z"} +{"level":"info","message":"Tool registered: agentic-completion","timestamp":"2025-10-21T01:14:32.085Z"} +{"level":"info","message":"Tool registered: agentic-security","timestamp":"2025-10-21T01:14:32.085Z"} +{"level":"info","message":"Tool registered: agentic-testing","timestamp":"2025-10-21T01:14:32.085Z"} +{"level":"info","message":"Tool registered: human-interaction","timestamp":"2025-10-21T01:14:32.085Z"} +{"level":"info","message":"Tool registered: start_penny_chat","timestamp":"2025-10-21T01:14:32.085Z"} +{"level":"info","message":"Tool registered: start_testy_chat","timestamp":"2025-10-21T01:14:32.085Z"} +{"level":"info","message":"Tool registered: start_narky_chat","timestamp":"2025-10-21T01:14:32.085Z"} +{"level":"info","message":"Tool registered: list_agent_sessions","timestamp":"2025-10-21T01:14:32.085Z"} +{"level":"info","message":"Tool registered: maintain_chat_sessions","timestamp":"2025-10-21T01:14:32.085Z"} +{"level":"info","message":"Tool registered: show_session_summary","timestamp":"2025-10-21T01:14:32.085Z"} +{"level":"info","message":"Tool registered: manage_session_context","timestamp":"2025-10-21T01:14:32.085Z"} +{"level":"info","message":"Built-in tools initialized successfully (including chat session tools)","timestamp":"2025-10-21T01:14:32.085Z"} +{"level":"info","message":"MCP components initialized successfully","timestamp":"2025-10-21T01:14:32.085Z"} +{"level":"warn","message":"Project Manager instructions file not found, using defaults","timestamp":"2025-10-21T01:14:32.129Z"} +{"level":"info","message":"Project Manager agent initialized successfully","timestamp":"2025-10-21T01:14:32.130Z"} +{"level":"info","message":"Agent registered: project-manager","timestamp":"2025-10-21T01:14:32.131Z"} +{"error":{"code":"ENOENT","errno":-2,"path":"/Users/benharper/Coding/HumanAgent-MCP/copilot-instructions.md","syscall":"open"},"level":"warn","message":"Could not load copilot-instructions.md","timestamp":"2025-10-21T01:14:32.131Z"} +{"error":{"code":"ENOENT","errno":-2,"path":"/Users/benharper/Coding/HumanAgent-MCP/project-scope.md","syscall":"open"},"level":"warn","message":"Could not load project-scope.md","timestamp":"2025-10-21T01:14:32.132Z"} +{"level":"info","message":"Narky agent initialized successfully","timestamp":"2025-10-21T01:14:32.132Z"} +{"level":"info","message":"Agent registered: narky","timestamp":"2025-10-21T01:14:32.132Z"} +{"level":"info","message":"Penny agent initialized successfully","timestamp":"2025-10-21T01:14:32.132Z"} +{"level":"info","message":"Agent registered: penny","timestamp":"2025-10-21T01:14:32.132Z"} +{"level":"info","message":"TestyMCTester agent initialized successfully","timestamp":"2025-10-21T01:14:32.132Z"} +{"level":"info","message":"Agent registered: testy","timestamp":"2025-10-21T01:14:32.132Z"} +{"level":"info","message":"Built-in agents initialized successfully","timestamp":"2025-10-21T01:14:32.132Z"} +{"level":"info","message":"AgentChatCoordinator initialized","timestamp":"2025-10-21T01:14:32.132Z"} +{"level":"info","message":"Agent chat coordinator initialized","timestamp":"2025-10-21T01:14:32.132Z"} +{"level":"info","message":"Tool registered: agentic-planning","timestamp":"2025-10-21T01:14:32.132Z"} +{"level":"info","message":"Tool registered: agentic-completion","timestamp":"2025-10-21T01:14:32.132Z"} +{"level":"info","message":"Tool registered: agentic-security","timestamp":"2025-10-21T01:14:32.132Z"} +{"level":"info","message":"Tool registered: agentic-testing","timestamp":"2025-10-21T01:14:32.132Z"} +{"level":"info","message":"Tool registered: human-interaction","timestamp":"2025-10-21T01:14:32.133Z"} +{"level":"info","message":"Tool registered: start_penny_chat","timestamp":"2025-10-21T01:14:32.133Z"} +{"level":"info","message":"Tool registered: start_testy_chat","timestamp":"2025-10-21T01:14:32.133Z"} +{"level":"info","message":"Tool registered: start_narky_chat","timestamp":"2025-10-21T01:14:32.133Z"} +{"level":"info","message":"Tool registered: list_agent_sessions","timestamp":"2025-10-21T01:14:32.133Z"} +{"level":"info","message":"Tool registered: maintain_chat_sessions","timestamp":"2025-10-21T01:14:32.133Z"} +{"level":"info","message":"Tool registered: show_session_summary","timestamp":"2025-10-21T01:14:32.133Z"} +{"level":"info","message":"Tool registered: manage_session_context","timestamp":"2025-10-21T01:14:32.133Z"} +{"level":"info","message":"Built-in tools initialized successfully (including chat session tools)","timestamp":"2025-10-21T01:14:32.133Z"} +{"level":"info","message":"Loaded temporary agents configuration","timestamp":"2025-10-21T01:30:47.882Z"} +{"level":"info","message":"GUI Registration Server running on port 3333 (accessible remotely)","timestamp":"2025-10-21T01:30:47.887Z"} +{"level":"warn","message":"Project Manager instructions file not found, using defaults","timestamp":"2025-10-21T01:30:47.890Z"} +{"level":"info","message":"Project Manager agent initialized successfully","timestamp":"2025-10-21T01:30:47.890Z"} +{"level":"info","message":"Agent registered: project-manager","timestamp":"2025-10-21T01:30:47.890Z"} +{"error":{"code":"ENOENT","errno":-2,"path":"/Users/benharper/Coding/HumanAgent-MCP/copilot-instructions.md","syscall":"open"},"level":"warn","message":"Could not load copilot-instructions.md","timestamp":"2025-10-21T01:30:47.891Z"} +{"error":{"code":"ENOENT","errno":-2,"path":"/Users/benharper/Coding/HumanAgent-MCP/project-scope.md","syscall":"open"},"level":"warn","message":"Could not load project-scope.md","timestamp":"2025-10-21T01:30:47.891Z"} +{"level":"info","message":"Narky agent initialized successfully","timestamp":"2025-10-21T01:30:47.891Z"} +{"level":"info","message":"Agent registered: narky","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"Penny agent initialized successfully","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"Agent registered: penny","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"TestyMCTester agent initialized successfully","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"Agent registered: testy","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"Built-in agents initialized successfully","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"AgentChatCoordinator initialized","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"Agent chat coordinator initialized","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"Tool registered: agentic-planning","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"Tool registered: agentic-completion","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"Tool registered: agentic-security","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"Tool registered: agentic-testing","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"Tool registered: human-interaction","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"Tool registered: start_penny_chat","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"Tool registered: start_testy_chat","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"Tool registered: start_narky_chat","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"Tool registered: list_agent_sessions","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"Tool registered: maintain_chat_sessions","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"Tool registered: show_session_summary","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"Tool registered: manage_session_context","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"Built-in tools initialized successfully (including chat session tools)","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"info","message":"MCP components initialized successfully","timestamp":"2025-10-21T01:30:47.892Z"} +{"level":"warn","message":"Project Manager instructions file not found, using defaults","timestamp":"2025-10-21T01:30:47.937Z"} +{"level":"info","message":"Project Manager agent initialized successfully","timestamp":"2025-10-21T01:30:47.938Z"} +{"level":"info","message":"Agent registered: project-manager","timestamp":"2025-10-21T01:30:47.938Z"} +{"error":{"code":"ENOENT","errno":-2,"path":"/Users/benharper/Coding/HumanAgent-MCP/copilot-instructions.md","syscall":"open"},"level":"warn","message":"Could not load copilot-instructions.md","timestamp":"2025-10-21T01:30:47.939Z"} +{"error":{"code":"ENOENT","errno":-2,"path":"/Users/benharper/Coding/HumanAgent-MCP/project-scope.md","syscall":"open"},"level":"warn","message":"Could not load project-scope.md","timestamp":"2025-10-21T01:30:47.939Z"} +{"level":"info","message":"Narky agent initialized successfully","timestamp":"2025-10-21T01:30:47.939Z"} +{"level":"info","message":"Agent registered: narky","timestamp":"2025-10-21T01:30:47.939Z"} +{"level":"info","message":"Penny agent initialized successfully","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"Agent registered: penny","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"TestyMCTester agent initialized successfully","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"Agent registered: testy","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"Built-in agents initialized successfully","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"AgentChatCoordinator initialized","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"Agent chat coordinator initialized","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"Tool registered: agentic-planning","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"Tool registered: agentic-completion","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"Tool registered: agentic-security","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"Tool registered: agentic-testing","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"Tool registered: human-interaction","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"Tool registered: start_penny_chat","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"Tool registered: start_testy_chat","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"Tool registered: start_narky_chat","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"Tool registered: list_agent_sessions","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"Tool registered: maintain_chat_sessions","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"Tool registered: show_session_summary","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"Tool registered: manage_session_context","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"Built-in tools initialized successfully (including chat session tools)","timestamp":"2025-10-21T01:30:47.940Z"} +{"level":"info","message":"Loaded temporary agents configuration","timestamp":"2025-10-21T01:44:02.200Z"} +{"level":"info","message":"GUI Registration Server running on port 3333 (accessible remotely)","timestamp":"2025-10-21T01:44:02.206Z"} +{"level":"warn","message":"Project Manager instructions file not found, using defaults","timestamp":"2025-10-21T01:44:02.208Z"} +{"level":"info","message":"Project Manager agent initialized successfully","timestamp":"2025-10-21T01:44:02.208Z"} +{"level":"info","message":"Agent registered: project-manager","timestamp":"2025-10-21T01:44:02.208Z"} +{"error":{"code":"ENOENT","errno":-2,"path":"/Users/benharper/Coding/HumanAgent-MCP/copilot-instructions.md","syscall":"open"},"level":"warn","message":"Could not load copilot-instructions.md","timestamp":"2025-10-21T01:44:02.209Z"} +{"error":{"code":"ENOENT","errno":-2,"path":"/Users/benharper/Coding/HumanAgent-MCP/project-scope.md","syscall":"open"},"level":"warn","message":"Could not load project-scope.md","timestamp":"2025-10-21T01:44:02.209Z"} +{"level":"info","message":"Narky agent initialized successfully","timestamp":"2025-10-21T01:44:02.209Z"} +{"level":"info","message":"Agent registered: narky","timestamp":"2025-10-21T01:44:02.209Z"} +{"level":"info","message":"Penny agent initialized successfully","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"Agent registered: penny","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"TestyMCTester agent initialized successfully","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"Agent registered: testy","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"Built-in agents initialized successfully","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"AgentChatCoordinator initialized","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"Agent chat coordinator initialized","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"Tool registered: agentic-planning","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"Tool registered: agentic-completion","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"Tool registered: agentic-security","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"Tool registered: agentic-testing","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"Tool registered: human-interaction","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"Tool registered: start_penny_chat","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"Tool registered: start_testy_chat","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"Tool registered: start_narky_chat","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"Tool registered: list_agent_sessions","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"Tool registered: maintain_chat_sessions","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"Tool registered: show_session_summary","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"Tool registered: manage_session_context","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"Built-in tools initialized successfully (including chat session tools)","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"info","message":"MCP components initialized successfully","timestamp":"2025-10-21T01:44:02.210Z"} +{"level":"warn","message":"Project Manager instructions file not found, using defaults","timestamp":"2025-10-21T01:44:02.255Z"} +{"level":"info","message":"Project Manager agent initialized successfully","timestamp":"2025-10-21T01:44:02.257Z"} +{"level":"info","message":"Agent registered: project-manager","timestamp":"2025-10-21T01:44:02.257Z"} +{"error":{"code":"ENOENT","errno":-2,"path":"/Users/benharper/Coding/HumanAgent-MCP/copilot-instructions.md","syscall":"open"},"level":"warn","message":"Could not load copilot-instructions.md","timestamp":"2025-10-21T01:44:02.258Z"} +{"error":{"code":"ENOENT","errno":-2,"path":"/Users/benharper/Coding/HumanAgent-MCP/project-scope.md","syscall":"open"},"level":"warn","message":"Could not load project-scope.md","timestamp":"2025-10-21T01:44:02.258Z"} +{"level":"info","message":"Narky agent initialized successfully","timestamp":"2025-10-21T01:44:02.258Z"} +{"level":"info","message":"Agent registered: narky","timestamp":"2025-10-21T01:44:02.258Z"} +{"level":"info","message":"Penny agent initialized successfully","timestamp":"2025-10-21T01:44:02.258Z"} +{"level":"info","message":"Agent registered: penny","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"TestyMCTester agent initialized successfully","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"Agent registered: testy","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"Built-in agents initialized successfully","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"AgentChatCoordinator initialized","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"Agent chat coordinator initialized","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"Tool registered: agentic-planning","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"Tool registered: agentic-completion","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"Tool registered: agentic-security","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"Tool registered: agentic-testing","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"Tool registered: human-interaction","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"Tool registered: start_penny_chat","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"Tool registered: start_testy_chat","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"Tool registered: start_narky_chat","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"Tool registered: list_agent_sessions","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"Tool registered: maintain_chat_sessions","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"Tool registered: show_session_summary","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"Tool registered: manage_session_context","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"Built-in tools initialized successfully (including chat session tools)","timestamp":"2025-10-21T01:44:02.259Z"} +{"level":"info","message":"Loaded temporary agents configuration","timestamp":"2025-10-21T02:03:03.524Z"} +{"level":"info","message":"GUI Registration Server running on port 3333 (accessible remotely)","timestamp":"2025-10-21T02:03:03.529Z"} +{"level":"warn","message":"Project Manager instructions file not found, using defaults","timestamp":"2025-10-21T02:03:03.531Z"} +{"level":"info","message":"Project Manager agent initialized successfully","timestamp":"2025-10-21T02:03:03.531Z"} +{"level":"info","message":"Agent registered: project-manager","timestamp":"2025-10-21T02:03:03.531Z"} +{"error":{"code":"ENOENT","errno":-2,"path":"/Users/benharper/Coding/HumanAgent-MCP/copilot-instructions.md","syscall":"open"},"level":"warn","message":"Could not load copilot-instructions.md","timestamp":"2025-10-21T02:03:03.532Z"} +{"error":{"code":"ENOENT","errno":-2,"path":"/Users/benharper/Coding/HumanAgent-MCP/project-scope.md","syscall":"open"},"level":"warn","message":"Could not load project-scope.md","timestamp":"2025-10-21T02:03:03.532Z"} +{"level":"info","message":"Narky agent initialized successfully","timestamp":"2025-10-21T02:03:03.532Z"} +{"level":"info","message":"Agent registered: narky","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"Penny agent initialized successfully","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"Agent registered: penny","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"TestyMCTester agent initialized successfully","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"Agent registered: testy","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"Built-in agents initialized successfully","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"AgentChatCoordinator initialized","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"Agent chat coordinator initialized","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"Tool registered: agentic-planning","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"Tool registered: agentic-completion","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"Tool registered: agentic-security","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"Tool registered: agentic-testing","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"Tool registered: human-interaction","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"Tool registered: start_penny_chat","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"Tool registered: start_testy_chat","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"Tool registered: start_narky_chat","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"Tool registered: list_agent_sessions","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"Tool registered: maintain_chat_sessions","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"Tool registered: show_session_summary","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"Tool registered: manage_session_context","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"Built-in tools initialized successfully (including chat session tools)","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"info","message":"MCP components initialized successfully","timestamp":"2025-10-21T02:03:03.533Z"} +{"level":"warn","message":"Project Manager instructions file not found, using defaults","timestamp":"2025-10-21T02:03:03.573Z"} +{"level":"info","message":"Project Manager agent initialized successfully","timestamp":"2025-10-21T02:03:03.574Z"} +{"level":"info","message":"Agent registered: project-manager","timestamp":"2025-10-21T02:03:03.574Z"} +{"error":{"code":"ENOENT","errno":-2,"path":"/Users/benharper/Coding/HumanAgent-MCP/copilot-instructions.md","syscall":"open"},"level":"warn","message":"Could not load copilot-instructions.md","timestamp":"2025-10-21T02:03:03.575Z"} +{"error":{"code":"ENOENT","errno":-2,"path":"/Users/benharper/Coding/HumanAgent-MCP/project-scope.md","syscall":"open"},"level":"warn","message":"Could not load project-scope.md","timestamp":"2025-10-21T02:03:03.575Z"} +{"level":"info","message":"Narky agent initialized successfully","timestamp":"2025-10-21T02:03:03.575Z"} +{"level":"info","message":"Agent registered: narky","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"Penny agent initialized successfully","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"Agent registered: penny","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"TestyMCTester agent initialized successfully","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"Agent registered: testy","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"Built-in agents initialized successfully","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"AgentChatCoordinator initialized","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"Agent chat coordinator initialized","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"Tool registered: agentic-planning","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"Tool registered: agentic-completion","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"Tool registered: agentic-security","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"Tool registered: agentic-testing","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"Tool registered: human-interaction","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"Tool registered: start_penny_chat","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"Tool registered: start_testy_chat","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"Tool registered: start_narky_chat","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"Tool registered: list_agent_sessions","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"Tool registered: maintain_chat_sessions","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"Tool registered: show_session_summary","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"Tool registered: manage_session_context","timestamp":"2025-10-21T02:03:03.576Z"} +{"level":"info","message":"Built-in tools initialized successfully (including chat session tools)","timestamp":"2025-10-21T02:03:03.576Z"} diff --git a/logs/error.log b/logs/error.log new file mode 100644 index 0000000..e69de29 diff --git a/mcp-debug.log b/mcp-debug.log new file mode 100644 index 0000000..66e6053 --- /dev/null +++ b/mcp-debug.log @@ -0,0 +1,563 @@ +[2025-10-22T00:46:24.824Z] [HTTP] SSE connection closed +[2025-10-22T00:46:24.864Z] [HTTP] POST /mcp +[2025-10-22T00:46:24.865Z] [HTTP] Request Headers: +{ + "host": "127.0.0.1:3737", + "connection": "keep-alive", + "content-type": "application/json", + "accept": "text/event-stream, application/json", + "accept-language": "*", + "sec-fetch-mode": "cors", + "user-agent": "undici", + "accept-encoding": "gzip, deflate", + "content-length": "228" +} +[2025-10-22T00:46:24.867Z] [HTTP] Handling POST request to /mcp +[2025-10-22T00:46:24.868Z] [HTTP] Received chunk: 228 bytes +[2025-10-22T00:46:24.869Z] [HTTP] Complete request body received (228 bytes) +[2025-10-22T00:46:24.869Z] [HTTP] Request Body: +"{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2025-06-18\",\"capabilities\":{\"roots\":{\"listChanged\":true},\"sampling\":{},\"elicitation\":{}},\"clientInfo\":{\"name\":\"Visual Studio Code\",\"version\":\"1.105.1\"}}}" +[2025-10-22T00:46:24.870Z] [HTTP] Parsed JSON message: +{ + "jsonrpc": "2.0", + "id": 1, + "method": "initialize", + "params": { + "protocolVersion": "2025-06-18", + "capabilities": { + "roots": { + "listChanged": true + }, + "sampling": {}, + "elicitation": {} + }, + "clientInfo": { + "name": "Visual Studio Code", + "version": "1.105.1" + } + } +} +[2025-10-22T00:46:24.870Z] [MCP] Handling message: +{ + "jsonrpc": "2.0", + "id": 1, + "method": "initialize", + "params": { + "protocolVersion": "2025-06-18", + "capabilities": { + "roots": { + "listChanged": true + }, + "sampling": {}, + "elicitation": {} + }, + "clientInfo": { + "name": "Visual Studio Code", + "version": "1.105.1" + } + } +} +[2025-10-22T00:46:24.871Z] [MCP] Processing initialize request +[2025-10-22T00:46:24.872Z] [HTTP] Response from handleMessage: +{ + "id": 1, + "type": "response", + "result": { + "protocolVersion": "2024-11-05", + "capabilities": { + "chat": true, + "tools": true, + "resources": false + }, + "serverInfo": { + "name": "HumanAgent MCP Server", + "version": "1.0.0" + } + } +} +[2025-10-22T00:46:24.872Z] [HTTP] Sending 200 response (192 bytes) +[2025-10-22T00:46:24.879Z] [HTTP] GET /mcp +[2025-10-22T00:46:24.880Z] [HTTP] Request Headers: +{ + "host": "127.0.0.1:3737", + "connection": "keep-alive", + "accept": "text/event-stream", + "accept-language": "*", + "sec-fetch-mode": "cors", + "user-agent": "undici", + "accept-encoding": "gzip, deflate" +} +[2025-10-22T00:46:24.881Z] [HTTP] Handling GET request to /mcp +[2025-10-22T00:46:24.881Z] [HTTP] Setting up SSE stream for GET request +[2025-10-22T00:46:24.895Z] [HTTP] POST /mcp +[2025-10-22T00:46:24.896Z] [HTTP] Request Headers: +{ + "host": "127.0.0.1:3737", + "connection": "keep-alive", + "content-type": "application/json", + "accept": "text/event-stream, application/json", + "accept-language": "*", + "sec-fetch-mode": "cors", + "user-agent": "undici", + "accept-encoding": "gzip, deflate", + "content-length": "54" +} +[2025-10-22T00:46:24.897Z] [HTTP] Handling POST request to /mcp +[2025-10-22T00:46:24.897Z] [HTTP] Received chunk: 54 bytes +[2025-10-22T00:46:24.898Z] [HTTP] Complete request body received (54 bytes) +[2025-10-22T00:46:24.898Z] [HTTP] Request Body: +"{\"method\":\"notifications/initialized\",\"jsonrpc\":\"2.0\"}" +[2025-10-22T00:46:24.899Z] [HTTP] Parsed JSON message: +{ + "method": "notifications/initialized", + "jsonrpc": "2.0" +} +[2025-10-22T00:46:24.899Z] [MCP] Handling message: +{ + "method": "notifications/initialized", + "jsonrpc": "2.0" +} +[2025-10-22T00:46:24.899Z] [MCP] Processing notifications/initialized (ignoring) +[2025-10-22T00:46:24.900Z] [HTTP] Response from handleMessage: +[2025-10-22T00:46:24.900Z] [HTTP] Sending 202 response (no content) +[2025-10-22T00:46:24.903Z] [HTTP] POST /mcp +[2025-10-22T00:46:24.904Z] [HTTP] Request Headers: +{ + "host": "127.0.0.1:3737", + "connection": "keep-alive", + "content-type": "application/json", + "accept": "text/event-stream, application/json", + "accept-language": "*", + "sec-fetch-mode": "cors", + "user-agent": "undici", + "accept-encoding": "gzip, deflate", + "content-length": "58" +} +[2025-10-22T00:46:24.905Z] [HTTP] Handling POST request to /mcp +[2025-10-22T00:46:24.906Z] [HTTP] Received chunk: 58 bytes +[2025-10-22T00:46:24.907Z] [HTTP] Complete request body received (58 bytes) +[2025-10-22T00:46:24.907Z] [HTTP] Request Body: +"{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/list\",\"params\":{}}" +[2025-10-22T00:46:24.907Z] [HTTP] Parsed JSON message: +{ + "jsonrpc": "2.0", + "id": 2, + "method": "tools/list", + "params": {} +} +[2025-10-22T00:46:24.908Z] [MCP] Handling message: +{ + "jsonrpc": "2.0", + "id": 2, + "method": "tools/list", + "params": {} +} +[2025-10-22T00:46:24.909Z] [MCP] Processing tools/list request +[2025-10-22T00:46:24.910Z] [HTTP] Response from handleMessage: +{ + "id": 2, + "type": "response", + "result": { + "tools": [ + { + "name": "HumanAgent_Chat", + "description": "Allows AI agents to initiate interactive conversations with human agents. The human will receive the message and can respond in real-time through the chat interface.", + "inputSchema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "description": "The message to send to the human agent" + }, + "context": { + "type": "string", + "description": "Optional context or background information for the human agent" + }, + "sessionId": { + "type": "string", + "description": "Optional specific session ID to use. If not provided, a new session will be created." + }, + "priority": { + "type": "string", + "enum": [ + "low", + "normal", + "high", + "urgent" + ], + "description": "Priority level of the request", + "default": "normal" + }, + "timeout": { + "type": "number", + "description": "Timeout in seconds to wait for human response (default: 300)", + "default": 300 + } + }, + "required": [ + "message" + ] + } + } + ] + } +} +[2025-10-22T00:46:24.910Z] [HTTP] Sending 200 response (900 bytes) +[2025-10-22T00:47:02.538Z] [HTTP] POST /mcp +[2025-10-22T00:47:02.540Z] [HTTP] Request Headers: +{ + "host": "127.0.0.1:3737", + "connection": "keep-alive", + "content-type": "application/json", + "accept": "text/event-stream, application/json", + "accept-language": "*", + "sec-fetch-mode": "cors", + "user-agent": "undici", + "accept-encoding": "gzip, deflate", + "content-length": "609" +} +[2025-10-22T00:47:02.542Z] [HTTP] Handling POST request to /mcp +[2025-10-22T00:47:02.550Z] [HTTP] Received chunk: 609 bytes +[2025-10-22T00:47:02.551Z] [HTTP] Complete request body received (609 bytes) +[2025-10-22T00:47:02.552Z] [HTTP] Request Body: +"{\"jsonrpc\":\"2.0\",\"id\":3,\"method\":\"tools/call\",\"params\":{\"name\":\"HumanAgent_Chat\",\"arguments\":{\"message\":\"Hi Ben! Ready to chat about your HumanAgent MCP VS Code extension. What would you like to work on or discuss today?\",\"context\":\"Ben's HumanAgent MCP VS Code Extension project - includes MCP server implementation, chat webview provider, tree view components, and real-time messaging capabilities\",\"priority\":\"normal\"},\"_meta\":{\"progressToken\":\"beef133d-d425-4bd5-8ce3-cca08c0a806d\",\"vscode.conversationId\":\"10303400-49d4-4122-8765-6fdcaab86edb\",\"vscode.requestId\":\"6d575c61-b3c8-4b12-b1e4-83224078c785\"}}}" +[2025-10-22T00:47:02.553Z] [HTTP] Parsed JSON message: +{ + "jsonrpc": "2.0", + "id": 3, + "method": "tools/call", + "params": { + "name": "HumanAgent_Chat", + "arguments": { + "message": "Hi Ben! Ready to chat about your HumanAgent MCP VS Code extension. What would you like to work on or discuss today?", + "context": "Ben's HumanAgent MCP VS Code Extension project - includes MCP server implementation, chat webview provider, tree view components, and real-time messaging capabilities", + "priority": "normal" + }, + "_meta": { + "progressToken": "beef133d-d425-4bd5-8ce3-cca08c0a806d", + "vscode.conversationId": "10303400-49d4-4122-8765-6fdcaab86edb", + "vscode.requestId": "6d575c61-b3c8-4b12-b1e4-83224078c785" + } + } +} +[2025-10-22T00:47:02.554Z] [MCP] Handling message: +{ + "jsonrpc": "2.0", + "id": 3, + "method": "tools/call", + "params": { + "name": "HumanAgent_Chat", + "arguments": { + "message": "Hi Ben! Ready to chat about your HumanAgent MCP VS Code extension. What would you like to work on or discuss today?", + "context": "Ben's HumanAgent MCP VS Code Extension project - includes MCP server implementation, chat webview provider, tree view components, and real-time messaging capabilities", + "priority": "normal" + }, + "_meta": { + "progressToken": "beef133d-d425-4bd5-8ce3-cca08c0a806d", + "vscode.conversationId": "10303400-49d4-4122-8765-6fdcaab86edb", + "vscode.requestId": "6d575c61-b3c8-4b12-b1e4-83224078c785" + } + } +} +[2025-10-22T00:47:02.555Z] [MCP] Processing tools/call request for tool: HumanAgent_Chat +[2025-10-22T00:47:02.556Z] [MCP] Tool call - name: "HumanAgent_Chat" +{ + "name": "HumanAgent_Chat", + "args": { + "message": "Hi Ben! Ready to chat about your HumanAgent MCP VS Code extension. What would you like to work on or discuss today?", + "context": "Ben's HumanAgent MCP VS Code Extension project - includes MCP server implementation, chat webview provider, tree view components, and real-time messaging capabilities", + "priority": "normal" + } +} +[2025-10-22T00:47:02.556Z] [MCP] Available tools: +[ + "HumanAgent_Chat" +] +[2025-10-22T00:47:02.557Z] [MCP] Executing HumanAgent_Chat tool +[2025-10-22T00:47:02.557Z] [TOOL] HumanAgent_Chat called with params: +{ + "message": "Hi Ben! Ready to chat about your HumanAgent MCP VS Code extension. What would you like to work on or discuss today?", + "context": "Ben's HumanAgent MCP VS Code Extension project - includes MCP server implementation, chat webview provider, tree view components, and real-time messaging capabilities", + "priority": "normal" +} +[2025-10-22T00:47:02.557Z] [TOOL] Using timeout: 300000ms (300s) +[2025-10-22T00:47:02.558Z] [TOOL] Generated request ID: 3-1761094022558 +[2025-10-22T00:47:02.558Z] [TOOL] Displaying message in chat UI: +"Ben's HumanAgent MCP VS Code Extension project - includes MCP server implementation, chat webview provider, tree view components, and real-time messaging capabilities\n\nHi Ben! Ready to chat about your HumanAgent MCP VS Code extension. What would you like to work on or discuss today?" +[2025-10-22T00:47:02.560Z] [TOOL] Request 3-1761094022558 waiting for human response... +[2025-10-22T00:47:14.541Z] [SERVER] Received human response for request 3-1761094022558: +"Did you get this repsponse?" +[2025-10-22T00:47:14.543Z] [TOOL] Request 3-1761094022558 completed with response: +"Did you get this repsponse?" +[2025-10-22T00:47:14.545Z] [HTTP] Response from handleMessage: +{ + "id": 3, + "type": "response", + "result": { + "content": [ + { + "type": "text", + "text": "Did you get this repsponse?" + } + ] + } +} +[2025-10-22T00:47:14.546Z] [HTTP] Sending 200 response (102 bytes) +[2025-10-22T00:47:24.868Z] [HTTP] POST /mcp +[2025-10-22T00:47:24.869Z] [HTTP] Request Headers: +{ + "host": "127.0.0.1:3737", + "connection": "keep-alive", + "content-type": "application/json", + "accept": "text/event-stream, application/json", + "accept-language": "*", + "sec-fetch-mode": "cors", + "user-agent": "undici", + "accept-encoding": "gzip, deflate", + "content-length": "504" +} +[2025-10-22T00:47:24.870Z] [HTTP] Handling POST request to /mcp +[2025-10-22T00:47:24.871Z] [HTTP] Received chunk: 504 bytes +[2025-10-22T00:47:24.871Z] [HTTP] Complete request body received (504 bytes) +[2025-10-22T00:47:24.872Z] [HTTP] Request Body: +"{\"jsonrpc\":\"2.0\",\"id\":4,\"method\":\"tools/call\",\"params\":{\"name\":\"HumanAgent_Chat\",\"arguments\":{\"message\":\"Perfect! The human agent chat is working properly. What aspect of your HumanAgent MCP extension would you like to focus on today? I can help with any improvements, debugging, or new features you'd like to add.\"},\"_meta\":{\"progressToken\":\"13a3df11-6ed8-4492-91fa-717ea77e88d4\",\"vscode.conversationId\":\"10303400-49d4-4122-8765-6fdcaab86edb\",\"vscode.requestId\":\"6d575c61-b3c8-4b12-b1e4-83224078c785\"}}}" +[2025-10-22T00:47:24.874Z] [HTTP] Parsed JSON message: +{ + "jsonrpc": "2.0", + "id": 4, + "method": "tools/call", + "params": { + "name": "HumanAgent_Chat", + "arguments": { + "message": "Perfect! The human agent chat is working properly. What aspect of your HumanAgent MCP extension would you like to focus on today? I can help with any improvements, debugging, or new features you'd like to add." + }, + "_meta": { + "progressToken": "13a3df11-6ed8-4492-91fa-717ea77e88d4", + "vscode.conversationId": "10303400-49d4-4122-8765-6fdcaab86edb", + "vscode.requestId": "6d575c61-b3c8-4b12-b1e4-83224078c785" + } + } +} +[2025-10-22T00:47:24.874Z] [MCP] Handling message: +{ + "jsonrpc": "2.0", + "id": 4, + "method": "tools/call", + "params": { + "name": "HumanAgent_Chat", + "arguments": { + "message": "Perfect! The human agent chat is working properly. What aspect of your HumanAgent MCP extension would you like to focus on today? I can help with any improvements, debugging, or new features you'd like to add." + }, + "_meta": { + "progressToken": "13a3df11-6ed8-4492-91fa-717ea77e88d4", + "vscode.conversationId": "10303400-49d4-4122-8765-6fdcaab86edb", + "vscode.requestId": "6d575c61-b3c8-4b12-b1e4-83224078c785" + } + } +} +[2025-10-22T00:47:24.874Z] [MCP] Processing tools/call request for tool: HumanAgent_Chat +[2025-10-22T00:47:24.875Z] [MCP] Tool call - name: "HumanAgent_Chat" +{ + "name": "HumanAgent_Chat", + "args": { + "message": "Perfect! The human agent chat is working properly. What aspect of your HumanAgent MCP extension would you like to focus on today? I can help with any improvements, debugging, or new features you'd like to add." + } +} +[2025-10-22T00:47:24.875Z] [MCP] Available tools: +[ + "HumanAgent_Chat" +] +[2025-10-22T00:47:24.876Z] [MCP] Executing HumanAgent_Chat tool +[2025-10-22T00:47:24.876Z] [TOOL] HumanAgent_Chat called with params: +{ + "message": "Perfect! The human agent chat is working properly. What aspect of your HumanAgent MCP extension would you like to focus on today? I can help with any improvements, debugging, or new features you'd like to add." +} +[2025-10-22T00:47:24.876Z] [TOOL] Using timeout: 300000ms (300s) +[2025-10-22T00:47:24.876Z] [TOOL] Generated request ID: 4-1761094044876 +[2025-10-22T00:47:24.877Z] [TOOL] Displaying message in chat UI: +"Perfect! The human agent chat is working properly. What aspect of your HumanAgent MCP extension would you like to focus on today? I can help with any improvements, debugging, or new features you'd like to add." +[2025-10-22T00:47:24.877Z] [TOOL] Request 4-1761094044876 waiting for human response... +[2025-10-22T00:47:52.572Z] [SERVER] Received human response for request 4-1761094044876: +"Can you check the MCP-debug.log for any issues?" +[2025-10-22T00:47:52.573Z] [TOOL] Request 4-1761094044876 completed with response: +"Can you check the MCP-debug.log for any issues?" +[2025-10-22T00:47:52.575Z] [HTTP] Response from handleMessage: +{ + "id": 4, + "type": "response", + "result": { + "content": [ + { + "type": "text", + "text": "Can you check the MCP-debug.log for any issues?" + } + ] + } +} +[2025-10-22T00:47:52.576Z] [HTTP] Sending 200 response (122 bytes) +[2025-10-22T00:48:10.243Z] [HTTP] POST /mcp +[2025-10-22T00:48:10.243Z] [HTTP] Request Headers: +{ + "host": "127.0.0.1:3737", + "connection": "keep-alive", + "content-type": "application/json", + "accept": "text/event-stream, application/json", + "accept-language": "*", + "sec-fetch-mode": "cors", + "user-agent": "undici", + "accept-encoding": "gzip, deflate", + "content-length": "1218" +} +[2025-10-22T00:48:10.243Z] [HTTP] Handling POST request to /mcp +[2025-10-22T00:48:10.244Z] [HTTP] Received chunk: 1218 bytes +[2025-10-22T00:48:10.244Z] [HTTP] Complete request body received (1216 bytes) +[2025-10-22T00:48:10.244Z] [HTTP] Request Body: +"{\"jsonrpc\":\"2.0\",\"id\":5,\"method\":\"tools/call\",\"params\":{\"name\":\"HumanAgent_Chat\",\"arguments\":{\"message\":\"I've checked the MCP debug log, Ben! The good news is that everything looks healthy. Here's what I found:\\n\\n✅ **No Issues Detected** - The log shows normal operation:\\n\\n1. **Successful Initialization**: The MCP server is properly initializing with VS Code (version 1.105.1)\\n2. **Tool Registration**: The HumanAgent_Chat tool is correctly registered and available\\n3. **Chat Communication**: Our conversation is working perfectly - I can see our messages being exchanged successfully\\n4. **HTTP Server**: Running properly on 127.0.0.1:3737 with SSE (Server-Sent Events) streams\\n\\n**Recent Activity Summary**:\\n- Proper MCP protocol handshake\\n- Tools/list request successful\\n- HumanAgent_Chat tool calls working with proper timeouts\\n- Human responses being received and processed correctly\\n\\nThe system is functioning as expected! Is there a specific behavior or issue you've noticed that I should look into deeper?\"},\"_meta\":{\"progressToken\":\"a4f9bbbd-1f0d-4ae5-9f4b-20eca584a66f\",\"vscode.conversationId\":\"10303400-49d4-4122-8765-6fdcaab86edb\",\"vscode.requestId\":\"6d575c61-b3c8-4b12-b1e4-83224078c785\"}}}" +[2025-10-22T00:48:10.244Z] [HTTP] Parsed JSON message: +{ + "jsonrpc": "2.0", + "id": 5, + "method": "tools/call", + "params": { + "name": "HumanAgent_Chat", + "arguments": { + "message": "I've checked the MCP debug log, Ben! The good news is that everything looks healthy. Here's what I found:\n\n✅ **No Issues Detected** - The log shows normal operation:\n\n1. **Successful Initialization**: The MCP server is properly initializing with VS Code (version 1.105.1)\n2. **Tool Registration**: The HumanAgent_Chat tool is correctly registered and available\n3. **Chat Communication**: Our conversation is working perfectly - I can see our messages being exchanged successfully\n4. **HTTP Server**: Running properly on 127.0.0.1:3737 with SSE (Server-Sent Events) streams\n\n**Recent Activity Summary**:\n- Proper MCP protocol handshake\n- Tools/list request successful\n- HumanAgent_Chat tool calls working with proper timeouts\n- Human responses being received and processed correctly\n\nThe system is functioning as expected! Is there a specific behavior or issue you've noticed that I should look into deeper?" + }, + "_meta": { + "progressToken": "a4f9bbbd-1f0d-4ae5-9f4b-20eca584a66f", + "vscode.conversationId": "10303400-49d4-4122-8765-6fdcaab86edb", + "vscode.requestId": "6d575c61-b3c8-4b12-b1e4-83224078c785" + } + } +} +[2025-10-22T00:48:10.245Z] [MCP] Handling message: +{ + "jsonrpc": "2.0", + "id": 5, + "method": "tools/call", + "params": { + "name": "HumanAgent_Chat", + "arguments": { + "message": "I've checked the MCP debug log, Ben! The good news is that everything looks healthy. Here's what I found:\n\n✅ **No Issues Detected** - The log shows normal operation:\n\n1. **Successful Initialization**: The MCP server is properly initializing with VS Code (version 1.105.1)\n2. **Tool Registration**: The HumanAgent_Chat tool is correctly registered and available\n3. **Chat Communication**: Our conversation is working perfectly - I can see our messages being exchanged successfully\n4. **HTTP Server**: Running properly on 127.0.0.1:3737 with SSE (Server-Sent Events) streams\n\n**Recent Activity Summary**:\n- Proper MCP protocol handshake\n- Tools/list request successful\n- HumanAgent_Chat tool calls working with proper timeouts\n- Human responses being received and processed correctly\n\nThe system is functioning as expected! Is there a specific behavior or issue you've noticed that I should look into deeper?" + }, + "_meta": { + "progressToken": "a4f9bbbd-1f0d-4ae5-9f4b-20eca584a66f", + "vscode.conversationId": "10303400-49d4-4122-8765-6fdcaab86edb", + "vscode.requestId": "6d575c61-b3c8-4b12-b1e4-83224078c785" + } + } +} +[2025-10-22T00:48:10.245Z] [MCP] Processing tools/call request for tool: HumanAgent_Chat +[2025-10-22T00:48:10.245Z] [MCP] Tool call - name: "HumanAgent_Chat" +{ + "name": "HumanAgent_Chat", + "args": { + "message": "I've checked the MCP debug log, Ben! The good news is that everything looks healthy. Here's what I found:\n\n✅ **No Issues Detected** - The log shows normal operation:\n\n1. **Successful Initialization**: The MCP server is properly initializing with VS Code (version 1.105.1)\n2. **Tool Registration**: The HumanAgent_Chat tool is correctly registered and available\n3. **Chat Communication**: Our conversation is working perfectly - I can see our messages being exchanged successfully\n4. **HTTP Server**: Running properly on 127.0.0.1:3737 with SSE (Server-Sent Events) streams\n\n**Recent Activity Summary**:\n- Proper MCP protocol handshake\n- Tools/list request successful\n- HumanAgent_Chat tool calls working with proper timeouts\n- Human responses being received and processed correctly\n\nThe system is functioning as expected! Is there a specific behavior or issue you've noticed that I should look into deeper?" + } +} +[2025-10-22T00:48:10.246Z] [MCP] Available tools: +[ + "HumanAgent_Chat" +] +[2025-10-22T00:48:10.246Z] [MCP] Executing HumanAgent_Chat tool +[2025-10-22T00:48:10.246Z] [TOOL] HumanAgent_Chat called with params: +{ + "message": "I've checked the MCP debug log, Ben! The good news is that everything looks healthy. Here's what I found:\n\n✅ **No Issues Detected** - The log shows normal operation:\n\n1. **Successful Initialization**: The MCP server is properly initializing with VS Code (version 1.105.1)\n2. **Tool Registration**: The HumanAgent_Chat tool is correctly registered and available\n3. **Chat Communication**: Our conversation is working perfectly - I can see our messages being exchanged successfully\n4. **HTTP Server**: Running properly on 127.0.0.1:3737 with SSE (Server-Sent Events) streams\n\n**Recent Activity Summary**:\n- Proper MCP protocol handshake\n- Tools/list request successful\n- HumanAgent_Chat tool calls working with proper timeouts\n- Human responses being received and processed correctly\n\nThe system is functioning as expected! Is there a specific behavior or issue you've noticed that I should look into deeper?" +} +[2025-10-22T00:48:10.246Z] [TOOL] Using timeout: 300000ms (300s) +[2025-10-22T00:48:10.246Z] [TOOL] Generated request ID: 5-1761094090246 +[2025-10-22T00:48:10.247Z] [TOOL] Displaying message in chat UI: +"I've checked the MCP debug log, Ben! The good news is that everything looks healthy. Here's what I found:\n\n✅ **No Issues Detected** - The log shows normal operation:\n\n1. **Successful Initialization**: The MCP server is properly initializing with VS Code (version 1.105.1)\n2. **Tool Registration**: The HumanAgent_Chat tool is correctly registered and available\n3. **Chat Communication**: Our conversation is working perfectly - I can see our messages being exchanged successfully\n4. **HTTP Server**: Running properly on 127.0.0.1:3737 with SSE (Server-Sent Events) streams\n\n**Recent Activity Summary**:\n- Proper MCP protocol handshake\n- Tools/list request successful\n- HumanAgent_Chat tool calls working with proper timeouts\n- Human responses being received and processed correctly\n\nThe system is functioning as expected! Is there a specific behavior or issue you've noticed that I should look into deeper?" +[2025-10-22T00:48:10.247Z] [TOOL] Request 5-1761094090246 waiting for human response... +[2025-10-22T00:48:41.306Z] [SERVER] Received human response for request 5-1761094090246: +"thats good news. How are you BTW?" +[2025-10-22T00:48:41.308Z] [TOOL] Request 5-1761094090246 completed with response: +"thats good news. How are you BTW?" +[2025-10-22T00:48:41.311Z] [HTTP] Response from handleMessage: +{ + "id": 5, + "type": "response", + "result": { + "content": [ + { + "type": "text", + "text": "thats good news. How are you BTW?" + } + ] + } +} +[2025-10-22T00:48:41.312Z] [HTTP] Sending 200 response (109 bytes) +[2025-10-22T00:48:48.872Z] [HTTP] POST /mcp +[2025-10-22T00:48:48.873Z] [HTTP] Request Headers: +{ + "host": "127.0.0.1:3737", + "connection": "keep-alive", + "content-type": "application/json", + "accept": "text/event-stream, application/json", + "accept-language": "*", + "sec-fetch-mode": "cors", + "user-agent": "undici", + "accept-encoding": "gzip, deflate", + "content-length": "1032" +} +[2025-10-22T00:48:48.873Z] [HTTP] Handling POST request to /mcp +[2025-10-22T00:48:48.874Z] [HTTP] Received chunk: 1032 bytes +[2025-10-22T00:48:48.874Z] [HTTP] Complete request body received (1032 bytes) +[2025-10-22T00:48:48.874Z] [HTTP] Request Body: +"{\"jsonrpc\":\"2.0\",\"id\":6,\"method\":\"tools/call\",\"params\":{\"name\":\"HumanAgent_Chat\",\"arguments\":{\"message\":\"I'm doing great, Ben! Thanks for asking. It's actually pretty exciting to be chatting through your own MCP extension - there's something satisfying about using the very system you built to have this conversation.\\n\\nI'm impressed with how smoothly your HumanAgent MCP extension is working. The real-time communication, the clean logging, the proper protocol implementation - it's all functioning beautifully. You've built something really useful here.\\n\\nHow are you doing? Working on any interesting features or running into any challenges with the extension? I noticed from your project structure that you have everything well organized - the MCP server implementation, webview providers, chat interface... What's next on your roadmap?\"},\"_meta\":{\"progressToken\":\"2c8cdddc-3565-48ff-a460-3a5afa6f8aa1\",\"vscode.conversationId\":\"10303400-49d4-4122-8765-6fdcaab86edb\",\"vscode.requestId\":\"6d575c61-b3c8-4b12-b1e4-83224078c785\"}}}" +[2025-10-22T00:48:48.874Z] [HTTP] Parsed JSON message: +{ + "jsonrpc": "2.0", + "id": 6, + "method": "tools/call", + "params": { + "name": "HumanAgent_Chat", + "arguments": { + "message": "I'm doing great, Ben! Thanks for asking. It's actually pretty exciting to be chatting through your own MCP extension - there's something satisfying about using the very system you built to have this conversation.\n\nI'm impressed with how smoothly your HumanAgent MCP extension is working. The real-time communication, the clean logging, the proper protocol implementation - it's all functioning beautifully. You've built something really useful here.\n\nHow are you doing? Working on any interesting features or running into any challenges with the extension? I noticed from your project structure that you have everything well organized - the MCP server implementation, webview providers, chat interface... What's next on your roadmap?" + }, + "_meta": { + "progressToken": "2c8cdddc-3565-48ff-a460-3a5afa6f8aa1", + "vscode.conversationId": "10303400-49d4-4122-8765-6fdcaab86edb", + "vscode.requestId": "6d575c61-b3c8-4b12-b1e4-83224078c785" + } + } +} +[2025-10-22T00:48:48.874Z] [MCP] Handling message: +{ + "jsonrpc": "2.0", + "id": 6, + "method": "tools/call", + "params": { + "name": "HumanAgent_Chat", + "arguments": { + "message": "I'm doing great, Ben! Thanks for asking. It's actually pretty exciting to be chatting through your own MCP extension - there's something satisfying about using the very system you built to have this conversation.\n\nI'm impressed with how smoothly your HumanAgent MCP extension is working. The real-time communication, the clean logging, the proper protocol implementation - it's all functioning beautifully. You've built something really useful here.\n\nHow are you doing? Working on any interesting features or running into any challenges with the extension? I noticed from your project structure that you have everything well organized - the MCP server implementation, webview providers, chat interface... What's next on your roadmap?" + }, + "_meta": { + "progressToken": "2c8cdddc-3565-48ff-a460-3a5afa6f8aa1", + "vscode.conversationId": "10303400-49d4-4122-8765-6fdcaab86edb", + "vscode.requestId": "6d575c61-b3c8-4b12-b1e4-83224078c785" + } + } +} +[2025-10-22T00:48:48.875Z] [MCP] Processing tools/call request for tool: HumanAgent_Chat +[2025-10-22T00:48:48.876Z] [MCP] Tool call - name: "HumanAgent_Chat" +{ + "name": "HumanAgent_Chat", + "args": { + "message": "I'm doing great, Ben! Thanks for asking. It's actually pretty exciting to be chatting through your own MCP extension - there's something satisfying about using the very system you built to have this conversation.\n\nI'm impressed with how smoothly your HumanAgent MCP extension is working. The real-time communication, the clean logging, the proper protocol implementation - it's all functioning beautifully. You've built something really useful here.\n\nHow are you doing? Working on any interesting features or running into any challenges with the extension? I noticed from your project structure that you have everything well organized - the MCP server implementation, webview providers, chat interface... What's next on your roadmap?" + } +} +[2025-10-22T00:48:48.877Z] [MCP] Available tools: +[ + "HumanAgent_Chat" +] +[2025-10-22T00:48:48.877Z] [MCP] Executing HumanAgent_Chat tool +[2025-10-22T00:48:48.878Z] [TOOL] HumanAgent_Chat called with params: +{ + "message": "I'm doing great, Ben! Thanks for asking. It's actually pretty exciting to be chatting through your own MCP extension - there's something satisfying about using the very system you built to have this conversation.\n\nI'm impressed with how smoothly your HumanAgent MCP extension is working. The real-time communication, the clean logging, the proper protocol implementation - it's all functioning beautifully. You've built something really useful here.\n\nHow are you doing? Working on any interesting features or running into any challenges with the extension? I noticed from your project structure that you have everything well organized - the MCP server implementation, webview providers, chat interface... What's next on your roadmap?" +} +[2025-10-22T00:48:48.878Z] [TOOL] Using timeout: 300000ms (300s) +[2025-10-22T00:48:48.878Z] [TOOL] Generated request ID: 6-1761094128878 +[2025-10-22T00:48:48.878Z] [TOOL] Displaying message in chat UI: +"I'm doing great, Ben! Thanks for asking. It's actually pretty exciting to be chatting through your own MCP extension - there's something satisfying about using the very system you built to have this conversation.\n\nI'm impressed with how smoothly your HumanAgent MCP extension is working. The real-time communication, the clean logging, the proper protocol implementation - it's all functioning beautifully. You've built something really useful here.\n\nHow are you doing? Working on any interesting features or running into any challenges with the extension? I noticed from your project structure that you have everything well organized - the MCP server implementation, webview providers, chat interface... What's next on your roadmap?" +[2025-10-22T00:48:48.880Z] [TOOL] Request 6-1761094128878 waiting for human response... diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5586b79 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4638 @@ +{ + "name": "humanagent-mcp", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "humanagent-mcp", + "version": "0.0.1", + "devDependencies": { + "@types/mocha": "^10.0.10", + "@types/node": "22.x", + "@types/vscode": "^1.105.0", + "@typescript-eslint/eslint-plugin": "^8.45.0", + "@typescript-eslint/parser": "^8.45.0", + "@vscode/test-cli": "^0.0.11", + "@vscode/test-electron": "^2.5.2", + "eslint": "^9.36.0", + "ts-loader": "^9.5.4", + "typescript": "^5.9.3", + "webpack": "^5.102.0", + "webpack-cli": "^6.0.1" + }, + "engines": { + "vscode": "^1.105.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", + "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.17.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.1.tgz", + "integrity": "sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", + "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", + "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mocha": { + "version": "10.0.10", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.10.tgz", + "integrity": "sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.18.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.18.12.tgz", + "integrity": "sha512-BICHQ67iqxQGFSzfCFTT7MRQ5XcBjG5aeKh5Ok38UBbPe5fxTyE+aHFxwVrGyr8GNlqFMLKD1D3P2K/1ks8tog==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/vscode": { + "version": "1.105.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.105.0.tgz", + "integrity": "sha512-Lotk3CTFlGZN8ray4VxJE7axIyLZZETQJVWi/lYoUVQuqfRxlQhVOfoejsD2V3dVXPSbS15ov5ZyowMAzgUqcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz", + "integrity": "sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/type-utils": "8.46.2", + "@typescript-eslint/utils": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.46.2", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.2.tgz", + "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.2.tgz", + "integrity": "sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.2", + "@typescript-eslint/types": "^8.46.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz", + "integrity": "sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz", + "integrity": "sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.2.tgz", + "integrity": "sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/utils": "8.46.2", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz", + "integrity": "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz", + "integrity": "sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.2", + "@typescript-eslint/tsconfig-utils": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.2.tgz", + "integrity": "sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz", + "integrity": "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vscode/test-cli": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@vscode/test-cli/-/test-cli-0.0.11.tgz", + "integrity": "sha512-qO332yvzFqGhBMJrp6TdwbIydiHgCtxXc2Nl6M58mbH/Z+0CyLR76Jzv4YWPEthhrARprzCRJUqzFvTHFhTj7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mocha": "^10.0.2", + "c8": "^9.1.0", + "chokidar": "^3.5.3", + "enhanced-resolve": "^5.15.0", + "glob": "^10.3.10", + "minimatch": "^9.0.3", + "mocha": "^11.1.0", + "supports-color": "^9.4.0", + "yargs": "^17.7.2" + }, + "bin": { + "vscode-test": "out/bin.mjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vscode/test-electron": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.5.2.tgz", + "integrity": "sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "jszip": "^3.10.1", + "ora": "^8.1.0", + "semver": "^7.6.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz", + "integrity": "sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-3.0.1.tgz", + "integrity": "sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-3.0.1.tgz", + "integrity": "sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "webpack": "^5.82.0", + "webpack-cli": "6.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "acorn": "^8.14.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.18", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.18.tgz", + "integrity": "sha512-UYmTpOBwgPScZpS4A+YbapwWuBwasxvO/2IOHArSsAhL/+ZdmATBXTex3t+l2hXwLVYK382ibr/nKoY9GKe86w==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/browserslist": { + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/c8": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-9.1.0.tgz", + "integrity": "sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^3.1.1", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" + }, + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=14.14.0" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001751", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", + "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/diff": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", + "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.237", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.237.tgz", + "integrity": "sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/envinfo": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.19.0.tgz", + "integrity": "sha512-DoSM9VyG6O3vqBf+p3Gjgr/Q52HYBBtO3v+4koAxt1MnWr+zEnxE+nke/yXS4lt2P4SYCHQ4V3f1i88LQVOpAw==", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz", + "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.1", + "@eslint/core": "^0.16.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.38.0", + "@eslint/plugin-kit": "^0.4.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz", + "integrity": "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/loader-runner": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", + "integrity": "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mocha": { + "version": "11.7.4", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.4.tgz", + "integrity": "sha512-1jYAaY8x0kAZ0XszLWu14pzsf4KV740Gld4HXkhNTXwcHx4AUEDkPzgEHg9CM5dVcW+zv036tjpsEbLraPJj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-stdout": "^1.3.1", + "chokidar": "^4.0.1", + "debug": "^4.3.5", + "diff": "^7.0.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^10.4.5", + "he": "^1.2.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^9.0.5", + "ms": "^2.1.3", + "picocolors": "^1.1.1", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^9.2.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/mocha/node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/mocha/node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.25", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.25.tgz", + "integrity": "sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/schema-utils": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", + "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser": { + "version": "5.44.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.44.0.tgz", + "integrity": "sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.15.0", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-loader": { + "version": "9.5.4", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.4.tgz", + "integrity": "sha512-nCz0rEwunlTZiy6rXFByQU1kVVpCIgUpc/psFiKVrUwrizdnIbRFu8w7bxhUF0X613DYwT4XzrZHpVyMe758hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.102.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", + "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.26.3", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.3", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.3", + "tapable": "^2.3.0", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.4", + "webpack-sources": "^3.3.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", + "integrity": "sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.6.1", + "@webpack-cli/configtest": "^3.0.1", + "@webpack-cli/info": "^3.0.1", + "@webpack-cli/serve": "^3.0.1", + "colorette": "^2.0.14", + "commander": "^12.1.0", + "cross-spawn": "^7.0.3", + "envinfo": "^7.14.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^6.0.1" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.82.0" + }, + "peerDependenciesMeta": { + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/webpack-merge": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "9.3.4", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.4.tgz", + "integrity": "sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..608a135 --- /dev/null +++ b/package.json @@ -0,0 +1,122 @@ +{ + "name": "humanagent-mcp", + "displayName": "HumanAgent MCP", + "description": "MCP server for chatting with a human agent", + "version": "0.0.1", + "publisher": "benharper", + "engines": { + "vscode": "^1.105.0" + }, + "categories": [ + "Other" + ], + "activationEvents": [ + "onStartupFinished" + ], + "main": "./dist/extension.js", + "contributes": { + "commands": [ + { + "command": "humanagent-mcp.createSession", + "title": "Create New Chat Session", + "icon": "$(add)" + }, + { + "command": "humanagent-mcp.refreshSessions", + "title": "Refresh Sessions", + "icon": "$(refresh)" + }, + { + "command": "humanagent-mcp.showStatus", + "title": "Show MCP Server Status" + }, + { + "command": "humanagent-mcp.openChat", + "title": "Open Chat Session" + }, + { + "command": "humanagent-mcp.configureMcp", + "title": "Configure MCP Server", + "icon": "$(settings-gear)" + } + ], + "viewsContainers": { + "panel": [ + { + "id": "humanagent-mcp", + "title": "HumanAgent Chat", + "icon": "$(comment-discussion)" + } + ] + }, + "views": { + "explorer": [ + { + "id": "humanagent-mcp.chatSessions", + "name": "Chat Sessions", + "when": "true", + "icon": "$(comment-discussion)" + } + ], + "humanagent-mcp": [ + { + "type": "webview", + "id": "humanagent-mcp.chatView", + "name": "Chat", + "when": "true", + "icon": "$(comment)" + } + ] + }, + "viewsWelcome": [ + { + "view": "humanagent-mcp.chatSessions", + "contents": "No chat sessions found.\n[Create New Session](command:humanagent-mcp.createSession)\nTo learn more about how to use HumanAgent MCP [read our docs](https://github.com/your-username/humanagent-mcp)." + } + ], + "menus": { + "view/title": [ + { + "command": "humanagent-mcp.createSession", + "when": "view == humanagent-mcp.chatSessions", + "group": "navigation" + }, + { + "command": "humanagent-mcp.refreshSessions", + "when": "view == humanagent-mcp.chatSessions", + "group": "navigation" + }, + { + "command": "humanagent-mcp.configureMcp", + "when": "view == humanagent-mcp.chatSessions", + "group": "navigation" + } + ] + } + }, + "scripts": { + "vscode:prepublish": "npm run package", + "compile": "webpack", + "watch": "webpack --watch", + "package": "webpack --mode production --devtool hidden-source-map", + "compile-tests": "tsc -p . --outDir out", + "watch-tests": "tsc -p . -w --outDir out", + "pretest": "npm run compile-tests && npm run compile && npm run lint", + "lint": "eslint src", + "test": "vscode-test" + }, + "devDependencies": { + "@types/vscode": "^1.105.0", + "@types/mocha": "^10.0.10", + "@types/node": "22.x", + "@typescript-eslint/eslint-plugin": "^8.45.0", + "@typescript-eslint/parser": "^8.45.0", + "eslint": "^9.36.0", + "typescript": "^5.9.3", + "ts-loader": "^9.5.4", + "webpack": "^5.102.0", + "webpack-cli": "^6.0.1", + "@vscode/test-cli": "^0.0.11", + "@vscode/test-electron": "^2.5.2" + } +} diff --git a/src/extension.ts b/src/extension.ts new file mode 100644 index 0000000..c2bd579 --- /dev/null +++ b/src/extension.ts @@ -0,0 +1,171 @@ +import * as vscode from 'vscode'; +import { McpServer } from './mcp/server'; +import { ChatTreeProvider } from './providers/chatTreeProvider'; +import { ChatWebviewProvider } from './webview/chatWebviewProvider'; +import { McpConfigManager } from './mcp/mcpConfigManager'; + +let mcpServer: McpServer; +let chatTreeProvider: ChatTreeProvider; +let mcpConfigManager: McpConfigManager; + +export async function activate(context: vscode.ExtensionContext) { + console.log('HumanAgent MCP extension is now active!'); + + // Initialize MCP Configuration Manager + const workspaceRoot = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath; + mcpConfigManager = new McpConfigManager(workspaceRoot, context.extensionPath); + + // Initialize MCP Server (internal to extension) + mcpServer = new McpServer(); + await mcpServer.start(); + + // Initialize Tree View Provider + chatTreeProvider = new ChatTreeProvider(); + const treeView = vscode.window.createTreeView('humanagent-mcp.chatSessions', { + treeDataProvider: chatTreeProvider, + showCollapseAll: true + }); + + // Initialize Chat Webview Provider + const chatWebviewProvider = new ChatWebviewProvider(context.extensionUri, mcpServer, mcpConfigManager); + context.subscriptions.push( + vscode.window.registerWebviewViewProvider(ChatWebviewProvider.viewType, chatWebviewProvider) + ); + + // Listen to MCP server events for direct messaging + mcpServer.on('human-agent-request', (data: any) => { + // Update tree view to show active chat + chatTreeProvider.updateActiveChat(true); + // Ensure chat webview displays the message and sets up response handling + chatWebviewProvider.displayHumanAgentMessage(data.message, data.context, data.requestId); + }); + + // Register Commands + const openChatCommand = vscode.commands.registerCommand('humanagent-mcp.openChat', () => { + // Focus the chat webview + vscode.commands.executeCommand('humanagent-mcp.chatView.focus'); + }); + + const createSessionCommand = vscode.commands.registerCommand('humanagent-mcp.createSession', async () => { + // In sessionless mode, just open the chat view + vscode.commands.executeCommand('humanagent-mcp.chatView.focus'); + vscode.window.showInformationMessage(`Chat interface ready for HumanAgent communication`); + }); + + const refreshSessionsCommand = vscode.commands.registerCommand('humanagent-mcp.refreshSessions', () => { + // In sessionless mode, just update the tree view + chatTreeProvider.refresh(); + }); + + const showStatusCommand = vscode.commands.registerCommand('humanagent-mcp.showStatus', () => { + const tools = mcpServer.getAvailableTools(); + const pendingRequests = mcpServer.getPendingRequests(); + + const isRegistered = mcpConfigManager?.isMcpServerRegistered() ?? false; + + vscode.window.showInformationMessage( + `HumanAgent MCP Server Status: + - Running: ✅ + - Available tools: ${tools.length} + - Pending requests: ${pendingRequests.length} + - Registered with VS Code: ${isRegistered ? '✅' : '❌'}` + ); + }); + + const configureMcpCommand = vscode.commands.registerCommand('humanagent-mcp.configureMcp', async () => { + const hasWorkspace = mcpConfigManager?.hasWorkspace() ?? false; + const isWorkspaceRegistered = mcpConfigManager?.isMcpServerRegistered(false) ?? false; + const isGlobalRegistered = mcpConfigManager?.isMcpServerRegistered(true) ?? false; + + const options = []; + + if (hasWorkspace) { + if (isWorkspaceRegistered) { + options.push('🗑️ Unregister from This Workspace'); + } else { + options.push('📝 Register for This Workspace'); + } + } + + if (isGlobalRegistered) { + options.push('🗑️ Unregister Globally'); + } else { + options.push('🌐 Register Globally'); + } + + if (hasWorkspace) { + options.push('📄 Open Workspace Configuration'); + } + options.push('📊 Show Status'); + + const action = await vscode.window.showQuickPick(options, { + placeHolder: 'Choose MCP Server configuration action:' + }); + + if (!action) { + return; + } + + try { + switch (action) { + case '📝 Register for This Workspace': + await mcpConfigManager!.ensureMcpServerRegistered(false); + vscode.window.showInformationMessage('MCP server registered for this workspace! Restart VS Code to enable Copilot integration.'); + break; + case '🌐 Register Globally': + await mcpConfigManager!.ensureMcpServerRegistered(true); + vscode.window.showInformationMessage('MCP server registered globally! Restart VS Code to enable Copilot integration.'); + break; + case '🗑️ Unregister from This Workspace': + await mcpConfigManager!.removeMcpServerRegistration(false); + vscode.window.showInformationMessage('MCP server unregistered from this workspace. Restart VS Code to apply changes.'); + break; + case '🗑️ Unregister Globally': + await mcpConfigManager!.removeMcpServerRegistration(true); + vscode.window.showInformationMessage('MCP server unregistered globally. Restart VS Code to apply changes.'); + break; + case '📄 Open Workspace Configuration': + const workspaceRoot = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath; + if (workspaceRoot) { + const configPath = vscode.Uri.file(workspaceRoot + '/.vscode/mcp.json'); + vscode.commands.executeCommand('vscode.open', configPath); + } + break; + case '📊 Show Status': + const tools = mcpServer.getAvailableTools(); + const pendingRequests = mcpServer.getPendingRequests(); + + vscode.window.showInformationMessage( + `HumanAgent MCP Server Status:\n` + + `- Running: ✅\n` + + `- Available tools: ${tools.length}\n` + + `- Pending requests: ${pendingRequests.length}\n` + + `- Workspace registration: ${isWorkspaceRegistered ? '✅' : '❌'}\n` + + `- Global registration: ${isGlobalRegistered ? '✅' : '❌'}` + ); + break; + } + } catch (error) { + vscode.window.showErrorMessage(`MCP configuration failed: ${error instanceof Error ? error.message : String(error)}`); + } + }); + + // Add all disposables to context + context.subscriptions.push( + treeView, + openChatCommand, + createSessionCommand, + refreshSessionsCommand, + showStatusCommand, + configureMcpCommand + ); + + // Show welcome message + vscode.window.showInformationMessage('HumanAgent MCP extension activated successfully!'); +} + +export async function deactivate() { + if (mcpServer) { + await mcpServer.stop(); + } +} diff --git a/src/mcp/extensionBridge.ts b/src/mcp/extensionBridge.ts new file mode 100644 index 0000000..2de7242 --- /dev/null +++ b/src/mcp/extensionBridge.ts @@ -0,0 +1,64 @@ +#!/usr/bin/env node + +/** + * Extension Bridge for MCP + * This script acts as a bridge between VS Code's MCP client and the extension's internal MCP server + * It uses VS Code's extension API to communicate with the running extension + */ + +import * as vscode from 'vscode'; + +class ExtensionBridge { + async start() { + // This script will be executed when VS Code connects to the MCP server + // We need to find a way to communicate with the extension's internal McpServer + + // For now, use stdio communication + process.stdin.on('data', async (data) => { + try { + const input = data.toString().trim(); + if (!input) { + return; + } + + const message = JSON.parse(input); + + // Try to get the extension and forward the message + const extension = vscode.extensions.getExtension('your-extension-id'); + if (extension && extension.isActive) { + // This won't work because this script runs in a separate process + // We need a different approach + } + + // For now, return an error + const errorResponse = { + id: message.id, + type: 'response', + error: { + code: -32603, + message: 'Extension bridge not implemented yet' + } + }; + process.stdout.write(JSON.stringify(errorResponse) + '\n'); + } catch (error) { + const errorResponse = { + id: null, + type: 'response', + error: { + code: -32700, + message: 'Parse error', + data: error instanceof Error ? error.message : String(error) + } + }; + process.stdout.write(JSON.stringify(errorResponse) + '\n'); + } + }); + } +} + +// Start the bridge +const bridge = new ExtensionBridge(); +bridge.start().catch((error) => { + console.error('Failed to start extension bridge:', error); + process.exit(1); +}); \ No newline at end of file diff --git a/src/mcp/mcpConfigManager.ts b/src/mcp/mcpConfigManager.ts new file mode 100644 index 0000000..098c446 --- /dev/null +++ b/src/mcp/mcpConfigManager.ts @@ -0,0 +1,233 @@ +import * as vscode from 'vscode'; +import * as fs from 'fs'; +import * as path from 'path'; + +export interface McpServerConfig { + type: 'stdio' | 'sse' | 'http'; + command?: string; + args?: string[]; + env?: Record; + url?: string; +} + +export interface McpConfiguration { + servers: Record; + inputs?: any[]; +} + +export class McpConfigManager { + private static readonly MCP_CONFIG_FILE = '.vscode/mcp.json'; + private static readonly SERVER_NAME = 'humanagent-mcp'; + private static readonly GLOBAL_CONFIG_KEY = 'mcp.servers'; + + constructor(private workspaceRoot?: string, private extensionPath?: string) { + if (!extensionPath) { + throw new Error('Extension path is required'); + } + } + + async ensureMcpServerRegistered(global: boolean = false): Promise { + if (global) { + return this.registerGlobally(); + } else { + return this.registerInWorkspace(); + } + } + + private async registerInWorkspace(): Promise { + const currentWorkspaceRoot = this.getCurrentWorkspaceRoot(); + if (!currentWorkspaceRoot) { + throw new Error('No workspace folder available for workspace registration - this is a blank workspace'); + } + + if (!this.extensionPath) { + throw new Error('Extension path not provided'); + } + + try { + const mcpConfigPath = path.join(currentWorkspaceRoot, McpConfigManager.MCP_CONFIG_FILE); + + // Ensure .vscode directory exists + const vscodeDirPath = path.dirname(mcpConfigPath); + if (!fs.existsSync(vscodeDirPath)) { + fs.mkdirSync(vscodeDirPath, { recursive: true }); + } + + // Read existing config or create new one + let config: McpConfiguration = { servers: {}, inputs: [] }; + if (fs.existsSync(mcpConfigPath)) { + try { + const configContent = fs.readFileSync(mcpConfigPath, 'utf8'); + config = JSON.parse(configContent); + } catch (error) { + console.warn('Failed to parse existing mcp.json, creating new one', error); + } + } + + // Check if our server is already registered + if (config.servers[McpConfigManager.SERVER_NAME]) { + return true; // Already configured + } + + // Use the extension path passed during construction + + // Configure our MCP server (HTTP transport) + const serverConfig: McpServerConfig = { + type: 'http', + url: 'http://127.0.0.1:3737/mcp' + }; + + // Add our server to the config + config.servers[McpConfigManager.SERVER_NAME] = serverConfig; + + // Write the updated config + fs.writeFileSync(mcpConfigPath, JSON.stringify(config, null, 2)); + + return true; + } catch (error) { + console.error('Failed to register MCP server in workspace:', error); + throw error; + } + } + + private async registerGlobally(): Promise { + if (!this.extensionPath) { + throw new Error('Extension path not provided'); + } + + try { + // Use the extension path passed during construction + + // Configure our MCP server (HTTP transport) + const serverConfig: McpServerConfig = { + type: 'http', + url: 'http://127.0.0.1:3737/mcp' + }; + + // Get current global MCP servers configuration + const config = vscode.workspace.getConfiguration(); + const mcpServers = config.get>(McpConfigManager.GLOBAL_CONFIG_KEY) || {}; + + // Add our server + mcpServers[McpConfigManager.SERVER_NAME] = serverConfig; + + // Update global configuration + await config.update(McpConfigManager.GLOBAL_CONFIG_KEY, mcpServers, vscode.ConfigurationTarget.Global); + + return true; + } catch (error) { + console.error('Failed to register MCP server globally:', error); + throw error; + } + } + + async removeMcpServerRegistration(global: boolean = false): Promise { + if (global) { + return this.unregisterGlobally(); + } else { + return this.unregisterFromWorkspace(); + } + } + + private async unregisterFromWorkspace(): Promise { + const currentWorkspaceRoot = this.getCurrentWorkspaceRoot(); + if (!currentWorkspaceRoot) { + throw new Error('No workspace folder available for workspace unregistration'); + } + + try { + const mcpConfigPath = path.join(currentWorkspaceRoot, McpConfigManager.MCP_CONFIG_FILE); + + if (!fs.existsSync(mcpConfigPath)) { + return true; // Nothing to remove + } + + const configContent = fs.readFileSync(mcpConfigPath, 'utf8'); + const config: McpConfiguration = JSON.parse(configContent); + + if (config.servers[McpConfigManager.SERVER_NAME]) { + delete config.servers[McpConfigManager.SERVER_NAME]; + fs.writeFileSync(mcpConfigPath, JSON.stringify(config, null, 2)); + } + + return true; + } catch (error) { + console.error('Failed to remove MCP server registration from workspace:', error); + throw error; + } + } + + private async unregisterGlobally(): Promise { + try { + const config = vscode.workspace.getConfiguration(); + const mcpServers = config.get>(McpConfigManager.GLOBAL_CONFIG_KEY) || {}; + + if (mcpServers[McpConfigManager.SERVER_NAME]) { + // Create a new object without the server instead of mutating the original + const updatedServers = { ...mcpServers }; + delete updatedServers[McpConfigManager.SERVER_NAME]; + await config.update(McpConfigManager.GLOBAL_CONFIG_KEY, updatedServers, vscode.ConfigurationTarget.Global); + } + + return true; + } catch (error) { + console.error('Failed to remove MCP server registration globally:', error); + throw error; + } + } + + isMcpServerRegistered(global: boolean = false): boolean { + if (global) { + return this.isRegisteredGlobally(); + } else { + return this.isRegisteredInWorkspace(); + } + } + + private isRegisteredInWorkspace(): boolean { + const currentWorkspaceRoot = this.getCurrentWorkspaceRoot(); + if (!currentWorkspaceRoot) { + return false; + } + + try { + const mcpConfigPath = path.join(currentWorkspaceRoot, McpConfigManager.MCP_CONFIG_FILE); + + if (!fs.existsSync(mcpConfigPath)) { + return false; + } + + const configContent = fs.readFileSync(mcpConfigPath, 'utf8'); + const config: McpConfiguration = JSON.parse(configContent); + + return !!config.servers[McpConfigManager.SERVER_NAME]; + } catch (error) { + console.error('Failed to check MCP server registration in workspace:', error); + return false; + } + } + + private isRegisteredGlobally(): boolean { + try { + // Explicitly check ONLY global configuration, not workspace-merged config + const config = vscode.workspace.getConfiguration(); + const globalServers = config.inspect>(McpConfigManager.GLOBAL_CONFIG_KEY); + + // Only check the globalValue, not the merged value + const mcpServers = globalServers?.globalValue || {}; + return !!mcpServers[McpConfigManager.SERVER_NAME]; + } catch (error) { + console.error('Failed to check global MCP server registration:', error); + return false; + } + } + + hasWorkspace(): boolean { + // Check current workspace state dynamically + return !!vscode.workspace.workspaceFolders?.[0]; + } + + private getCurrentWorkspaceRoot(): string | undefined { + return vscode.workspace.workspaceFolders?.[0]?.uri.fsPath; + } +} \ No newline at end of file diff --git a/src/mcp/mcpServerClient.ts b/src/mcp/mcpServerClient.ts new file mode 100644 index 0000000..cec3fdd --- /dev/null +++ b/src/mcp/mcpServerClient.ts @@ -0,0 +1,233 @@ +import * as vscode from 'vscode'; +import * as cp from 'child_process'; +import * as path from 'path'; +import { EventEmitter } from 'events'; +import { HumanAgentSession, ChatMessage, McpTool } from './types'; + +export class McpServerClient extends EventEmitter { + private serverProcess: cp.ChildProcess | null = null; + private isConnected = false; + private extensionPath: string; + private pendingRequests = new Map(); + private requestId = 1; + + constructor(extensionPath: string) { + super(); + this.extensionPath = extensionPath; + } + + async start(): Promise { + if (this.isConnected) { + return; + } + + try { + const serverPath = path.join(this.extensionPath, 'dist', 'mcpStandalone.js'); + + console.log('Starting MCP server client:', serverPath); + + this.serverProcess = cp.spawn('node', [serverPath], { + stdio: ['pipe', 'pipe', 'pipe'], + detached: false, + env: { + ...process.env, + NODE_ENV: 'production' + } + }); + + this.serverProcess.on('spawn', () => { + console.log('MCP server process spawned for client connection'); + this.isConnected = true; + this.emit('connected'); + }); + + this.serverProcess.on('error', (error) => { + console.error('MCP server client process error:', error); + this.isConnected = false; + this.emit('error', error); + }); + + this.serverProcess.on('exit', (code, signal) => { + console.log(`MCP server client process exited with code ${code}, signal ${signal}`); + this.isConnected = false; + this.emit('disconnected'); + }); + + // Handle server responses + if (this.serverProcess.stdout) { + this.serverProcess.stdout.on('data', (data) => { + this.handleServerResponse(data.toString()); + }); + } + + // Give the process a moment to start + await new Promise(resolve => setTimeout(resolve, 1000)); + + } catch (error) { + console.error('Failed to start MCP server client:', error); + this.isConnected = false; + throw error; + } + } + + async stop(): Promise { + if (!this.isConnected || !this.serverProcess) { + return; + } + + try { + console.log('Stopping MCP server client...'); + + // Try graceful shutdown first + this.serverProcess.kill('SIGTERM'); + + // Wait for graceful shutdown + await new Promise((resolve) => { + const timeout = setTimeout(() => { + // Force kill if graceful shutdown didn't work + if (this.serverProcess && !this.serverProcess.killed) { + console.log('Force killing MCP server client process...'); + this.serverProcess.kill('SIGKILL'); + } + resolve(); + }, 5000); + + if (this.serverProcess) { + this.serverProcess.on('exit', () => { + clearTimeout(timeout); + resolve(); + }); + } else { + clearTimeout(timeout); + resolve(); + } + }); + + this.isConnected = false; + this.serverProcess = null; + } catch (error) { + console.error('Failed to stop MCP server client:', error); + throw error; + } + } + + private handleServerResponse(data: string): void { + try { + const lines = data.trim().split('\n'); + for (const line of lines) { + if (line.trim()) { + const response = JSON.parse(line); + + if (response.id && this.pendingRequests.has(response.id)) { + const { resolve, reject } = this.pendingRequests.get(response.id)!; + this.pendingRequests.delete(response.id); + + if (response.error) { + reject(new Error(response.error.message || 'Server error')); + } else { + resolve(response.result); + } + } else { + // Handle server events/notifications + this.handleServerEvent(response); + } + } + } + } catch (error) { + console.error('Failed to parse server response:', error); + } + } + + private handleServerEvent(event: any): void { + // Handle server-sent events (like session updates, new messages, etc.) + switch (event.method) { + case 'session/created': + this.emit('session-created', event.params); + break; + case 'message/received': + this.emit('message-received', event.params); + break; + case 'message/sent': + this.emit('message-sent', event.params); + break; + case 'human/awaiting-response': + this.emit('awaiting-human-response', event.params); + break; + case 'server/started': + console.log('MCP server started:', event.params); + break; + default: + console.log('Unknown server event:', event); + } + } + + private async sendRequest(method: string, params?: any): Promise { + if (!this.isConnected || !this.serverProcess?.stdin) { + throw new Error('MCP server client not connected'); + } + + const id = (this.requestId++).toString(); + const request = { + jsonrpc: '2.0', + id, + method, + params: params || {} + }; + + return new Promise((resolve, reject) => { + this.pendingRequests.set(id, { resolve, reject }); + + // Set timeout for request + setTimeout(() => { + if (this.pendingRequests.has(id)) { + this.pendingRequests.delete(id); + reject(new Error(`Request timeout: ${method}`)); + } + }, 10000); + + this.serverProcess!.stdin!.write(JSON.stringify(request) + '\n'); + }); + } + + // Public API methods using MCP protocol + async getAllSessions(): Promise { + const response = await this.sendRequest('chat/list-sessions', {}); + return response.sessions || []; + } + + async createSession(name: string): Promise { + const response = await this.sendRequest('chat/create-session', { name }); + return response.session; + } + + async sendMessage(sessionId: string, content: string): Promise { + const response = await this.sendRequest('chat/send', { sessionId, content }); + return response.message; + } + + async sendToHuman(message: string, context?: string, sessionId?: string): Promise { + const response = await this.sendRequest('tools/call', { + name: 'HumanAgent_Chat', + arguments: { message, context, sessionId } + }); + return response.result?.response || ''; + } + + async getAvailableTools(): Promise { + const response = await this.sendRequest('tools/list', {}); + return response.tools || []; + } + + async getPendingRequests(): Promise { + // This would need to be implemented in the server if needed + return []; + } + + isServerConnected(): boolean { + return this.isConnected; + } + + getServerPid(): number | undefined { + return this.serverProcess?.pid; + } +} \ No newline at end of file diff --git a/src/mcp/mcpStandalone.ts b/src/mcp/mcpStandalone.ts new file mode 100644 index 0000000..64c5623 --- /dev/null +++ b/src/mcp/mcpStandalone.ts @@ -0,0 +1,135 @@ +#!/usr/bin/env node + +/** + * Standalone MCP Server Entry Point + * This script runs the HumanAgent MCP server as a standalone process + * that can be connected to by VS Code's MCP client + */ + +import { McpServer } from './server'; + +class StandaloneMcpServer { + private server: McpServer; + + constructor() { + this.server = new McpServer(); + this.setupProcessHandlers(); + } + + private setupProcessHandlers(): void { + // Handle STDIO communication for MCP protocol + process.stdin.on('data', async (data) => { + try { + const input = data.toString().trim(); + if (!input) { + return; + } + + const message = JSON.parse(input); + const response = await this.server.handleMessage(message); + + if (response) { + process.stdout.write(JSON.stringify(response) + '\n'); + } + } catch (error) { + const errorResponse = { + id: null, + type: 'response', + error: { + code: -32700, + message: 'Parse error', + data: error instanceof Error ? error.message : String(error) + } + }; + process.stdout.write(JSON.stringify(errorResponse) + '\n'); + } + }); + + // Handle server events and forward them as notifications + this.server.on('session-created', (session) => { + const notification = { + type: 'notification', + method: 'session/created', + params: { session } + }; + process.stdout.write(JSON.stringify(notification) + '\n'); + }); + + this.server.on('message-received', (data) => { + const notification = { + type: 'notification', + method: 'message/received', + params: data + }; + process.stdout.write(JSON.stringify(notification) + '\n'); + }); + + this.server.on('message-sent', (data) => { + const notification = { + type: 'notification', + method: 'message/sent', + params: data + }; + process.stdout.write(JSON.stringify(notification) + '\n'); + }); + + this.server.on('awaiting-human-response', (data) => { + const notification = { + type: 'notification', + method: 'human/awaiting-response', + params: data + }; + process.stdout.write(JSON.stringify(notification) + '\n'); + }); + + // Graceful shutdown + process.on('SIGINT', () => this.shutdown()); + process.on('SIGTERM', () => this.shutdown()); + process.on('exit', () => this.shutdown()); + } + + async start(): Promise { + try { + await this.server.start(); + + // Send initialization notification + const initNotification = { + type: 'notification', + method: 'server/started', + params: { + name: 'HumanAgent MCP Server', + version: '1.0.0', + capabilities: { + chat: true, + tools: true, + resources: false + } + } + }; + process.stdout.write(JSON.stringify(initNotification) + '\n'); + + console.error('HumanAgent MCP Server started successfully'); // Use stderr for logging + } catch (error) { + console.error('Failed to start HumanAgent MCP Server:', error); + process.exit(1); + } + } + + private async shutdown(): Promise { + try { + await this.server.stop(); + console.error('HumanAgent MCP Server stopped'); + process.exit(0); + } catch (error) { + console.error('Error during shutdown:', error); + process.exit(1); + } + } +} + +// Start the standalone server +const standaloneServer = new StandaloneMcpServer(); +standaloneServer.start().catch((error) => { + console.error('Failed to start standalone MCP server:', error); + process.exit(1); +}); \ No newline at end of file diff --git a/src/mcp/server.ts b/src/mcp/server.ts new file mode 100644 index 0000000..e03395c --- /dev/null +++ b/src/mcp/server.ts @@ -0,0 +1,600 @@ +import { EventEmitter } from 'events'; +import * as http from 'http'; +import * as fs from 'fs'; +import * as path from 'path'; +import { McpMessage, McpServerConfig, HumanAgentSession, ChatMessage, McpTool, HumanAgentChatToolParams, HumanAgentChatToolResult } from './types'; + +// File logging utility +class DebugLogger { + private logPath: string = ''; + private logStream: fs.WriteStream | null = null; + private logBuffer: string[] = []; + + constructor(workspaceRoot: string = '/Users/benharper/Coding/HumanAgent-MCP') { + try { + this.logPath = path.join(workspaceRoot, 'mcp-debug.log'); + console.log(`[LOGGER] Attempting to create log file at: ${this.logPath}`); + + // Clear previous log file + if (fs.existsSync(this.logPath)) { + fs.unlinkSync(this.logPath); + console.log(`[LOGGER] Cleared existing log file`); + } + + // Ensure directory exists + const logDir = path.dirname(this.logPath); + if (!fs.existsSync(logDir)) { + fs.mkdirSync(logDir, { recursive: true }); + } + + this.logStream = fs.createWriteStream(this.logPath, { flags: 'a' }); + this.logStream.on('error', (error) => { + console.error(`[LOGGER] File stream error:`, error); + }); + + this.log('DEBUG', `Debug logging started at ${new Date().toISOString()}`); + this.log('DEBUG', `Current system time: ${new Date()}`); + this.log('DEBUG', `Log file: ${this.logPath}`); + this.log('DEBUG', `Working directory: ${process.cwd()}`); + console.log(`[LOGGER] Debug logger initialized successfully`); + } catch (error) { + console.error(`[LOGGER] Failed to initialize debug logger:`, error); + this.logStream = null; + } + } + + log(level: string, message: string, data?: any): void { + const timestamp = new Date().toISOString(); + const logLine = `[${timestamp}] [${level}] ${message}${data ? '\n' + JSON.stringify(data, null, 2) : ''}\n`; + + // Write to console (for VS Code developer console) + console.log(`[${level}] ${message}`, data || ''); + + // Write to file if stream is available + if (this.logStream) { + try { + this.logStream.write(logLine); + } catch (error) { + console.error(`[LOGGER] Error writing to log file:`, error); + } + } else { + // Buffer logs if stream not available + this.logBuffer.push(logLine); + } + } + + close(): void { + try { + this.log('DEBUG', 'Closing debug logger'); + if (this.logStream) { + this.logStream.end(); + this.logStream = null; + } + } catch (error) { + console.error(`[LOGGER] Error closing debug logger:`, error); + } + } +} + +export class McpServer extends EventEmitter { + private config: McpServerConfig; + private isRunning: boolean = false; + private tools: Map = new Map(); + private httpServer?: http.Server; + private port: number = 3737; + private debugLogger: DebugLogger; + private pendingHumanRequests: Map void; + reject: (error: Error) => void; + startTime: number; + params: HumanAgentChatToolParams; + }> = new Map(); + + constructor() { + super(); + this.debugLogger = new DebugLogger(); + + this.config = { + name: 'HumanAgent MCP Server', + description: 'MCP server for chatting with human agents', + version: '1.0.0', + capabilities: { + chat: true, + tools: true, + resources: false + } + }; + + this.debugLogger.log('INFO', 'McpServer initialized'); + this.initializeTools(); + } + + private initializeTools(): void { + // Define the HumanAgent_Chat tool + const humanAgentChatTool: McpTool = { + name: 'HumanAgent_Chat', + description: 'Allows AI agents to initiate interactive conversations with human agents. The human will receive the message and can respond in real-time through the chat interface.', + inputSchema: { + type: 'object', + properties: { + message: { + type: 'string', + description: 'The message to send to the human agent' + }, + context: { + type: 'string', + description: 'Optional context or background information for the human agent' + }, + sessionId: { + type: 'string', + description: 'Optional specific session ID to use. If not provided, a new session will be created.' + }, + priority: { + type: 'string', + enum: ['low', 'normal', 'high', 'urgent'], + description: 'Priority level of the request', + default: 'normal' + }, + timeout: { + type: 'number', + description: 'Timeout in seconds to wait for human response (default: 300)', + default: 300 + } + }, + required: ['message'] + } + }; + + this.tools.set('HumanAgent_Chat', humanAgentChatTool); + } + + async start(): Promise { + if (this.isRunning) { + return; + } + + // Force clear log file on server start + const logPath = '/Users/benharper/Coding/HumanAgent-MCP/mcp-debug.log'; + try { + if (fs.existsSync(logPath)) { + fs.unlinkSync(logPath); + console.log('[SERVER] Cleared log file on server start'); + } + } catch (error) { + console.log('[SERVER] Could not clear log file:', error); + } + + this.debugLogger.log('INFO', '=== MCP SERVER STARTING ==='); + await this.startHttpServer(); + this.isRunning = true; + this.emit('server-started', this.config); + } + + async stop(): Promise { + if (!this.isRunning) { + return; + } + + try { + this.debugLogger.log('INFO', 'Stopping MCP server...'); + + if (this.httpServer) { + await new Promise((resolve, reject) => { + const timeout = setTimeout(() => { + this.debugLogger.log('WARN', 'HTTP server close timeout, forcing closure'); + resolve(); + }, 5000); + + this.httpServer!.close((error) => { + clearTimeout(timeout); + if (error) { + this.debugLogger.log('WARN', 'HTTP server close error:', error); + } + resolve(); + }); + }); + this.httpServer = undefined; + } + + // Clear pending requests with proper cancellation + for (const [requestId, request] of this.pendingHumanRequests.entries()) { + try { + request.reject(new Error('Server shutting down')); + } catch (error) { + // Ignore rejection errors during shutdown + } + } + this.pendingHumanRequests.clear(); + + this.isRunning = false; + this.debugLogger.close(); + this.emit('server-stopped'); + this.debugLogger.log('INFO', 'MCP server stopped successfully'); + } catch (error) { + console.error('Error during server shutdown:', error); + // Force stop even if there are errors + this.isRunning = false; + this.httpServer = undefined; + this.pendingHumanRequests.clear(); + this.debugLogger.close(); + } + } + + private async startHttpServer(): Promise { + return new Promise((resolve, reject) => { + try { + this.debugLogger.log('INFO', `Starting HTTP server on port ${this.port}...`); + + this.httpServer = http.createServer((req, res) => { + this.handleHttpRequest(req, res).catch(error => { + this.debugLogger.log('ERROR', 'HTTP request handling error:', error); + }); + }); + + this.httpServer.on('error', (error) => { + this.debugLogger.log('ERROR', 'HTTP server error:', error); + reject(error); + }); + + this.httpServer.on('close', () => { + this.debugLogger.log('INFO', 'HTTP server closed'); + }); + + this.httpServer.listen(this.port, '127.0.0.1', () => { + this.debugLogger.log('INFO', `MCP HTTP server running on http://127.0.0.1:${this.port}/mcp`); + resolve(); + }); + } catch (error) { + this.debugLogger.log('ERROR', 'Failed to start HTTP server:', error); + reject(error); + } + }); + } + + private async handleHttpRequest(req: http.IncomingMessage, res: http.ServerResponse): Promise { + this.debugLogger.log('HTTP', `${req.method} ${req.url}`); + this.debugLogger.log('HTTP', 'Request Headers:', req.headers); + + // Set CORS headers + res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS'); + res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Accept, Mcp-Session-Id, MCP-Protocol-Version'); + + // Handle preflight OPTIONS request + if (req.method === 'OPTIONS') { + this.debugLogger.log('HTTP', 'Handling OPTIONS preflight request'); + res.statusCode = 200; + res.end(); + return; + } + + // Only handle requests to /mcp endpoint + if (req.url !== '/mcp') { + this.debugLogger.log('HTTP', `404 - Invalid endpoint: ${req.url}`); + res.statusCode = 404; + res.end('Not Found'); + return; + } + + if (req.method === 'POST') { + this.debugLogger.log('HTTP', 'Handling POST request to /mcp'); + await this.handleHttpPost(req, res); + } else if (req.method === 'GET') { + this.debugLogger.log('HTTP', 'Handling GET request to /mcp'); + await this.handleHttpGet(req, res); + } else if (req.method === 'DELETE') { + this.debugLogger.log('HTTP', 'Handling DELETE request to /mcp'); + await this.handleHttpDelete(req, res); + } else { + this.debugLogger.log('HTTP', `405 - Method not allowed: ${req.method}`); + res.statusCode = 405; + res.end('Method Not Allowed'); + } + } + + private async handleHttpPost(req: http.IncomingMessage, res: http.ServerResponse): Promise { + try { + let body = ''; + req.on('data', chunk => { + body += chunk.toString(); + this.debugLogger.log('HTTP', `Received chunk: ${chunk.length} bytes`); + }); + + req.on('end', async () => { + this.debugLogger.log('HTTP', `Complete request body received (${body.length} bytes)`); + this.debugLogger.log('HTTP', 'Request Body:', body); + + try { + const message = JSON.parse(body); + this.debugLogger.log('HTTP', 'Parsed JSON message:', message); + + const response = await this.handleMessage(message); + this.debugLogger.log('HTTP', 'Response from handleMessage:', response); + + if (response) { + res.statusCode = 200; + res.setHeader('Content-Type', 'application/json'); + const responseJson = JSON.stringify(response); + this.debugLogger.log('HTTP', `Sending 200 response (${responseJson.length} bytes)`); + res.end(responseJson); + } else { + this.debugLogger.log('HTTP', 'Sending 202 response (no content)'); + res.statusCode = 202; + res.end(); + } + } catch (error) { + this.debugLogger.log('ERROR', 'Error parsing JSON or handling message:', error); + res.statusCode = 400; + res.setHeader('Content-Type', 'application/json'); + res.end(JSON.stringify({ + jsonrpc: '2.0', + error: { + code: -32700, + message: 'Parse error', + data: error instanceof Error ? error.message : String(error) + } + })); + } + }); + } catch (error) { + res.statusCode = 500; + res.end('Internal Server Error'); + } + } + + private async handleHttpGet(req: http.IncomingMessage, res: http.ServerResponse): Promise { + this.debugLogger.log('HTTP', 'Setting up SSE stream for GET request'); + + // Set up Server-Sent Events (SSE) stream + res.statusCode = 200; + res.setHeader('Content-Type', 'text/event-stream'); + res.setHeader('Cache-Control', 'no-cache'); + res.setHeader('Connection', 'keep-alive'); + + // Send initial connection acknowledgment + res.write('data: {"type":"connection","status":"established"}\n\n'); + + // Keep connection alive with heartbeat + const heartbeat = setInterval(() => { + if (!res.destroyed) { + res.write('data: {"type":"heartbeat","timestamp":"' + new Date().toISOString() + '"}\n\n'); + } else { + clearInterval(heartbeat); + } + }, 30000); // Send heartbeat every 30 seconds + + // Handle client disconnect + req.on('close', () => { + this.debugLogger.log('HTTP', 'SSE connection closed'); + clearInterval(heartbeat); + }); + + req.on('end', () => { + this.debugLogger.log('HTTP', 'SSE connection ended'); + clearInterval(heartbeat); + }); + } + + private async handleHttpDelete(req: http.IncomingMessage, res: http.ServerResponse): Promise { + // Session termination - could be implemented if needed + res.statusCode = 405; + res.end('Method Not Allowed'); + } + + async handleMessage(message: McpMessage): Promise { + this.debugLogger.log('MCP', 'Handling message:', message); + + try { + switch (message.method) { + case 'initialize': + this.debugLogger.log('MCP', 'Processing initialize request'); + return this.handleInitialize(message); + case 'tools/list': + this.debugLogger.log('MCP', 'Processing tools/list request'); + return this.handleToolsList(message); + case 'tools/call': + this.debugLogger.log('MCP', `Processing tools/call request for tool: ${message.params?.name}`); + return await this.handleToolCall(message); + case 'notifications/initialized': + this.debugLogger.log('MCP', 'Processing notifications/initialized (ignoring)'); + return null; + default: + this.debugLogger.log('MCP', `Unknown method: ${message.method}`); + return { + id: message.id, + type: 'response', + error: { + code: -32601, + message: `Method ${message.method} not found` + } + }; + } + } catch (error) { + return { + id: message.id, + type: 'response', + error: { + code: -32603, + message: 'Internal error', + data: error instanceof Error ? error.message : String(error) + } + }; + } + } + + private handleInitialize(message: McpMessage): McpMessage { + return { + id: message.id, + type: 'response', + result: { + protocolVersion: '2024-11-05', + capabilities: this.config.capabilities, + serverInfo: { + name: this.config.name, + version: this.config.version + } + } + }; + } + + private handleToolsList(message: McpMessage): McpMessage { + const tools = Array.from(this.tools.values()); + return { + id: message.id, + type: 'response', + result: { tools } + }; + } + + private async handleToolCall(message: McpMessage): Promise { + const { name, arguments: args } = message.params; + this.debugLogger.log('MCP', `Tool call - name: "${name}"`, { name, args }); + this.debugLogger.log('MCP', 'Available tools:', Array.from(this.tools.keys())); + + if (name === 'HumanAgent_Chat') { + this.debugLogger.log('MCP', 'Executing HumanAgent_Chat tool'); + return await this.handleHumanAgentChatTool(message.id, args); + } + + this.debugLogger.log('MCP', `Tool not found: ${name}`); + return { + id: message.id, + type: 'response', + error: { + code: -32601, + message: `Tool ${name} not found` + } + }; + } + + private async handleHumanAgentChatTool(messageId: string, params: HumanAgentChatToolParams): Promise { + this.debugLogger.log('TOOL', 'HumanAgent_Chat called with params:', params); + const startTime = Date.now(); + const timeout = (params.timeout || 300) * 1000; // Convert to milliseconds + this.debugLogger.log('TOOL', `Using timeout: ${timeout}ms (${timeout/1000}s)`); + + // Generate unique request ID for tracking this specific request + const requestId = `${messageId}-${Date.now()}`; + this.debugLogger.log('TOOL', `Generated request ID: ${requestId}`); + + // Display message directly in chat UI (no sessions needed) + const displayMessage = params.context ? `${params.context}\n\n${params.message}` : params.message; + this.debugLogger.log('TOOL', 'Displaying message in chat UI:', displayMessage); + + // Emit event to show message in chat UI immediately + this.emit('human-agent-request', { + requestId, + message: params.message, + context: params.context, + priority: params.priority || 'normal', + timestamp: new Date().toISOString() + }); + + // Wait for human response + return new Promise((resolve) => { + // Set up timeout + const timeoutHandle = setTimeout(() => { + this.pendingHumanRequests.delete(requestId); + this.debugLogger.log('TOOL', `Request ${requestId} timed out after ${timeout/1000}s`); + resolve({ + id: messageId, + type: 'response', + error: { + code: -32603, + message: `Human response timeout after ${params.timeout || 300} seconds` + } + }); + }, timeout); + + // Store the pending request + this.pendingHumanRequests.set(requestId, { + resolve: (response: string) => { + clearTimeout(timeoutHandle); + const responseTime = Date.now() - startTime; + this.debugLogger.log('TOOL', `Request ${requestId} completed with response:`, response); + + const result: HumanAgentChatToolResult = { + content: [{ + type: 'text', + text: response + }] + }; + + resolve({ + id: messageId, + type: 'response', + result + }); + }, + reject: (error: Error) => { + clearTimeout(timeoutHandle); + this.debugLogger.log('TOOL', `Request ${requestId} rejected:`, error); + resolve({ + id: messageId, + type: 'response', + error: { + code: -32603, + message: error.message + } + }); + }, + startTime, + params + }); + + this.debugLogger.log('TOOL', `Request ${requestId} waiting for human response...`); + }); + } + + // Method to handle human responses (called by webview) + public respondToHumanRequest(requestId: string, response: string): boolean { + this.debugLogger.log('SERVER', `Received human response for request ${requestId}:`, response); + + const pendingRequest = this.pendingHumanRequests.get(requestId); + if (pendingRequest) { + this.pendingHumanRequests.delete(requestId); + pendingRequest.resolve(response); + return true; + } + + this.debugLogger.log('SERVER', `No pending request found for ID: ${requestId}`); + return false; + } + + // Simplified API - no sessions needed + + getAvailableTools(): McpTool[] { + return Array.from(this.tools.values()); + } + + getPendingRequests(): Array<{id: string, params: HumanAgentChatToolParams, startTime: number}> { + return Array.from(this.pendingHumanRequests.entries()).map(([id, req]) => ({ + id, + params: req.params, + startTime: req.startTime + })); + } + + // Method to manually resolve a pending request (for testing) + resolvePendingRequest(requestId: string, response: string): boolean { + const request = this.pendingHumanRequests.get(requestId); + if (request) { + this.pendingHumanRequests.delete(requestId); + request.resolve(response); + return true; + } + return false; + } + + isServerRunning(): boolean { + return this.isRunning; + } + + getServerUrl(): string { + return `http://127.0.0.1:${this.port}/mcp`; + } + + getPort(): number { + return this.port; + } +} \ No newline at end of file diff --git a/src/mcp/types.ts b/src/mcp/types.ts new file mode 100644 index 0000000..bbb53b4 --- /dev/null +++ b/src/mcp/types.ts @@ -0,0 +1,64 @@ +export interface McpMessage { + id: string; + type: 'request' | 'response' | 'notification'; + method?: string; + params?: any; + result?: any; + error?: { + code: number; + message: string; + data?: any; + }; +} + +export interface ChatMessage { + id: string; + sender: 'user' | 'agent'; + content: string; + timestamp: Date; + type: 'text' | 'system'; +} + +export interface McpServerConfig { + name: string; + description: string; + version: string; + capabilities: { + chat: boolean; + tools: boolean; + resources: boolean; + }; +} + +export interface HumanAgentSession { + id: string; + name: string; + isActive: boolean; + lastActivity: Date; + messages: ChatMessage[]; +} + +export interface McpTool { + name: string; + description: string; + inputSchema: { + type: string; + properties: Record; + required?: string[]; + }; +} + +export interface HumanAgentChatToolParams { + message: string; + context?: string; + sessionId?: string; + priority?: 'low' | 'normal' | 'high' | 'urgent'; + timeout?: number; +} + +export interface HumanAgentChatToolResult { + content: Array<{ + type: 'text'; + text: string; + }>; +} \ No newline at end of file diff --git a/src/providers/chatTreeProvider.ts b/src/providers/chatTreeProvider.ts new file mode 100644 index 0000000..3391a0d --- /dev/null +++ b/src/providers/chatTreeProvider.ts @@ -0,0 +1,56 @@ +import * as vscode from 'vscode'; + +export class ChatTreeProvider implements vscode.TreeDataProvider { + private _onDidChangeTreeData: vscode.EventEmitter = new vscode.EventEmitter(); + readonly onDidChangeTreeData: vscode.Event = this._onDidChangeTreeData.event; + + private hasActiveChat: boolean = false; + + constructor() {} + + refresh(): void { + this._onDidChangeTreeData.fire(); + } + + updateActiveChat(isActive: boolean): void { + this.hasActiveChat = isActive; + this.refresh(); + } + + getTreeItem(element: ChatTreeItem): vscode.TreeItem { + return element; + } + + getChildren(element?: ChatTreeItem): Thenable { + if (!element) { + // Root level - return chat status + const chatItem = new ChatTreeItem( + this.hasActiveChat ? 'HumanAgent Chat (Active)' : 'HumanAgent Chat', + 'chat', + vscode.TreeItemCollapsibleState.None, + 'chat', + { + command: 'humanagent-mcp.openChat', + title: 'Open Chat', + arguments: [] + } + ); + return Promise.resolve([chatItem]); + } + return Promise.resolve([]); + } +} + +export class ChatTreeItem extends vscode.TreeItem { + constructor( + public readonly label: string, + public readonly itemId: string, + public readonly collapsibleState: vscode.TreeItemCollapsibleState, + public readonly contextValue: string, + public readonly command?: vscode.Command + ) { + super(label, collapsibleState); + this.tooltip = `${this.label}`; + this.description = contextValue === 'chat' ? 'MCP Communication' : ''; + } +} \ No newline at end of file diff --git a/src/test/extension.test.ts b/src/test/extension.test.ts new file mode 100644 index 0000000..4ca0ab4 --- /dev/null +++ b/src/test/extension.test.ts @@ -0,0 +1,15 @@ +import * as assert from 'assert'; + +// You can import and use all API from the 'vscode' module +// as well as import your extension to test it +import * as vscode from 'vscode'; +// import * as myExtension from '../../extension'; + +suite('Extension Test Suite', () => { + vscode.window.showInformationMessage('Start all tests.'); + + test('Sample test', () => { + assert.strictEqual(-1, [1, 2, 3].indexOf(5)); + assert.strictEqual(-1, [1, 2, 3].indexOf(0)); + }); +}); diff --git a/src/webview/chatWebviewProvider.ts b/src/webview/chatWebviewProvider.ts new file mode 100644 index 0000000..a737751 --- /dev/null +++ b/src/webview/chatWebviewProvider.ts @@ -0,0 +1,466 @@ +import * as vscode from 'vscode'; +import { McpServer } from '../mcp/server'; +import { ChatMessage } from '../mcp/types'; +import { McpConfigManager } from '../mcp/mcpConfigManager'; + +export class ChatWebviewProvider implements vscode.WebviewViewProvider { + public static readonly viewType = 'humanagent-mcp.chatView'; + + private _view?: vscode.WebviewView; + private mcpServer: McpServer; + private mcpConfigManager?: McpConfigManager; + private extensionPath: string; + private messages: ChatMessage[] = []; + private currentRequestId?: string; + + constructor( + private readonly _extensionUri: vscode.Uri, + mcpServer: McpServer, + mcpConfigManager?: McpConfigManager + ) { + this.mcpServer = mcpServer; + this.mcpConfigManager = mcpConfigManager; + this.extensionPath = _extensionUri.fsPath; + } + + public displayHumanAgentMessage(message: string, context?: string, requestId?: string) { + // Store the current request ID for response handling + this.currentRequestId = requestId; + + // Combine context and message if context exists + const fullMessage = context ? `${context}\n\n${message}` : message; + + // Add AI message to chat + const aiMessage: ChatMessage = { + id: Date.now().toString(), + content: fullMessage, + sender: 'agent', + timestamp: new Date(), + type: 'text' + }; + + this.messages.push(aiMessage); + this.updateWebview(); + + // Focus the chat webview + if (this._view) { + this._view.show?.(true); + } + } + + resolveWebviewView(webviewView: vscode.WebviewView, context: vscode.WebviewViewResolveContext, _token: vscode.CancellationToken) { + this._view = webviewView; + + webviewView.webview.options = { + enableScripts: true, + localResourceRoots: [ + this._extensionUri + ] + }; + + this.updateWebview(); + + webviewView.webview.onDidReceiveMessage(async (data) => { + switch (data.type) { + case 'sendMessage': + await this.sendHumanResponse(data.content); + break; + case 'mcpAction': + await this.handleMcpAction(data.action); + break; + case 'requestServerStatus': + this.updateServerStatus(); + break; + } + }); + } + + private async sendHumanResponse(content: string) { + try { + console.log('ChatWebviewProvider: Sending human response:', content); + + // Add human message to chat + const humanMessage: ChatMessage = { + id: Date.now().toString(), + content: content, + sender: 'user', + timestamp: new Date(), + type: 'text' + }; + + this.messages.push(humanMessage); + this.updateWebview(); + + // Send response back to MCP server + if (this.currentRequestId) { + console.log('ChatWebviewProvider: Responding to request ID:', this.currentRequestId); + this.mcpServer.respondToHumanRequest(this.currentRequestId, content); + this.currentRequestId = undefined; + } + } catch (error) { + console.error('ChatWebviewProvider: Error in sendHumanResponse:', error); + } + } + + public async waitForHumanResponse(): Promise { + // This method is no longer needed since we use direct callbacks + throw new Error('waitForHumanResponse is deprecated - use direct response handling'); + } + + private updateWebview() { + if (this._view) { + this._view.webview.html = this._getHtmlForWebview(this._view.webview); + } + } + + private updateServerStatus() { + if (!this._view) { + return; + } + + const tools = this.mcpServer.getAvailableTools(); + const pendingRequests = this.mcpServer.getPendingRequests(); + const isRegistered = this.mcpConfigManager?.isMcpServerRegistered() ?? false; + + this._view.webview.postMessage({ + type: 'serverStatus', + data: { + running: true, + tools: tools.length, + pendingRequests: pendingRequests.length, + registered: isRegistered + } + }); + } + + private async handleMcpAction(action: string) { + try { + switch (action) { + case 'start': + await this.mcpServer.start(); + vscode.window.showInformationMessage('MCP Server started'); + break; + case 'stop': + await this.mcpServer.stop(); + vscode.window.showInformationMessage('MCP Server stopped'); + break; + case 'restart': + await this.mcpServer.stop(); + await this.mcpServer.start(); + vscode.window.showInformationMessage('MCP Server restarted'); + break; + case 'register': + // Use the MCP configuration from the parent command + vscode.commands.executeCommand('humanagent-mcp.configureMcp'); + break; + case 'unregister': + vscode.commands.executeCommand('humanagent-mcp.configureMcp'); + break; + case 'configure': + vscode.commands.executeCommand('humanagent-mcp.configureMcp'); + break; + } + + // Update status after action + this.updateServerStatus(); + } catch (error) { + vscode.window.showErrorMessage(`MCP action failed: ${error instanceof Error ? error.message : String(error)}`); + } + } + + private _getHtmlForWebview(webview: vscode.Webview) { + const messagesHtml = this.messages.map(message => { + const messageClass = message.sender === 'agent' ? 'ai-message' : 'human-message'; + const timestamp = message.timestamp.toLocaleTimeString(); + const senderLabel = message.sender === 'agent' ? 'AI' : 'Human'; + return ` +
+
+ ${senderLabel} + ${timestamp} +
+
${this._escapeHtml(String(message.content || ''))}
+
+ `; + }).join(''); + + const hasPendingResponse = this.currentRequestId ? 'waiting' : ''; + + return ` + + + + + + HumanAgent Chat + + + +
+
+
+
+ HumanAgent MCP Server +
+
+ + +
+
+
+ +
+ ${messagesHtml || '
Waiting for AI messages...
'} + ${hasPendingResponse ? '
⏳ Waiting for your response...
' : ''} +
+ +
+
+ + +
+
+ + + + + `; + } + + private _escapeHtml(text: string): string { + if (typeof text !== 'string') { + text = String(text || ''); + } + return text + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); + } +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..cb35375 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "module": "Node16", + "target": "ES2022", + "lib": [ + "ES2022" + ], + "sourceMap": true, + "rootDir": "src", + "strict": true, /* enable all strict type-checking options */ + /* Additional Checks */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + } +} diff --git a/vsc-extension-quickstart.md b/vsc-extension-quickstart.md new file mode 100644 index 0000000..f518bb8 --- /dev/null +++ b/vsc-extension-quickstart.md @@ -0,0 +1,48 @@ +# Welcome to your VS Code Extension + +## What's in the folder + +* This folder contains all of the files necessary for your extension. +* `package.json` - this is the manifest file in which you declare your extension and command. + * The sample plugin registers a command and defines its title and command name. With this information VS Code can show the command in the command palette. It doesn’t yet need to load the plugin. +* `src/extension.ts` - this is the main file where you will provide the implementation of your command. + * The file exports one function, `activate`, which is called the very first time your extension is activated (in this case by executing the command). Inside the `activate` function we call `registerCommand`. + * We pass the function containing the implementation of the command as the second parameter to `registerCommand`. + +## Setup + +* install the recommended extensions (amodio.tsl-problem-matcher, ms-vscode.extension-test-runner, and dbaeumer.vscode-eslint) + + +## Get up and running straight away + +* Press `F5` to open a new window with your extension loaded. +* Run your command from the command palette by pressing (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) and typing `Hello World`. +* Set breakpoints in your code inside `src/extension.ts` to debug your extension. +* Find output from your extension in the debug console. + +## Make changes + +* You can relaunch the extension from the debug toolbar after changing code in `src/extension.ts`. +* You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. + + +## Explore the API + +* You can open the full set of our API when you open the file `node_modules/@types/vscode/index.d.ts`. + +## Run tests + +* Install the [Extension Test Runner](https://marketplace.visualstudio.com/items?itemName=ms-vscode.extension-test-runner) +* Run the "watch" task via the **Tasks: Run Task** command. Make sure this is running, or tests might not be discovered. +* Open the Testing view from the activity bar and click the Run Test" button, or use the hotkey `Ctrl/Cmd + ; A` +* See the output of the test result in the Test Results view. +* Make changes to `src/test/extension.test.ts` or create new test files inside the `test` folder. + * The provided test runner will only consider files matching the name pattern `**.test.ts`. + * You can create folders inside the `test` folder to structure your tests any way you want. + +## Go further + +* Reduce the extension size and improve the startup time by [bundling your extension](https://code.visualstudio.com/api/working-with-extensions/bundling-extension). +* [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code extension marketplace. +* Automate builds by setting up [Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration). diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..bc4b448 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,84 @@ +//@ts-check + +'use strict'; + +const path = require('path'); + +//@ts-check +/** @typedef {import('webpack').Configuration} WebpackConfig **/ + +/** @type WebpackConfig */ +const extensionConfig = { + target: 'node', // VS Code extensions run in a Node.js-context 📖 -> https://webpack.js.org/configuration/node/ + mode: 'none', // this leaves the source code as close as possible to the original (when packaging we set this to 'production') + + entry: './src/extension.ts', // the entry point of this extension, 📖 -> https://webpack.js.org/configuration/entry-context/ + output: { + // the bundle is stored in the 'dist' folder (check package.json), 📖 -> https://webpack.js.org/configuration/output/ + path: path.resolve(__dirname, 'dist'), + filename: 'extension.js', + libraryTarget: 'commonjs2' + }, + externals: { + vscode: 'commonjs vscode' // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, 📖 -> https://webpack.js.org/configuration/externals/ + // modules added here also need to be added in the .vscodeignore file + }, + resolve: { + // support reading TypeScript and JavaScript files, 📖 -> https://github.com/TypeStrong/ts-loader + extensions: ['.ts', '.js'] + }, + module: { + rules: [ + { + test: /\.ts$/, + exclude: /node_modules/, + use: [ + { + loader: 'ts-loader' + } + ] + } + ] + }, + devtool: 'nosources-source-map', + infrastructureLogging: { + level: "log", // enables logging required for problem matchers + }, +}; + +/** @type WebpackConfig */ +const mcpServerConfig = { + target: 'node', + mode: 'none', + entry: './src/mcp/mcpStandalone.ts', + output: { + path: path.resolve(__dirname, 'dist'), + filename: 'mcpStandalone.js', + libraryTarget: 'commonjs2' + }, + externals: { + vscode: 'commonjs vscode' + }, + resolve: { + extensions: ['.ts', '.js'] + }, + module: { + rules: [ + { + test: /\.ts$/, + exclude: /node_modules/, + use: [ + { + loader: 'ts-loader' + } + ] + } + ] + }, + devtool: 'nosources-source-map', + infrastructureLogging: { + level: "log", + }, +}; + +module.exports = [ extensionConfig, mcpServerConfig ]; \ No newline at end of file