diff --git a/.cursor/commands/bi-test-healer.md b/.cursor/commands/bi-test-healer.md new file mode 100644 index 00000000000..6604d740305 --- /dev/null +++ b/.cursor/commands/bi-test-healer.md @@ -0,0 +1,44 @@ +--- +description: Use this agent when you need to debug and fix failing Playwright tests. +tools: ['edit/createFile', 'edit/createDirectory', 'edit/editFiles', 'search/fileSearch', 'search/textSearch', 'search/listDirectory', 'search/readFile', 'playwright-test/browser_console_messages', 'playwright-test/browser_evaluate', 'playwright-test/browser_generate_locator', 'playwright-test/browser_network_requests', 'playwright-test/browser_snapshot', 'playwright-test/test_debug', 'playwright-test/test_list', 'playwright-test/test_run'] +--- + +You are the Playwright Test Healer, an expert test automation engineer specializing in debugging and +resolving Playwright test failures. Your mission is to systematically identify, diagnose, and fix +broken Playwright tests using a methodical approach. + +Your workflow: +1. **Initial Execution**: Run all tests using playwright_test_run_test tool to identify failing tests +2. **Debug failed tests**: For each failing test run playwright_test_debug_test. +3. **Error Investigation**: When the test pauses on errors, use available Playwright MCP tools to: + - Examine the error details + - Capture page snapshot to understand the context + - Analyze selectors, timing issues, or assertion failures +4. **Root Cause Analysis**: Determine the underlying cause of the failure by examining: + - Element selectors that may have changed + - Timing and synchronization issues + - Data dependencies or test environment problems + - Application changes that broke test assumptions +5. **Code Remediation**: Edit the test code to address identified issues, focusing on: + - Updating selectors to match current application state + - Fixing assertions and expected values + - Improving test reliability and maintainability + - For inherently dynamic data, utilize regular expressions to produce resilient locators +6. **Verification**: Restart the test after each fix to validate the changes +7. **Iteration**: Repeat the investigation and fixing process until the test passes cleanly + +Key principles: +- Be systematic and thorough in your debugging approach +- Document your findings and reasoning for each fix +- Prefer robust, maintainable solutions over quick hacks +- Use Playwright best practices for reliable test automation +- If multiple errors exist, fix them one at a time and retest +- Provide clear explanations of what was broken and how you fixed it +- You will continue this process until the test runs successfully without any failures or errors. +- If the error persists and you have high level of confidence that the test is correct, mark this test as test.fixme() + so that it is skipped during the execution. Add a comment before the failing step explaining what is happening instead + of the expected behavior. +- Do not ask user questions, you are not interactive tool, do the most reasonable thing possible to pass the test. +- Never wait for networkidle or use other discouraged or deprecated apis +Context: A developer has a failing Playwright test that needs to be debugged and fixed. user: 'The login test is failing, can you fix it?' assistant: 'I'll use the healer agent to debug and fix the failing login test.' The user has identified a specific failing test that needs debugging and fixing, which is exactly what the healer agent is designed for. +Context: After running a test suite, several tests are reported as failing. user: 'Test user-registration.spec.ts is broken after the recent changes' assistant: 'Let me use the healer agent to investigate and fix the user-registration test.' A specific test file is failing and needs debugging, which requires the systematic approach of the playwright-test-healer agent. \ No newline at end of file diff --git a/.cursor/commands/generate-ai-tests.md b/.cursor/commands/generate-ai-tests.md new file mode 100644 index 00000000000..2bf8592e911 --- /dev/null +++ b/.cursor/commands/generate-ai-tests.md @@ -0,0 +1,59 @@ +--- +description: Use this agent when you need to create automated browser tests using Playwright. +tools: ['search/fileSearch', 'search/textSearch', 'search/listDirectory', 'search/readFile', 'microsoft/playwright-mcp/*'] +--- + +You are a Playwright Test Generator, an expert in browser automation and end-to-end testing. +Your specialty is creating robust, reliable Playwright tests that accurately simulate user interactions and validate +application behavior. + +# For each test you generate +- First you must go to the given url and go through the vscode extension application +- Obtain the test plan with all the steps and verification specification +- Run the `generator_setup_page` tool to set up page for the scenario +- For each step and verification in the scenario, do the following: + - Use Playwright tool to manually execute it in real-time. + - Use the step description as the intent for each Playwright tool call. +- Retrieve generator log via `generator_read_log` +- Immediately after reading the test log, invoke `generator_write_test` with the generated source code + - File should contain single test + - File name must be fs-friendly scenario name + - Test must be placed in a describe matching the top-level test plan item + - Test title must match the scenario name + - Includes a comment with the step text before each step execution. Do not duplicate comments if step requires + multiple actions. + - Always use best practices from the log when generating tests. + + + For following plan: + + ```markdown file=specs/plan.md + ### 1. Adding New Todos + **Seed:** `test/e2e-playwright-tests/seed.spec.ts` + + #### 1.1 Add Valid Todo + **Steps:** + 1. Click in the "What needs to be done?" input field + + #### 1.2 Add Multiple Todos + ... + ``` + + Following file is generated: + + ```ts file=add-valid-todo.spec.ts + // spec: specs/plan.md + // seed: tests/seed.spec.ts + + test.describe('Adding New Todos', () => { + test('Add Valid Todo', async { page } => { + // 1. Click in the "What needs to be done?" input field + await page.click(...); + + ... + }); + }); + ``` + +Context: User wants to test a login flow on their web application. user: 'I need a test that logs into my app at localhost:3000 with username admin@test.com and password 123456, then verifies the dashboard page loads' assistant: 'I'll use the generator agent to create and validate this login test for you' The user needs a specific browser automation test created, which is exactly what the generator agent is designed for. +Context: User has built a new checkout flow and wants to ensure it works correctly. user: 'Can you create a test that adds items to cart, proceeds to checkout, fills in payment details, and confirms the order?' assistant: 'I'll use the generator agent to build a comprehensive checkout flow test' This is a complex user journey that needs to be automated and tested, perfect for the generator agent. \ No newline at end of file diff --git a/.cursor/commands/planner.md b/.cursor/commands/planner.md new file mode 100644 index 00000000000..d0699310c04 --- /dev/null +++ b/.cursor/commands/planner.md @@ -0,0 +1,92 @@ +--- +description: Use this agent when you need to create comprehensive test plan for a web application or website. +tools: ['edit/createFile', 'edit/createDirectory', 'search/fileSearch', 'search/textSearch', 'search/listDirectory', 'search/readFile', 'playwright-test/browser_click', 'playwright-test/browser_close', 'playwright-test/browser_console_messages', 'playwright-test/browser_drag', 'playwright-test/browser_evaluate', 'playwright-test/browser_file_upload', 'playwright-test/browser_handle_dialog', 'playwright-test/browser_hover', 'playwright-test/browser_navigate', 'playwright-test/browser_navigate_back', 'playwright-test/browser_network_requests', 'playwright-test/browser_press_key', 'playwright-test/browser_select_option', 'playwright-test/browser_snapshot', 'playwright-test/browser_take_screenshot', 'playwright-test/browser_type', 'playwright-test/browser_wait_for', 'playwright-test/planner_setup_page'] +--- + +You are an expert web test planner with extensive experience in quality assurance, user experience testing, and test +scenario design. Your expertise includes functional testing, edge case identification, and comprehensive test coverage +planning. + +You will: + +1. **Navigate and Explore** + - Invoke the `planner_setup_page` tool once to set up page before using any other tools + - Explore the browser snapshot + - Do not take screenshots unless absolutely necessary + - Use browser_* tools to navigate and discover interface + - Thoroughly explore the interface, identifying all interactive elements, forms, navigation paths, and functionality + +2. **Analyze User Flows** + - Map out the primary user journeys and identify critical paths through the application + - Consider different user types and their typical behaviors + +3. **Design Comprehensive Scenarios** + + Create detailed test scenarios that cover: + - Happy path scenarios (normal user behavior) + - Edge cases and boundary conditions + - Error handling and validation + +4. **Structure Test Plans** + + Each scenario must include: + - Clear, descriptive title + - Detailed step-by-step instructions + - Expected outcomes where appropriate + - Assumptions about starting state (always assume blank/fresh state) + - Success criteria and failure conditions + +5. **Create Documentation** + + Save your test plan as requested: + - Executive summary of the tested page/application + - Individual scenarios as separate sections + - Each scenario formatted with numbered steps + - Clear expected results for verification + + +# TodoMVC Application - Comprehensive Test Plan + +## Application Overview + +The TodoMVC application is a React-based todo list manager that provides core task management functionality. The +application features: + +- **Task Management**: Add, edit, complete, and delete individual todos +- **Bulk Operations**: Mark all todos as complete/incomplete and clear all completed todos +- **Filtering**: View todos by All, Active, or Completed status +- **URL Routing**: Support for direct navigation to filtered views via URLs +- **Counter Display**: Real-time count of active (incomplete) todos +- **Persistence**: State maintained during session (browser refresh behavior not tested) + +## Test Scenarios + +### 1. Adding New Todos + +**Seed:** `e2e-playwright-tests/ai-written-tests/seed.spec.ts` + +#### 1.1 Add Valid Todo +**Steps:** +1. Click in the "What needs to be done?" input field +2. Type "Buy groceries" +3. Press Enter key + +**Expected Results:** +- Todo appears in the list with unchecked checkbox +- Counter shows "1 item left" +- Input field is cleared and ready for next entry +- Todo list controls become visible (Mark all as complete checkbox) + +#### 1.2 +... + + +**Quality Standards**: +- Write steps that are specific enough for any tester to follow +- Include negative testing scenarios +- Ensure scenarios are independent and can be run in any order + +**Output Format**: Always save the complete test plan as a markdown file with clear headings, numbered steps, and +professional formatting suitable for sharing with development and QA teams. +Context: User wants to test a new e-commerce checkout flow. user: 'I need test scenarios for our new checkout process at https://mystore.com/checkout' assistant: 'I'll use the planner agent to navigate to your checkout page and create comprehensive test scenarios.' The user needs test planning for a specific web page, so use the planner agent to explore and create test scenarios. +Context: User has deployed a new feature and wants thorough testing coverage. user: 'Can you help me test our new user dashboard at https://app.example.com/dashboard?' assistant: 'I'll launch the planner agent to explore your dashboard and develop detailed test scenarios.' This requires web exploration and test scenario creation, perfect for the planner agent. \ No newline at end of file diff --git a/.github/actions/build/action.yml b/.github/actions/build/action.yml index c0edca894b1..b8ff8c60782 100644 --- a/.github/actions/build/action.yml +++ b/.github/actions/build/action.yml @@ -45,34 +45,32 @@ inputs: type: string required: false BALLERINA_AUTH_ORG: - default: true type: string BALLERINA_AUTH_CLIENT_ID: - default: true type: string + BALLERINA_DEV_COPLIOT_ROOT_URL: + type: string + BALLERINA_DEV_COPLIOT_AUTH_ORG: + type: string + BALLERINA_DEV_COPLIOT_AUTH_CLIENT_ID: + type: string + BALLERINA_DEV_COPLIOT_AUTH_REDIRECT_URL: + type: string MI_AUTH_ORG: - default: true type: string MI_AUTH_CLIENT_ID: - default: true type: string PLATFORM_DEFAULT_GHAPP_CLIENT_ID: - default: true type: string PLATFORM_DEFAULT_DEVANT_ASGARDEO_CLIENT_ID: - default: true type: string PLATFORM_STAGE_GHAPP_CLIENT_ID: - default: true type: string PLATFORM_STAGE_DEVANT_ASGARDEO_CLIENT_ID: - default: true type: string PLATFORM_DEV_GHAPP_CLIENT_ID: - default: true type: string PLATFORM_DEV_DEVANT_ASGARDEO_CLIENT_ID: - default: true type: string runs: @@ -167,6 +165,10 @@ runs: isPreRelease: ${{ inputs.isPreRelease == 'true' }} BALLERINA_AUTH_ORG: ${{ inputs.BALLERINA_AUTH_ORG }} BALLERINA_AUTH_CLIENT_ID: ${{ inputs.BALLERINA_AUTH_CLIENT_ID }} + BALLERINA_DEV_COPLIOT_ROOT_URL: ${{ inputs.BALLERINA_DEV_COPLIOT_ROOT_URL }} + BALLERINA_DEV_COPLIOT_AUTH_ORG: ${{ inputs.BALLERINA_DEV_COPLIOT_AUTH_ORG }} + BALLERINA_DEV_COPLIOT_AUTH_CLIENT_ID: ${{ inputs.BALLERINA_DEV_COPLIOT_AUTH_CLIENT_ID }} + BALLERINA_DEV_COPLIOT_AUTH_REDIRECT_URL: ${{ inputs.BALLERINA_DEV_COPLIOT_AUTH_REDIRECT_URL }} MI_AUTH_ORG: ${{ inputs.MI_AUTH_ORG }} MI_AUTH_CLIENT_ID: ${{ inputs.MI_AUTH_CLIENT_ID }} PLATFORM_DEFAULT_GHAPP_CLIENT_ID: ${{ inputs.PLATFORM_DEFAULT_GHAPP_CLIENT_ID }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index eb1f7b7c52f..8522f3cb7c2 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -205,6 +205,10 @@ jobs: token: ${{ secrets.CHOREO_BOT_TOKEN }} BALLERINA_AUTH_ORG: ${{ secrets.BALLERINA_AUTH_ORG }} BALLERINA_AUTH_CLIENT_ID: ${{ secrets.BALLERINA_AUTH_CLIENT_ID }} + BALLERINA_DEV_COPLIOT_ROOT_URL: ${{ secrets.BALLERINA_DEV_COPLIOT_ROOT_URL }} + BALLERINA_DEV_COPLIOT_AUTH_ORG: ${{ secrets.BALLERINA_DEV_COPLIOT_AUTH_ORG }} + BALLERINA_DEV_COPLIOT_AUTH_CLIENT_ID: ${{ secrets.BALLERINA_DEV_COPLIOT_AUTH_CLIENT_ID }} + BALLERINA_DEV_COPLIOT_AUTH_REDIRECT_URL: ${{ secrets.BALLERINA_DEV_COPLIOT_AUTH_REDIRECT_URL }} MI_AUTH_ORG: ${{ secrets.MI_AUTH_ORG }} MI_AUTH_CLIENT_ID: ${{ secrets.MI_AUTH_CLIENT_ID }} PLATFORM_DEFAULT_GHAPP_CLIENT_ID: ${{ secrets.PLATFORM_DEFAULT_GHAPP_CLIENT_ID }} diff --git a/.trivyignore b/.trivyignore index 66301551846..37f268eb45d 100644 --- a/.trivyignore +++ b/.trivyignore @@ -4,3 +4,6 @@ # No fix released by the author # https://github.com/wso2/vscode-extensions/issues/550 CVE-2020-36851 + +# https://github.com/actions/cache/issues/1693 +CVE-2026-22036 diff --git a/.vscode/launch.json b/.vscode/launch.json index 28d44bc5469..2f9a4a62441 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -258,7 +258,7 @@ "outFiles": [ "${workspaceFolder}/workspaces/ballerina/ballerina-extension/out/test/**/*.js" ], - "preLaunchTask": "compile:ballerina-tests", + "preLaunchTask": "clean-and-compile:ballerina-tests", "envFile": "${workspaceFolder}/workspaces/ballerina/ballerina-extension/.env" }, { @@ -280,7 +280,7 @@ "outFiles": [ "${workspaceFolder}/workspaces/ballerina/ballerina-extension/out/test/**/*.js" ], - "preLaunchTask": "compile:ballerina-tests", + "preLaunchTask": "clean-and-compile:ballerina-tests", "envFile": "${workspaceFolder}/workspaces/ballerina/ballerina-extension/.env" }, { @@ -296,4 +296,4 @@ "preLaunchTask": "npm: watch-apk" }, ] -} \ No newline at end of file +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json index b9523f5c3a6..29a79960663 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -195,12 +195,36 @@ "isDefault": true } }, + { + "label": "clean:ballerina-test-output", + "type": "shell", + "command": "rm", + "args": ["-rf", "out"], + "options": { + "cwd": "${workspaceFolder}/workspaces/ballerina/ballerina-extension" + } + }, { "label": "compile:ballerina-tests", "type": "npm", "path": "workspaces/ballerina/ballerina-extension", "script": "test-compile", }, + { + "label": "build:ballerina-extension", + "type": "npm", + "path": "workspaces/ballerina/ballerina-extension", + "script": "compile" + }, + { + "label": "clean-and-compile:ballerina-tests", + "dependsOn": [ + "clean:ballerina-test-output", + "build:ballerina-extension", + "compile:ballerina-tests" + ], + "dependsOrder": "sequence" + }, { "label": "compile:wso2-platform-tests", "type": "npm", diff --git a/ballerina-extension.code-workspace b/ballerina-extension.code-workspace index 414009b7e59..6572a51df4d 100644 --- a/ballerina-extension.code-workspace +++ b/ballerina-extension.code-workspace @@ -13,7 +13,7 @@ "path": "workspaces/common-libs/ui-toolkit" }, { - "path": "workspaces/ballerina/data-mapper-view" + "path": "workspaces/ballerina/data-mapper" }, { "path": "workspaces/ballerina/statement-editor" diff --git a/common/autoinstallers/rush-plugins/package.json b/common/autoinstallers/rush-plugins/package.json index 72f5f360e7d..49e6696f870 100644 --- a/common/autoinstallers/rush-plugins/package.json +++ b/common/autoinstallers/rush-plugins/package.json @@ -2,7 +2,11 @@ "name": "rush-plugins", "version": "1.0.0", "private": true, + "pnpm": { + "overrides": { + } + }, "dependencies": { - "@gigara/rush-github-action-build-cache-plugin": "^1.1.1" + "@gigara/rush-github-action-build-cache-plugin": "^1.1.4" } } diff --git a/common/autoinstallers/rush-plugins/pnpm-lock.yaml b/common/autoinstallers/rush-plugins/pnpm-lock.yaml index 4bee8099969..165f3ae8d89 100644 --- a/common/autoinstallers/rush-plugins/pnpm-lock.yaml +++ b/common/autoinstallers/rush-plugins/pnpm-lock.yaml @@ -9,28 +9,28 @@ importers: .: dependencies: '@gigara/rush-github-action-build-cache-plugin': - specifier: ^1.1.1 - version: 1.1.1 + specifier: ^1.1.4 + version: 1.1.4 packages: - '@actions/cache@4.0.3': - resolution: {integrity: sha512-SvrqFtYJ7I48A/uXNkoJrnukx5weQv1fGquhs3+4nkByZThBH109KTIqj5x/cGV7JGNvb8dLPVywUOqX1fjiXg==} + '@actions/cache@5.0.5': + resolution: {integrity: sha512-jiQSg0gfd+C2KPgcmdCOq7dCuCIQQWQ4b1YfGIRaaA9w7PJbRwTOcCz4LiFEUnqZGf0ha/8OKL3BeNwetHzYsQ==} - '@actions/core@1.11.1': - resolution: {integrity: sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==} + '@actions/core@2.0.3': + resolution: {integrity: sha512-Od9Thc3T1mQJYddvVPM4QGiLUewdh+3txmDYHHxoNdkqysR1MbCT+rFOtNUxYAz+7+6RIsqipVahY2GJqGPyxA==} - '@actions/exec@1.1.1': - resolution: {integrity: sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==} + '@actions/exec@2.0.0': + resolution: {integrity: sha512-k8ngrX2voJ/RIN6r9xB82NVqKpnMRtxDoiO+g3olkIUpQNqjArXrCQceduQZCQj3P3xm32pChRLqRrtXTlqhIw==} - '@actions/glob@0.1.2': - resolution: {integrity: sha512-SclLR7Ia5sEqjkJTPs7Sd86maMDw43p769YxBOxvPvEWuPEhpAnBsQfENOpXjFYMmhCqd127bmf+YdvJqVqR4A==} + '@actions/glob@0.5.1': + resolution: {integrity: sha512-+dv/t2aKQdKp9WWSp+1yIXVJzH5Q38M0Mta26pzIbeec14EcIleMB7UU6N7sNgbEuYfyuVGpE5pOKjl6j1WXkA==} - '@actions/http-client@2.2.3': - resolution: {integrity: sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==} + '@actions/http-client@3.0.2': + resolution: {integrity: sha512-JP38FYYpyqvUsz+Igqlc/JG6YO9PaKuvqjM3iGvaLqFnJ7TFmcLyy2IDrY0bI0qCQug8E9K+elv5ZNfw62ZJzA==} - '@actions/io@1.1.3': - resolution: {integrity: sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==} + '@actions/io@2.0.0': + resolution: {integrity: sha512-Jv33IN09XLO+0HS79aaODsvIRyduiF7NY/F6LYeK5oeUmrsz7aFdRphQjFoESF4jS7lMauDOttKALcpapVDIAg==} '@azure/abort-controller@1.1.0': resolution: {integrity: sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw==} @@ -40,17 +40,17 @@ packages: resolution: {integrity: sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA==} engines: {node: '>=18.0.0'} - '@azure/core-auth@1.10.0': - resolution: {integrity: sha512-88Djs5vBvGbHQHf5ZZcaoNHo6Y8BKZkt3cw2iuJIQzLEgH4Ox6Tm4hjFhbqOxyYsgIG/eJbFEHpxRIfEEWv5Ow==} + '@azure/core-auth@1.10.1': + resolution: {integrity: sha512-ykRMW8PjVAn+RS6ww5cmK9U2CyH9p4Q88YJwvUslfuMmN98w/2rdGRLPqJYObapBCdzBVeDgYWdJnFPFb7qzpg==} engines: {node: '>=20.0.0'} - '@azure/core-client@1.10.0': - resolution: {integrity: sha512-O4aP3CLFNodg8eTHXECaH3B3CjicfzkxVtnrfLkOq0XNP7TIECGfHpK/C6vADZkWP75wzmdBnsIA8ksuJMk18g==} + '@azure/core-client@1.10.1': + resolution: {integrity: sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==} engines: {node: '>=20.0.0'} - '@azure/core-http-compat@2.3.0': - resolution: {integrity: sha512-qLQujmUypBBG0gxHd0j6/Jdmul6ttl24c8WGiLXIk7IHXdBlfoBqW27hyz3Xn6xbfdyVSarl1Ttbk0AwnZBYCw==} - engines: {node: '>=18.0.0'} + '@azure/core-http-compat@2.3.1': + resolution: {integrity: sha512-az9BkXND3/d5VgdRRQVkiJb2gOmDU8Qcq4GvjtBmDICNiQ9udFmDk4ZpSB5Qq1OmtDJGlQAfBaS4palFsazQ5g==} + engines: {node: '>=20.0.0'} '@azure/core-lro@2.7.2': resolution: {integrity: sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw==} @@ -60,16 +60,16 @@ packages: resolution: {integrity: sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA==} engines: {node: '>=18.0.0'} - '@azure/core-rest-pipeline@1.22.0': - resolution: {integrity: sha512-OKHmb3/Kpm06HypvB3g6Q3zJuvyXcpxDpCS1PnU8OV6AJgSFaee/covXBcPbWc6XDDxtEPlbi3EMQ6nUiPaQtw==} + '@azure/core-rest-pipeline@1.22.2': + resolution: {integrity: sha512-MzHym+wOi8CLUlKCQu12de0nwcq9k9Kuv43j4Wa++CsCpJwps2eeBQwD2Bu8snkxTtDKDx4GwjuR9E8yC8LNrg==} engines: {node: '>=20.0.0'} - '@azure/core-tracing@1.3.0': - resolution: {integrity: sha512-+XvmZLLWPe67WXNZo9Oc9CrPj/Tm8QnHR92fFAFdnbzwNdCH1h+7UdpaQgRSBsMY+oW1kHXNUZQLdZ1gHX3ROw==} + '@azure/core-tracing@1.3.1': + resolution: {integrity: sha512-9MWKevR7Hz8kNzzPLfX4EAtGM2b8mr50HPDBvio96bURP/9C+HjdH3sBlLSNNrvRAr5/k/svoH457gB5IKpmwQ==} engines: {node: '>=20.0.0'} - '@azure/core-util@1.13.0': - resolution: {integrity: sha512-o0psW8QWQ58fq3i24Q1K2XfS/jYTxr7O1HRcyUE9bV9NttLU+kYOH82Ixj8DGlMTOWgxm1Sss2QAfKK5UkSPxw==} + '@azure/core-util@1.13.1': + resolution: {integrity: sha512-XPArKLzsvl0Hf0CaGyKHUyVgF7oDnhKoP85Xv6M4StF/1AhfORhZudHtOyf2s+FcbuQ9dPRAjB8J2KvRRMUK2A==} engines: {node: '>=20.0.0'} '@azure/core-xml@1.5.0': @@ -80,33 +80,16 @@ packages: resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} engines: {node: '>=20.0.0'} - '@azure/ms-rest-js@2.7.0': - resolution: {integrity: sha512-ngbzWbqF+NmztDOpLBVDxYM+XLcUj7nKhxGbSU9WtIsXfRB//cf2ZbAG5HkOrhU9/wd/ORRB6lM/d69RKVjiyA==} - - '@azure/storage-blob@12.27.0': - resolution: {integrity: sha512-IQjj9RIzAKatmNca3D6bT0qJ+Pkox1WZGOg2esJF2YLHb45pQKOwGPIAV+w3rfgkj7zV3RMxpn/c6iftzSOZJQ==} - engines: {node: '>=18.0.0'} - - '@bufbuild/protobuf@2.6.1': - resolution: {integrity: sha512-DaG6XlyKpz08bmHY5SGX2gfIllaqtDJ/KwVoxsmP22COOLYwDBe7yD3DZGwXem/Xq7QOc9cuR7R3MpAv5CFfDw==} - - '@bufbuild/protoplugin@2.6.1': - resolution: {integrity: sha512-pheV/ysWCMSCyRnR7oE2qjEM2QEFFkwYOtHaS86VbxbGfSohcw64rorU7ldCVFZHlFjIsSAqd/yIuTy4J3Itlg==} - - '@fastify/busboy@2.1.1': - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - - '@gigara/rush-github-action-build-cache-plugin@1.1.1': - resolution: {integrity: sha512-lSGoYyG+EPYmQhqUTBq6tJupNZgiWWFG2OWtqU2TY16FB5DPgk2Y3WbBHOcBb4rL3tr2srmH82ffc5lT83qfCg==} + '@azure/storage-blob@12.30.0': + resolution: {integrity: sha512-peDCR8blSqhsAKDbpSP/o55S4sheNwSrblvCaHUZ5xUI73XA7ieUGGwrONgD/Fng0EoDe1VOa3fAQ7+WGB3Ocg==} + engines: {node: '>=20.0.0'} - '@protobuf-ts/plugin@2.11.1': - resolution: {integrity: sha512-HyuprDcw0bEEJqkOWe1rnXUP0gwYLij8YhPuZyZk6cJbIgc/Q0IFgoHQxOXNIXAcXM4Sbehh6kjVnCzasElw1A==} - hasBin: true + '@azure/storage-common@12.2.0': + resolution: {integrity: sha512-YZLxiJ3vBAAnFbG3TFuAMUlxZRexjQX5JDQxOkFGb6e2TpoxH3xyHI6idsMe/QrWtj41U/KoqBxlayzhS+LlwA==} + engines: {node: '>=20.0.0'} - '@protobuf-ts/protoc@2.11.1': - resolution: {integrity: sha512-mUZJaV0daGO6HUX90o/atzQ6A7bbN2RSuHtdwo8SSF2Qoe3zHwa4IHyCN1evftTeHfLmdz+45qo47sL+5P8nyg==} - hasBin: true + '@gigara/rush-github-action-build-cache-plugin@1.1.4': + resolution: {integrity: sha512-KL87XJSiKwXEXtAj9g1CSOSFa02URE+PHZy/hnbLQNQuL/yGr3gvC+ZEhiYC5GL7/a+ZD+yaGJmU/KMX7NatOg==} '@protobuf-ts/runtime-rpc@2.11.1': resolution: {integrity: sha512-4CqqUmNA+/uMz00+d3CYKgElXO9VrEbucjnBFEjqI4GuDrEQ32MaI3q+9qPBvIGOlL4PmHXrzM32vBPWRhQKWQ==} @@ -114,45 +97,25 @@ packages: '@protobuf-ts/runtime@2.11.1': resolution: {integrity: sha512-KuDaT1IfHkugM2pyz+FwiY80ejWrkH1pAtOBOZFuR6SXEFTsnb/jiQWQ1rCIrcKx2BtyxnxW6BWwsVSA/Ie+WQ==} - '@typescript/vfs@1.6.1': - resolution: {integrity: sha512-JwoxboBh7Oz1v38tPbkrZ62ZXNHAk9bJ7c9x0eI5zBfBnBYGhURdbnh7Z4smN/MV48Y5OCcZb58n972UtbazsA==} - peerDependencies: - typescript: '*' - - '@typespec/ts-http-runtime@0.3.0': - resolution: {integrity: sha512-sOx1PKSuFwnIl7z4RN0Ls7N9AQawmR9r66eI5rFCzLDIs8HTIYrIpH9QjYWoX0lkgGrkLxXhi4QnK7MizPRrIg==} + '@typespec/ts-http-runtime@0.3.2': + resolution: {integrity: sha512-IlqQ/Gv22xUC1r/WQm4StLkYQmaaTsXAhUVsNE0+xiyf0yRFiH5++q78U3bw6bLKDCTmh0uqKB9eG9+Bt75Dkg==} engines: {node: '>=20.0.0'} - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -160,73 +123,14 @@ packages: supports-color: optional: true - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.1.0: - resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} - engines: {node: '>= 0.4'} - - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - fast-xml-parser@5.2.5: - resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} + fast-xml-parser@5.3.4: + resolution: {integrity: sha512-EFd6afGmXlCx8H8WTZHhAoDaWaGyuIBoZJ2mknrNxug+aZKjkp0a0dlars9Izl+jF+7Gu1/5f/2h68cQpe0IiA==} hasBin: true - form-data@2.5.5: - resolution: {integrity: sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==} - engines: {node: '>= 0.12'} - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -235,51 +139,18 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} - semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - strnum@2.1.1: - resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + strnum@2.1.2: + resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -288,76 +159,47 @@ packages: resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - typescript@3.9.10: - resolution: {integrity: sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==} - engines: {node: '>=4.2.0'} - hasBin: true - - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true - - undici@5.29.0: - resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} - engines: {node: '>=14.0'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - xml2js@0.5.0: - resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} - engines: {node: '>=4.0.0'} - - xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} + undici@6.23.0: + resolution: {integrity: sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==} + engines: {node: '>=18.17'} snapshots: - '@actions/cache@4.0.3': + '@actions/cache@5.0.5': dependencies: - '@actions/core': 1.11.1 - '@actions/exec': 1.1.1 - '@actions/glob': 0.1.2 - '@actions/http-client': 2.2.3 - '@actions/io': 1.1.3 + '@actions/core': 2.0.3 + '@actions/exec': 2.0.0 + '@actions/glob': 0.5.1 + '@actions/http-client': 3.0.2 + '@actions/io': 2.0.0 '@azure/abort-controller': 1.1.0 - '@azure/ms-rest-js': 2.7.0 - '@azure/storage-blob': 12.27.0 - '@protobuf-ts/plugin': 2.11.1 + '@azure/core-rest-pipeline': 1.22.2 + '@azure/storage-blob': 12.30.0 + '@protobuf-ts/runtime-rpc': 2.11.1 semver: 6.3.1 transitivePeerDependencies: - - encoding - supports-color - '@actions/core@1.11.1': + '@actions/core@2.0.3': dependencies: - '@actions/exec': 1.1.1 - '@actions/http-client': 2.2.3 + '@actions/exec': 2.0.0 + '@actions/http-client': 3.0.2 - '@actions/exec@1.1.1': + '@actions/exec@2.0.0': dependencies: - '@actions/io': 1.1.3 + '@actions/io': 2.0.0 - '@actions/glob@0.1.2': + '@actions/glob@0.5.1': dependencies: - '@actions/core': 1.11.1 + '@actions/core': 2.0.3 minimatch: 3.1.2 - '@actions/http-client@2.2.3': + '@actions/http-client@3.0.2': dependencies: tunnel: 0.0.6 - undici: 5.29.0 + undici: 6.23.0 - '@actions/io@1.1.3': {} + '@actions/io@2.0.0': {} '@azure/abort-controller@1.1.0': dependencies: @@ -367,38 +209,38 @@ snapshots: dependencies: tslib: 2.8.1 - '@azure/core-auth@1.10.0': + '@azure/core-auth@1.10.1': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-util': 1.13.0 + '@azure/core-util': 1.13.1 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/core-client@1.10.0': + '@azure/core-client@1.10.1': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.10.0 - '@azure/core-rest-pipeline': 1.22.0 - '@azure/core-tracing': 1.3.0 - '@azure/core-util': 1.13.0 + '@azure/core-auth': 1.10.1 + '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/core-http-compat@2.3.0': + '@azure/core-http-compat@2.3.1': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-client': 1.10.0 - '@azure/core-rest-pipeline': 1.22.0 + '@azure/core-client': 1.10.1 + '@azure/core-rest-pipeline': 1.22.2 transitivePeerDependencies: - supports-color '@azure/core-lro@2.7.2': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-util': 1.13.0 + '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 tslib: 2.8.1 transitivePeerDependencies: @@ -408,121 +250,89 @@ snapshots: dependencies: tslib: 2.8.1 - '@azure/core-rest-pipeline@1.22.0': + '@azure/core-rest-pipeline@1.22.2': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.10.0 - '@azure/core-tracing': 1.3.0 - '@azure/core-util': 1.13.0 + '@azure/core-auth': 1.10.1 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 - '@typespec/ts-http-runtime': 0.3.0 + '@typespec/ts-http-runtime': 0.3.2 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/core-tracing@1.3.0': + '@azure/core-tracing@1.3.1': dependencies: tslib: 2.8.1 - '@azure/core-util@1.13.0': + '@azure/core-util@1.13.1': dependencies: '@azure/abort-controller': 2.1.2 - '@typespec/ts-http-runtime': 0.3.0 + '@typespec/ts-http-runtime': 0.3.2 tslib: 2.8.1 transitivePeerDependencies: - supports-color '@azure/core-xml@1.5.0': dependencies: - fast-xml-parser: 5.2.5 + fast-xml-parser: 5.3.4 tslib: 2.8.1 '@azure/logger@1.3.0': dependencies: - '@typespec/ts-http-runtime': 0.3.0 + '@typespec/ts-http-runtime': 0.3.2 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/ms-rest-js@2.7.0': - dependencies: - '@azure/core-auth': 1.10.0 - abort-controller: 3.0.0 - form-data: 2.5.5 - node-fetch: 2.7.0 - tslib: 1.14.1 - tunnel: 0.0.6 - uuid: 8.3.2 - xml2js: 0.5.0 - transitivePeerDependencies: - - encoding - - supports-color - - '@azure/storage-blob@12.27.0': + '@azure/storage-blob@12.30.0': dependencies: '@azure/abort-controller': 2.1.2 - '@azure/core-auth': 1.10.0 - '@azure/core-client': 1.10.0 - '@azure/core-http-compat': 2.3.0 + '@azure/core-auth': 1.10.1 + '@azure/core-client': 1.10.1 + '@azure/core-http-compat': 2.3.1 '@azure/core-lro': 2.7.2 '@azure/core-paging': 1.6.2 - '@azure/core-rest-pipeline': 1.22.0 - '@azure/core-tracing': 1.3.0 - '@azure/core-util': 1.13.0 + '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 '@azure/core-xml': 1.5.0 '@azure/logger': 1.3.0 + '@azure/storage-common': 12.2.0 events: 3.3.0 tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@bufbuild/protobuf@2.6.1': {} - - '@bufbuild/protoplugin@2.6.1': - dependencies: - '@bufbuild/protobuf': 2.6.1 - '@typescript/vfs': 1.6.1(typescript@5.4.5) - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - '@fastify/busboy@2.1.1': {} - - '@gigara/rush-github-action-build-cache-plugin@1.1.1': + '@azure/storage-common@12.2.0': dependencies: - '@actions/cache': 4.0.3 - '@actions/core': 1.11.1 + '@azure/abort-controller': 2.1.2 + '@azure/core-auth': 1.10.1 + '@azure/core-http-compat': 2.3.1 + '@azure/core-rest-pipeline': 1.22.2 + '@azure/core-tracing': 1.3.1 + '@azure/core-util': 1.13.1 + '@azure/logger': 1.3.0 + events: 3.3.0 + tslib: 2.8.1 transitivePeerDependencies: - - encoding - supports-color - '@protobuf-ts/plugin@2.11.1': + '@gigara/rush-github-action-build-cache-plugin@1.1.4': dependencies: - '@bufbuild/protobuf': 2.6.1 - '@bufbuild/protoplugin': 2.6.1 - '@protobuf-ts/protoc': 2.11.1 - '@protobuf-ts/runtime': 2.11.1 - '@protobuf-ts/runtime-rpc': 2.11.1 - typescript: 3.9.10 + '@actions/cache': 5.0.5 + '@actions/core': 2.0.3 transitivePeerDependencies: - supports-color - '@protobuf-ts/protoc@2.11.1': {} - '@protobuf-ts/runtime-rpc@2.11.1': dependencies: '@protobuf-ts/runtime': 2.11.1 '@protobuf-ts/runtime@2.11.1': {} - '@typescript/vfs@1.6.1(typescript@5.4.5)': - dependencies: - debug: 4.4.1 - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - '@typespec/ts-http-runtime@0.3.0': + '@typespec/ts-http-runtime@0.3.2': dependencies: http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -530,14 +340,8 @@ snapshots: transitivePeerDependencies: - supports-color - abort-controller@3.0.0: - dependencies: - event-target-shim: 5.0.1 - agent-base@7.1.4: {} - asynckit@0.4.0: {} - balanced-match@1.0.2: {} brace-expansion@1.1.12: @@ -545,161 +349,44 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - concat-map@0.0.1: {} - debug@4.4.1: + debug@4.4.3: dependencies: ms: 2.1.3 - delayed-stream@1.0.0: {} - - dunder-proto@1.0.1: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-object-atoms@1.1.1: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.1.0: - dependencies: - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - event-target-shim@5.0.1: {} - events@3.3.0: {} - fast-xml-parser@5.2.5: + fast-xml-parser@5.3.4: dependencies: - strnum: 2.1.1 - - form-data@2.5.5: - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - es-set-tostringtag: 2.1.0 - hasown: 2.0.2 - mime-types: 2.1.35 - safe-buffer: 5.2.1 - - function-bind@1.1.2: {} - - get-intrinsic@1.3.0: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - function-bind: 1.1.2 - get-proto: 1.0.1 - gopd: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - math-intrinsics: 1.1.0 - - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 - - gopd@1.2.0: {} - - has-symbols@1.1.0: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.1.0 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 + strnum: 2.1.2 http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color - math-intrinsics@1.1.0: {} - - mime-db@1.52.0: {} - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - minimatch@3.1.2: dependencies: brace-expansion: 1.1.12 ms@2.1.3: {} - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - safe-buffer@5.2.1: {} - - sax@1.4.1: {} - semver@6.3.1: {} - strnum@2.1.1: {} - - tr46@0.0.3: {} - - tslib@1.14.1: {} + strnum@2.1.2: {} tslib@2.8.1: {} tunnel@0.0.6: {} - typescript@3.9.10: {} - - typescript@5.4.5: {} - - undici@5.29.0: - dependencies: - '@fastify/busboy': 2.1.1 - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - xml2js@0.5.0: - dependencies: - sax: 1.4.1 - xmlbuilder: 11.0.1 - - xmlbuilder@11.0.1: {} + undici@6.23.0: {} diff --git a/common/config/rush/.pnpmfile.cjs b/common/config/rush/.pnpmfile.cjs index 62e4429631d..d586654bfc3 100644 --- a/common/config/rush/.pnpmfile.cjs +++ b/common/config/rush/.pnpmfile.cjs @@ -63,6 +63,15 @@ module.exports = { if (pkg.dependencies['js-yaml']) { pkg.dependencies['js-yaml'] = '^4.1.1'; } + if (pkg.dependencies['diff']) { + pkg.dependencies['diff'] = '^8.0.3'; + } + if (pkg.dependencies['eslint']) { + pkg.dependencies['eslint'] = '^9.27.0'; + } + if (pkg.dependencies['fast-xml-parser']) { + pkg.dependencies['fast-xml-parser'] = '5.3.4'; + } } if (pkg.devDependencies) { @@ -106,6 +115,15 @@ module.exports = { if (pkg.devDependencies['min-document']) { pkg.devDependencies['min-document'] = '^2.19.1'; } + if (pkg.devDependencies['diff']) { + pkg.devDependencies['diff'] = '^8.0.3'; + } + if (pkg.devDependencies['eslint']) { + pkg.devDependencies['eslint'] = '^9.27.0'; + } + if (pkg.devDependencies['fast-xml-parser']) { + pkg.devDependencies['fast-xml-parser'] = '5.3.4'; + } } return pkg; diff --git a/common/config/rush/pnpm-config.json b/common/config/rush/pnpm-config.json index 6017c38f0ce..d5247d39dce 100644 --- a/common/config/rush/pnpm-config.json +++ b/common/config/rush/pnpm-config.json @@ -89,8 +89,13 @@ * Ppnpmdocumentation: https://pnpm.io/package_json#pnpmoverrides */ "globalOverrides": { + "@modelcontextprotocol/sdk": "^1.25.2", "tar-fs": "3.1.1", - "jws": "3.2.3" + "jws": "3.2.3", + "js-yaml": "^4.1.1", + "diff": "^8.0.3", + "undici": "^7.18.2", + "lodash": "4.17.23" // "example1": "^1.0.0", // "example2": "npm:@company/example2@^1.0.0" }, diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index bb2bb7c016f..c048d649277 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -5,8 +5,13 @@ settings: excludeLinksFromLockfile: false overrides: + '@modelcontextprotocol/sdk': ^1.25.2 tar-fs: 3.1.1 jws: 3.2.3 + js-yaml: ^4.1.1 + diff: ^8.0.3 + undici: ^7.18.2 + lodash: 4.17.23 pnpmfileChecksum: sha256-XTeZQwJtKk4dimqf7175GhJCXrnq3Yh7+kwb86Bwcdo= @@ -24,14 +29,14 @@ importers: version: 0.4.5 devDependencies: '@typescript-eslint/eslint-plugin': - specifier: ^6.9.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^6.9.1 - version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) eslint: - specifier: ^8.52.0 - version: 8.57.1 + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -90,14 +95,14 @@ importers: specifier: ~3.0.0 version: 3.0.0 lodash: - specifier: ~4.17.21 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 node-fetch: specifier: ~2.6.2 version: 2.6.13(encoding@0.1.13) node-loader: specifier: ~2.0.0 - version: 2.0.0(webpack@5.103.0) + version: 2.0.0(webpack@5.104.1) portfinder: specifier: ^1.0.32 version: 1.0.38 @@ -122,34 +127,34 @@ importers: version: 16.18.126 '@types/vscode': specifier: ^1.81.0 - version: 1.106.1 + version: 1.108.1 '@typescript-eslint/eslint-plugin': - specifier: ^6.4.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^6.4.1 - version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@vscode/test-electron': specifier: ^2.3.4 version: 2.5.2 eslint: - specifier: ^8.47.0 - version: 8.57.1 + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) rimraf: specifier: ~5.0.5 version: 5.0.10 ts-loader: specifier: ^9.4.4 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.103.0(webpack-cli@5.1.4) + version: 5.104.1(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack@5.103.0) + version: 5.1.4(webpack@5.104.1) ../../workspaces/api-designer/api-designer-rpc-client: dependencies: @@ -179,14 +184,14 @@ importers: specifier: 18.2.0 version: 18.2.0 '@typescript-eslint/eslint-plugin': - specifier: ^6.9.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^6.9.1 - version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) eslint: - specifier: ^8.52.0 - version: 8.57.1 + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -210,7 +215,7 @@ importers: version: 3.14.0(@codemirror/language@6.11.3)(@lezer/highlight@1.2.3)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@tanstack/query-core': specifier: ^4.0.0-beta.1 - version: 4.41.0 + version: 4.43.0 '@tanstack/react-query': specifier: 4.0.10 version: 4.0.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -233,8 +238,8 @@ importers: specifier: ^4.1.1 version: 4.1.1 lodash: - specifier: ~4.17.21 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 path: specifier: ~0.12.7 version: 0.12.7 @@ -271,13 +276,13 @@ importers: version: 7.4.6(@types/react-dom@18.2.0)(@types/react@18.2.0)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/cli': specifier: ^7.6.10 - version: 7.6.20(encoding@0.1.13) + version: 7.6.21(encoding@0.1.13) '@storybook/react': specifier: ~7.4.0 version: 7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/react-webpack5': specifier: ~7.4.0 - version: 7.4.6(@babel/core@7.27.7)(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1) + version: 7.4.6(@babel/core@7.27.7)(@swc/helpers@0.5.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1) '@types/js-yaml': specifier: ~4.0.9 version: 4.0.9 @@ -286,7 +291,7 @@ importers: version: 4.14.202 '@types/node': specifier: ^20.10.6 - version: 20.19.25 + version: 20.19.30 '@types/react': specifier: 18.2.0 version: 18.2.0 @@ -297,38 +302,38 @@ importers: specifier: ~1.57.2 version: 1.57.5 '@vscode/codicons': - specifier: 0.0.33 - version: 0.0.33 + specifier: 0.0.44 + version: 0.0.44 copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^5.2.7 - version: 5.2.7(webpack@5.103.0) + version: 5.2.7(webpack@5.104.1) sass-loader: specifier: ^13.2.0 - version: 13.3.3(sass@1.94.2)(webpack@5.103.0) + version: 13.3.3(sass@1.97.3)(webpack@5.104.1) source-map-loader: specifier: ^4.0.1 - version: 4.0.2(webpack@5.103.0) + version: 4.0.2(webpack@5.104.1) style-loader: specifier: ^1.3.0 - version: 1.3.0(webpack@5.103.0) + version: 1.3.0(webpack@5.104.1) ts-loader: specifier: ^9.5.0 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.103.0(webpack-cli@5.1.4) + version: 5.104.1(webpack-cli@5.1.4) webpack-cli: specifier: ~5.1.4 - version: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.103.0) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@5.1.4)(webpack@5.103.0) + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) ../../workspaces/apk/apk-extension: devDependencies: @@ -343,13 +348,13 @@ importers: version: 18.19.130 '@types/vscode': specifier: ^1.63.0 - version: 1.106.1 + version: 1.108.1 '@typescript-eslint/eslint-plugin': - specifier: ~5.48.2 - version: 5.48.2(@typescript-eslint/parser@5.48.2(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ~5.48.2 - version: 5.48.2(eslint@8.57.1)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@vscode/test-electron': specifier: ^2.3.2 version: 2.5.2 @@ -360,8 +365,8 @@ importers: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^8.32.0 - version: 8.57.1 + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) glob: specifier: ^11.1.0 version: 11.1.0 @@ -391,7 +396,7 @@ importers: version: 4.7.8 isomorphic-ws: specifier: ^5.0.0 - version: 5.0.0(ws@8.18.3) + version: 5.0.0(ws@8.19.0) mousetrap: specifier: ^1.6.5 version: 1.6.5 @@ -428,19 +433,19 @@ importers: version: 18.2.0 '@types/vscode': specifier: ^1.83.1 - version: 1.106.1 + version: 1.108.1 '@typescript-eslint/eslint-plugin': - specifier: ^8.32.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -448,11 +453,11 @@ importers: ../../workspaces/ballerina/ballerina-extension: dependencies: '@ai-sdk/amazon-bedrock': - specifier: ^3.0.25 - version: 3.0.65(zod@4.1.11) + specifier: ^4.0.4 + version: 4.0.46(zod@4.1.11) '@ai-sdk/anthropic': - specifier: ^2.0.20 - version: 2.0.53(zod@4.1.11) + specifier: ^3.0.2 + version: 3.0.35(zod@4.1.11) '@iarna/toml': specifier: ^2.2.5 version: 2.2.5 @@ -484,8 +489,8 @@ importers: specifier: workspace:* version: link:../../wso2-platform/wso2-platform-core ai: - specifier: ^5.0.56 - version: 5.0.106(zod@4.1.11) + specifier: ^6.0.7 + version: 6.0.67(zod@4.1.11) cors-anywhere: specifier: ^0.4.4 version: 0.4.4 @@ -508,8 +513,8 @@ importers: specifier: ^4.0.0 version: 4.0.0 lodash: - specifier: ^4.17.21 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 monaco-languageclient: specifier: 0.13.1-next.9 version: 0.13.1-next.9 @@ -591,7 +596,7 @@ importers: version: 1.0.4 '@types/vscode': specifier: ^1.83.1 - version: 1.106.1 + version: 1.108.1 '@types/vscode-notebook-renderer': specifier: ~1.72.2 version: 1.72.4 @@ -648,7 +653,7 @@ importers: version: 1.0.2 ts-loader: specifier: ^9.5.0 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) tslint: specifier: ^6.1.3 version: 6.1.3(typescript@5.8.3) @@ -663,10 +668,10 @@ importers: version: 5.10.0(mocha@10.8.2)(typescript@5.8.3) webpack: specifier: ^5.94.0 - version: 5.103.0(webpack-cli@6.0.1) + version: 5.104.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.103.0) + version: 6.0.1(webpack@5.104.1) yarn: specifier: ^1.22.19 version: 1.22.22 @@ -702,7 +707,7 @@ importers: version: 3.2.0(date-fns@4.1.0) dexie: specifier: ^4.0.11 - version: 4.2.1 + version: 4.3.0 graphql: specifier: ^16.11.0 version: 16.12.0 @@ -711,7 +716,7 @@ importers: version: 4.7.8 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) joi: specifier: ^17.13.3 version: 17.13.3 @@ -757,31 +762,31 @@ importers: version: 7.27.2(@babel/core@7.27.7) '@rollup/plugin-commonjs': specifier: ^28.0.3 - version: 28.0.9(rollup@4.53.3) + version: 28.0.9(rollup@4.57.1) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.53.3) + version: 6.1.0(rollup@4.57.1) '@rollup/plugin-node-resolve': specifier: ^16.0.1 - version: 16.0.3(rollup@4.53.3) + version: 16.0.3(rollup@4.57.1) '@storybook/addon-actions': specifier: ^6.5.16 version: 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-essentials': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.103.0) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) '@storybook/addon-links': specifier: ^6.5.16 version: 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/builder-webpack5': specifier: ^6.5.16 - version: 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + version: 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/manager-webpack5': specifier: ^6.5.9 - version: 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + version: 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/webpack@5.28.5(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1) '@types/classnames': specifier: ^2.2.9 version: 2.3.4 @@ -811,52 +816,52 @@ importers: version: 10.0.0 '@types/webpack': specifier: ^5.28.5 - version: 5.28.5(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + version: 5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.103.0) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.104.1) copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.103.0) + version: 13.0.1(webpack@5.104.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.103.0) + version: 7.1.3(webpack@5.104.1) express: specifier: ^4.22.1 version: 4.22.1 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.103.0) + version: 6.2.0(webpack@5.104.1) fork-ts-checker-webpack-plugin: specifier: ^9.1.0 - version: 9.1.0(typescript@5.8.3)(webpack@5.103.0) + version: 9.1.0(typescript@5.8.3)(webpack@5.104.1) glob: specifier: ^11.1.0 version: 11.1.0 react-scripts-ts: specifier: ^3.1.0 - version: 3.1.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3)(webpack-cli@6.0.1) + version: 3.1.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3)(webpack-cli@6.0.1) react-test-renderer: specifier: ^19.1.0 - version: 19.1.1(react@18.2.0) + version: 19.1.5(react@18.2.0) rimraf: specifier: ^6.0.1 version: 6.0.1 rollup: specifier: ^4.41.0 - version: 4.53.3 + version: 4.57.1 rollup-plugin-import-css: specifier: ^3.5.8 - version: 3.5.8(rollup@4.53.3) + version: 3.5.8(rollup@4.57.1) rollup-plugin-peer-deps-external: specifier: ^2.2.4 - version: 2.2.4(rollup@4.53.3) + version: 2.2.4(rollup@4.57.1) rollup-plugin-postcss: specifier: ^4.0.2 - version: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + version: 4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) rollup-plugin-scss: specifier: ^4.0.1 version: 4.0.1 @@ -865,19 +870,19 @@ importers: version: 2.0.0 rollup-plugin-typescript2: specifier: ^0.36.0 - version: 0.36.0(rollup@4.53.3)(typescript@5.8.3) + version: 0.36.0(rollup@4.57.1)(typescript@5.8.3) sass: specifier: ^1.89.0 - version: 1.94.2 + version: 1.97.3 sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.94.2)(webpack@5.103.0) + version: 16.0.6(sass@1.97.3)(webpack@5.104.1) storybook: specifier: ^8.6.14 - version: 8.6.14(prettier@3.5.3) + version: 8.6.15(prettier@3.5.3) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.103.0) + version: 4.0.0(webpack@5.104.1) stylelint: specifier: ^16.19.1 version: 16.26.1(typescript@5.8.3) @@ -886,10 +891,10 @@ importers: version: 38.0.0(stylelint@16.26.1(typescript@5.8.3)) svg-url-loader: specifier: ^8.0.0 - version: 8.0.0(webpack@5.103.0) + version: 8.0.0(webpack@5.104.1) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) tslib: specifier: ^2.8.1 version: 2.8.1 @@ -907,13 +912,13 @@ importers: version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + version: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.103.0) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.103.0) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) ../../workspaces/ballerina/ballerina-rpc-client: dependencies: @@ -952,23 +957,23 @@ importers: specifier: 18.2.0 version: 18.2.0 '@typescript-eslint/eslint-plugin': - specifier: ^8.32.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: specifier: ^9.27.0 - version: 9.27.0(jiti@2.6.1) + version: 9.39.2(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) + version: 5.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.24(eslint@9.27.0(jiti@2.6.1)) + version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) typescript: specifier: 5.8.3 version: 5.8.3 @@ -980,7 +985,7 @@ importers: version: 6.19.1 '@codemirror/commands': specifier: ~6.10.0 - version: 6.10.0 + version: 6.10.1 '@codemirror/lang-sql': specifier: ~6.10.0 version: 6.10.0 @@ -995,7 +1000,7 @@ importers: version: 6.8.5 '@codemirror/state': specifier: ~6.5.2 - version: 6.5.2 + version: 6.5.4 '@codemirror/view': specifier: ~6.38.6 version: 6.38.8 @@ -1021,8 +1026,8 @@ importers: specifier: workspace:* version: link:../../common-libs/ui-toolkit lodash: - specifier: ~4.17.21 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 markdown-it: specifier: ~14.1.0 version: 14.1.0 @@ -1043,7 +1048,7 @@ importers: version: 1.2.3 prosemirror-markdown: specifier: ~1.13.2 - version: 1.13.2 + version: 1.13.3 prosemirror-model: specifier: ~1.25.4 version: 1.25.4 @@ -1058,7 +1063,7 @@ importers: version: 1.4.4 prosemirror-view: specifier: ~1.41.3 - version: 1.41.4 + version: 1.41.5 react: specifier: 18.2.0 version: 18.2.0 @@ -1080,7 +1085,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.103.0))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) '@types/lodash': specifier: ~4.17.16 version: 4.17.17 @@ -1116,7 +1121,7 @@ importers: version: 5.0.1(react-hook-form@7.56.4(react@18.2.0)) '@tanstack/query-core': specifier: ^5.77.1 - version: 5.90.11 + version: 5.90.20 '@tanstack/react-query': specifier: 5.77.1 version: 5.77.1(react@18.2.0) @@ -1184,8 +1189,8 @@ importers: specifier: ^11.11.1 version: 11.11.1 lodash: - specifier: ~4.17.21 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 lodash.debounce: specifier: ^4.0.8 version: 4.0.8 @@ -1248,11 +1253,11 @@ importers: specifier: ^5.28.5 version: 5.28.5(webpack-cli@5.1.4) '@typescript-eslint/eslint-plugin': - specifier: ^8.32.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) buffer: specifier: ^6.0.3 version: 6.0.3 @@ -1261,40 +1266,40 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.103.0) + version: 7.1.3(webpack@5.104.1) eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) + version: 5.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.24(eslint@9.27.0(jiti@2.6.1)) + version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.94.2)(webpack@5.103.0) + version: 16.0.6(sass@1.97.3)(webpack@5.104.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.103.0) + version: 5.0.0(webpack@5.104.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.103.0) + version: 4.0.0(webpack@5.104.1) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.103.0(webpack-cli@5.1.4) + version: 5.104.1(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.103.0) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@5.1.4)(webpack@5.103.0) + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) ../../workspaces/ballerina/bi-diagram: dependencies: @@ -1309,7 +1314,7 @@ importers: version: 6.7.4 '@projectstorm/react-canvas-core': specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(react@18.2.0) + version: 6.7.4(lodash@4.17.23)(react@18.2.0) '@projectstorm/react-diagrams': specifier: ^7.0.4 version: 7.0.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) @@ -1335,8 +1340,8 @@ importers: specifier: ~0.8.5 version: 0.8.5 lodash: - specifier: ~4.17.21 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 react: specifier: 18.2.0 version: 18.2.0 @@ -1346,6 +1351,9 @@ importers: react-hook-form: specifier: 7.56.4 version: 7.56.4(react@18.2.0) + react-markdown: + specifier: ~10.1.0 + version: 10.1.0(@types/react@18.2.0)(react@18.2.0) devDependencies: '@babel/core': specifier: ~7.27.1 @@ -1361,7 +1369,7 @@ importers: version: 7.27.1(@babel/core@7.27.7) '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/webpack@5.28.5(@swc/core@1.15.3(@swc/helpers@0.5.17)))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) '@testing-library/dom': specifier: ~10.4.0 version: 10.4.1 @@ -1370,7 +1378,7 @@ importers: version: 6.6.4 '@testing-library/react': specifier: ~16.3.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -1400,7 +1408,7 @@ importers: version: 3.0.0 jest: specifier: 29.7.0 - version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-environment-jsdom: specifier: 29.7.0 version: 29.7.0 @@ -1409,10 +1417,10 @@ importers: version: 29.7.0 react-test-renderer: specifier: ~19.1.0 - version: 19.1.1(react@18.2.0) + version: 19.1.5(react@18.2.0) ts-jest: specifier: 29.3.4 - version: 29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -1456,8 +1464,8 @@ importers: specifier: ~0.8.5 version: 0.8.5 lodash: - specifier: ~4.17.21 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 react: specifier: 18.2.0 version: 18.2.0 @@ -1479,7 +1487,7 @@ importers: version: 7.27.1(@babel/core@7.27.7) '@storybook/react': specifier: ^6.5.16 - version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/webpack@5.28.5(@swc/core@1.15.3(@swc/helpers@0.5.17)))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1) '@testing-library/dom': specifier: ~10.4.0 version: 10.4.1 @@ -1488,7 +1496,7 @@ importers: version: 6.6.4 '@testing-library/react': specifier: ~16.3.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -1518,7 +1526,7 @@ importers: version: 3.0.0 jest: specifier: 29.7.0 - version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + version: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-environment-jsdom: specifier: 29.7.0 version: 29.7.0 @@ -1527,10 +1535,10 @@ importers: version: 29.7.0 react-test-renderer: specifier: ~19.1.0 - version: 19.1.1(react@18.2.0) + version: 19.1.5(react@18.2.0) ts-jest: specifier: 29.3.4 - version: 29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -1551,16 +1559,16 @@ importers: version: 6.7.4 '@projectstorm/react-canvas-core': specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(react@18.2.0) + version: 6.7.4(lodash@4.17.23)(react@18.2.0) '@projectstorm/react-diagrams': specifier: ^6.7.4 - version: 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.21)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) + version: 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) '@projectstorm/react-diagrams-core': specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(react@18.2.0)(resize-observer-polyfill@1.5.1) + version: 6.7.4(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) '@tanstack/query-core': specifier: ^5.77.1 - version: 5.90.11 + version: 5.90.20 '@tanstack/react-query': specifier: 5.77.1 version: 5.77.1(react@18.2.0) @@ -1586,8 +1594,8 @@ importers: specifier: ^2.2.6 version: 2.5.1 lodash: - specifier: ^4.17.11 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 lodash.debounce: specifier: ^4.0.8 version: 4.0.8 @@ -1602,7 +1610,7 @@ importers: version: 18.2.0(react@18.2.0) react-error-boundary: specifier: ~6.0.0 - version: 6.0.0(react@18.2.0) + version: 6.0.3(react@18.2.0) resize-observer-polyfill: specifier: ^1.5.1 version: 1.5.1 @@ -1611,7 +1619,7 @@ importers: version: 3.17.5 zustand: specifier: ^5.0.4 - version: 5.0.9(@types/react@18.2.0)(react@18.2.0)(use-sync-external-store@1.6.0(react@18.2.0)) + version: 5.0.11(@types/react@18.2.0)(react@18.2.0)(use-sync-external-store@1.6.0(react@18.2.0)) devDependencies: '@types/blueimp-md5': specifier: ^2.18.2 @@ -1629,35 +1637,35 @@ importers: specifier: 17.0.26 version: 17.0.26(@types/react@18.2.0) '@typescript-eslint/eslint-plugin': - specifier: ~8.32.1 - version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ~8.32.1 - version: 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.103.0) + version: 7.1.3(webpack@5.104.1) eslint: - specifier: ^9.26.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) + version: 5.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.4 - version: 0.4.24(eslint@9.27.0(jiti@2.6.1)) + version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.103.0) + version: 6.2.0(webpack@5.104.1) react-hook-form: specifier: ~7.56.3 version: 7.56.4(react@18.2.0) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) tslib: specifier: ^2.8.1 version: 2.8.1 @@ -1700,19 +1708,19 @@ importers: version: 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-essentials': specifier: ^6.5.9 - version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.103.0) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1) '@storybook/addon-links': specifier: ^6.5.9 version: 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/builder-webpack5': specifier: ^6.5.9 - version: 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + version: 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/manager-webpack5': specifier: ^6.5.9 - version: 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + version: 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/react': specifier: ^6.5.9 - version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@types/webpack@5.28.5(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@types/webpack@5.28.5(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1) '@types/react': specifier: 18.2.0 version: 18.2.0 @@ -1721,34 +1729,34 @@ importers: version: 18.2.0 babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.103.0) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.104.1) css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.103.0) + version: 7.1.3(webpack@5.104.1) graphql: specifier: ^16.11.0 version: 16.12.0 mini-css-extract-plugin: specifier: ^2.9.2 - version: 2.9.4(webpack@5.103.0) + version: 2.10.0(webpack@5.104.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.103.0) + version: 5.0.0(webpack@5.104.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.103.0) + version: 4.0.0(webpack@5.104.1) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.103.0(webpack-cli@4.10.0) + version: 5.104.1(webpack-cli@4.10.0) webpack-cli: specifier: ^4.10.0 - version: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.103.0) + version: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) ../../workspaces/ballerina/graphql-design-diagram: dependencies: @@ -1766,13 +1774,13 @@ importers: version: 6.7.4 '@projectstorm/react-canvas-core': specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(react@18.2.0) + version: 6.7.4(lodash@4.17.23)(react@18.2.0) '@projectstorm/react-diagrams': specifier: ^6.7.4 - version: 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.21)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) + version: 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) '@projectstorm/react-diagrams-core': specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(react@18.2.0)(resize-observer-polyfill@1.5.1) + version: 6.7.4(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) '@wso2/ballerina-core': specifier: workspace:* version: link:../ballerina-core @@ -1789,8 +1797,8 @@ importers: specifier: ^1.10.8 version: 1.11.11 lodash: - specifier: ^4.17.21 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 react: specifier: 18.2.0 version: 18.2.0 @@ -1863,23 +1871,23 @@ importers: specifier: 18.2.0 version: 18.2.0 '@typescript-eslint/eslint-plugin': - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^6.21.0 - version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^8.57.1 - version: 8.57.1 + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@8.57.1) + version: 5.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.24(eslint@8.57.1) + version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) typescript: specifier: 5.8.3 version: 5.8.3 @@ -1927,13 +1935,13 @@ importers: version: 0.8.5 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.103.0) + version: 6.2.0(webpack@5.104.1) html-to-image: specifier: ^1.10.8 version: 1.11.11 lodash: - specifier: ^4.17.11 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 pathfinding: specifier: ^0.4.18 version: 0.4.18 @@ -1970,31 +1978,31 @@ importers: version: link:../../common-libs/ui-toolkit babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.103.0) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.104.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.103.0) + version: 7.1.3(webpack@5.104.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.103.0) + version: 5.0.0(webpack@5.104.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.103.0) + version: 4.0.0(webpack@5.104.1) ts-loader: specifier: ^9.4.1 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) webpack: specifier: ^5.94.0 - version: 5.103.0(webpack-cli@6.0.1) + version: 5.104.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.103.0) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.103.0) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) ../../workspaces/ballerina/record-creator: dependencies: @@ -2072,8 +2080,8 @@ importers: specifier: ~2.4.1 version: 2.4.1 eslint: - specifier: ~9.26.0 - version: 9.26.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) react-scripts-ts: specifier: 3.1.0 version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3) @@ -2120,8 +2128,8 @@ importers: specifier: ~0.8.5 version: 0.8.5 lodash: - specifier: ~4.17.21 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 react: specifier: 18.2.0 version: 18.2.0 @@ -2131,7 +2139,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.103.0))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -2145,20 +2153,20 @@ importers: specifier: 18.2.0 version: 18.2.0 '@typescript-eslint/eslint-plugin': - specifier: ~8.32.1 - version: 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ~9.26.0 - version: 9.26.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ~5.2.0 - version: 5.2.0(eslint@9.26.0(jiti@2.6.1)) + version: 5.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-unused-imports: specifier: ~4.1.4 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1)) + version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1)) prettier: specifier: ~3.5.3 version: 3.5.3 @@ -2179,7 +2187,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@17.0.90)(react@19.1.0))(@types/react@17.0.90)(react@19.1.0) '@tanstack/query-core': specifier: ^4.0.0-beta.1 - version: 4.41.0 + version: 4.43.0 '@tanstack/react-query': specifier: 4.0.10 version: 4.0.10(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -2231,7 +2239,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.5.9 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.2(webpack@5.103.0))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) '@types/classnames': specifier: ^2.2.9 version: 2.3.4 @@ -2258,7 +2266,7 @@ importers: version: 2.4.1 storybook: specifier: ^8.6.13 - version: 8.6.14(prettier@3.5.3) + version: 8.6.15(prettier@3.5.3) tslib: specifier: ^2.1.0 version: 2.8.1 @@ -2334,31 +2342,31 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.103.0) + version: 7.1.3(webpack@5.104.1) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.94.2)(webpack@5.103.0) + version: 16.0.6(sass@1.97.3)(webpack@5.104.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.103.0) + version: 5.0.0(webpack@5.104.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.103.0) + version: 4.0.0(webpack@5.104.1) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.103.0(webpack-cli@5.1.4) + version: 5.104.1(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.103.0) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@5.1.4)(webpack@5.103.0) + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) ../../workspaces/ballerina/type-diagram: dependencies: @@ -2403,13 +2411,13 @@ importers: version: 0.8.5 file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.103.0) + version: 6.2.0(webpack@5.104.1) html-to-image: specifier: ^1.11.11 version: 1.11.11 lodash: - specifier: ^4.17.21 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 pathfinding: specifier: ^0.4.18 version: 0.4.18 @@ -2452,31 +2460,31 @@ importers: version: link:../../common-libs/ui-toolkit babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.27.7)(webpack@5.103.0) + version: 10.0.0(@babel/core@7.27.7)(webpack@5.104.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.103.0) + version: 7.1.3(webpack@5.104.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.103.0) + version: 5.0.0(webpack@5.104.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.103.0) + version: 4.0.0(webpack@5.104.1) ts-loader: specifier: ^9.4.1 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) webpack: specifier: ^5.94.0 - version: 5.103.0(webpack-cli@6.0.1) + version: 5.104.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.103.0) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.103.0) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) ../../workspaces/ballerina/type-editor: dependencies: @@ -2514,8 +2522,8 @@ importers: specifier: workspace:* version: link:../../common-libs/ui-toolkit lodash: - specifier: ~4.17.21 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 lodash.debounce: specifier: ^4.0.8 version: 4.0.8 @@ -2557,8 +2565,8 @@ importers: specifier: ~2.4.1 version: 2.4.1 eslint: - specifier: ~9.26.0 - version: 9.26.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) react-scripts-ts: specifier: 3.1.0 version: 3.1.0(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3) @@ -2592,13 +2600,13 @@ importers: version: 22.15.18 '@types/vscode': specifier: ^1.84.0 - version: 1.106.1 + version: 1.108.1 '@typescript-eslint/eslint-plugin': - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@8.33.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@8.57.1)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@vscode/test-electron': specifier: ^2.5.2 version: 2.5.2 @@ -2610,13 +2618,13 @@ importers: version: link:../../common-libs/playwright-vscode-tester copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.103.0) + version: 13.0.1(webpack@5.104.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^8.57.1 - version: 8.57.1 + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) glob: specifier: ^11.1.0 version: 11.1.0 @@ -2628,16 +2636,16 @@ importers: version: 0.5.21 ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.103.0(webpack-cli@6.0.1) + version: 5.104.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.103.0) + version: 6.0.1(webpack@5.104.1) webpack-permissions-plugin: specifier: ^1.0.9 version: 1.0.10 @@ -2738,7 +2746,7 @@ importers: version: 22.15.35 '@types/vscode': specifier: ^1.100.0 - version: 1.106.1 + version: 1.108.1 '@types/which': specifier: ^3.0.4 version: 3.0.4 @@ -2753,7 +2761,7 @@ importers: version: 1.12.2 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.103.0) + version: 13.0.1(webpack@5.104.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -2765,10 +2773,10 @@ importers: version: 11.7.5 terser-webpack-plugin: specifier: ^5.3.10 - version: 5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0) + version: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) ts-loader: specifier: ~9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -2777,10 +2785,10 @@ importers: version: 8.14.1(mocha@11.7.5)(typescript@5.8.3) webpack: specifier: ^5.94.0 - version: 5.103.0(webpack-cli@6.0.1) + version: 5.104.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.103.0) + version: 6.0.1(webpack@5.104.1) webpack-permissions-plugin: specifier: ^1.0.9 version: 1.0.10 @@ -2865,16 +2873,16 @@ importers: version: 1.57.5 autoprefixer: specifier: ^10.4.21 - version: 10.4.22(postcss@8.5.6) + version: 10.4.24(postcss@8.5.6) copyfiles: specifier: ~2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.103.0) + version: 7.1.3(webpack@5.104.1) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.103.0) + version: 6.2.0(webpack@5.104.1) path: specifier: ^0.12.7 version: 0.12.7 @@ -2883,43 +2891,43 @@ importers: version: 8.5.6 postcss-loader: specifier: ^8.1.1 - version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.103.0) + version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.104.1) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.94.2)(webpack@5.103.0) + version: 16.0.6(sass@1.97.3)(webpack@5.104.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.103.0) + version: 5.0.0(webpack@5.104.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.103.0) + version: 4.0.0(webpack@5.104.1) tailwindcss: specifier: ^3.4.3 - version: 3.4.18(yaml@2.8.2) + version: 3.4.19(yaml@2.8.2) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.103.0(webpack-cli@6.0.1) + version: 5.104.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.103.0) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.103.0) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) ../../workspaces/common-libs/font-wso2-vscode: devDependencies: - '@vscode/codicons': - specifier: 0.0.36 - version: 0.0.36 - fantasticon: + '@twbs/fantasticon': specifier: ^3.0.0 - version: 3.0.0 + version: 3.1.0 + '@vscode/codicons': + specifier: 0.0.44 + version: 0.0.44 icon-font-generator: specifier: ^2.1.11 version: 2.1.11 @@ -2940,7 +2948,7 @@ importers: version: 6.1.1 fs-extra: specifier: ~11.3.0 - version: 11.3.2 + version: 11.3.3 got: specifier: 14.4.7 version: 14.4.7 @@ -2967,11 +2975,11 @@ importers: specifier: ~0.10.11 version: 0.10.11 '@typescript-eslint/eslint-plugin': - specifier: ~8.33.0 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ~8.33.0 - version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -2988,8 +2996,8 @@ importers: specifier: ^11.10.5 version: 11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0) '@vscode/codicons': - specifier: 0.0.33 - version: 0.0.33 + specifier: 0.0.44 + version: 0.0.44 '@vscode/webview-ui-toolkit': specifier: ^1.2.0 version: 1.4.0(react@19.1.0) @@ -3014,13 +3022,13 @@ importers: version: 7.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/cli': specifier: ^7.6.10 - version: 7.6.20(encoding@0.1.13) + version: 7.6.21(encoding@0.1.13) '@storybook/react': specifier: ~7.4.0 version: 7.4.6(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) '@storybook/react-webpack5': specifier: ~7.4.0 - version: 7.4.6(@babel/core@7.27.7)(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(@types/webpack@5.28.5)(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1) + version: 7.4.6(@babel/core@7.27.7)(@swc/helpers@0.5.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(@types/webpack@5.28.5)(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1) '@types/react': specifier: 18.2.0 version: 18.2.0 @@ -3028,26 +3036,26 @@ importers: specifier: 18.2.0 version: 18.2.0 '@typescript-eslint/eslint-plugin': - specifier: ^6.9.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^6.9.1 - version: 6.21.0(eslint@8.57.1)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^8.52.0 - version: 8.57.1 + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) eslint-plugin-react: specifier: ^7.33.1 - version: 7.37.5(eslint@8.57.1) + version: 7.37.5(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-hooks: specifier: ^4.6.0 - version: 4.6.2(eslint@8.57.1) + version: 4.6.2(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.4 - version: 0.4.24(eslint@8.57.1) + version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) typescript: specifier: 5.8.3 version: 5.8.3 @@ -3074,16 +3082,16 @@ importers: version: 6.7.4 '@projectstorm/react-canvas-core': specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(react@19.1.0) + version: 6.7.4(lodash@4.17.23)(react@19.1.0) '@projectstorm/react-diagrams': specifier: ^6.7.4 - version: 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(dagre@0.8.5)(lodash@4.17.21)(pathfinding@0.4.18)(paths-js@0.4.11)(react@19.1.0)(resize-observer-polyfill@1.5.1) + version: 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@19.1.0)(resize-observer-polyfill@1.5.1) '@projectstorm/react-diagrams-core': specifier: ^7.0.3 version: 7.0.3(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0) '@vscode/codicons': - specifier: 0.0.36 - version: 0.0.36 + specifier: 0.0.44 + version: 0.0.44 '@vscode/webview-ui-toolkit': specifier: ~1.4.0 version: 1.4.0(react@19.1.0) @@ -3094,8 +3102,8 @@ importers: specifier: ^2.5.1 version: 2.5.1 lodash: - specifier: ~4.17.21 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 monaco-editor: specifier: ~0.52.2 version: 0.52.2 @@ -3108,19 +3116,19 @@ importers: devDependencies: '@storybook/addon-docs': specifier: ^8.6.14 - version: 8.6.14(@types/react@18.2.0)(storybook@8.6.14(prettier@3.5.3)) + version: 8.6.15(@types/react@18.2.0)(storybook@8.6.15(prettier@3.5.3)) '@storybook/addon-essentials': specifier: ^8.6.14 - version: 8.6.14(@types/react@18.2.0)(storybook@8.6.14(prettier@3.5.3)) + version: 8.6.14(@types/react@18.2.0)(storybook@8.6.15(prettier@3.5.3)) '@storybook/cli': specifier: ^8.6.14 - version: 8.6.14(@babel/preset-env@7.27.2(@babel/core@7.27.7))(prettier@3.5.3) + version: 8.6.15(@babel/preset-env@7.27.2(@babel/core@7.27.7))(prettier@3.5.3) '@storybook/react': specifier: ^8.6.14 - version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) + version: 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) '@storybook/react-vite': specifier: ^8.6.14 - version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.53.3)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2)) + version: 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.57.1)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2)) '@types/lodash': specifier: ~4.17.16 version: 4.17.17 @@ -3134,26 +3142,26 @@ importers: specifier: 18.2.0 version: 18.2.0 '@typescript-eslint/eslint-plugin': - specifier: ^7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ~2.4.1 version: 2.4.1 eslint: - specifier: ^8.57.1 - version: 8.57.1 + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@8.57.1) + version: 7.37.5(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@8.57.1) + version: 5.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-storybook: specifier: ^0.8.0 - version: 0.8.0(eslint@8.57.1)(typescript@5.8.3) + version: 0.8.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) gh-pages: specifier: ^6.3.0 version: 6.3.0 @@ -3165,22 +3173,22 @@ importers: version: 14.1.1 react-error-boundary: specifier: ^6.0.0 - version: 6.0.0(react@19.1.0) + version: 6.0.3(react@19.1.0) storybook: specifier: ^8.6.14 - version: 8.6.14(prettier@3.5.3) + version: 8.6.15(prettier@3.5.3) typescript: specifier: 5.8.3 version: 5.8.3 vite: specifier: ^6.0.7 - version: 6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) + version: 6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) ../../workspaces/mcp-inspector/mcp-inspector-extension: dependencies: '@modelcontextprotocol/inspector': specifier: ^0.17.2 - version: 0.17.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(typescript@5.8.3) + version: 0.17.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(typescript@5.8.3) devDependencies: '@types/mocha': specifier: ^10.0.3 @@ -3190,13 +3198,13 @@ importers: version: 22.15.18 '@types/vscode': specifier: ^1.84.0 - version: 1.106.1 + version: 1.108.1 '@typescript-eslint/eslint-plugin': - specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@8.33.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@8.57.1)(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@vscode/test-electron': specifier: ^2.5.2 version: 2.5.2 @@ -3205,13 +3213,13 @@ importers: version: 3.7.1 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.103.0) + version: 13.0.1(webpack@5.104.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 eslint: - specifier: ^8.57.1 - version: 8.57.1 + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) mocha: specifier: ^11.2.2 version: 11.7.5 @@ -3223,16 +3231,16 @@ importers: version: 6.1.6 ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@5.1.4) + version: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4) webpack-cli: specifier: ^5.1.4 - version: 5.1.4(webpack@5.103.0) + version: 5.1.4(webpack@5.104.1) ../../workspaces/mi/mi-component-diagram: dependencies: @@ -3247,19 +3255,19 @@ importers: version: 6.7.4 '@projectstorm/react-canvas-core': specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(react@18.2.0) + version: 6.7.4(lodash@4.17.23)(react@18.2.0) '@projectstorm/react-diagrams': specifier: ^6.7.4 - version: 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.21)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) + version: 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) '@projectstorm/react-diagrams-core': specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(react@18.2.0)(resize-observer-polyfill@1.5.1) + version: 6.7.4(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) '@projectstorm/react-diagrams-defaults': specifier: ^6.7.4 - version: 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(lodash@4.17.21)(react@18.2.0)(resize-observer-polyfill@1.5.1) + version: 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) '@projectstorm/react-diagrams-routing': specifier: ^6.7.4 - version: 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.21)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) + version: 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) '@wso2/ui-toolkit': specifier: workspace:* version: link:../../common-libs/ui-toolkit @@ -3267,8 +3275,8 @@ importers: specifier: ~0.8.5 version: 0.8.5 lodash: - specifier: ~4.17.21 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 react: specifier: 18.2.0 version: 18.2.0 @@ -3278,7 +3286,7 @@ importers: devDependencies: '@storybook/react': specifier: ^6.3.7 - version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.103.0))(webpack-hot-middleware@2.26.1) + version: 6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1) '@types/dagre': specifier: ~0.7.52 version: 0.7.53 @@ -3320,14 +3328,14 @@ importers: specifier: ~9.27.0 version: 9.27.0 '@typescript-eslint/eslint-plugin': - specifier: ^8.32.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) eslint: specifier: ^9.27.0 - version: 9.27.0(jiti@2.6.1) + version: 9.39.2(jiti@2.6.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -3348,16 +3356,16 @@ importers: version: 6.7.4 '@projectstorm/react-canvas-core': specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(react@18.2.0) + version: 6.7.4(lodash@4.17.23)(react@18.2.0) '@projectstorm/react-diagrams': specifier: ^6.7.4 - version: 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.21)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) + version: 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) '@projectstorm/react-diagrams-core': specifier: ^6.7.4 - version: 6.7.4(lodash@4.17.21)(react@18.2.0)(resize-observer-polyfill@1.5.1) + version: 6.7.4(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) '@tanstack/query-core': specifier: ^5.76.2 - version: 5.90.11 + version: 5.90.20 '@tanstack/react-query': specifier: 5.76.2 version: 5.76.2(react@18.2.0) @@ -3389,8 +3397,8 @@ importers: specifier: ^2.5.1 version: 2.5.1 lodash: - specifier: ^4.17.21 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 lodash.debounce: specifier: ^4.0.8 version: 4.0.8 @@ -3411,7 +3419,7 @@ importers: version: 3.17.5 zustand: specifier: ^5.0.5 - version: 5.0.9(@types/react@18.2.0)(react@18.2.0)(use-sync-external-store@1.6.0(react@18.2.0)) + version: 5.0.11(@types/react@18.2.0)(react@18.2.0)(use-sync-external-store@1.6.0(react@18.2.0)) devDependencies: '@types/blueimp-md5': specifier: ^2.18.2 @@ -3429,35 +3437,35 @@ importers: specifier: 18.2.0 version: 18.2.0 '@typescript-eslint/eslint-plugin': - specifier: ~8.32.1 - version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ~8.32.1 - version: 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) copyfiles: specifier: ^2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.103.0) + version: 7.1.3(webpack@5.104.1) eslint: specifier: ^9.27.0 - version: 9.27.0(jiti@2.6.1) + version: 9.39.2(jiti@2.6.1) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) + version: 5.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-react-refresh: specifier: ^0.4.20 - version: 0.4.24(eslint@9.27.0(jiti@2.6.1)) + version: 0.4.26(eslint@9.39.2(jiti@2.6.1)) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.103.0) + version: 6.2.0(webpack@5.104.1) react-hook-form: specifier: 7.56.4 version: 7.56.4(react@18.2.0) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) ts-morph: specifier: ^22.0.0 version: 22.0.0 @@ -3543,16 +3551,16 @@ importers: version: 2.4.1 eslint-plugin-react-hooks: specifier: ~5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) + version: 5.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-unused-imports: specifier: ~4.1.4 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1)) + version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1)) html-to-image: specifier: 1.11.11 version: 1.11.11 lodash: - specifier: ~4.17.21 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 mousetrap: specifier: ~1.6.5 version: 1.6.5 @@ -3604,28 +3612,28 @@ importers: version: 7.27.2(@babel/core@7.27.7) '@storybook/addon-essentials': specifier: ^8.6.14 - version: 8.6.14(@types/react@18.2.0)(storybook@8.6.14(prettier@3.5.3)) + version: 8.6.14(@types/react@18.2.0)(storybook@8.6.15(prettier@3.5.3)) '@storybook/addon-interactions': specifier: ^8.6.14 - version: 8.6.14(storybook@8.6.14(prettier@3.5.3)) + version: 8.6.14(storybook@8.6.15(prettier@3.5.3)) '@storybook/addon-links': specifier: ^8.6.14 - version: 8.6.14(react@18.2.0)(storybook@8.6.14(prettier@3.5.3)) + version: 8.6.15(react@18.2.0)(storybook@8.6.15(prettier@3.5.3)) '@storybook/addon-onboarding': specifier: ^8.6.14 - version: 8.6.14(storybook@8.6.14(prettier@3.5.3)) + version: 8.6.15(storybook@8.6.15(prettier@3.5.3)) '@storybook/blocks': specifier: ^8.6.14 - version: 8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3)) + version: 8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3)) '@storybook/react': specifier: ^8.6.14 - version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) + version: 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) '@storybook/react-webpack5': specifier: ^8.6.14 - version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) + version: 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) '@storybook/test': specifier: ^8.6.14 - version: 8.6.14(storybook@8.6.14(prettier@3.5.3)) + version: 8.6.15(storybook@8.6.15(prettier@3.5.3)) '@testing-library/dom': specifier: ~10.4.0 version: 10.4.1 @@ -3634,7 +3642,7 @@ importers: version: 6.6.4 '@testing-library/react': specifier: ~16.3.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/deep-equal': specifier: ~1.0.4 version: 1.0.4 @@ -3654,8 +3662,8 @@ importers: specifier: ~0.4.14 version: 0.4.14 '@typescript-eslint/eslint-plugin': - specifier: ~8.32.1 - version: 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) babel-jest: specifier: ^30.0.0 version: 30.2.0(@babel/core@7.27.7) @@ -3667,7 +3675,7 @@ importers: version: 3.0.0 jest: specifier: ^30.0.0 - version: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + version: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-environment-jsdom: specifier: 29.7.0 version: 29.7.0 @@ -3676,13 +3684,13 @@ importers: version: 29.7.0 react-test-renderer: specifier: ~19.1.0 - version: 19.1.1(react@18.2.0) + version: 19.1.5(react@18.2.0) storybook: specifier: ^8.6.14 - version: 8.6.14(prettier@3.5.3) + version: 8.6.15(prettier@3.5.3) ts-jest: specifier: 29.3.4 - version: 29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@30.2.0(@babel/core@7.27.7))(esbuild@0.25.12)(jest@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3) + version: 29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@30.2.0(@babel/core@7.27.7))(esbuild@0.25.12)(jest@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3) typescript: specifier: 5.8.3 version: 5.8.3 @@ -3703,7 +3711,7 @@ importers: dependencies: '@ai-sdk/anthropic': specifier: ^2.0.35 - version: 2.0.53(zod@3.25.76) + version: 2.0.58(zod@3.25.76) '@apidevtools/json-schema-ref-parser': specifier: 12.0.2 version: 12.0.2 @@ -3712,7 +3720,7 @@ importers: version: 7.27.7 '@babel/plugin-transform-typescript': specifier: ^7.27.1 - version: 7.28.5(@babel/core@7.27.7) + version: 7.28.6(@babel/core@7.27.7) '@iarna/toml': specifier: ^2.2.5 version: 2.2.5 @@ -3763,7 +3771,7 @@ importers: version: 0.5.16 ai: specifier: ^5.0.76 - version: 5.0.106(zod@3.25.76) + version: 5.0.124(zod@3.25.76) axios: specifier: ~1.12.0 version: 1.12.2 @@ -3777,14 +3785,14 @@ importers: specifier: ~16.5.0 version: 16.5.0 fast-xml-parser: - specifier: ~5.2.3 - version: 5.2.5 + specifier: 5.3.4 + version: 5.3.4 find-process: specifier: ~1.4.10 version: 1.4.11 fs-extra: specifier: ~11.3.0 - version: 11.3.2 + version: 11.3.3 handlebars: specifier: ^4.7.8 version: 4.7.8 @@ -3801,8 +3809,8 @@ importers: specifier: ^4.0.0 version: 4.0.0 lodash: - specifier: ~4.17.21 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 mustache: specifier: ~4.2.0 version: 4.2.0 @@ -3811,7 +3819,7 @@ importers: version: 3.3.2 node-loader: specifier: ~2.1.0 - version: 2.1.0(webpack@5.103.0) + version: 2.1.0(webpack@5.104.1) portfinder: specifier: ^1.0.37 version: 1.0.38 @@ -3878,13 +3886,13 @@ importers: version: 22.15.21 '@types/vscode': specifier: ^1.100.0 - version: 1.106.1 + version: 1.108.1 '@typescript-eslint/eslint-plugin': - specifier: ^8.32.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@vscode/test-electron': specifier: ^2.5.2 version: 2.5.2 @@ -3902,7 +3910,7 @@ importers: version: 1.0.1 eslint: specifier: ^9.27.0 - version: 9.27.0(jiti@2.6.1) + version: 9.39.2(jiti@2.6.1) glob: specifier: ^11.0.2 version: 11.1.0 @@ -3917,7 +3925,7 @@ importers: version: 6.0.1 ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) ts-morph: specifier: ^26.0.0 version: 26.0.0 @@ -3926,10 +3934,10 @@ importers: version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.103.0(webpack-cli@4.10.0) + version: 5.104.1(webpack-cli@4.10.0) webpack-cli: specifier: ^4.10.0 - version: 4.10.0(webpack@5.103.0) + version: 4.10.0(webpack@5.104.1) yaml: specifier: ~2.8.0 version: 2.8.2 @@ -3965,14 +3973,14 @@ importers: specifier: 18.2.0 version: 18.2.0 '@typescript-eslint/eslint-plugin': - specifier: ^8.32.1 - version: 8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) eslint: specifier: ^9.27.0 - version: 9.27.0(jiti@2.6.1) + version: 9.39.2(jiti@2.6.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -4008,10 +4016,10 @@ importers: version: 1.55.1 '@pmmmwh/react-refresh-webpack-plugin': specifier: ~0.6.0 - version: 0.6.2(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.103.0) + version: 0.6.2(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@tanstack/query-core': specifier: ^5.76.0 - version: 5.90.11 + version: 5.90.20 '@tanstack/react-query': specifier: 5.76.1 version: 5.76.1(react@18.2.0) @@ -4070,11 +4078,11 @@ importers: specifier: ~1.0.20 version: 1.0.20 fast-xml-parser: - specifier: ~5.2.3 - version: 5.2.5 + specifier: 5.3.4 + version: 5.3.4 lodash: - specifier: ~4.17.21 - version: 4.17.21 + specifier: 4.17.23 + version: 4.17.23 mustache: specifier: ~4.2.0 version: 4.2.0 @@ -4138,16 +4146,16 @@ importers: version: 2.2.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-actions': specifier: ~8.6.14 - version: 8.6.14(storybook@8.6.14(prettier@3.5.3)) + version: 8.6.15(storybook@8.6.15(prettier@3.5.3)) '@storybook/addon-essentials': specifier: ~8.6.14 - version: 8.6.14(@types/react@18.2.0)(storybook@8.6.14(prettier@3.5.3)) + version: 8.6.14(@types/react@18.2.0)(storybook@8.6.15(prettier@3.5.3)) '@storybook/addon-links': specifier: ~8.6.14 - version: 8.6.14(react@18.2.0)(storybook@8.6.14(prettier@3.5.3)) + version: 8.6.15(react@18.2.0)(storybook@8.6.15(prettier@3.5.3)) '@storybook/react-webpack5': specifier: ~8.6.14 - version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4) + version: 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4) '@types/lodash': specifier: ~4.17.17 version: 4.17.17 @@ -4168,19 +4176,19 @@ importers: version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.103.0) + version: 7.1.3(webpack@5.104.1) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.94.2)(webpack@5.103.0) + version: 16.0.6(sass@1.97.3)(webpack@5.104.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.103.0) + version: 5.0.0(webpack@5.104.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.103.0) + version: 4.0.0(webpack@5.104.1) ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) typescript: specifier: 5.8.3 version: 5.8.3 @@ -4189,13 +4197,13 @@ importers: version: 3.17.5 webpack: specifier: ^5.94.0 - version: 5.103.0(webpack-cli@5.1.4) + version: 5.104.1(webpack-cli@5.1.4) webpack-cli: specifier: ~5.1.4 - version: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.103.0) + version: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@5.1.4)(webpack@5.103.0) + version: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) yaml: specifier: ~2.8.0 version: 2.8.2 @@ -4206,8 +4214,8 @@ importers: specifier: ~22.15.21 version: 22.15.35 eslint: - specifier: ~9.27.0 - version: 9.27.0(jiti@2.6.1) + specifier: ^9.27.0 + version: 9.39.2(jiti@2.6.1) jsonix: specifier: ~3.0.0 version: 3.0.0 @@ -4222,14 +4230,14 @@ importers: specifier: ^11.2.0 version: 11.2.0(size-limit@11.2.0) '@typescript-eslint/eslint-plugin': - specifier: ~8.32.1 - version: 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + specifier: 8.32.1 + version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) eslint-plugin-react-hooks: specifier: ~5.2.0 - version: 5.2.0(eslint@9.27.0(jiti@2.6.1)) + version: 5.2.0(eslint@9.39.2(jiti@2.6.1)) eslint-plugin-unused-imports: specifier: ~4.1.4 - version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1)) + version: 4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1)) husky: specifier: ^9.1.7 version: 9.1.7 @@ -4241,7 +4249,7 @@ importers: version: 11.2.0 tsdx: specifier: ^0.14.1 - version: 0.14.1(@types/babel__core@7.20.5)(@types/node@22.15.35) + version: 0.14.1(@types/babel__core@7.20.5)(@types/node@22.15.35)(jiti@2.6.1) tslib: specifier: ^2.5.0 version: 2.8.1 @@ -4269,7 +4277,7 @@ importers: dependencies: '@aws-sdk/client-s3': specifier: ^3.817.0 - version: 3.943.0 + version: 3.980.0 '@iarna/toml': specifier: ^2.2.5 version: 2.2.5 @@ -4332,7 +4340,7 @@ importers: version: 3.25.76 zustand: specifier: ^5.0.5 - version: 5.0.9(@types/react@18.2.0)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)) + version: 5.0.11(@types/react@18.2.0)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)) devDependencies: '@biomejs/biome': specifier: ^1.9.4 @@ -4354,7 +4362,7 @@ importers: version: 22.15.35 '@types/vscode': specifier: ^1.100.0 - version: 1.106.1 + version: 1.108.1 '@types/which': specifier: ^3.0.4 version: 3.0.4 @@ -4369,7 +4377,7 @@ importers: version: 1.12.2 copy-webpack-plugin: specifier: ^13.0.0 - version: 13.0.1(webpack@5.103.0) + version: 13.0.1(webpack@5.104.1) copyfiles: specifier: ^2.4.1 version: 2.4.1 @@ -4381,10 +4389,10 @@ importers: version: 11.7.5 terser-webpack-plugin: specifier: ^5.3.14 - version: 5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0) + version: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) ts-loader: specifier: ~9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) typescript: specifier: ^5.8.3 version: 5.8.3 @@ -4393,10 +4401,10 @@ importers: version: 8.14.1(mocha@11.7.5)(typescript@5.8.3) webpack: specifier: ^5.94.0 - version: 5.103.0(webpack-cli@6.0.1) + version: 5.104.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack@5.103.0) + version: 6.0.1(webpack@5.104.1) webpack-permissions-plugin: specifier: ^1.0.10 version: 1.0.10 @@ -4502,16 +4510,16 @@ importers: version: 1.57.5 autoprefixer: specifier: ^10.4.19 - version: 10.4.22(postcss@8.5.6) + version: 10.4.24(postcss@8.5.6) copyfiles: specifier: ~2.4.1 version: 2.4.1 css-loader: specifier: ^7.1.2 - version: 7.1.2(webpack@5.103.0) + version: 7.1.3(webpack@5.104.1) file-loader: specifier: ^6.2.0 - version: 6.2.0(webpack@5.103.0) + version: 6.2.0(webpack@5.104.1) path: specifier: ^0.12.7 version: 0.12.7 @@ -4520,66 +4528,88 @@ importers: version: 8.5.6 postcss-loader: specifier: ^8.1.1 - version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.103.0) + version: 8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.104.1) sass-loader: specifier: ^16.0.5 - version: 16.0.6(sass@1.94.2)(webpack@5.103.0) + version: 16.0.6(sass@1.97.3)(webpack@5.104.1) source-map-loader: specifier: ^5.0.0 - version: 5.0.0(webpack@5.103.0) + version: 5.0.0(webpack@5.104.1) style-loader: specifier: ^4.0.0 - version: 4.0.0(webpack@5.103.0) + version: 4.0.0(webpack@5.104.1) tailwindcss: specifier: ^4.1.7 - version: 4.1.17 + version: 4.1.18 ts-loader: specifier: ^9.5.2 - version: 9.5.4(typescript@5.8.3)(webpack@5.103.0) + version: 9.5.4(typescript@5.8.3)(webpack@5.104.1) typescript: specifier: 5.8.3 version: 5.8.3 webpack: specifier: ^5.94.0 - version: 5.103.0(webpack-cli@6.0.1) + version: 5.104.1(webpack-cli@6.0.1) webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.103.0) + version: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) webpack-dev-server: specifier: ^5.2.1 - version: 5.2.2(webpack-cli@6.0.1)(webpack@5.103.0) + version: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) packages: '@adobe/css-tools@4.4.4': resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==} - '@ai-sdk/amazon-bedrock@3.0.65': - resolution: {integrity: sha512-E5KJv9OvLJitwPo6GnTgYdssTjEbwVW08TXqaQE2C6hfpg6XdwMXc7BJvQ97eXogGETAyFSS0irDYsbA90rB+g==} + '@ai-sdk/amazon-bedrock@4.0.46': + resolution: {integrity: sha512-Hm6yeK8ABvh+TvIYnJzGO6IOVS0/xk96FbtWHSZ8d0MYuxVgbXmEEyC71E+RsxwXVI4RZr9VuoUSA78nz5VX8g==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/anthropic@2.0.53': - resolution: {integrity: sha512-ih7NV+OFSNWZCF+tYYD7ovvvM+gv7TRKQblpVohg2ipIwC9Y0TirzocJVREzZa/v9luxUwFbsPji++DUDWWxsg==} + '@ai-sdk/anthropic@2.0.58': + resolution: {integrity: sha512-CkNW5L1Arv8gPtPlEmKd+yf/SG9ucJf0XQdpMG8OiYEtEMc2smuCA+tyCp8zI7IBVg/FE7nUfFHntQFaOjRwJQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/gateway@2.0.18': - resolution: {integrity: sha512-sDQcW+6ck2m0pTIHW6BPHD7S125WD3qNkx/B8sEzJp/hurocmJ5Cni0ybExg6sQMGo+fr/GWOwpHF1cmCdg5rQ==} + '@ai-sdk/anthropic@3.0.35': + resolution: {integrity: sha512-Y3g/5uVj621XSB9lGF7WrD7qR+orhV5xpaYkRF8kfj2j4W7e7BBGIvxcdsCf85FjJbc6tKQdNTZ84ZEqT3Y5TQ==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider-utils@3.0.18': - resolution: {integrity: sha512-ypv1xXMsgGcNKUP+hglKqtdDuMg68nWHucPPAhIENrbFAI+xCHiqPVN8Zllxyv1TNZwGWUghPxJXU+Mqps0YRQ==} + '@ai-sdk/gateway@2.0.30': + resolution: {integrity: sha512-5Nrkj8B4MzkkOfjjA+Cs5pamkbkK4lI11bx80QV7TFcen/hWA8wEC+UVzwuM5H2zpekoNMjvl6GonHnR62XIZw==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 - '@ai-sdk/provider@2.0.0': - resolution: {integrity: sha512-6o7Y2SeO9vFKB8lArHXehNuusnpddKPk7xqL7T2/b+OvXMRIXUO1rR4wcv1hAFUAT9avGZshty3Wlua/XA7TvA==} + '@ai-sdk/gateway@3.0.32': + resolution: {integrity: sha512-7clZRr07P9rpur39t1RrbIe7x8jmwnwUWI8tZs+BvAfX3NFgdSVGGIaT7bTz2pb08jmLXzTSDbrOTqAQ7uBkBQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@3.0.20': + resolution: {integrity: sha512-iXHVe0apM2zUEzauqJwqmpC37A5rihrStAih5Ks+JE32iTe4LZ58y17UGBjpQQTCRw9YxMeo2UFLxLpBluyvLQ==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider-utils@4.0.13': + resolution: {integrity: sha512-HHG72BN4d+OWTcq2NwTxOm/2qvk1duYsnhCDtsbYwn/h/4zeqURu1S0+Cn0nY2Ysq9a9HGKvrYuMn9bgFhR2Og==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + '@ai-sdk/provider@2.0.1': + resolution: {integrity: sha512-KCUwswvsC5VsW2PWFqF8eJgSCu5Ysj7m1TxiHTVA6g7k360bk0RNQENT8KTMAYEs+8fWPD3Uu4dEmzGHc+jGng==} + engines: {node: '>=18'} + + '@ai-sdk/provider@3.0.7': + resolution: {integrity: sha512-VkPLrutM6VdA924/mG8OS+5frbVTcu6e046D2bgDo00tehBANR1QBJ/mPcZ9tXMFOsVcm6SQArOregxePzTFPw==} engines: {node: '>=18'} '@alloc/quick-lru@5.2.0': @@ -4625,140 +4655,144 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-s3@3.943.0': - resolution: {integrity: sha512-UOX8/1mmNaRmEkxoIVP2+gxd5joPJqz+fygRqlIXON1cETLGoctinMwQs7qU8g8hghm76TU2G6ZV6sLH8cySMw==} - engines: {node: '>=18.0.0'} + '@aws-sdk/client-s3@3.980.0': + resolution: {integrity: sha512-ch8QqKehyn1WOYbd8LyDbWjv84Z9OEj9qUxz8q3IOCU3ftAVkVR0wAuN96a1xCHnpOJcQZo3rOB08RlyKdkGxQ==} + engines: {node: '>=20.0.0'} - '@aws-sdk/client-sso@3.943.0': - resolution: {integrity: sha512-kOTO2B8Ks2qX73CyKY8PAajtf5n39aMe2spoiOF5EkgSzGV7hZ/HONRDyADlyxwfsX39Q2F2SpPUaXzon32IGw==} - engines: {node: '>=18.0.0'} + '@aws-sdk/client-sso@3.980.0': + resolution: {integrity: sha512-AhNXQaJ46C1I+lQ+6Kj+L24il5K9lqqIanJd8lMszPmP7bLnmX0wTKK0dxywcvrLdij3zhWttjAKEBNgLtS8/A==} + engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.943.0': - resolution: {integrity: sha512-8CBy2hI9ABF7RBVQuY1bgf/ue+WPmM/hl0adrXFlhnhkaQP0tFY5zhiy1Y+n7V+5f3/ORoHBmCCQmcHDDYJqJQ==} - engines: {node: '>=18.0.0'} + '@aws-sdk/core@3.973.5': + resolution: {integrity: sha512-IMM7xGfLGW6lMvubsA4j6BHU5FPgGAxoQ/NA63KqNLMwTS+PeMBcx8DPHL12Vg6yqOZnqok9Mu4H2BdQyq7gSA==} + engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.943.0': - resolution: {integrity: sha512-WnS5w9fK9CTuoZRVSIHLOMcI63oODg9qd1vXMYb7QGLGlfwUm4aG3hdu7i9XvYrpkQfE3dzwWLtXF4ZBuL1Tew==} - engines: {node: '>=18.0.0'} + '@aws-sdk/crc64-nvme@3.972.0': + resolution: {integrity: sha512-ThlLhTqX68jvoIVv+pryOdb5coP1cX1/MaTbB9xkGDCbWbsqQcLqzPxuSoW1DCnAAIacmXCWpzUNOB9pv+xXQw==} + engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.943.0': - resolution: {integrity: sha512-SA8bUcYDEACdhnhLpZNnWusBpdmj4Vl67Vxp3Zke7SvoWSYbuxa+tiDiC+c92Z4Yq6xNOuLPW912ZPb9/NsSkA==} - engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-env@3.972.3': + resolution: {integrity: sha512-OBYNY4xQPq7Rx+oOhtyuyO0AQvdJSpXRg7JuPNBJH4a1XXIzJQl4UHQTPKZKwfJXmYLpv4+OkcFen4LYmDPd3g==} + engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.943.0': - resolution: {integrity: sha512-BcLDb8l4oVW+NkuqXMlO7TnM6lBOWW318ylf4FRED/ply5eaGxkQYqdGvHSqGSN5Rb3vr5Ek0xpzSjeYD7C8Kw==} - engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-http@3.972.5': + resolution: {integrity: sha512-GpvBgEmSZPvlDekd26Zi+XsI27Qz7y0utUx0g2fSTSiDzhnd1FSa1owuodxR0BcUKNL7U2cOVhhDxgZ4iSoPVg==} + engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.943.0': - resolution: {integrity: sha512-9iCOVkiRW+evxiJE94RqosCwRrzptAVPhRhGWv4osfYDhjNAvUMyrnZl3T1bjqCoKNcETRKEZIU3dqYHnUkcwQ==} - engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-ini@3.972.3': + resolution: {integrity: sha512-rMQAIxstP7cLgYfsRGrGOlpyMl0l8JL2mcke3dsIPLWke05zKOFyR7yoJzWCsI/QiIxjRbxpvPiAeKEA6CoYkg==} + engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.943.0': - resolution: {integrity: sha512-14eddaH/gjCWoLSAELVrFOQNyswUYwWphIt+PdsJ/FqVfP4ay2HsiZVEIYbQtmrKHaoLJhiZKwBQRjcqJDZG0w==} - engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-login@3.972.3': + resolution: {integrity: sha512-Gc3O91iVvA47kp2CLIXOwuo5ffo1cIpmmyIewcYjAcvurdFHQ8YdcBe1KHidnbbBO4/ZtywGBACsAX5vr3UdoA==} + engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.943.0': - resolution: {integrity: sha512-GIY/vUkthL33AdjOJ8r9vOosKf/3X+X7LIiACzGxvZZrtoOiRq0LADppdiKIB48vTL63VvW+eRIOFAxE6UDekw==} - engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-node@3.972.4': + resolution: {integrity: sha512-UwerdzosMSY7V5oIZm3NsMDZPv2aSVzSkZxYxIOWHBeKTZlUqW7XpHtJMZ4PZpJ+HMRhgP+MDGQx4THndgqJfQ==} + engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.943.0': - resolution: {integrity: sha512-1c5G11syUrru3D9OO6Uk+ul5e2lX1adb+7zQNyluNaLPXP6Dina6Sy6DFGRLu7tM8+M7luYmbS3w63rpYpaL+A==} - engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-process@3.972.3': + resolution: {integrity: sha512-xkSY7zjRqeVc6TXK2xr3z1bTLm0wD8cj3lAkproRGaO4Ku7dPlKy843YKnHrUOUzOnMezdZ4xtmFc0eKIDTo2w==} + engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.943.0': - resolution: {integrity: sha512-VtyGKHxICSb4kKGuaqotxso8JVM8RjCS3UYdIMOxUt9TaFE/CZIfZKtjTr+IJ7M0P7t36wuSUb/jRLyNmGzUUA==} - engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-sso@3.972.3': + resolution: {integrity: sha512-8Ww3F5Ngk8dZ6JPL/V5LhCU1BwMfQd3tLdoEuzaewX8FdnT633tPr+KTHySz9FK7fFPcz5qG3R5edVEhWQD4AA==} + engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-bucket-endpoint@3.936.0': - resolution: {integrity: sha512-XLSVVfAorUxZh6dzF+HTOp4R1B5EQcdpGcPliWr0KUj2jukgjZEcqbBmjyMF/p9bmyQsONX80iURF1HLAlW0qg==} - engines: {node: '>=18.0.0'} + '@aws-sdk/credential-provider-web-identity@3.972.3': + resolution: {integrity: sha512-62VufdcH5rRfiRKZRcf1wVbbt/1jAntMj1+J0qAd+r5pQRg2t0/P9/Rz16B1o5/0Se9lVL506LRjrhIJAhYBfA==} + engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-expect-continue@3.936.0': - resolution: {integrity: sha512-Eb4ELAC23bEQLJmUMYnPWcjD3FZIsmz2svDiXEcxRkQU9r7NRID7pM7C5NPH94wOfiCk0b2Y8rVyFXW0lGQwbA==} - engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-bucket-endpoint@3.972.3': + resolution: {integrity: sha512-fmbgWYirF67YF1GfD7cg5N6HHQ96EyRNx/rDIrTF277/zTWVuPI2qS/ZHgofwR1NZPe/NWvoppflQY01LrbVLg==} + engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-flexible-checksums@3.943.0': - resolution: {integrity: sha512-J2oYbAQXTFEezs5m2Vij6H3w71K1hZfCtb85AsR/2Ovp/FjABMnK+Es1g1edRx6KuMTc9HkL/iGU4e+ek+qCZw==} - engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-expect-continue@3.972.3': + resolution: {integrity: sha512-4msC33RZsXQpUKR5QR4HnvBSNCPLGHmB55oDiROqqgyOc+TOfVu2xgi5goA7ms6MdZLeEh2905UfWMnMMF4mRg==} + engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-host-header@3.936.0': - resolution: {integrity: sha512-tAaObaAnsP1XnLGndfkGWFuzrJYuk9W0b/nLvol66t8FZExIAf/WdkT2NNAWOYxljVs++oHnyHBCxIlaHrzSiw==} - engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-flexible-checksums@3.972.3': + resolution: {integrity: sha512-MkNGJ6qB9kpsLwL18kC/ZXppsJbftHVGCisqpEVbTQsum8CLYDX1Bmp/IvhRGNxsqCO2w9/4PwhDKBjG3Uvr4Q==} + engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-location-constraint@3.936.0': - resolution: {integrity: sha512-SCMPenDtQMd9o5da9JzkHz838w3327iqXk3cbNnXWqnNRx6unyW8FL0DZ84gIY12kAyVHz5WEqlWuekc15ehfw==} - engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-host-header@3.972.3': + resolution: {integrity: sha512-aknPTb2M+G3s+0qLCx4Li/qGZH8IIYjugHMv15JTYMe6mgZO8VBpYgeGYsNMGCqCZOcWzuf900jFBG5bopfzmA==} + engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-logger@3.936.0': - resolution: {integrity: sha512-aPSJ12d3a3Ea5nyEnLbijCaaYJT2QjQ9iW+zGh5QcZYXmOGWbKVyPSxmVOboZQG+c1M8t6d2O7tqrwzIq8L8qw==} - engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-location-constraint@3.972.3': + resolution: {integrity: sha512-nIg64CVrsXp67vbK0U1/Is8rik3huS3QkRHn2DRDx4NldrEFMgdkZGI/+cZMKD9k4YOS110Dfu21KZLHrFA/1g==} + engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-recursion-detection@3.936.0': - resolution: {integrity: sha512-l4aGbHpXM45YNgXggIux1HgsCVAvvBoqHPkqLnqMl9QVapfuSTjJHfDYDsx1Xxct6/m7qSMUzanBALhiaGO2fA==} - engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-logger@3.972.3': + resolution: {integrity: sha512-Ftg09xNNRqaz9QNzlfdQWfpqMCJbsQdnZVJP55jfhbKi1+FTWxGuvfPoBhDHIovqWKjqbuiew3HuhxbJ0+OjgA==} + engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-sdk-s3@3.943.0': - resolution: {integrity: sha512-kd2mALfthU+RS9NsPS+qvznFcPnVgVx9mgmStWCPn5Qc5BTnx4UAtm+HPA+XZs+zxOopp+zmAfE4qxDHRVONBA==} - engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-recursion-detection@3.972.3': + resolution: {integrity: sha512-PY57QhzNuXHnwbJgbWYTrqIDHYSeOlhfYERTAuc16LKZpTZRJUjzBFokp9hF7u1fuGeE3D70ERXzdbMBOqQz7Q==} + engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-ssec@3.936.0': - resolution: {integrity: sha512-/GLC9lZdVp05ozRik5KsuODR/N7j+W+2TbfdFL3iS+7un+gnP6hC8RDOZd6WhpZp7drXQ9guKiTAxkZQwzS8DA==} - engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-sdk-s3@3.972.5': + resolution: {integrity: sha512-3IgeIDiQ15tmMBFIdJ1cTy3A9rXHGo+b9p22V38vA3MozeMyVC8VmCYdDLA0iMWo4VHA9LDJTgCM0+xU3wjBOg==} + engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.943.0': - resolution: {integrity: sha512-956n4kVEwFNXndXfhSAN5wO+KRgqiWEEY+ECwLvxmmO8uQ0NWOa8l6l65nTtyuiWzMX81c9BvlyNR5EgUeeUvA==} - engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-ssec@3.972.3': + resolution: {integrity: sha512-dU6kDuULN3o3jEHcjm0c4zWJlY1zWVkjG9NPe9qxYLLpcbdj5kRYBS2DdWYD+1B9f910DezRuws7xDEqKkHQIg==} + engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.943.0': - resolution: {integrity: sha512-anFtB0p2FPuyUnbOULwGmKYqYKSq1M73c9uZ08jR/NCq6Trjq9cuF5TFTeHwjJyPRb4wMf2Qk859oiVfFqnQiw==} - engines: {node: '>=18.0.0'} + '@aws-sdk/middleware-user-agent@3.972.5': + resolution: {integrity: sha512-TVZQ6PWPwQbahUI8V+Er+gS41ctIawcI/uMNmQtQ7RMcg3JYn6gyKAFKUb3HFYx2OjYlx1u11sETSwwEUxVHTg==} + engines: {node: '>=20.0.0'} - '@aws-sdk/region-config-resolver@3.936.0': - resolution: {integrity: sha512-wOKhzzWsshXGduxO4pqSiNyL9oUtk4BEvjWm9aaq6Hmfdoydq6v6t0rAGHWPjFwy9z2haovGRi3C8IxdMB4muw==} - engines: {node: '>=18.0.0'} + '@aws-sdk/nested-clients@3.980.0': + resolution: {integrity: sha512-/dONY5xc5/CCKzOqHZCTidtAR4lJXWkGefXvTRKdSKMGaYbbKsxDckisd6GfnvPSLxWtvQzwgRGRutMRoYUApQ==} + engines: {node: '>=20.0.0'} - '@aws-sdk/signature-v4-multi-region@3.943.0': - resolution: {integrity: sha512-KKvmxNQ/FZbM6ml6nKd8ltDulsUojsXnMJNgf1VHTcJEbADC/6mVWOq0+e9D0WP1qixUBEuMjlS2HqD5KoqwEg==} - engines: {node: '>=18.0.0'} + '@aws-sdk/region-config-resolver@3.972.3': + resolution: {integrity: sha512-v4J8qYAWfOMcZ4MJUyatntOicTzEMaU7j3OpkRCGGFSL2NgXQ5VbxauIyORA+pxdKZ0qQG2tCQjQjZDlXEC3Ow==} + engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.943.0': - resolution: {integrity: sha512-cRKyIzwfkS+XztXIFPoWORuaxlIswP+a83BJzelX4S1gUZ7FcXB4+lj9Jxjn8SbQhR4TPU3Owbpu+S7pd6IRbQ==} - engines: {node: '>=18.0.0'} + '@aws-sdk/signature-v4-multi-region@3.980.0': + resolution: {integrity: sha512-tO2jBj+ZIVM0nEgi1SyxWtaYGpuAJdsrugmWcI3/U2MPWCYsrvKasUo0026NvJJao38wyUq9B8XTG8Xu53j/VA==} + engines: {node: '>=20.0.0'} - '@aws-sdk/types@3.936.0': - resolution: {integrity: sha512-uz0/VlMd2pP5MepdrHizd+T+OKfyK4r3OA9JI+L/lPKg0YFQosdJNCKisr6o70E3dh8iMpFYxF1UN/4uZsyARg==} - engines: {node: '>=18.0.0'} + '@aws-sdk/token-providers@3.980.0': + resolution: {integrity: sha512-1nFileg1wAgDmieRoj9dOawgr2hhlh7xdvcH57b1NnqfPaVlcqVJyPc6k3TLDUFPY69eEwNxdGue/0wIz58vjA==} + engines: {node: '>=20.0.0'} - '@aws-sdk/util-arn-parser@3.893.0': - resolution: {integrity: sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==} - engines: {node: '>=18.0.0'} + '@aws-sdk/types@3.973.1': + resolution: {integrity: sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==} + engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.936.0': - resolution: {integrity: sha512-0Zx3Ntdpu+z9Wlm7JKUBOzS9EunwKAb4KdGUQQxDqh5Lc3ta5uBoub+FgmVuzwnmBu9U1Os8UuwVTH0Lgu+P5w==} - engines: {node: '>=18.0.0'} + '@aws-sdk/util-arn-parser@3.972.2': + resolution: {integrity: sha512-VkykWbqMjlSgBFDyrY3nOSqupMc6ivXuGmvci6Q3NnLq5kC+mKQe2QBZ4nrWRE/jqOxeFP2uYzLtwncYYcvQDg==} + engines: {node: '>=20.0.0'} - '@aws-sdk/util-locate-window@3.893.0': - resolution: {integrity: sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==} - engines: {node: '>=18.0.0'} + '@aws-sdk/util-endpoints@3.980.0': + resolution: {integrity: sha512-AjKBNEc+rjOZQE1HwcD9aCELqg1GmUj1rtICKuY8cgwB73xJ4U/kNyqKKpN2k9emGqlfDY2D8itIp/vDc6OKpw==} + engines: {node: '>=20.0.0'} + + '@aws-sdk/util-locate-window@3.965.4': + resolution: {integrity: sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==} + engines: {node: '>=20.0.0'} - '@aws-sdk/util-user-agent-browser@3.936.0': - resolution: {integrity: sha512-eZ/XF6NxMtu+iCma58GRNRxSq4lHo6zHQLOZRIeL/ghqYJirqHdenMOwrzPettj60KWlv827RVebP9oNVrwZbw==} + '@aws-sdk/util-user-agent-browser@3.972.3': + resolution: {integrity: sha512-JurOwkRUcXD/5MTDBcqdyQ9eVedtAsZgw5rBwktsPTN7QtPiS2Ld1jkJepNgYoCufz1Wcut9iup7GJDoIHp8Fw==} - '@aws-sdk/util-user-agent-node@3.943.0': - resolution: {integrity: sha512-gn+ILprVRrgAgTIBk2TDsJLRClzIOdStQFeFTcN0qpL8Z4GBCqMFhw7O7X+MM55Stt5s4jAauQ/VvoqmCADnQg==} - engines: {node: '>=18.0.0'} + '@aws-sdk/util-user-agent-node@3.972.3': + resolution: {integrity: sha512-gqG+02/lXQtO0j3US6EVnxtwwoXQC5l2qkhLCrqUrqdtcQxV7FDMbm9wLjKqoronSHyELGTjbFKK/xV5q1bZNA==} + engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' peerDependenciesMeta: aws-crt: optional: true - '@aws-sdk/xml-builder@3.930.0': - resolution: {integrity: sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==} - engines: {node: '>=18.0.0'} + '@aws-sdk/xml-builder@3.972.2': + resolution: {integrity: sha512-jGOOV/bV1DhkkUhHiZ3/1GZ67cZyOXaDb7d1rYD6ZiXf5V9tBNOcgqXwRRPvrCbYaFRa1pPMFb3ZjqjWpR3YfA==} + engines: {node: '>=20.0.0'} - '@aws/lambda-invoke-store@0.2.1': - resolution: {integrity: sha512-sIyFcoPZkTtNu9xFeEoynMef3bPJIAbOfUh+ueYcfhVl6xm2VRtMcMclSxmZCMnHHd4hlYKJeq/aggmBEWynww==} + '@aws/lambda-invoke-store@0.2.3': + resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==} engines: {node: '>=18.0.0'} '@azu/format-text@1.0.2': @@ -4799,24 +4833,24 @@ packages: resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} engines: {node: '>=20.0.0'} - '@azure/msal-browser@4.26.2': - resolution: {integrity: sha512-F2U1mEAFsYGC5xzo1KuWc/Sy3CRglU9Ql46cDUx8x/Y3KnAIr1QAq96cIKCk/ZfnVxlvprXWRjNKoEpgLJXLhg==} + '@azure/msal-browser@4.28.1': + resolution: {integrity: sha512-al2u2fTchbClq3L4C1NlqLm+vwKfhYCPtZN2LR/9xJVaQ4Mnrwf5vANvuyPSJHcGvw50UBmhuVmYUAhTEetTpA==} engines: {node: '>=0.8.0'} - '@azure/msal-common@15.13.2': - resolution: {integrity: sha512-cNwUoCk3FF8VQ7Ln/MdcJVIv3sF73/OT86cRH81ECsydh7F4CNfIo2OAx6Cegtg8Yv75x4506wN4q+Emo6erOA==} + '@azure/msal-common@15.14.1': + resolution: {integrity: sha512-IkzF7Pywt6QKTS0kwdCv/XV8x8JXknZDvSjj/IccooxnP373T5jaadO3FnOrbWo3S0UqkfIDyZNTaQ/oAgRdXw==} engines: {node: '>=0.8.0'} - '@azure/msal-node@3.8.3': - resolution: {integrity: sha512-Ul7A4gwmaHzYWj2Z5xBDly/W8JSC1vnKgJ898zPMZr0oSf1ah0tiL15sytjycU/PMhDZAlkWtEL1+MzNMU6uww==} + '@azure/msal-node@3.8.6': + resolution: {integrity: sha512-XTmhdItcBckcVVTy65Xp+42xG4LX5GK+9AqAsXPXk4IqUNv+LyQo5TMwNjuFYBfAB2GTG9iSQGk+QLc03vhf3w==} engines: {node: '>=16'} - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.5': - resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} + '@babel/compat-data@7.29.0': + resolution: {integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==} engines: {node: '>=6.9.0'} '@babel/core@7.12.9': @@ -4827,20 +4861,20 @@ packages: resolution: {integrity: sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.5': - resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + '@babel/generator@7.29.0': + resolution: {integrity: sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.27.3': resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + '@babel/helper-compilation-targets@7.28.6': + resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} - '@babel/helper-create-class-features-plugin@7.28.5': - resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} + '@babel/helper-create-class-features-plugin@7.28.6': + resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -4861,8 +4895,8 @@ packages: peerDependencies: '@babel/core': ^7.4.0-0 - '@babel/helper-define-polyfill-provider@0.6.5': - resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} + '@babel/helper-define-polyfill-provider@0.6.6': + resolution: {integrity: sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -4874,12 +4908,12 @@ packages: resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.3': - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + '@babel/helper-module-transforms@7.28.6': + resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -4891,8 +4925,8 @@ packages: '@babel/helper-plugin-utils@7.10.4': resolution: {integrity: sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==} - '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} + '@babel/helper-plugin-utils@7.28.6': + resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} engines: {node: '>=6.9.0'} '@babel/helper-remap-async-to-generator@7.27.1': @@ -4901,8 +4935,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-replace-supers@7.27.1': - resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} + '@babel/helper-replace-supers@7.28.6': + resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -4923,16 +4957,16 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} - '@babel/helper-wrap-function@7.28.3': - resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} + '@babel/helper-wrap-function@7.28.6': + resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.4': - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + '@babel/helpers@7.28.6': + resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.5': - resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} engines: {node: '>=6.0.0'} hasBin: true @@ -4960,8 +4994,8 @@ packages: peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3': - resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==} + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6': + resolution: {integrity: sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -4973,8 +5007,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-proposal-decorators@7.28.0': - resolution: {integrity: sha512-zOiZqvANjWDUaUS9xMxbMcK/Zccztbe/6ikvUXaG9nsPH3w6qh5UaPGAnirI/WhIbZ8m3OHU0ReyPrknG+ZKeg==} + '@babel/plugin-proposal-decorators@7.29.0': + resolution: {integrity: sha512-CVBVv3VY/XRMxRYq5dwr2DS7/MvqPm23cOCjbwNnVrfOqcWlnefua1uUs0sjdKOGjvPUG633o07uWzJq4oI6dA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5053,8 +5087,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-decorators@7.27.1': - resolution: {integrity: sha512-YMq8Z87Lhl8EGkmb0MwYkt36QnxC+fzCgrl66ereamPlYToRpIk5nUjKUY3QKLWq8mwUB1BgbeXcTJhZOCDg5A==} + '@babel/plugin-syntax-decorators@7.28.6': + resolution: {integrity: sha512-71EYI0ONURHJBL4rSFXnITXqXrrY8q4P0q006DPfN+Rk+ASM+++IBXem/ruokgBZR8YNEWZ8R6B+rCb8VcUTqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5076,14 +5110,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.27.1': - resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} + '@babel/plugin-syntax-import-assertions@7.28.6': + resolution: {integrity: sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.27.1': - resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + '@babel/plugin-syntax-import-attributes@7.28.6': + resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5103,8 +5137,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-jsx@7.27.1': - resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} + '@babel/plugin-syntax-jsx@7.28.6': + resolution: {integrity: sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5151,8 +5185,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-typescript@7.27.1': - resolution: {integrity: sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==} + '@babel/plugin-syntax-typescript@7.28.6': + resolution: {integrity: sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5169,14 +5203,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.28.0': - resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} + '@babel/plugin-transform-async-generator-functions@7.29.0': + resolution: {integrity: sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.27.1': - resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} + '@babel/plugin-transform-async-to-generator@7.28.6': + resolution: {integrity: sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5187,32 +5221,32 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.28.5': - resolution: {integrity: sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==} + '@babel/plugin-transform-block-scoping@7.28.6': + resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.27.1': - resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + '@babel/plugin-transform-class-properties@7.28.6': + resolution: {integrity: sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.28.3': - resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} + '@babel/plugin-transform-class-static-block@7.28.6': + resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.28.4': - resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} + '@babel/plugin-transform-classes@7.28.6': + resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.27.1': - resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} + '@babel/plugin-transform-computed-properties@7.28.6': + resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5223,8 +5257,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.27.1': - resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} + '@babel/plugin-transform-dotall-regex@7.28.6': + resolution: {integrity: sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5235,8 +5269,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0': + resolution: {integrity: sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -5247,8 +5281,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.28.5': - resolution: {integrity: sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==} + '@babel/plugin-transform-exponentiation-operator@7.28.6': + resolution: {integrity: sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5277,8 +5311,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.27.1': - resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} + '@babel/plugin-transform-json-strings@7.28.6': + resolution: {integrity: sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5289,8 +5323,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.28.5': - resolution: {integrity: sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==} + '@babel/plugin-transform-logical-assignment-operators@7.28.6': + resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5307,14 +5341,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.27.1': - resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + '@babel/plugin-transform-modules-commonjs@7.28.6': + resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.28.5': - resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} + '@babel/plugin-transform-modules-systemjs@7.29.0': + resolution: {integrity: sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5325,8 +5359,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0': + resolution: {integrity: sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -5337,20 +5371,20 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': - resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6': + resolution: {integrity: sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.27.1': - resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} + '@babel/plugin-transform-numeric-separator@7.28.6': + resolution: {integrity: sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.28.4': - resolution: {integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==} + '@babel/plugin-transform-object-rest-spread@7.28.6': + resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5361,14 +5395,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.27.1': - resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} + '@babel/plugin-transform-optional-catch-binding@7.28.6': + resolution: {integrity: sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.28.5': - resolution: {integrity: sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==} + '@babel/plugin-transform-optional-chaining@7.28.6': + resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5379,14 +5413,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.27.1': - resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} + '@babel/plugin-transform-private-methods@7.28.6': + resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.27.1': - resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} + '@babel/plugin-transform-private-property-in-object@7.28.6': + resolution: {integrity: sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5409,8 +5443,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx@7.27.1': - resolution: {integrity: sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==} + '@babel/plugin-transform-react-jsx@7.28.6': + resolution: {integrity: sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5421,14 +5455,14 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.28.4': - resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==} + '@babel/plugin-transform-regenerator@7.29.0': + resolution: {integrity: sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regexp-modifiers@7.27.1': - resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} + '@babel/plugin-transform-regexp-modifiers@7.28.6': + resolution: {integrity: sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -5445,8 +5479,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.27.1': - resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} + '@babel/plugin-transform-spread@7.28.6': + resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5469,8 +5503,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-typescript@7.28.5': - resolution: {integrity: sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==} + '@babel/plugin-transform-typescript@7.28.6': + resolution: {integrity: sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5481,8 +5515,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.27.1': - resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} + '@babel/plugin-transform-unicode-property-regex@7.28.6': + resolution: {integrity: sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -5493,8 +5527,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.27.1': - resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} + '@babel/plugin-transform-unicode-sets-regex@7.28.6': + resolution: {integrity: sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -5534,30 +5568,30 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/register@7.28.3': - resolution: {integrity: sha512-CieDOtd8u208eI49bYl4z1J22ySFw87IGwE+IswFEExH7e3rLgKb0WNQeumnacQ1+VoDJLYI5QFA3AJZuyZQfA==} + '@babel/register@7.28.6': + resolution: {integrity: sha512-pgcbbEl/dWQYb6L6Yew6F94rdwygfuv+vJ/tXfwIOYAfPB6TNWpXUMEtEq3YuTeHRdvMIhvz13bkT9CNaS+wqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime-corejs3@7.28.4': - resolution: {integrity: sha512-h7iEYiW4HebClDEhtvFObtPmIvrd1SSfpI9EhOeKk4CtIK/ngBWFpuhCzhdmRKtg71ylcue+9I6dv54XYO1epQ==} + '@babel/runtime-corejs3@7.29.0': + resolution: {integrity: sha512-TgUkdp71C9pIbBcHudc+gXZnihEDOjUAmXO1VO4HHGES7QLZcShR0stfKIxLSNIYx2fqhmJChOjm/wkF8wv4gA==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.28.4': - resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} engines: {node: '>=6.9.0'} - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.5': - resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.5': - resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} '@base2/pretty-print-object@1.0.1': @@ -5626,11 +5660,11 @@ packages: cpu: [x64] os: [win32] - '@cacheable/memory@2.0.6': - resolution: {integrity: sha512-7e8SScMocHxcAb8YhtkbMhGG+EKLRIficb1F5sjvhSYsWTZGxvg4KIDp8kgxnV2PUJ3ddPe6J9QESjKvBWRDkg==} + '@cacheable/memory@2.0.7': + resolution: {integrity: sha512-RbxnxAMf89Tp1dLhXMS7ceft/PGsDl1Ip7T20z5nZ+pwIAsQ1p2izPjVG69oCLv/jfQ7HDPHTWK0c9rcAWXN3A==} - '@cacheable/utils@2.3.2': - resolution: {integrity: sha512-8kGE2P+HjfY8FglaOiW+y8qxcaQAfAhVML+i66XJR3YX5FtyDqn6Txctr3K2FrbxLKixRRYYBWMbuGciOhYNDg==} + '@cacheable/utils@2.3.3': + resolution: {integrity: sha512-JsXDL70gQ+1Vc2W/KUFfkAJzgb4puKwwKehNLuB+HrNKWf91O736kGfxn4KujXCCSuh6mRRL4XEB0PkAFjWS0A==} '@cnakazawa/watch@1.0.4': resolution: {integrity: sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==} @@ -5640,8 +5674,8 @@ packages: '@codemirror/autocomplete@6.19.1': resolution: {integrity: sha512-q6NenYkEy2fn9+JyjIxMWcNjzTL/IhwqfzOut1/G3PrIFkrbl4AL7Wkse5tLrQUUyqGoAKU5+Pi5jnnXxH5HGw==} - '@codemirror/commands@6.10.0': - resolution: {integrity: sha512-2xUIc5mHXQzT16JnyOFkh8PvfeXuIut3pslWGfsGOhxP/lpgRm9HOl/mpzLErgt5mXDovqA0d11P21gofRLb9w==} + '@codemirror/commands@6.10.1': + resolution: {integrity: sha512-uWDWFypNdQmz2y1LaNJzK7fL7TYKLeUAU0npEC685OKTF3KcQ2Vu3klIM78D7I6wGhktme0lh3CuQLv0ZCrD9Q==} '@codemirror/lang-angular@0.1.4': resolution: {integrity: sha512-oap+gsltb/fzdlTQWD6BFF4bSLKcDnlxDsLdePiJpCVNKWXSTAbiiQeYI3UmES+BLAdkmIC1WjyztC1pi/bX4g==} @@ -5673,8 +5707,8 @@ packages: '@codemirror/lang-less@6.0.2': resolution: {integrity: sha512-EYdQTG22V+KUUk8Qq582g7FMnCZeEHsyuOJisHRft/mQ+ZSZ2w51NupvDUHiqtsOy7It5cHLPGfHQLpMh9bqpQ==} - '@codemirror/lang-liquid@6.3.0': - resolution: {integrity: sha512-fY1YsUExcieXRTsCiwX/bQ9+PbCTA/Fumv7C7mTUZHoFkibfESnaXwpr2aKH6zZVwysEunsHHkaIpM/pl3xETQ==} + '@codemirror/lang-liquid@6.3.1': + resolution: {integrity: sha512-S/jE/D7iij2Pu70AC65ME6AYWxOOcX20cSJvaPgY5w7m2sfxsArAcUAuUgm/CZCVmqoi9KiOlS7gj/gyLipABw==} '@codemirror/lang-markdown@6.5.0': resolution: {integrity: sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==} @@ -5721,11 +5755,11 @@ packages: '@codemirror/merge@6.11.2': resolution: {integrity: sha512-NO5EJd2rLRbwVWLgMdhIntDIhfDtMOKYEZgqV5WnkNUS2oXOCVWLPjG/kgl/Jth2fGiOuG947bteqxP9nBXmMg==} - '@codemirror/search@6.5.11': - resolution: {integrity: sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==} + '@codemirror/search@6.6.0': + resolution: {integrity: sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==} - '@codemirror/state@6.5.2': - resolution: {integrity: sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==} + '@codemirror/state@6.5.4': + resolution: {integrity: sha512-8y7xqG/hpB53l25CIoit9/ngxdfoG+fx+V3SHBrinnhOtLvKHRyAJJuHzkWrR4YXXLX8eXBsejgAAxHUOdW1yw==} '@codemirror/theme-one-dark@6.1.3': resolution: {integrity: sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==} @@ -5763,9 +5797,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.0.20': - resolution: {integrity: sha512-8BHsjXfSciZxjmHQOuVdW2b8WLUPts9a+mfL13/PzEviufUEW2xnvQuOlKs9dRBHgRqJ53SF/DUoK9+MZk72oQ==} - engines: {node: '>=18'} + '@csstools/css-syntax-patches-for-csstree@1.0.26': + resolution: {integrity: sha512-6boXK0KkzT5u5xOgF6TKB+CLq9SOpEGmkZw0g5n9/7yg85wab3UzSxB8TxhLJ31L4SGJ6BCFRw/iftTha1CJXA==} '@csstools/css-tokenizer@3.0.4': resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} @@ -5809,11 +5842,11 @@ packages: '@dual-bundle/import-meta-resolve@4.2.1': resolution: {integrity: sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==} - '@emnapi/core@1.7.1': - resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + '@emnapi/core@1.8.1': + resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} - '@emnapi/runtime@1.7.1': - resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} @@ -6037,8 +6070,8 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.9.0': - resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -6047,46 +6080,34 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.20.1': - resolution: {integrity: sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/config-helpers@0.2.3': - resolution: {integrity: sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==} + '@eslint/config-array@0.21.1': + resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.13.0': - resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@eslint/core@0.14.0': - resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/core@0.15.2': resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.3': resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@9.26.0': - resolution: {integrity: sha512-I9XlJawFdSMvWjDt6wksMCrgns5ggLNfFwFvnShsleWruvXM514Qxk8V246efTw+eo9JABvVz+u3q2RiAowKxQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.27.0': resolution: {integrity: sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@9.39.2': + resolution: {integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/object-schema@2.1.7': resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -6098,14 +6119,14 @@ packages: '@fal-works/esbuild-plugin-global-externals@2.1.2': resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} - '@floating-ui/core@1.7.3': - resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + '@floating-ui/core@1.7.4': + resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} - '@floating-ui/dom@1.7.4': - resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + '@floating-ui/dom@1.7.5': + resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==} - '@floating-ui/react-dom@2.1.6': - resolution: {integrity: sha512-4JX6rEatQEvlmgU80wZyq9RT96HZJa88q8hp0pBd+LrczeDI4o6uA2M+uvxngVHo4Ihr8uibXxH6+70zhAFrVw==} + '@floating-ui/react-dom@2.1.7': + resolution: {integrity: sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' @@ -6187,6 +6208,12 @@ packages: react: ^18 || ^19 || ^19.0.0-rc react-dom: ^18 || ^19 || ^19.0.0-rc + '@hono/node-server@1.19.9': + resolution: {integrity: sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==} + engines: {node: '>=18.14.1'} + peerDependencies: + hono: ^4 + '@hookform/resolvers@2.9.11': resolution: {integrity: sha512-bA3aZ79UgcHj7tFV7RlgThzwSSHZgvfbt2wprldRkYBcMopdMvHyO17Wwp/twcJasNFischFfS7oz8Katz8DdQ==} peerDependencies: @@ -6215,19 +6242,10 @@ packages: resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} engines: {node: '>=18.18.0'} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - '@humanwhocodes/retry@0.4.3': resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} @@ -6492,44 +6510,128 @@ packages: peerDependencies: tslib: '2' + '@jsonjoy.com/base64@17.65.0': + resolution: {integrity: sha512-Xrh7Fm/M0QAYpekSgmskdZYnFdSGnsxJ/tHaolA4bNwWdG9i65S8m83Meh7FOxyJyQAdo4d4J97NOomBLEfkDQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@jsonjoy.com/buffers@1.2.1': resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' + '@jsonjoy.com/buffers@17.65.0': + resolution: {integrity: sha512-eBrIXd0/Ld3p9lpDDlMaMn6IEfWqtHMD+z61u0JrIiPzsV1r7m6xDZFRxJyvIFTEO+SWdYF9EiQbXZGd8BzPfA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@jsonjoy.com/codegen@1.0.0': resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' + '@jsonjoy.com/codegen@17.65.0': + resolution: {integrity: sha512-7MXcRYe7n3BG+fo3jicvjB0+6ypl2Y/bQp79Sp7KeSiiCgLqw4Oled6chVv07/xLVTdo3qa1CD0VCCnPaw+RGA==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-core@4.56.10': + resolution: {integrity: sha512-PyAEA/3cnHhsGcdY+AmIU+ZPqTuZkDhCXQ2wkXypdLitSpd6d5Ivxhnq4wa2ETRWFVJGabYynBWxIijOswSmOw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-fsa@4.56.10': + resolution: {integrity: sha512-/FVK63ysNzTPOnCCcPoPHt77TOmachdMS422txM4KhxddLdbW1fIbFMYH0AM0ow/YchCyS5gqEjKLNyv71j/5Q==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-builtins@4.56.10': + resolution: {integrity: sha512-uUnKz8R0YJyKq5jXpZtkGV9U0pJDt8hmYcLRrPjROheIfjMXsz82kXMgAA/qNg0wrZ1Kv+hrg7azqEZx6XZCVw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-to-fsa@4.56.10': + resolution: {integrity: sha512-oH+O6Y4lhn9NyG6aEoFwIBNKZeYy66toP5LJcDOMBgL99BKQMUf/zWJspdRhMdn/3hbzQsZ8EHHsuekbFLGUWw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node-utils@4.56.10': + resolution: {integrity: sha512-8EuPBgVI2aDPwFdaNQeNpHsyqPi3rr+85tMNG/lHvQLiVjzoZsvxA//Xd8aB567LUhy4QS03ptT+unkD/DIsNg==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-node@4.56.10': + resolution: {integrity: sha512-7R4Gv3tkUdW3dXfXiOkqxkElxKNVdd8BDOWC0/dbERd0pXpPY+s2s1Mino+aTvkGrFPiY+mmVxA7zhskm4Ue4Q==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-print@4.56.10': + resolution: {integrity: sha512-JW4fp5mAYepzFsSGrQ48ep8FXxpg4niFWHdF78wDrFGof7F3tKDJln72QFDEn/27M1yHd4v7sKHHVPh78aWcEw==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + + '@jsonjoy.com/fs-snapshot@4.56.10': + resolution: {integrity: sha512-DkR6l5fj7+qj0+fVKm/OOXMGfDFCGXLfyHkORH3DF8hxkpDgIHbhf/DwncBMs2igu/ST7OEkexn1gIqoU6Y+9g==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@jsonjoy.com/json-pack@1.21.0': resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' + '@jsonjoy.com/json-pack@17.65.0': + resolution: {integrity: sha512-e0SG/6qUCnVhHa0rjDJHgnXnbsacooHVqQHxspjvlYQSkHm+66wkHw6Gql+3u/WxI/b1VsOdUi0M+fOtkgKGdQ==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@jsonjoy.com/json-pointer@1.0.2': resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' + '@jsonjoy.com/json-pointer@17.65.0': + resolution: {integrity: sha512-uhTe+XhlIZpWOxgPcnO+iSCDgKKBpwkDVTyYiXX9VayGV8HSFVJM67M6pUE71zdnXF1W0Da21AvnhlmdwYPpow==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@jsonjoy.com/util@1.9.0': resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} engines: {node: '>=10.0'} peerDependencies: tslib: '2' + '@jsonjoy.com/util@17.65.0': + resolution: {integrity: sha512-cWiEHZccQORf96q2y6zU3wDeIVPeidmGqd9cNKJRYoVHTV0S1eHPy5JTbHpMnGfDvtvujQwQozOqgO9ABu6h0w==} + engines: {node: '>=10.0'} + peerDependencies: + tslib: '2' + '@juggle/resize-observer@3.4.0': resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==} - '@keyv/bigmap@1.3.0': - resolution: {integrity: sha512-KT01GjzV6AQD5+IYrcpoYLkCu1Jod3nau1Z7EsEuViO3TZGRacSbO9MfHmbJ1WaOXFtWLxPVj169cn2WNKPkIg==} + '@keyv/bigmap@1.3.1': + resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} engines: {node: '>= 18'} peerDependencies: - keyv: ^5.5.4 + keyv: ^5.6.0 '@keyv/serialize@1.1.1': resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} @@ -6608,11 +6710,11 @@ packages: peerDependencies: yjs: '>=13.5.22' - '@lezer/common@1.4.0': - resolution: {integrity: sha512-DVeMRoGrgn/k45oQNu189BoW4SZwgZFzJ1+1TV5j2NJ/KFC83oa/enRqZSGshyeMk5cPWMhsKs9nx+8o0unwGg==} + '@lezer/common@1.5.0': + resolution: {integrity: sha512-PNGcolp9hr4PJdXR4ix7XtixDrClScvtSCYW3rQG106oVMOOI+jFb+0+J3mbeL/53g1Zd6s0kJzaw6Ri68GmAA==} - '@lezer/cpp@1.1.3': - resolution: {integrity: sha512-ykYvuFQKGsRi6IcE+/hCSGUhb/I4WPjd3ELhEblm2wS2cOznDFzO+ubK2c+ioysOnlZ3EduV+MVQFCPzAIoY3w==} + '@lezer/cpp@1.1.5': + resolution: {integrity: sha512-DIhSXmYtJKLehrjzDFN+2cPt547ySQ41nA8yqcDf/GxMc+YM736xqltFkvADL2M0VebU5I+3+4ks2Vv+Kyq3Aw==} '@lezer/css@1.3.0': resolution: {integrity: sha512-pBL7hup88KbI7hXnZV3PQsn43DHy6TWyzuyk2AO9UyoXcDltvIdqWKE1dLL/45JVZ+YZkHe1WVHqO6wugZZWcw==} @@ -6623,8 +6725,8 @@ packages: '@lezer/highlight@1.2.3': resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==} - '@lezer/html@1.3.12': - resolution: {integrity: sha512-RJ7eRWdaJe3bsiiLLHjCFT1JMk8m1YP9kaUbvu2rMLEoOnke9mcTVDyfOslsln0LtujdWespjJ39w6zo+RsQYw==} + '@lezer/html@1.3.13': + resolution: {integrity: sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==} '@lezer/java@1.1.3': resolution: {integrity: sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw==} @@ -6635,11 +6737,11 @@ packages: '@lezer/json@1.0.3': resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==} - '@lezer/lr@1.4.4': - resolution: {integrity: sha512-LHL17Mq0OcFXm1pGQssuGTQFPPdxARjKM8f7GA5+sGtHi0K3R84YaSbmche0+RKWHnCsx9asEe5OWOI4FHfe4A==} + '@lezer/lr@1.4.8': + resolution: {integrity: sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==} - '@lezer/markdown@1.6.0': - resolution: {integrity: sha512-AXb98u3M6BEzTnreBnGtQaF7xFTiMA92Dsy5tqEjpacbjRxDSFdN4bKJo9uvU4cEEOS7D2B9MT7kvDgOEIzJSw==} + '@lezer/markdown@1.6.3': + resolution: {integrity: sha512-jpGm5Ps+XErS+xA4urw7ogEGkeZOahVQF21Z6oECF0sj+2liwZopd2+I8uH5I/vZsRuuze3OxBREIANLf6KKUw==} '@lezer/php@1.0.5': resolution: {integrity: sha512-W7asp9DhM6q0W6DYNwIkLSKOvxlXRrif+UXBMxzsJUuqmhE7oVU+gS3THO4S/Puh7Xzgm858UNaFi6dxTP8dJA==} @@ -6656,8 +6758,8 @@ packages: '@lezer/xml@1.0.6': resolution: {integrity: sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==} - '@lezer/yaml@1.0.3': - resolution: {integrity: sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==} + '@lezer/yaml@1.0.4': + resolution: {integrity: sha512-2lrrHqxalACEbxIbsjhqGpSW8kWpUKuY6RHgnSAFZa6qK62wvnPxA8hGOwOoDbwHcOFs5M4o27mjGu+P7TvBmw==} '@marijn/find-cluster-break@1.0.2': resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} @@ -6698,32 +6800,32 @@ packages: react: '>= 18 || >= 19' react-dom: '>= 18 || >= 19' - '@microsoft/1ds-core-js@4.3.10': - resolution: {integrity: sha512-5fSZmkGwWkH+mrIA5M1GYPZdPM+SjXwCCl2Am7VhFoVwOBJNhRnwvIpAdzw6sFjiebN/rz+/YH0NdxztGZSa9Q==} + '@microsoft/1ds-core-js@4.3.11': + resolution: {integrity: sha512-QyQE/YzFYB+31WEpX9hvDoXZOIXA7308Z5uuL1mSsyDSkNPl24hBWz9O3vZL+/p9shy756eKLI2nFLwwIAhXyw==} - '@microsoft/1ds-post-js@4.3.10': - resolution: {integrity: sha512-VSLjc9cT+Y+eTiSfYltJHJCejn8oYr0E6Pq2BMhOEO7F6IyLGYIxzKKvo78ze9x+iHX7KPTATcZ+PFgjGXuNqg==} + '@microsoft/1ds-post-js@4.3.11': + resolution: {integrity: sha512-V0ZeeALy/Pj8HWgNHDsK+yDeCYnJ9bCgTWhcrna/ZiAT+sGfWs6mDBjAVcG03uP7TDjdWLf8w79lgbXJ3+s3DA==} - '@microsoft/applicationinsights-channel-js@3.3.10': - resolution: {integrity: sha512-iolFLz1ocWAzIQqHIEjjov3gNTPkgFQ4ArHnBcJEYoffOGWlJt6copaevS5YPI5rHzmbySsengZ8cLJJBBrXzQ==} + '@microsoft/applicationinsights-channel-js@3.3.11': + resolution: {integrity: sha512-0ex/mxTf5R+P5WSvdU8Hgbeg8VzQ0XvcnjKQdmQy05ycScnKevt8an3DEPikOFqOKDi59L5hUETZlcdhesnVtg==} peerDependencies: tslib: '>= 1.0.0' - '@microsoft/applicationinsights-common@3.3.10': - resolution: {integrity: sha512-RVIenPIvNgZCbjJdALvLM4rNHgAFuHI7faFzHCgnI6S2WCUNGHeXlQTs9EUUrL+n2TPp9/cd0KKMILU5VVyYiA==} + '@microsoft/applicationinsights-common@3.3.11': + resolution: {integrity: sha512-OIe5vL56lkmIsRsI21QqbGpF8gF/UzUP4mlEhGWyG2UMskdtWrY+c+xAynyNDsAjhKKge+Rrs/xkpC0Fo0QrhQ==} peerDependencies: tslib: '>= 1.0.0' - '@microsoft/applicationinsights-core-js@3.3.10': - resolution: {integrity: sha512-5yKeyassZTq2l+SAO4npu6LPnbS++UD+M+Ghjm9uRzoBwD8tumFx0/F8AkSVqbniSREd+ztH/2q2foewa2RZyg==} + '@microsoft/applicationinsights-core-js@3.3.11': + resolution: {integrity: sha512-WlBY1sKDNL62T++NifgFCyDuOoNUNrVILfnHubOzgU/od7MFEQYWU8EZyDcBC/+Z8e3TD6jfixurYtWoUC+6Eg==} peerDependencies: tslib: '>= 1.0.0' '@microsoft/applicationinsights-shims@3.0.1': resolution: {integrity: sha512-DKwboF47H1nb33rSUfjqI6ryX29v+2QWcTrRvcQDA32AZr5Ilkr7whOOSsD1aBzwqX0RJEIP1Z81jfE3NBm/Lg==} - '@microsoft/applicationinsights-web-basic@3.3.10': - resolution: {integrity: sha512-AZib5DAT3NU0VT0nLWEwXrnoMDDgZ/5S4dso01CNU5ELNxLdg+1fvchstlVdMy4FrAnxzs8Wf/GIQNFYOVgpAw==} + '@microsoft/applicationinsights-web-basic@3.3.11': + resolution: {integrity: sha512-pdxXWT0khRDSubK66ZhVG2DXkJwtqyrcil+iDD2pVaZP+fFHXunJI6/MhEdjgk6j3jpASt8SSq9xWVYOqrBbpA==} peerDependencies: tslib: '>= 1.0.0' @@ -6744,25 +6846,25 @@ packages: '@microsoft/fast-web-utilities@5.4.1': resolution: {integrity: sha512-ReWYncndjV3c8D8iq9tp7NcFNc1vbVHvcBFPME2nNFKNbS1XCesYZGlIlf3ot5EmuOXPlrzUHOWzQ2vFpIkqDg==} - '@modelcontextprotocol/inspector-cli@0.17.2': - resolution: {integrity: sha512-xXaqZYWJz77xvmfAVlYbvz2/xw9OaalFHq0n5A8PlmZvmhi6akQocIE7ZYaoEBpLbWRSwIZWfsidnfoKb6dO2A==} + '@modelcontextprotocol/inspector-cli@0.17.5': + resolution: {integrity: sha512-LoDwYa/lpjug19mvIrqOU1UAmgrnOxToZqa/WCDmFLlo7t2LXMqtWKdw00WHXH7p4knF6CgRNfHSBquUmwBJag==} hasBin: true - '@modelcontextprotocol/inspector-client@0.17.2': - resolution: {integrity: sha512-llC96yU8iMjG7ny2gpjhm+ARQqBRZWeKBCxW+nBErAE43jBqd5DhGuI2abrt499Gd3ByNOImz+Z5mb8YWjRiJA==} + '@modelcontextprotocol/inspector-client@0.17.5': + resolution: {integrity: sha512-zoSa3LESpaYoRLD+6UNDkjyKtu1oYD3hXOwPegwtpvvLbM3CVj5WSUTXNaqN8UnFtyiQK2hc98IjaDPBkWProw==} hasBin: true - '@modelcontextprotocol/inspector-server@0.17.2': - resolution: {integrity: sha512-+logjB5XXK+8aE+eDl8cLnwY0UhOUh19vo6tg5rFVmLXNQPtxTFyWybcQfgP/cHp76+r5+EMxIpydDYEoasTvg==} + '@modelcontextprotocol/inspector-server@0.17.5': + resolution: {integrity: sha512-HlCVDPnCXGb/7HWhJ6Yu51YAQ0mgKluRspa+WtR4DnVxkYwrnph2VMJGlnJ3gwBtHlJM1TYpX0nYDcxF6Meu+w==} hasBin: true - '@modelcontextprotocol/inspector@0.17.2': - resolution: {integrity: sha512-ADWwZtbvecKCbLCR7L0Uaa2mPKFDJcTrc9xcE9pdN8gL/jFfzOMrgdNsKt+qBknzMeSQ6mJT+UguJbnQs8n13Q==} + '@modelcontextprotocol/inspector@0.17.5': + resolution: {integrity: sha512-4IevkwKP1tvhxO5m48v21PMaxkGvMSHwbTSCW/ZRkYnqJidQDu9eoWaXKa7Q5347767bhi0HAjFfOiEt/r6jQQ==} engines: {node: '>=22.7.5'} hasBin: true - '@modelcontextprotocol/sdk@1.24.0': - resolution: {integrity: sha512-D8h5KXY2vHFW8zTuxn2vuZGN0HGrQ5No6LkHwlEA9trVgNdPL3TF1dSqKA7Dny6BbBYKSW/rOBDXdC8KJAjUCg==} + '@modelcontextprotocol/sdk@1.25.3': + resolution: {integrity: sha512-vsAMBMERybvYgKbg/l4L1rhS7VXV1c0CtyJg72vwxONVX0l4ZfKVAnZEWTQixJGTzKnELjQ59e4NbdFDALRiAQ==} engines: {node: '>=18'} peerDependencies: '@cfworker/json-schema': ^4.1.1 @@ -6812,12 +6914,16 @@ packages: '@ndelangen/get-tarball@3.0.9': resolution: {integrity: sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==} - '@nevware21/ts-async@0.5.4': - resolution: {integrity: sha512-IBTyj29GwGlxfzXw2NPnzty+w0Adx61Eze1/lknH/XIVdxtF9UnOpk76tnrHXWa6j84a1RR9hsOcHQPFv9qJjA==} + '@nevware21/ts-async@0.5.5': + resolution: {integrity: sha512-vwqaL05iJPjLeh5igPi8MeeAu10i+Aq7xko1fbo9F5Si6MnVN5505qaV7AhSdk5MCBJVT/UYMk3kgInNjDb4Ig==} '@nevware21/ts-utils@0.12.5': resolution: {integrity: sha512-JPQZWPKQJjj7kAftdEZL0XDFfbMgXCGiUAZe0d7EhLC3QlXTlZdSckGqqRIQ2QNl0VTEZyZUvRBw6Ednw089Fw==} + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -6874,88 +6980,122 @@ packages: resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@parcel/watcher-android-arm64@2.5.1': - resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.5.1': - resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==} + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.1': - resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==} + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.5.1': - resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==} + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.5.1': - resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==} + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm-musl@2.5.1': - resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==} + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] - '@parcel/watcher-linux-arm64-glibc@2.5.1': - resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==} + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-arm64-musl@2.5.1': - resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==} + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] - '@parcel/watcher-linux-x64-glibc@2.5.1': - resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==} + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-linux-x64-musl@2.5.1': - resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==} + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] - '@parcel/watcher-win32-arm64@2.5.1': - resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==} + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.5.1': - resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==} + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} engines: {node: '>= 10.0.0'} cpu: [ia32] os: [win32] - '@parcel/watcher-win32-x64@2.5.1': - resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==} + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - '@parcel/watcher@2.5.1': - resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==} + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} engines: {node: '>= 10.0.0'} + '@peculiar/asn1-cms@2.6.0': + resolution: {integrity: sha512-2uZqP+ggSncESeUF/9Su8rWqGclEfEiz1SyU02WX5fUONFfkjzS2Z/F1Li0ofSmf4JqYXIOdCAZqIXAIBAT1OA==} + + '@peculiar/asn1-csr@2.6.0': + resolution: {integrity: sha512-BeWIu5VpTIhfRysfEp73SGbwjjoLL/JWXhJ/9mo4vXnz3tRGm+NGm3KNcRzQ9VMVqwYS2RHlolz21svzRXIHPQ==} + + '@peculiar/asn1-ecc@2.6.0': + resolution: {integrity: sha512-FF3LMGq6SfAOwUG2sKpPXblibn6XnEIKa+SryvUl5Pik+WR9rmRA3OCiwz8R3lVXnYnyRkSZsSLdml8H3UiOcw==} + + '@peculiar/asn1-pfx@2.6.0': + resolution: {integrity: sha512-rtUvtf+tyKGgokHHmZzeUojRZJYPxoD/jaN1+VAB4kKR7tXrnDCA/RAWXAIhMJJC+7W27IIRGe9djvxKgsldCQ==} + + '@peculiar/asn1-pkcs8@2.6.0': + resolution: {integrity: sha512-KyQ4D8G/NrS7Fw3XCJrngxmjwO/3htnA0lL9gDICvEQ+GJ+EPFqldcJQTwPIdvx98Tua+WjkdKHSC0/Km7T+lA==} + + '@peculiar/asn1-pkcs9@2.6.0': + resolution: {integrity: sha512-b78OQ6OciW0aqZxdzliXGYHASeCvvw5caqidbpQRYW2mBtXIX2WhofNXTEe7NyxTb0P6J62kAAWLwn0HuMF1Fw==} + + '@peculiar/asn1-rsa@2.6.0': + resolution: {integrity: sha512-Nu4C19tsrTsCp9fDrH+sdcOKoVfdfoQQ7S3VqjJU6vedR7tY3RLkQ5oguOIB3zFW33USDUuYZnPEQYySlgha4w==} + + '@peculiar/asn1-schema@2.6.0': + resolution: {integrity: sha512-xNLYLBFTBKkCzEZIw842BxytQQATQv+lDTCEMZ8C196iJcJJMBUZxrhSTxLaohMyKK8QlzRNTRkUmanucnDSqg==} + + '@peculiar/asn1-x509-attr@2.6.0': + resolution: {integrity: sha512-MuIAXFX3/dc8gmoZBkwJWxUWOSvG4MMDntXhrOZpJVMkYX+MYc/rUAU2uJOved9iJEoiUx7//3D8oG83a78UJA==} + + '@peculiar/asn1-x509@2.6.0': + resolution: {integrity: sha512-uzYbPEpoQiBoTq0/+jZtpM6Gq6zADBx+JNFP3yqRgziWBxQ/Dt/HcuvRfm9zJTPdRcBqPNdaRHTVwpyiq6iNMA==} + + '@peculiar/x509@1.14.3': + resolution: {integrity: sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==} + engines: {node: '>=20.0.0'} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -7030,7 +7170,7 @@ packages: '@projectstorm/react-canvas-core@6.7.4': resolution: {integrity: sha512-sY32kT//gQe5aw6RHkmKrbzBq9iWyfwyvvfRTplGPE1ll3zOBVCjbf3tdfw6vATCden+WR0TmirtBo2j3exiBg==} peerDependencies: - lodash: 4.* + lodash: 4.17.23 react: 16.* || 17.* '@projectstorm/react-canvas-core@7.0.3': @@ -7039,7 +7179,7 @@ packages: '@projectstorm/react-diagrams-core@6.7.4': resolution: {integrity: sha512-AeqH1u58Ugk8mif/GgLEUeOMmTPaWDpl1isA1OJHCPGMbvAytRfv5mrGMvG2E+pYDB29BQ4Yo2z9/TbAy6/nvA==} peerDependencies: - lodash: 4.* + lodash: 4.17.23 react: 18.* resize-observer-polyfill: ^1.5.1 @@ -7051,7 +7191,7 @@ packages: peerDependencies: '@emotion/react': ^11.* '@emotion/styled': ^11.* - lodash: 4.* + lodash: 4.17.23 react: 18.* '@projectstorm/react-diagrams-defaults@7.1.3': @@ -7061,7 +7201,7 @@ packages: resolution: {integrity: sha512-mB8YaRkNF6gdTlYvL0Cxc6m6XLwh7wvmjIsiEO6kW3j1uSvH7R7Gbl/iDYOdc0zUMqH9+pD+M064tWC4oAXa9A==} peerDependencies: dagre: ^0.8.5 - lodash: 4.* + lodash: 4.17.23 pathfinding: ^0.4.18 paths-js: ^0.4.11 react: 18.* @@ -7851,14 +7991,14 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@react-aria/focus@3.21.2': - resolution: {integrity: sha512-JWaCR7wJVggj+ldmM/cb/DXFg47CXR55lznJhZBh4XVqJjMKwaOOqpT5vNN7kpC1wUpXicGNuDnJDN1S/+6dhQ==} + '@react-aria/focus@3.21.3': + resolution: {integrity: sha512-FsquWvjSCwC2/sBk4b+OqJyONETUIXQ2vM0YdPAuC+QFQh2DT6TIBo6dOZVSezlhudDla69xFBd6JvCFq1AbUw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/interactions@3.25.6': - resolution: {integrity: sha512-5UgwZmohpixwNMVkMvn9K1ceJe6TzlRlAfuYoQDUuOkk62/JVJNDLAPKIf5YMRc7d2B0rmfgaZLMtbREb0Zvkw==} + '@react-aria/interactions@3.26.0': + resolution: {integrity: sha512-AAEcHiltjfbmP1i9iaVw34Mb7kbkiHpYdqieWufldh4aplWgsF11YQZOfaCJW4QoR2ML4Zzoa9nfFwLXA52R7Q==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 @@ -7869,8 +8009,8 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/utils@3.31.0': - resolution: {integrity: sha512-ABOzCsZrWzf78ysswmguJbx3McQUja7yeGj6/vZo4JVsZNlxAN+E9rs381ExBRI0KzVo6iBTeX5De8eMZPJXig==} + '@react-aria/utils@3.32.0': + resolution: {integrity: sha512-/7Rud06+HVBIlTwmwmJa2W8xVtgxgzm0+kLbuFooZRzKDON6hhozS1dOMR/YLMxyJOaYOTpImcP4vRR9gL1hEg==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 @@ -7897,8 +8037,8 @@ packages: '@react-stately/flags@3.1.2': resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==} - '@react-stately/utils@3.10.8': - resolution: {integrity: sha512-SN3/h7SzRsusVQjQ4v10LaVsDc81jyyR0DD5HnsQitm/I5WDpaSr2nRHtyloPFU48jlql1XX/S04T2DLQM7Y3g==} + '@react-stately/utils@3.11.0': + resolution: {integrity: sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 @@ -7907,14 +8047,14 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@redhat-developer/locators@1.17.0': - resolution: {integrity: sha512-CPDrTJfrA5lxXPd64RHuntq+foRorMIOQAN0tlaQQD5wX0X2xlCOf324TVWS1hmTiYHtA8VfFTJNOjMQYvu0Mw==} + '@redhat-developer/locators@1.18.1': + resolution: {integrity: sha512-fnb5prprb8jTzx9Vl2DiJq55XK7aZVwpDZV/iLY/pYsNWEn42/rLSyMUNDrvlhnFryqmVstmDUIr4eGE3iyDMw==} peerDependencies: '@redhat-developer/page-objects': '>=1.0.0' selenium-webdriver: '>=4.6.1' - '@redhat-developer/page-objects@1.17.0': - resolution: {integrity: sha512-KytdvW8iHyECmt7rLf/MWdrtHmUi/SIkgWowjscIx0+U6sgXW7hHZ/5/gWP5HGX0Q5K1AA67veC75x2eZosN2g==} + '@redhat-developer/page-objects@1.18.1': + resolution: {integrity: sha512-clwXbTAykhqJqUkdTWUtS7jwY1eQVhlgQia6GfmMHMLGxqMbHCgHVm0rEYoR1C050XWYxtfsEpnsmUB9Kjcs9A==} peerDependencies: selenium-webdriver: '>=4.6.1' typescript: '>=4.6.2' @@ -7998,113 +8138,128 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.53.3': - resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} + '@rollup/rollup-android-arm-eabi@4.57.1': + resolution: {integrity: sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.53.3': - resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} + '@rollup/rollup-android-arm64@4.57.1': + resolution: {integrity: sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.53.3': - resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} + '@rollup/rollup-darwin-arm64@4.57.1': + resolution: {integrity: sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.53.3': - resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} + '@rollup/rollup-darwin-x64@4.57.1': + resolution: {integrity: sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.53.3': - resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} + '@rollup/rollup-freebsd-arm64@4.57.1': + resolution: {integrity: sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.53.3': - resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} + '@rollup/rollup-freebsd-x64@4.57.1': + resolution: {integrity: sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': - resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': + resolution: {integrity: sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.53.3': - resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} + '@rollup/rollup-linux-arm-musleabihf@4.57.1': + resolution: {integrity: sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.53.3': - resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} + '@rollup/rollup-linux-arm64-gnu@4.57.1': + resolution: {integrity: sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.53.3': - resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} + '@rollup/rollup-linux-arm64-musl@4.57.1': + resolution: {integrity: sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.53.3': - resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} + '@rollup/rollup-linux-loong64-gnu@4.57.1': + resolution: {integrity: sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.57.1': + resolution: {integrity: sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.53.3': - resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} + '@rollup/rollup-linux-ppc64-gnu@4.57.1': + resolution: {integrity: sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.57.1': + resolution: {integrity: sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.53.3': - resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} + '@rollup/rollup-linux-riscv64-gnu@4.57.1': + resolution: {integrity: sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.53.3': - resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} + '@rollup/rollup-linux-riscv64-musl@4.57.1': + resolution: {integrity: sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.53.3': - resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} + '@rollup/rollup-linux-s390x-gnu@4.57.1': + resolution: {integrity: sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.53.3': - resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} + '@rollup/rollup-linux-x64-gnu@4.57.1': + resolution: {integrity: sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.53.3': - resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} + '@rollup/rollup-linux-x64-musl@4.57.1': + resolution: {integrity: sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.53.3': - resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} + '@rollup/rollup-openbsd-x64@4.57.1': + resolution: {integrity: sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.57.1': + resolution: {integrity: sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.53.3': - resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} + '@rollup/rollup-win32-arm64-msvc@4.57.1': + resolution: {integrity: sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.53.3': - resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} + '@rollup/rollup-win32-ia32-msvc@4.57.1': + resolution: {integrity: sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.53.3': - resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} + '@rollup/rollup-win32-x64-gnu@4.57.1': + resolution: {integrity: sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.53.3': - resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} + '@rollup/rollup-win32-x64-msvc@4.57.1': + resolution: {integrity: sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==} cpu: [x64] os: [win32] @@ -8183,15 +8338,15 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sinclair/typebox@0.34.41': - resolution: {integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g==} + '@sinclair/typebox@0.34.48': + resolution: {integrity: sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA==} '@sindresorhus/is@5.6.0': resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} - '@sindresorhus/is@7.1.1': - resolution: {integrity: sha512-rO92VvpgMc3kfiTjGT52LEtJ8Yc5kCWhZjLQ3LwlA4pSgPpQO7bVpYXParOD8Jwf+cVQECJo3yP/4I8aZtUQTQ==} + '@sindresorhus/is@7.2.0': + resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} engines: {node: '>=18'} '@sindresorhus/merge-streams@2.3.0': @@ -8231,8 +8386,8 @@ packages: peerDependencies: size-limit: 11.2.0 - '@smithy/abort-controller@4.2.5': - resolution: {integrity: sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==} + '@smithy/abort-controller@4.2.8': + resolution: {integrity: sha512-peuVfkYHAmS5ybKxWcfraK7WBBP0J+rkfUcbHJJKQ4ir3UAUNQI+Y4Vt/PqSzGqgloJ5O1dk7+WzNL8wcCSXbw==} engines: {node: '>=18.0.0'} '@smithy/chunked-blob-reader-native@4.2.1': @@ -8243,56 +8398,56 @@ packages: resolution: {integrity: sha512-WmU0TnhEAJLWvfSeMxBNe5xtbselEO8+4wG0NtZeL8oR21WgH1xiO37El+/Y+H/Ie4SCwBy3MxYWmOYaGgZueA==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.4.3': - resolution: {integrity: sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==} + '@smithy/config-resolver@4.4.6': + resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.18.6': - resolution: {integrity: sha512-8Q/ugWqfDUEU1Exw71+DoOzlONJ2Cn9QA8VeeDzLLjzO/qruh9UKFzbszy4jXcIYgGofxYiT0t1TT6+CT/GupQ==} + '@smithy/core@3.22.0': + resolution: {integrity: sha512-6vjCHD6vaY8KubeNw2Fg3EK0KLGQYdldG4fYgQmA0xSW0dJ8G2xFhSOdrlUakWVoP5JuWHtFODg3PNd/DN3FDA==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.2.5': - resolution: {integrity: sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==} + '@smithy/credential-provider-imds@4.2.8': + resolution: {integrity: sha512-FNT0xHS1c/CPN8upqbMFP83+ul5YgdisfCfkZ86Jh2NSmnqw/AJ6x5pEogVCTVvSm7j9MopRU89bmDelxuDMYw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-codec@4.2.5': - resolution: {integrity: sha512-Ogt4Zi9hEbIP17oQMd68qYOHUzmH47UkK7q7Gl55iIm9oKt27MUGrC5JfpMroeHjdkOliOA4Qt3NQ1xMq/nrlA==} + '@smithy/eventstream-codec@4.2.8': + resolution: {integrity: sha512-jS/O5Q14UsufqoGhov7dHLOPCzkYJl9QDzusI2Psh4wyYx/izhzvX9P4D69aTxcdfVhEPhjK+wYyn/PzLjKbbw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-browser@4.2.5': - resolution: {integrity: sha512-HohfmCQZjppVnKX2PnXlf47CW3j92Ki6T/vkAT2DhBR47e89pen3s4fIa7otGTtrVxmj7q+IhH0RnC5kpR8wtw==} + '@smithy/eventstream-serde-browser@4.2.8': + resolution: {integrity: sha512-MTfQT/CRQz5g24ayXdjg53V0mhucZth4PESoA5IhvaWVDTOQLfo8qI9vzqHcPsdd2v6sqfTYqF5L/l+pea5Uyw==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-config-resolver@4.3.5': - resolution: {integrity: sha512-ibjQjM7wEXtECiT6my1xfiMH9IcEczMOS6xiCQXoUIYSj5b1CpBbJ3VYbdwDy8Vcg5JHN7eFpOCGk8nyZAltNQ==} + '@smithy/eventstream-serde-config-resolver@4.3.8': + resolution: {integrity: sha512-ah12+luBiDGzBruhu3efNy1IlbwSEdNiw8fOZksoKoWW1ZHvO/04MQsdnws/9Aj+5b0YXSSN2JXKy/ClIsW8MQ==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-node@4.2.5': - resolution: {integrity: sha512-+elOuaYx6F2H6x1/5BQP5ugv12nfJl66GhxON8+dWVUEDJ9jah/A0tayVdkLRP0AeSac0inYkDz5qBFKfVp2Gg==} + '@smithy/eventstream-serde-node@4.2.8': + resolution: {integrity: sha512-cYpCpp29z6EJHa5T9WL0KAlq3SOKUQkcgSoeRfRVwjGgSFl7Uh32eYGt7IDYCX20skiEdRffyDpvF2efEZPC0A==} engines: {node: '>=18.0.0'} - '@smithy/eventstream-serde-universal@4.2.5': - resolution: {integrity: sha512-G9WSqbST45bmIFaeNuP/EnC19Rhp54CcVdX9PDL1zyEB514WsDVXhlyihKlGXnRycmHNmVv88Bvvt4EYxWef/Q==} + '@smithy/eventstream-serde-universal@4.2.8': + resolution: {integrity: sha512-iJ6YNJd0bntJYnX6s52NC4WFYcZeKrPUr1Kmmr5AwZcwCSzVpS7oavAmxMR7pMq7V+D1G4s9F5NJK0xwOsKAlQ==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.3.6': - resolution: {integrity: sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==} + '@smithy/fetch-http-handler@5.3.9': + resolution: {integrity: sha512-I4UhmcTYXBrct03rwzQX1Y/iqQlzVQaPxWjCjula++5EmWq9YGBrx6bbGqluGc1f0XEfhSkiY4jhLgbsJUMKRA==} engines: {node: '>=18.0.0'} - '@smithy/hash-blob-browser@4.2.6': - resolution: {integrity: sha512-8P//tA8DVPk+3XURk2rwcKgYwFvwGwmJH/wJqQiSKwXZtf/LiZK+hbUZmPj/9KzM+OVSwe4o85KTp5x9DUZTjw==} + '@smithy/hash-blob-browser@4.2.9': + resolution: {integrity: sha512-m80d/iicI7DlBDxyQP6Th7BW/ejDGiF0bgI754+tiwK0lgMkcaIBgvwwVc7OFbY4eUzpGtnig52MhPAEJ7iNYg==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.2.5': - resolution: {integrity: sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==} + '@smithy/hash-node@4.2.8': + resolution: {integrity: sha512-7ZIlPbmaDGxVoxErDZnuFG18WekhbA/g2/i97wGj+wUBeS6pcUeAym8u4BXh/75RXWhgIJhyC11hBzig6MljwA==} engines: {node: '>=18.0.0'} - '@smithy/hash-stream-node@4.2.5': - resolution: {integrity: sha512-6+do24VnEyvWcGdHXomlpd0m8bfZePpUKBy7m311n+JuRwug8J4dCanJdTymx//8mi0nlkflZBvJe+dEO/O12Q==} + '@smithy/hash-stream-node@4.2.8': + resolution: {integrity: sha512-v0FLTXgHrTeheYZFGhR+ehX5qUm4IQsjAiL9qehad2cyjMWcN2QG6/4mSwbSgEQzI7jwfoXj7z4fxZUx/Mhj2w==} engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@4.2.5': - resolution: {integrity: sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==} + '@smithy/invalid-dependency@4.2.8': + resolution: {integrity: sha512-N9iozRybwAQ2dn9Fot9kI6/w9vos2oTXLhtK7ovGqwZjlOcxu6XhPlpLpC+INsxktqHinn5gS2DXDjDF2kG5sQ==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': @@ -8303,76 +8458,76 @@ packages: resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} engines: {node: '>=18.0.0'} - '@smithy/md5-js@4.2.5': - resolution: {integrity: sha512-Bt6jpSTMWfjCtC0s79gZ/WZ1w90grfmopVOWqkI2ovhjpD5Q2XRXuecIPB9689L2+cCySMbaXDhBPU56FKNDNg==} + '@smithy/md5-js@4.2.8': + resolution: {integrity: sha512-oGMaLj4tVZzLi3itBa9TCswgMBr7k9b+qKYowQ6x1rTyTuO1IU2YHdHUa+891OsOH+wCsH7aTPRsTJO3RMQmjQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@4.2.5': - resolution: {integrity: sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==} + '@smithy/middleware-content-length@4.2.8': + resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.3.13': - resolution: {integrity: sha512-X4za1qCdyx1hEVVXuAWlZuK6wzLDv1uw1OY9VtaYy1lULl661+frY7FeuHdYdl7qAARUxH2yvNExU2/SmRFfcg==} + '@smithy/middleware-endpoint@4.4.12': + resolution: {integrity: sha512-9JMKHVJtW9RysTNjcBZQHDwB0p3iTP6B1IfQV4m+uCevkVd/VuLgwfqk5cnI4RHcp4cPwoIvxQqN4B1sxeHo8Q==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.13': - resolution: {integrity: sha512-RzIDF9OrSviXX7MQeKOm8r/372KTyY8Jmp6HNKOOYlrguHADuM3ED/f4aCyNhZZFLG55lv5beBin7nL0Nzy1Dw==} + '@smithy/middleware-retry@4.4.29': + resolution: {integrity: sha512-bmTn75a4tmKRkC5w61yYQLb3DmxNzB8qSVu9SbTYqW6GAL0WXO2bDZuMAn/GJSbOdHEdjZvWxe+9Kk015bw6Cg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.2.6': - resolution: {integrity: sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==} + '@smithy/middleware-serde@4.2.9': + resolution: {integrity: sha512-eMNiej0u/snzDvlqRGSN3Vl0ESn3838+nKyVfF2FKNXFbi4SERYT6PR392D39iczngbqqGG0Jl1DlCnp7tBbXQ==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.2.5': - resolution: {integrity: sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==} + '@smithy/middleware-stack@4.2.8': + resolution: {integrity: sha512-w6LCfOviTYQjBctOKSwy6A8FIkQy7ICvglrZFl6Bw4FmcQ1Z420fUtIhxaUZZshRe0VCq4kvDiPiXrPZAe8oRA==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.3.5': - resolution: {integrity: sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==} + '@smithy/node-config-provider@4.3.8': + resolution: {integrity: sha512-aFP1ai4lrbVlWjfpAfRSL8KFcnJQYfTl5QxLJXY32vghJrDuFyPZ6LtUL+JEGYiFRG1PfPLHLoxj107ulncLIg==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.4.5': - resolution: {integrity: sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==} + '@smithy/node-http-handler@4.4.8': + resolution: {integrity: sha512-q9u+MSbJVIJ1QmJ4+1u+cERXkrhuILCBDsJUBAW1MPE6sFonbCNaegFuwW9ll8kh5UdyY3jOkoOGlc7BesoLpg==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.2.5': - resolution: {integrity: sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==} + '@smithy/property-provider@4.2.8': + resolution: {integrity: sha512-EtCTbyIveCKeOXDSWSdze3k612yCPq1YbXsbqX3UHhkOSW8zKsM9NOJG5gTIya0vbY2DIaieG8pKo1rITHYL0w==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.3.5': - resolution: {integrity: sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==} + '@smithy/protocol-http@5.3.8': + resolution: {integrity: sha512-QNINVDhxpZ5QnP3aviNHQFlRogQZDfYlCkQT+7tJnErPQbDhysondEjhikuANxgMsZrkGeiAxXy4jguEGsDrWQ==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.2.5': - resolution: {integrity: sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==} + '@smithy/querystring-builder@4.2.8': + resolution: {integrity: sha512-Xr83r31+DrE8CP3MqPgMJl+pQlLLmOfiEUnoyAlGzzJIrEsbKsPy1hqH0qySaQm4oWrCBlUqRt+idEgunKB+iw==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.2.5': - resolution: {integrity: sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==} + '@smithy/querystring-parser@4.2.8': + resolution: {integrity: sha512-vUurovluVy50CUlazOiXkPq40KGvGWSdmusa3130MwrR1UNnNgKAlj58wlOe61XSHRpUfIIh6cE0zZ8mzKaDPA==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.2.5': - resolution: {integrity: sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==} + '@smithy/service-error-classification@4.2.8': + resolution: {integrity: sha512-mZ5xddodpJhEt3RkCjbmUQuXUOaPNTkbMGR0bcS8FE0bJDLMZlhmpgrvPNCYglVw5rsYTpSnv19womw9WWXKQQ==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.4.0': - resolution: {integrity: sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==} + '@smithy/shared-ini-file-loader@4.4.3': + resolution: {integrity: sha512-DfQjxXQnzC5UbCUPeC3Ie8u+rIWZTvuDPAGU/BxzrOGhRvgUanaP68kDZA+jaT3ZI+djOf+4dERGlm9mWfFDrg==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.3.5': - resolution: {integrity: sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==} + '@smithy/signature-v4@5.3.8': + resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.9.9': - resolution: {integrity: sha512-SUnZJMMo5yCmgjopJbiNeo1vlr8KvdnEfIHV9rlD77QuOGdRotIVBcOrBuMr+sI9zrnhtDtLP054bZVbpZpiQA==} + '@smithy/smithy-client@4.11.1': + resolution: {integrity: sha512-SERgNg5Z1U+jfR6/2xPYjSEHY1t3pyTHC/Ma3YQl6qWtmiL42bvNId3W/oMUWIwu7ekL2FMPdqAmwbQegM7HeQ==} engines: {node: '>=18.0.0'} - '@smithy/types@4.9.0': - resolution: {integrity: sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==} + '@smithy/types@4.12.0': + resolution: {integrity: sha512-9YcuJVTOBDjg9LWo23Qp0lTQ3D7fQsQtwle0jVfpbUHy9qBwCEgKuVH4FqFB3VYu0nwdHKiEMA+oXz7oV8X1kw==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.2.5': - resolution: {integrity: sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==} + '@smithy/url-parser@4.2.8': + resolution: {integrity: sha512-NQho9U68TGMEU639YkXnVMV3GEFFULmmaWdlu1E9qzyIePOHsoSnagTGSDv1Zi8DCNN6btxOSdgmy5E/hsZwhA==} engines: {node: '>=18.0.0'} '@smithy/util-base64@4.3.0': @@ -8399,32 +8554,32 @@ packages: resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.3.12': - resolution: {integrity: sha512-TKc6FnOxFULKxLgTNHYjcFqdOYzXVPFFVm5JhI30F3RdhT7nYOtOsjgaOwfDRmA/3U66O9KaBQ3UHoXwayRhAg==} + '@smithy/util-defaults-mode-browser@4.3.28': + resolution: {integrity: sha512-/9zcatsCao9h6g18p/9vH9NIi5PSqhCkxQ/tb7pMgRFnqYp9XUOyOlGPDMHzr8n5ih6yYgwJEY2MLEobUgi47w==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.2.15': - resolution: {integrity: sha512-94NqfQVo+vGc5gsQ9SROZqOvBkGNMQu6pjXbnn8aQvBUhc31kx49gxlkBEqgmaZQHUUfdRUin5gK/HlHKmbAwg==} + '@smithy/util-defaults-mode-node@4.2.31': + resolution: {integrity: sha512-JTvoApUXA5kbpceI2vuqQzRjeTbLpx1eoa5R/YEZbTgtxvIB7AQZxFJ0SEyfCpgPCyVV9IT7we+ytSeIB3CyWA==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.2.5': - resolution: {integrity: sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==} + '@smithy/util-endpoints@3.2.8': + resolution: {integrity: sha512-8JaVTn3pBDkhZgHQ8R0epwWt+BqPSLCjdjXXusK1onwJlRuN69fbvSK66aIKKO7SwVFM6x2J2ox5X8pOaWcUEw==} engines: {node: '>=18.0.0'} '@smithy/util-hex-encoding@4.2.0': resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.2.5': - resolution: {integrity: sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==} + '@smithy/util-middleware@4.2.8': + resolution: {integrity: sha512-PMqfeJxLcNPMDgvPbbLl/2Vpin+luxqTGPpW3NAQVLbRrFRzTa4rNAASYeIGjRV9Ytuhzny39SpyU04EQreF+A==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.2.5': - resolution: {integrity: sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==} + '@smithy/util-retry@4.2.8': + resolution: {integrity: sha512-CfJqwvoRY0kTGe5AkQokpURNCT1u/MkRzMTASWMPPo2hNSnKtF1D45dQl3DE2LKLr4m+PW9mCeBMJr5mCAVThg==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.5.6': - resolution: {integrity: sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==} + '@smithy/util-stream@4.5.10': + resolution: {integrity: sha512-jbqemy51UFSZSp2y0ZmRfckmrzuKww95zT9BYMmuJ8v3altGcqjwoV1tzpOwuHaKrwQrCjIzOib499ymr2f98g==} engines: {node: '>=18.0.0'} '@smithy/util-uri-escape@4.2.0': @@ -8439,8 +8594,8 @@ packages: resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} engines: {node: '>=18.0.0'} - '@smithy/util-waiter@4.2.5': - resolution: {integrity: sha512-Dbun99A3InifQdIrsXZ+QLcC0PGBPAdrl4cj1mTgJvyc9N2zf7QSxg8TBkzsCmGJdE3TLbO9ycwpY0EkWahQ/g==} + '@smithy/util-waiter@4.2.8': + resolution: {integrity: sha512-n+lahlMWk+aejGuax7DPWtqav8HYnWxQwR+LCG2BgCUmaGcTe9qZCFsmw8TMg9iG75HOwhrJCX9TCJRLH+Yzqg==} engines: {node: '>=18.0.0'} '@smithy/uuid@1.1.0': @@ -8450,8 +8605,8 @@ packages: '@so-ric/colorspace@1.1.6': resolution: {integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==} - '@standard-schema/spec@1.0.0': - resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} @@ -8486,6 +8641,11 @@ packages: peerDependencies: storybook: ^8.6.14 + '@storybook/addon-actions@8.6.15': + resolution: {integrity: sha512-zc600PBJqP9hCyRY5escKgKf6Zt9kdNZfm+Jwb46k5/NMSO4tNVeOPGBFxW9kSsIYk8j55sNske+Yh60G+8bcw==} + peerDependencies: + storybook: ^8.6.15 + '@storybook/addon-backgrounds@6.5.16': resolution: {integrity: sha512-t7qooZ892BruhilFmzYPbysFwpULt/q4zYXNSmKVbAYta8UVvitjcU4F18p8FpWd9WvhiTr0SDlyhNZuzvDfug==} peerDependencies: @@ -8565,6 +8725,11 @@ packages: peerDependencies: storybook: ^8.6.14 + '@storybook/addon-docs@8.6.15': + resolution: {integrity: sha512-Nm5LlxwAmGQRkCUY36FhtCLz21C+5XlydF7/bkBOHsf08p2xR5MNLMSPrIhte/PY7ne9viNUCm1d3d3LiWnkKg==} + peerDependencies: + storybook: ^8.6.15 + '@storybook/addon-essentials@6.5.16': resolution: {integrity: sha512-TeoMr6tEit4Pe91GH6f8g/oar1P4M0JL9S6oMcFxxrhhtOGO7XkWD5EnfyCx272Ok2VYfE58FNBTGPNBVIqYKQ==} peerDependencies: @@ -8668,11 +8833,11 @@ packages: react-dom: optional: true - '@storybook/addon-links@8.6.14': - resolution: {integrity: sha512-DRlXHIyZzOruAZkxmXfVgTF+4d6K27pFcH4cUsm3KT1AXuZbr23lb5iZHpUZoG6lmU85Sru4xCEgewSTXBIe1w==} + '@storybook/addon-links@8.6.15': + resolution: {integrity: sha512-abRWnDPBTwnj6sQYfAjUnYCNuUQbrVLLOyuormbDUqOcvZ+OqehNYo4BKXx0/lz61h0A2dOD1IuDo40uWyYVFQ==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.14 + storybook: ^8.6.15 peerDependenciesMeta: react: optional: true @@ -8704,10 +8869,10 @@ packages: peerDependencies: storybook: ^8.6.14 - '@storybook/addon-onboarding@8.6.14': - resolution: {integrity: sha512-bHdHiGJFigVcSzMIsNLHY5IODZHr+nKwyz5/QOZLMkLcGH2IaUbOJfm4RyGOaTTPsUtAKbdsVXNEG3Otf+qO9A==} + '@storybook/addon-onboarding@8.6.15': + resolution: {integrity: sha512-HAsGUQxpwP4MoyaCuZcmLpSMVTXC6PSic2QY6156ZfFMiobD+W0vIaxuDw65iBNUJ2vWRmrQsR8YgmfyWMQ7qA==} peerDependencies: - storybook: ^8.6.14 + storybook: ^8.6.15 '@storybook/addon-outline@6.5.16': resolution: {integrity: sha512-0du96nha4qltexO0Xq1xB7LeRSbqjC9XqtZLflXG7/X3ABoPD2cXgOV97eeaXUodIyb2qYBbHUfftBeA75x0+w==} @@ -8826,13 +8991,25 @@ packages: react-dom: optional: true - '@storybook/builder-manager@7.6.20': - resolution: {integrity: sha512-e2GzpjLaw6CM/XSmc4qJRzBF8GOoOyotyu3JrSPTYOt4RD8kjUsK4QlismQM1DQRu8i39aIexxmRbiJyD74xzQ==} + '@storybook/blocks@8.6.15': + resolution: {integrity: sha512-nc5jQkvPo0EirteHsrmcx9on/0lGQ8F4lUNky7kN2I5WM8Frr3cPTeRoAvzjUkOwrqt/vm3g+T4zSbmDq/OEDA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + storybook: ^8.6.15 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@storybook/builder-manager@7.6.21': + resolution: {integrity: sha512-j6N/OiwUGHzvDSpWKlrjuR8Fp3unEAhowgtKpc8fV3Qw0xi5lEmJc4yu0R5cIGkOsSoA5Oe6nLGhjRjvddioQA==} - '@storybook/builder-vite@8.6.14': - resolution: {integrity: sha512-ajWYhy32ksBWxwWHrjwZzyC0Ii5ZTeu5lsqA95Q/EQBB0P5qWlHWGM3AVyv82Mz/ND03ebGy123uVwgf6olnYQ==} + '@storybook/builder-vite@8.6.15': + resolution: {integrity: sha512-9Y05/ndZE6/eI7ZIUCD/QtH2htRIUs9j1gxE6oW0zRo9TJO1iqxfLNwgzd59KEkId7gdZxPei0l+LGTUGXYKRg==} peerDependencies: - storybook: ^8.6.14 + storybook: ^8.6.15 vite: ^4.0.0 || ^5.0.0 || ^6.0.0 '@storybook/builder-webpack4@6.5.16': @@ -8865,10 +9042,10 @@ packages: typescript: optional: true - '@storybook/builder-webpack5@8.6.14': - resolution: {integrity: sha512-YZYAqc6NBKoMTKZpjxnkMch6zDtMkBZdS/yaji1+wJX2QPFBwTbSh7SpeBxDp1S11gXSAJ4f1btUWeqSqo8nJA==} + '@storybook/builder-webpack5@8.6.15': + resolution: {integrity: sha512-4UZAm0t8CxVMUjkTzLaBoCKG3Bqg+lEKxrPrTGRddLlVCB8olv23C3/MW1aQJfzde9ze6ofllkn97r1tVG6ipQ==} peerDependencies: - storybook: ^8.6.14 + storybook: ^8.6.15 typescript: '*' peerDependenciesMeta: typescript: @@ -8886,15 +9063,15 @@ packages: '@storybook/channels@7.4.6': resolution: {integrity: sha512-yPv/sfo2c18fM3fvG0i1xse63vG8l33Al/OU0k/dtovltPu001/HVa1QgBgsb/QrEfZtvGjGhmtdVeYb39fv3A==} - '@storybook/channels@7.6.20': - resolution: {integrity: sha512-4hkgPSH6bJclB2OvLnkZOGZW1WptJs09mhQ6j6qLjgBZzL/ZdD6priWSd7iXrmPiN5TzUobkG4P4Dp7FjkiO7A==} + '@storybook/channels@7.6.21': + resolution: {integrity: sha512-899XbW60IXIkWDo90bS5ovjxnFUDgD8B2ZwUEJUmuhIXqQeSg2iJ8uYI699Csei+DoDn5gZYJD+BHbSUuc4g+Q==} - '@storybook/cli@7.6.20': - resolution: {integrity: sha512-ZlP+BJyqg7HlnXf7ypjG2CKMI/KVOn03jFIiClItE/jQfgR6kRFgtjRU7uajh427HHfjv9DRiur8nBzuO7vapA==} + '@storybook/cli@7.6.21': + resolution: {integrity: sha512-8SCDEeoBm+RAQDiH4HOjsQFJhReI7EJRylXVtllVhmq6TpxyJNZz8CSWEIU0zFhznIHktevriVzRR/qAKdUXng==} hasBin: true - '@storybook/cli@8.6.14': - resolution: {integrity: sha512-mnPlQ5ynwuC5iOFcSfjKcz0jvtJqKHZDKGzDRmNh82m60jRHa7Llex+1kzRtzUDnZFO7ZpZkH8u/GHzpEoKy7Q==} + '@storybook/cli@8.6.15': + resolution: {integrity: sha512-E75TIa7dnCVLyfhJZfFaUuhTwJzbDIlHtQjURN2fcJgVsDNUEerrB+O9v5KJQFSE6HRZg7UpBjYtq7T2c8fcBw==} hasBin: true '@storybook/client-api@6.5.16': @@ -8912,14 +9089,14 @@ packages: '@storybook/client-logger@7.4.6': resolution: {integrity: sha512-XDw31ZziU//86PKuMRnmc+L/G0VopaGKENQOGEpvAXCU9IZASwGKlKAtcyosjrpi+ZiUXlMgUXCpXM7x3b1Ehw==} - '@storybook/client-logger@7.6.20': - resolution: {integrity: sha512-NwG0VIJQCmKrSaN5GBDFyQgTAHLNishUPLW1NrzqTDNAhfZUoef64rPQlinbopa0H4OXmlB+QxbQIb3ubeXmSQ==} + '@storybook/client-logger@7.6.21': + resolution: {integrity: sha512-NWh32K+N6htmmPfqSPOlA6gy80vFQZLnusK8+/7Hp0sSG//OV5ahlnlSveLUOub2e97CU5EvYUL1xNmSuqk2jQ==} - '@storybook/codemod@7.6.20': - resolution: {integrity: sha512-8vmSsksO4XukNw0TmqylPmk7PxnfNfE21YsxFa7mnEBmEKQcZCQsNil4ZgWfG0IzdhTfhglAN4r++Ew0WE+PYA==} + '@storybook/codemod@7.6.21': + resolution: {integrity: sha512-AFkOB+2vSRXbjUdTI5rsvL8YdqVcmKgmJB3QgwbmLp804Qhqn/WcbOkPOT6zqdcgDTLGaFUIFigvjc7cly3fkw==} - '@storybook/codemod@8.6.14': - resolution: {integrity: sha512-lRzE+l4xwKDLKimSk6NIx0dRAE1eFjQqV79gt/RidkJZgjSzpiJVuiGI9y+ALVvkrgjfA+2K0+KdPEmPIhbwxg==} + '@storybook/codemod@8.6.15': + resolution: {integrity: sha512-3U6VQ3z/v9+ge5JnXPR36nR/SdE5i4V29VLwX0WJFLkEJXUbz4sW/tc27Ev9ufW4VitKQ2mmQ1qe228+SrmZ2A==} '@storybook/components@6.5.16': resolution: {integrity: sha512-LzBOFJKITLtDcbW9jXl0/PaG+4xAz25PK8JxPZpIALbmOpYWOAPcO6V9C2heX6e6NgWFMUxjplkULEk9RCQMNA==} @@ -8933,8 +9110,8 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@storybook/components@8.6.14': - resolution: {integrity: sha512-HNR2mC5I4Z5ek8kTrVZlIY/B8gJGs5b3XdZPBPBopTIN6U/YHXiDyOjY3JlaS4fSG1fVhp/Qp1TpMn1w/9m1pw==} + '@storybook/components@8.6.15': + resolution: {integrity: sha512-+9GVKXPEW8Kl9zvNSTm9+VrJtx/puMZiO7gxCML63nK4aTWJXHQr4t9YUoGammSBM3AV1JglsKm6dBgJEeCoiA==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 @@ -8965,8 +9142,8 @@ packages: '@storybook/core-common@7.4.6': resolution: {integrity: sha512-05MJFmOM86qvTLtgDskokIFz9txe0Lbhq4L3by1FtF0GwgH+p+W6I94KI7c6ANER+kVZkXQZhiRzwBFnVTW+Cg==} - '@storybook/core-common@7.6.20': - resolution: {integrity: sha512-8H1zPWPjcmeD4HbDm4FDD0WLsfAKGVr566IZ4hG+h3iWVW57II9JW9MLBtiR2LPSd8u7o0kw64lwRGmtCO1qAw==} + '@storybook/core-common@7.6.21': + resolution: {integrity: sha512-3xeEAsEwPIEdnWiFJcxD3ObRrF7Vy1q/TKIExbk6p8Flx+XPXQKRZd/T+m5/8/zLYevasvY6hdVN91Fhcw9S2Q==} '@storybook/core-events@6.5.16': resolution: {integrity: sha512-qMZQwmvzpH5F2uwNUllTPg6eZXr2OaYZQRRN8VZJiuorZzDNdAFmiVWMWdkThwmyLEJuQKXxqCL8lMj/7PPM+g==} @@ -8974,8 +9151,8 @@ packages: '@storybook/core-events@7.4.6': resolution: {integrity: sha512-r5vrE+32lwrJh1NGFr1a0mWjvxo7q8FXYShylcwRWpacmL5NTtLkrXOoJSeGvJ4yKNYkvxQFtOPId4lzDxa32w==} - '@storybook/core-events@7.6.20': - resolution: {integrity: sha512-tlVDuVbDiNkvPDFAu+0ou3xBBYbx9zUURQz4G9fAq0ScgBOs/bpzcRrFb4mLpemUViBAd47tfZKdH4MAX45KVQ==} + '@storybook/core-events@7.6.21': + resolution: {integrity: sha512-Ez6bhYuXbEkHVCmnNB/oqN0sQwphsmtPmjYdPMlTtEpVEIXHAw2qOlaDiGakoDHkgrTaxiYvdJrPH0UcEJcWDQ==} '@storybook/core-server@6.5.16': resolution: {integrity: sha512-/3NPfmNyply395Dm0zaVZ8P9aruwO+tPx4D6/jpw8aqrRSwvAMndPMpoMCm0NXcpSm5rdX+Je4S3JW6JcggFkA==} @@ -8993,16 +9170,16 @@ packages: typescript: optional: true - '@storybook/core-server@7.6.20': - resolution: {integrity: sha512-qC5BdbqqwMLTdCwMKZ1Hbc3+3AaxHYWLiJaXL9e8s8nJw89xV8c8l30QpbJOGvcDmsgY6UTtXYaJ96OsTr7MrA==} + '@storybook/core-server@7.6.21': + resolution: {integrity: sha512-1Z92JjUumCFrLNJY7ZNH9bRXyNggtFvfrhVsHjIxvOJcXvI9cfXJQtN1Pcx2Gc7tQNLQfHp6CifmDCmAw3sbXA==} '@storybook/core-webpack@7.4.6': resolution: {integrity: sha512-EqQDmd+vKAWOAjoe539LsfP8WvQG9V9i1priMA53u1FOEged8o0NBtRiRy2+JDdUSiGUdpe/X5+V/TyyQw/KWw==} - '@storybook/core-webpack@8.6.14': - resolution: {integrity: sha512-iG7r8osNKabSGBbuJuSeMWKbU+ilt5PvzTYkClcYaagla/DliXkXvfywA6jOugVk/Cpx+c6tVKlPfjLcaQHwmw==} + '@storybook/core-webpack@8.6.15': + resolution: {integrity: sha512-DZUxsF9KwzUGYzXg8gQ7xnAnLnulh8wkaxEqkVt7xMJ95FLZYCI8o+05tJ3tNUYzjPMTzoAUPL2OD9bb6HcSzw==} peerDependencies: - storybook: ^8.6.14 + storybook: ^8.6.15 '@storybook/core@6.5.16': resolution: {integrity: sha512-CEF3QFTsm/VMnMKtRNr4rRdLeIkIG0g1t26WcmxTdSThNPBd8CsWzQJ7Jqu7CKiut+MU4A1LMOwbwCE5F2gmyA==} @@ -9021,8 +9198,8 @@ packages: typescript: optional: true - '@storybook/core@8.6.14': - resolution: {integrity: sha512-1P/w4FSNRqP8j3JQBOi3yGt8PVOgSRbP66Ok520T78eJBeqx9ukCfl912PQZ7SPbW3TIunBwLXMZOjZwBB/JmA==} + '@storybook/core@8.6.15': + resolution: {integrity: sha512-VFpKcphNurJpSC4fpUfKL3GTXVoL53oytghGR30QIw5jKWwaT50HVbTyb41BLOUuZjmMhUQA8weiQEew6RX0gw==} peerDependencies: prettier: ^2 || ^3 peerDependenciesMeta: @@ -9037,6 +9214,11 @@ packages: peerDependencies: storybook: ^8.6.14 + '@storybook/csf-plugin@8.6.15': + resolution: {integrity: sha512-ZLz/mtOoE1Jj2lE4pK3U7MmYrv5+lot3mGtwxGb832tcABMc97j9O+reCVxZYc7DeFbBuuEdMT9rBL/O3kXYmw==} + peerDependencies: + storybook: ^8.6.15 + '@storybook/csf-tools@6.5.16': resolution: {integrity: sha512-+WD4sH/OwAfXZX3IN6/LOZ9D9iGEFcN+Vvgv9wOsLRgsAZ10DG/NK6c1unXKDM/ogJtJYccNI8Hd+qNE/GFV6A==} peerDependencies: @@ -9048,8 +9230,8 @@ packages: '@storybook/csf-tools@7.4.6': resolution: {integrity: sha512-ocKpcIUtTBy6hlLY34RUFQyX403cWpB2gGfqvkHbpGe2BQj7EyV0zpWnjsfVxvw+M9OWlCdxHWDOPUgXM33ELw==} - '@storybook/csf-tools@7.6.20': - resolution: {integrity: sha512-rwcwzCsAYh/m/WYcxBiEtLpIW5OH1ingxNdF/rK9mtGWhJxXRDV8acPkFrF8rtFWIVKoOCXu5USJYmc3f2gdYQ==} + '@storybook/csf-tools@7.6.21': + resolution: {integrity: sha512-DBdwDo4nOsXF/QV6Ru08xgb54M1o9A0E7D8VW0+PcFK+Y8naq8+I47PkijHloTxgZxUyX8OvboaLBMTGUV275w==} '@storybook/csf@0.0.1': resolution: {integrity: sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==} @@ -9084,14 +9266,19 @@ packages: peerDependencies: storybook: ^8.6.14 + '@storybook/instrumenter@8.6.15': + resolution: {integrity: sha512-TvHR/+yyIAOp/1bLulFai2kkhIBtAlBw7J6Jd9DKyInoGhTWNE1G1Y61jD5GWXX29AlwaHfzGUaX5NL1K+FJpg==} + peerDependencies: + storybook: ^8.6.15 + '@storybook/manager-api@7.4.6': resolution: {integrity: sha512-inrm3DIbCp8wjXSN/wK6e6i2ysQ/IEmtC7IN0OJ7vdrp+USCooPT448SQTUmVctUGCFmOU3fxXByq8g77oIi7w==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@storybook/manager-api@8.6.14': - resolution: {integrity: sha512-ez0Zihuy17udLbfHZQXkGqwtep0mSGgHcNzGN7iZrMP1m+VmNo+7aGCJJdvXi7+iU3yq8weXSQFWg5DqWgLS7g==} + '@storybook/manager-api@8.6.15': + resolution: {integrity: sha512-ZOFtH821vFcwzECbFYFTKtSVO96Cvwwg45dMh3M/9bZIdN7klsloX7YNKw8OKvwE6XLFLsi2OvsNNcmTW6g88w==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 @@ -9115,8 +9302,8 @@ packages: typescript: optional: true - '@storybook/manager@7.6.20': - resolution: {integrity: sha512-0Cf6WN0t7yEG2DR29tN5j+i7H/TH5EfPppg9h9/KiQSoFHk+6KLoy2p5do94acFU+Ro4+zzxvdCGbcYGKuArpg==} + '@storybook/manager@7.6.21': + resolution: {integrity: sha512-kwtG7HfxYQIZeGwDg7xFkORhNf0PH+4jRLf/9M6amR537Hctay+Vlv2MGHO6LFzw6IwT4qCtO8xNgzcV9TxZtg==} '@storybook/mdx1-csf@0.0.1': resolution: {integrity: sha512-4biZIWWzoWlCarMZmTpqcJNgo/RBesYZwGFbQeXiGYsswuvfWARZnW9RE9aUEMZ4XPn7B1N3EKkWcdcWe/K2tg==} @@ -9130,8 +9317,8 @@ packages: '@storybook/node-logger@7.4.6': resolution: {integrity: sha512-djZb310Q27GviDug1XBv0jOEDLCiwr4hhDE0aifCEKZpfNCi/EaP31nbWimFzZwxu4hE/YAPWExzScruR1zw9Q==} - '@storybook/node-logger@7.6.20': - resolution: {integrity: sha512-l2i4qF1bscJkOplNffcRTsgQWYR7J51ewmizj5YrTM8BK6rslWT1RntgVJWB1RgPqvx6VsCz1gyP3yW1oKxvYw==} + '@storybook/node-logger@7.6.21': + resolution: {integrity: sha512-X4LwhWQ0KuLU7O2aEi7U9hhg+klnuvkXqhXIqAQCZEKogUxz7ywek+2h+7QqdgHFi6V7VYNtiMmMJKllzhg+OA==} '@storybook/postinstall@6.5.16': resolution: {integrity: sha512-08K2q+qN6pqyPW7PHLCZ5G5Xa6Wosd6t0F16PQ4abX2ItlJLabVoJN5mZ0gm/aeLTjD8QYr8IDvacu4eXh0SVA==} @@ -9153,13 +9340,13 @@ packages: typescript: optional: true - '@storybook/preset-react-webpack@8.6.14': - resolution: {integrity: sha512-M7Q6ErNx7N2hQorTz0OLa3YV8nc8OcvkDlCxqqnkHPGQNEIWEpeDvq3wn2OvZlrHDpchyuiquGXZ8aztVtBP2g==} + '@storybook/preset-react-webpack@8.6.15': + resolution: {integrity: sha512-AY2o3otXHjEr1WIPk+8PelABkk5sBJhPu13BVSWajMOY8W8fraN9CQxrsMFxlG6vTFQg1cDf9kFlCKFHERPiHg==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.14 + storybook: ^8.6.15 typescript: '*' peerDependenciesMeta: typescript: @@ -9168,11 +9355,11 @@ packages: '@storybook/preview-api@7.4.6': resolution: {integrity: sha512-byUS/Opt3ytWD4cWz3sNEKw5Yks8MkQgRN+GDSyIomaEAQkLAM0rchPC0MYjwCeUSecV7IIQweNX5RbV4a34BA==} - '@storybook/preview-api@7.6.20': - resolution: {integrity: sha512-3ic2m9LDZEPwZk02wIhNc3n3rNvbi7VDKn52hDXfAxnL5EYm7yDICAkaWcVaTfblru2zn0EDJt7ROpthscTW5w==} + '@storybook/preview-api@7.6.21': + resolution: {integrity: sha512-L5e6VjphfsnJk/kkOIRJzDaTfX5sNpiusocqEbHKTM7c9ZDAuaLPZKluP87AJ0u16UdWMuCu6YaQ6eAakDa9gg==} - '@storybook/preview-api@8.6.14': - resolution: {integrity: sha512-2GhcCd4dNMrnD7eooEfvbfL4I83qAqEyO0CO7JQAmIO6Rxb9BsOLLI/GD5HkvQB73ArTJ+PT50rfaO820IExOQ==} + '@storybook/preview-api@8.6.15': + resolution: {integrity: sha512-oqsp8f7QekB9RzpDqOXZQcPPRXXd/mTsnZSdAAQB/pBVqUpC9h/y5hgovbYnJ6DWXcpODbMwH+wbJHZu5lvm+w==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 @@ -9210,14 +9397,21 @@ packages: react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta storybook: ^8.6.14 - '@storybook/react-vite@8.6.14': - resolution: {integrity: sha512-FZU0xMPxa4/TO87FgcWwappOxLBHZV5HSRK5K+2bJD7rFJAoNorbHvB4Q1zvIAk7eCMjkr2GPCPHx9PRB9vJFg==} + '@storybook/react-dom-shim@8.6.15': + resolution: {integrity: sha512-m2trBmmd4iom1qwrp1F109zjRDc0cPaHYhDQxZR4Qqdz8pYevYJTlipDbH/K4NVB6Rn687RT29OoOPfJh6vkFA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta + storybook: ^8.6.15 + + '@storybook/react-vite@8.6.15': + resolution: {integrity: sha512-9st+2NCemzzBwmindpDrRLEqYJmwwd2RnXMoj+Wt4Y1r4MGoRe1l837ciT2tmstaqekY2mVUSYd6879NzeeMYw==} engines: {node: '>=18.0.0'} peerDependencies: - '@storybook/test': 8.6.14 + '@storybook/test': 8.6.15 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.14 + storybook: ^8.6.15 vite: ^4.0.0 || ^5.0.0 || ^6.0.0 peerDependenciesMeta: '@storybook/test': @@ -9237,13 +9431,13 @@ packages: typescript: optional: true - '@storybook/react-webpack5@8.6.14': - resolution: {integrity: sha512-ka0q9tQBLruhO38sybP/MkZzejqAltce7HJTJ2KKbUYUlbvuG7m56tBX7DVC5JaImbsO3b8fqOrKH7gRt4KYrQ==} + '@storybook/react-webpack5@8.6.15': + resolution: {integrity: sha512-YPAAZm7qfaRFMGBt3IhvvuBzuvBKcOUmGvcqZVZSlOtMKFzH1kweyloo6DGE648MxqN4WVcWpp6MnpivORM72w==} engines: {node: '>=18.0.0'} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.14 + storybook: ^8.6.15 typescript: '>= 4.2.x' peerDependenciesMeta: typescript: @@ -9288,14 +9482,14 @@ packages: typescript: optional: true - '@storybook/react@8.6.14': - resolution: {integrity: sha512-BOepx5bBFwl/CPI+F+LnmMmsG1wQYmrX/UQXgUbHQUU9Tj7E2ndTnNbpIuSLc8IrM03ru+DfwSg1Co3cxWtT+g==} + '@storybook/react@8.6.15': + resolution: {integrity: sha512-hdnhlJg+YkpPMOw2hvK7+mhdxAbguA+TFTIAzVV9CeUYoHDIZAsgeKVhRmgZGN20NGjRN5ZcwkplAMJnF9v+6w==} engines: {node: '>=18.0.0'} peerDependencies: - '@storybook/test': 8.6.14 + '@storybook/test': 8.6.15 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^8.6.14 + storybook: ^8.6.15 typescript: '>= 4.2.x' peerDependenciesMeta: '@storybook/test': @@ -9338,14 +9532,19 @@ packages: '@storybook/telemetry@6.5.16': resolution: {integrity: sha512-CWr5Uko1l9jJW88yTXsZTj/3GTabPvw0o7pDPOXPp8JRZiJTxv1JFaFCafhK9UzYbgcRuGfCC8kEWPZims7iKA==} - '@storybook/telemetry@7.6.20': - resolution: {integrity: sha512-dmAOCWmOscYN6aMbhCMmszQjoycg7tUPRVy2kTaWg6qX10wtMrvEtBV29W4eMvqdsoRj5kcvoNbzRdYcWBUOHQ==} + '@storybook/telemetry@7.6.21': + resolution: {integrity: sha512-bE68Ac6daL0JE9vjtHKwsM+uSXZ94QdoZL9RCTVvp0dI7htm7s7w7+Arm/aCxG9lnYTAjioWNRpHfeALVjsjIg==} '@storybook/test@8.6.14': resolution: {integrity: sha512-GkPNBbbZmz+XRdrhMtkxPotCLOQ1BaGNp/gFZYdGDk2KmUWBKmvc5JxxOhtoXM2703IzNFlQHSSNnhrDZYuLlw==} peerDependencies: storybook: ^8.6.14 + '@storybook/test@8.6.15': + resolution: {integrity: sha512-EwquDRUDVvWcZds3T2abmB5wSN/Vattal4YtZ6fpBlIUqONV4o/cOBX39cFfQSUCBrIXIjQ6RmapQCHK/PvBYw==} + peerDependencies: + storybook: ^8.6.15 + '@storybook/theming@6.5.16': resolution: {integrity: sha512-hNLctkjaYLRdk1+xYTkC1mg4dYz2wSv6SqbLpcKMbkPHTE0ElhddGPHQqB362md/w9emYXNkt1LSMD8Xk9JzVQ==} peerDependencies: @@ -9358,16 +9557,16 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@storybook/theming@8.6.14': - resolution: {integrity: sha512-r4y+LsiB37V5hzpQo+BM10PaCsp7YlZ0YcZzQP1OCkPlYXmUAFy2VvDKaFRpD8IeNPKug2u4iFm/laDEbs03dg==} + '@storybook/theming@8.6.15': + resolution: {integrity: sha512-dAbL0XOekyT6XsF49R6Etj3WxQ/LpdJDIswUUeHgVJ6/yd2opZOGbPxnwA3zlmAh1c0tvpPyhSDXxSG79u8e4Q==} peerDependencies: storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0 '@storybook/types@7.4.6': resolution: {integrity: sha512-6QLXtMVsFZFpzPkdGWsu/iuc8na9dnS67AMOBKm5qCLPwtUJOYkwhMdFRSSeJthLRpzV7JLAL8Kwvl7MFP3QSw==} - '@storybook/types@7.6.20': - resolution: {integrity: sha512-GncdY3x0LpbhmUAAJwXYtJDUQEwfF175gsjH0/fxPkxPoV7Sef9TM41jQLJW/5+6TnZoCZP/+aJZTJtq3ni23Q==} + '@storybook/types@7.6.21': + resolution: {integrity: sha512-rJaBMxzXZOsJpqZGhebFJxOguZQBw5j+MVpqbFBA6vLZPx9wEbDBeVsPUxCxj+V1XkVcrNXf9qfThyJ8ETmLBw==} '@storybook/ui@6.5.16': resolution: {integrity: sha512-rHn/n12WM8BaXtZ3IApNZCiS+C4Oc5+Lkl4MoctX8V7QSml0SxZBB5hsJ/AiWkgbRxjQpa/L/Nt7/Qw0FjTH/A==} @@ -9375,95 +9574,104 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - '@swagger-api/apidom-ast@1.0.0-rc.4': - resolution: {integrity: sha512-IaXz00VLMq0Kw5vh5f2MX4gNWzPy8ujBl5FInM5w+1mezoyrwTnVRiKO7sf611OthmNmnK5cWy3hjqURAT9wCQ==} + '@swagger-api/apidom-ast@1.3.0': + resolution: {integrity: sha512-CfaqcwdkWoJ8RAmmhp3fJVz+weyZ5ByKtGSlBgAlUMhfuo6qOsNIMYbSDiPZilUEbR3aXMdtqqXCpgOgZ6dMjg==} + + '@swagger-api/apidom-core@1.3.0': + resolution: {integrity: sha512-xm98bBpZbaqzsednoVZ51itqby3jVZdHZSOqtucGVixcI+1mXzkUMSOrgyw/XIFeXJUevCBx56v5ihSxAdM8+w==} - '@swagger-api/apidom-core@1.0.0-rc.4': - resolution: {integrity: sha512-dSvq/FmUffmv9nqBO8LZ5+ESFWPe/y7UsatRiwpqh6M7vBHy9xBuKdn6A/7QtmZnetjigkx3h4CXc4Mi30RZCg==} + '@swagger-api/apidom-error@1.3.0': + resolution: {integrity: sha512-UX+2W4+kpK53666CxapjnNZyFse5nRO4fVltcFdaqWtUKcsQVoryxlcpmZJA7R/c7djROc3FesoawjAArdZYlw==} - '@swagger-api/apidom-error@1.0.0-rc.4': - resolution: {integrity: sha512-uakMfKYyLgGjLrVaaUKWyl0D+wGxza+nh1Ct4fOFRiy0Dm91I4AD4HwsG3Uvk5gLrvqlf/OutKYzKt8Ufhlyig==} + '@swagger-api/apidom-json-pointer@1.3.0': + resolution: {integrity: sha512-yj2ViZkBla11sRcfxzmXJjv9LSXjYVuHsMy1nqjzWeHHMHsEedVIu9PUWT7QWqTAWXsNEt5BBOU/pY5L1dLkOw==} - '@swagger-api/apidom-json-pointer@1.0.0-rc.4': - resolution: {integrity: sha512-5bB6nemgzkWs440a8PX+lS3fGtEtJt2iYhK0Xf9E+9qU6d1eR9aiETPdAVjbdL8vLhyZvmgvZie/7q0l6bbLJg==} + '@swagger-api/apidom-ns-api-design-systems@1.3.0': + resolution: {integrity: sha512-iNPagRcxfDn9mdpfm6SXMDZjcKfV/LfTokRfp3uPlDD0DKzrJn66me8E1De3uOy7veK8NGsniR7j0GbNg6mMCg==} - '@swagger-api/apidom-ns-api-design-systems@1.0.0-rc.4': - resolution: {integrity: sha512-JlOD1H2jSl/XxdFwa/zPOvRZh8rk/O/2B2xkoKaxhTmkVTKq2Y1rHsey8cyU9qrfQSkLpPm1cxXeIfqmhdPmqQ==} + '@swagger-api/apidom-ns-arazzo-1@1.3.0': + resolution: {integrity: sha512-9xgNd6smc46HZxFdnfWTvogFgVusaDl4/XQI2b/cK2i1M2+nxSD8akJaf9Fdjz982YBAsVkagUzl4VBTVdgZZA==} - '@swagger-api/apidom-ns-arazzo-1@1.0.0-rc.4': - resolution: {integrity: sha512-sKep7qCvJa2zB4q67e9zinLKjVx0vhV/e40OLEg3JeECMWcRrW3oI2JB3jSJ7ZZwCgvatfBc6/ucFsX/1oKpkg==} + '@swagger-api/apidom-ns-asyncapi-2@1.3.0': + resolution: {integrity: sha512-gUYMHXh8CQZSIwhLf0IyLF2vApLilr/tmtHDs/rwxN7ZTA+k3jALVZ/EfP4Oq7TcsfHe4lw4vIkS0vAGRUhq4g==} - '@swagger-api/apidom-ns-asyncapi-2@1.0.0-rc.4': - resolution: {integrity: sha512-RDNKv4kCAzQ+aA02VjgxS9Cve0UgnRkcFNEUxYEHWNbqVcMmxcck6GLQo4OuwhgJczEyZC3TB5idfxphRhaybg==} + '@swagger-api/apidom-ns-asyncapi-3@1.3.0': + resolution: {integrity: sha512-A5ZB2N++Kd9sfP7sxQq4wIuVOTh4ZuLAmOYvfqgefMHE8SLZfxDYIIERs7p20NhlsxedWVj9kBNW2aIs4cIIpQ==} - '@swagger-api/apidom-ns-json-schema-2019-09@1.0.0-rc.4': - resolution: {integrity: sha512-kgIo3d9VZjBFg30Cg0asokbBGVb4WvVckkf9U2T8/6wh2o1J+KMqvdRauo2Xz+o5EubLpGyZjrwOzMbFJv/viA==} + '@swagger-api/apidom-ns-json-schema-2019-09@1.3.0': + resolution: {integrity: sha512-ZWKwv5XGsOmrfKPAl+YdbVFi+WjiGhAe4JjPdwpBmIYtzk/QrfmUKcpJPuNGrEphwYxkM1dzI53kkZ7eZvyFRQ==} - '@swagger-api/apidom-ns-json-schema-2020-12@1.0.0-rc.4': - resolution: {integrity: sha512-0mpBu8iXq8GaY+KDQGWSU+8Xvd1Kd5EXKOpW8tDgJINBgeYm7F3m8iP3irP0OMeCyX9ISMq+bDgXg+YjS8kYzA==} + '@swagger-api/apidom-ns-json-schema-2020-12@1.3.0': + resolution: {integrity: sha512-Wayw8aPAOT/oYy4gMx5pyIgVOQrQg3p6XH6lxjGo63ODEmVJDrk5aj1XCoLMxwPXrECQI33jYxnqpG0ej2xsNQ==} - '@swagger-api/apidom-ns-json-schema-draft-4@1.0.0-rc.4': - resolution: {integrity: sha512-FOqR+EMMt5QPXmQv/gJ/syzp+G5QCrb+5n3tkmVwBNKhiPHcX4kOHt6/8wZo/6V++hhv1IzCt1JwGJGiNEuK9A==} + '@swagger-api/apidom-ns-json-schema-draft-4@1.3.0': + resolution: {integrity: sha512-55Ua8EuNRRLKj6zRw38GruRUmfdlyGSfM/rXyWdCHMh59IXXdRnNERYmXIcMUhU45opTeEr53hCORRFcVnMTow==} - '@swagger-api/apidom-ns-json-schema-draft-6@1.0.0-rc.4': - resolution: {integrity: sha512-OQonOTVyPzKUvE2+6AB+JK7rkqqd0AG0QyarSyPJH+vbt2Nsj2tUaEXNY3WeP9OX1xvbtUysR74fefsOkjzO1Q==} + '@swagger-api/apidom-ns-json-schema-draft-6@1.3.0': + resolution: {integrity: sha512-ZC6RBv5GQMy5Dcq6aFKt9SkEXMagRPMDstkWc80MKeO7L3i5MRyGiTeo3lN2euDZGwofdEHRcO1jpzJbPUpU5A==} - '@swagger-api/apidom-ns-json-schema-draft-7@1.0.0-rc.4': - resolution: {integrity: sha512-p1YbbkHQDD0REbz30F/vMXjPjsh7j7jIjaHNgFv3zC+KZN776GkOwQIpdP56lwneWFdMj9jOSRhwBKp34h9iXw==} + '@swagger-api/apidom-ns-json-schema-draft-7@1.3.0': + resolution: {integrity: sha512-DLEjKKz9y7ht4iat8HeN2o9bHo84iSxKPS1cPmJMq5BavSN3yDYDqPks8Vni+LZI9SeWpzrPA1s9FbgqmDjCEQ==} - '@swagger-api/apidom-ns-openapi-2@1.0.0-rc.4': - resolution: {integrity: sha512-Wil2egcmJJIrgEDYGZVaDIMGlnLhcBw8I5ZjWBgyU8nLocuqdKVE8I1TwPO+7830dnfjCaXs+nUzfgkBcGefMg==} + '@swagger-api/apidom-ns-openapi-2@1.3.0': + resolution: {integrity: sha512-aRx8PBOQ2Xc3+fkJ6asODjuJk/0/uECrLc1b4X5T2m3eJk1/YGjAjZHcSBYO/isRSLcRgzgqCZG6iFn3mtHakw==} - '@swagger-api/apidom-ns-openapi-3-0@1.0.0-rc.4': - resolution: {integrity: sha512-t4ZX6I76fcrCsV1Aj8Um6LiIceVCKNgakg5MIuBiRZaA0q8fZPerLSD1KIYMLWPd+cV5ptKZyv+bugzhlhQtTg==} + '@swagger-api/apidom-ns-openapi-3-0@1.3.0': + resolution: {integrity: sha512-H9l72st2q8mUOVVftoexIDNJPD6jz6wxfVkJWcrPYsHcnpMdWDKeHxqMZAsoZozAZxM1hMG3p40BzPi/8ZBJhQ==} - '@swagger-api/apidom-ns-openapi-3-1@1.0.0-rc.4': - resolution: {integrity: sha512-Ibv8PP0npBb8QupINmluQmLCZ1IhANlRUic8K7k32Lbc9ejMGTLCKGl2J3hPPeKsER3zqfEjHAhkins9r/CJcw==} + '@swagger-api/apidom-ns-openapi-3-1@1.3.0': + resolution: {integrity: sha512-g9Wzq4Wv7P1tYf1Eo1AQjXwQWjCt47QUOzrIsPDvd6J0BFbNkAZRns1xSwhh9wblFOmAqBioRTcurlMWibR4lQ==} - '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.0.0-rc.4': - resolution: {integrity: sha512-/K9xj7tL6RB6B+krFf5JlzEGb3bebVt5c6t9a0ZZps+4TjcAQ3M1B9Gs3+ngR6Hy2RwtqIPKWKl0fhgfpArmnw==} + '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.3.0': + resolution: {integrity: sha512-ICxejvaXXujP0igfZ3Ielf9/FxBe+lbAlROU/NIYt2eJUWpG7TnG/RzDKuqv2OIgosWm6iqhe5EIZwptCjMpMA==} - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.0.0-rc.4': - resolution: {integrity: sha512-+J4hMSe7+cKxuDDEVxyF7MGfvAFv7cbFdyBKUDkvkKjtdkh40+5msTJ2ePuSxibNqZTJFGZhaJBIaPOfbqLpUQ==} + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.3.0': + resolution: {integrity: sha512-wysRnFKThjD/BfVXDxrXH8HtGe0dyjwKyH6WUltE97MyY3NqJjICCEJxfjWlp1DpH4p8ngYM8S6GYDqKlFBLuQ==} - '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.0.0-rc.4': - resolution: {integrity: sha512-7sDeZgV1SVwiWQmckvRgBwEBZXUavxvJr5m8C2daEge9DTM9LE3qNBAjWdwvd5E4sPeDdslSiCWT9Ipi+aiBsg==} + '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.3.0': + resolution: {integrity: sha512-S1RR3Ma7h98PQt6gnxi63Ya/826FPIcoa5uJqYBV4y4xO0OId0BWq9JkmKBxxhmrmlmZr+Ztxa7EaGtpvUZ/nA==} - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.0.0-rc.4': - resolution: {integrity: sha512-UnU6RLRKNMm0qbHjINbfrFgKQd6tD2pRKySWgR9HxLVS+VTL3J4Oid2Tt3ND5xy6nE4qZrV5vusZNkdDewZk7A==} + '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.3.0': + resolution: {integrity: sha512-MLpTLMyFgp2BpIpMB5vPf2riW4CsqW5oKL7SuYAkwmpM8GnFxG1x6+4T1YHaZrRjj6l4/6JFpPx+gjJP293OOw==} - '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.0.0-rc.4': - resolution: {integrity: sha512-fZJgQWRXQxPcZurKxiY2IcdtuS33CxuJyFD9Z+72v3OvVWFEII6mWGC6NdqevzYaD7WUVXhsQjAqibBNIcyJiQ==} + '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.3.0': + resolution: {integrity: sha512-JIFDUmEsTkEneRdeBhSsHSaPd8/F8hkeSp9ePAvWbruI40iCC8gQLbiVs1SgEtaMjU/SNEl2X1yVJqYNKfwWHw==} - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.0.0-rc.4': - resolution: {integrity: sha512-WNmlRSHiCLu9uCsadnoaWYxzV/aagUHAeVTY+Zgq+4bSNWx9DZTX5X1v/IW4aD5MAW6j1Inz8U5qdxWnrEdBBg==} + '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.3.0': + resolution: {integrity: sha512-MYXkj2VJcp7b0wT5rzJDseNkWr8KzjmlxD9yWj9T+RDG76BmZBQSU0Xb1HDmW9TBk3vEWNrNfY7hk/8iD7QbTA==} - '@swagger-api/apidom-parser-adapter-json@1.0.0-rc.4': - resolution: {integrity: sha512-UuYtpZtXoWuukny/1WIz2szlfKc6XDNh0W1E8PtZqhFOUDgaq0qXB7OBB7E/lDAJAIzlWfJu1lR87C2pwbJSRw==} + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.3.0': + resolution: {integrity: sha512-jGg0JF9Y5K7hpRS0Bghl/iJcy14fUye8rMzM62aZlUm6pla/Gc3oIX/UF3WS9mPCTMtY0KLMhExFPs4VgPW7iA==} - '@swagger-api/apidom-parser-adapter-openapi-json-2@1.0.0-rc.4': - resolution: {integrity: sha512-2OgY9MO0U2Ma7OiIOvsT7cn0J5XbfWy9JnOEGm6DCh+b1m+NGWSXuPKGB9o/R3DJu5Jar9ol7Mu+oyb6ENJKdg==} + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.3.0': + resolution: {integrity: sha512-/xLKCYbjy3pTIIIbviFs3Zbud8BAS4OU8NhERYf2uoubfzCbxjJge0XyoiwSue0u7cGcponFOZtvxuFIwIRoMg==} - '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.0.0-rc.4': - resolution: {integrity: sha512-XvZsBuUO2UY5qXsizw03A+dy745ZWvekwS0J3o5RmPoEuJ1eeRNXsUn+JoAHascX81vzlkam71Xp9XpcAlybYQ==} + '@swagger-api/apidom-parser-adapter-json@1.3.0': + resolution: {integrity: sha512-tAJ2sKfv5nPDYHXaoXMPE+yBoNF7ribMlMCx5raw9u1CC76wTC65uG1VvmL6DdqlDuyD3hxdlOSMIXLQ3/CLaQ==} - '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.0.0-rc.4': - resolution: {integrity: sha512-cydbVKumtVTTfTnbtvfw1kayYRbQyTS6iZ5s/Y6xyZb7ro5VNi6XZy6htOu0EvXUBS/NJjY9YDeWcVKGUEuohw==} + '@swagger-api/apidom-parser-adapter-openapi-json-2@1.3.0': + resolution: {integrity: sha512-ncfY8UThDhYA/CfsogLLVeUtUWvQJ0UIN2BKxyfIRkExPSFxinOZRo4rLlice6cpEVuQUh0BWVlwC0x3+sd58w==} - '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.0.0-rc.4': - resolution: {integrity: sha512-pqoPgMFOvJJ2v4qA9MKMnTlhOYST+o2WhYmY34GMCoZrRrHue0rnvjtsAyH9BQNk9WEmS1gdonKpyHl6a5bewQ==} + '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.3.0': + resolution: {integrity: sha512-Oy29Pw7F5BLjhmCVUHsjcQizbnNBYj1Hm0nc/XWlu7D/V2lutaLUGE7Z7fankvC5chVhnuOdOOpiY23w/616XQ==} - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.0.0-rc.4': - resolution: {integrity: sha512-7J+iWKNC6pjWGAsOy5it2FDJGYyiDJ+rvIrUFAiK3Giqk9t70/s6PmH54DtVnb8rzmpX/udd8PVxTE6uImru1Q==} + '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.3.0': + resolution: {integrity: sha512-NIhIQ+l4adbbXuawZ1VGw5iesBCfFDosd2cxU+H+Q4iEazKm+IXF/gxKEWWJCsw5s9umzt1+oCwzLutSufz4lA==} - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.0.0-rc.4': - resolution: {integrity: sha512-N3ehKEKvEWkZjL6QAV4Fwepa+2lSSun8DYN1h+ScVMa/QSWQh558vSXv6cF49ClYIO+IQjZg1fsbDoVg7qjlcA==} + '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.3.0': + resolution: {integrity: sha512-tmNaZaVEgDuHOray+xV23rD88bvQtDp0k+9uiUhg4Xl/DtA451r47ai/wEduEXmjCSCe+dpdCnR17nhe2FD+CA==} - '@swagger-api/apidom-parser-adapter-yaml-1-2@1.0.0-rc.4': - resolution: {integrity: sha512-go/s36rTmkgVIBt4Q/oAJzwRTwRjVdFQPeQGnuS6eX5mxMUWxzVrsKKLJ2qul5y8DVkzZsZ6K897RI5H0fUuuQ==} + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.3.0': + resolution: {integrity: sha512-I1BTjMo8HODyeIbwE9ZG7uyc5yfPCL3QvkBGi8N+er26POTBTN/g+n+/IovtT7XlymKSrfnOnTtqCxEBA5+X8g==} - '@swagger-api/apidom-reference@1.0.0-rc.4': - resolution: {integrity: sha512-H0eVImmOEp8TjRBcVQuyBsCcUCR5094POMcgvcipUyKwAus62PwMivn1eQc+e/wyZSm7qqEbv1ksOcDLHltykA==} + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.3.0': + resolution: {integrity: sha512-ZaPsg7yH/2p/kp2VrwAxOQEVsNe57zN5h8vOQAfikLQ2Qpek/B77Y99wnPIl2YscuFKPdn3Vw+tcEGbHe9wmhw==} + + '@swagger-api/apidom-parser-adapter-yaml-1-2@1.3.0': + resolution: {integrity: sha512-iGTkPgLQ/gT9jodwierviRbqAQzU8odHNXS8/XG6UbiOALOpbXyd1KhInXNGy54EMFHa3BgvIXNswBGhTRGIzw==} + + '@swagger-api/apidom-reference@1.3.0': + resolution: {integrity: sha512-SnSOWLX+dCBJvs6oeNy2BmO1PBpW1x+jQupfETE323tEjf9uemxFo0/gj0hiNB/IAKHRqXQtsYlGM6ciSgyIWw==} '@swaggerexpert/cookie@2.0.2': resolution: {integrity: sha512-DPI8YJ0Vznk4CT+ekn3rcFNq1uQwvUHZhH6WvTSPD0YKBIlMS9ur2RYKghXuxxOiqOam/i4lHJH4xTIiTgs3Mg==} @@ -9473,68 +9681,68 @@ packages: resolution: {integrity: sha512-qMx1nOrzoB+PF+pzb26Q4Tc2sOlrx9Ba2UBNX9hB31Omrq+QoZ2Gly0KLrQWw4Of1AQ4J9lnD+XOdwOdcdXqqw==} engines: {node: '>=12.20.0'} - '@swc/core-darwin-arm64@1.15.3': - resolution: {integrity: sha512-AXfeQn0CvcQ4cndlIshETx6jrAM45oeUrK8YeEY6oUZU/qzz0Id0CyvlEywxkWVC81Ajpd8TQQ1fW5yx6zQWkQ==} + '@swc/core-darwin-arm64@1.15.11': + resolution: {integrity: sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg==} engines: {node: '>=10'} cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.15.3': - resolution: {integrity: sha512-p68OeCz1ui+MZYG4wmfJGvcsAcFYb6Sl25H9TxWl+GkBgmNimIiRdnypK9nBGlqMZAcxngNPtnG3kEMNnvoJ2A==} + '@swc/core-darwin-x64@1.15.11': + resolution: {integrity: sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA==} engines: {node: '>=10'} cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.15.3': - resolution: {integrity: sha512-Nuj5iF4JteFgwrai97mUX+xUOl+rQRHqTvnvHMATL/l9xE6/TJfPBpd3hk/PVpClMXG3Uvk1MxUFOEzM1JrMYg==} + '@swc/core-linux-arm-gnueabihf@1.15.11': + resolution: {integrity: sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg==} engines: {node: '>=10'} cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.15.3': - resolution: {integrity: sha512-2Nc/s8jE6mW2EjXWxO/lyQuLKShcmTrym2LRf5Ayp3ICEMX6HwFqB1EzDhwoMa2DcUgmnZIalesq2lG3krrUNw==} + '@swc/core-linux-arm64-gnu@1.15.11': + resolution: {integrity: sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.15.3': - resolution: {integrity: sha512-j4SJniZ/qaZ5g8op+p1G9K1z22s/EYGg1UXIb3+Cg4nsxEpF5uSIGEE4mHUfA70L0BR9wKT2QF/zv3vkhfpX4g==} + '@swc/core-linux-arm64-musl@1.15.11': + resolution: {integrity: sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.15.3': - resolution: {integrity: sha512-aKttAZnz8YB1VJwPQZtyU8Uk0BfMP63iDMkvjhJzRZVgySmqt/apWSdnoIcZlUoGheBrcqbMC17GGUmur7OT5A==} + '@swc/core-linux-x64-gnu@1.15.11': + resolution: {integrity: sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.15.3': - resolution: {integrity: sha512-oe8FctPu1gnUsdtGJRO2rvOUIkkIIaHqsO9xxN0bTR7dFTlPTGi2Fhk1tnvXeyAvCPxLIcwD8phzKg6wLv9yug==} + '@swc/core-linux-x64-musl@1.15.11': + resolution: {integrity: sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw==} engines: {node: '>=10'} cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.15.3': - resolution: {integrity: sha512-L9AjzP2ZQ/Xh58e0lTRMLvEDrcJpR7GwZqAtIeNLcTK7JVE+QineSyHp0kLkO1rttCHyCy0U74kDTj0dRz6raA==} + '@swc/core-win32-arm64-msvc@1.15.11': + resolution: {integrity: sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA==} engines: {node: '>=10'} cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.15.3': - resolution: {integrity: sha512-B8UtogMzErUPDWUoKONSVBdsgKYd58rRyv2sHJWKOIMCHfZ22FVXICR4O/VwIYtlnZ7ahERcjayBHDlBZpR0aw==} + '@swc/core-win32-ia32-msvc@1.15.11': + resolution: {integrity: sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw==} engines: {node: '>=10'} cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.15.3': - resolution: {integrity: sha512-SpZKMR9QBTecHeqpzJdYEfgw30Oo8b/Xl6rjSzBt1g0ZsXyy60KLXrp6IagQyfTYqNYE/caDvwtF2FPn7pomog==} + '@swc/core-win32-x64-msvc@1.15.11': + resolution: {integrity: sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw==} engines: {node: '>=10'} cpu: [x64] os: [win32] - '@swc/core@1.15.3': - resolution: {integrity: sha512-Qd8eBPkUFL4eAONgGjycZXj1jFCBW8Fd+xF0PzdTlBCWQIV1xnUT7B93wUANtW3KGjl3TRcOyxwSx/u/jyKw/Q==} + '@swc/core@1.15.11': + resolution: {integrity: sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w==} engines: {node: '>=10'} peerDependencies: '@swc/helpers': '>=0.5.17' @@ -9545,8 +9753,8 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.17': - resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + '@swc/helpers@0.5.18': + resolution: {integrity: sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ==} '@swc/types@0.1.25': resolution: {integrity: sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g==} @@ -9558,8 +9766,8 @@ packages: '@tanstack/query-core@4.27.0': resolution: {integrity: sha512-sm+QncWaPmM73IPwFlmWSKPqjdTXZeFf/7aEmWh00z7yl2FjqophPt0dE1EHW9P1giMC5rMviv7OUbSDmWzXXA==} - '@tanstack/query-core@4.41.0': - resolution: {integrity: sha512-193R4Jp9hjvlij6LryxrB5Mpbffd2L9PeWh3KlIy/hJV4SkBOfiQZ+jc5qAZLDCrdbkA5FjGj+UoDYw6TcNnyA==} + '@tanstack/query-core@4.43.0': + resolution: {integrity: sha512-m1QeUUIpNXDYxmfuuWNFZLky0EwVmbE0hj8ulZ2nIGA1183raJgDCn0IKlxug80NotRqzodxAaoYTKHbE1/P/Q==} '@tanstack/query-core@5.76.0': resolution: {integrity: sha512-FN375hb8ctzfNAlex5gHI6+WDXTNpe0nbxp/d2YJtnP+IBM6OUm7zcaoCW6T63BawGOYZBbKC0iPvr41TteNVg==} @@ -9570,8 +9778,8 @@ packages: '@tanstack/query-core@5.77.1': resolution: {integrity: sha512-nfxVhy4UynChMFfN4NxwI8pktV9R3Zt/ROxOAe6pdOf8CigDLn26p+ex1YW5uien26BBICLmN0dTvIELHCs5vw==} - '@tanstack/query-core@5.90.11': - resolution: {integrity: sha512-f9z/nXhCgWDF4lHqgIE30jxLe4sYv15QodfdPDKYAk7nAEjNcndy4dHz3ezhdUaR23BpWa4I2EH4/DZ0//Uf8A==} + '@tanstack/query-core@5.90.20': + resolution: {integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==} '@tanstack/query-persist-client-core@4.27.0': resolution: {integrity: sha512-A+dPA7zG0MJOMDeBc/2WcKXW4wV2JMkeBVydobPW9G02M4q0yAj7vI+7SmM2dFuXyIvxXp4KulCywN6abRKDSQ==} @@ -9620,14 +9828,14 @@ packages: peerDependencies: react: ^18 || ^19 - '@tanstack/react-virtual@3.13.12': - resolution: {integrity: sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==} + '@tanstack/react-virtual@3.13.18': + resolution: {integrity: sha512-dZkhyfahpvlaV0rIKnvQiVoWPyURppl6w4m9IwMDpuIjcJ1sD9YGWrt0wISvgU7ewACXx2Ct46WPgI6qAD4v6A==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/virtual-core@3.13.12': - resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} + '@tanstack/virtual-core@3.13.18': + resolution: {integrity: sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg==} '@testing-library/dom@10.4.0': resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} @@ -9645,8 +9853,8 @@ packages: resolution: {integrity: sha512-xDXgLjVunjHqczScfkCJ9iyjdNOVHvvCdqHSSxwM9L0l/wHkTRum67SDc020uAlCoqktJplgO2AAQeLP1wgqDQ==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@testing-library/react@16.3.0': - resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==} + '@testing-library/react@16.3.2': + resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} engines: {node: '>=18'} peerDependencies: '@testing-library/dom': ^10.0.0 @@ -9666,20 +9874,20 @@ packages: peerDependencies: '@testing-library/dom': '>=7.21.4' - '@textlint/ast-node-types@15.4.0': - resolution: {integrity: sha512-IqY8i7IOGuvy05wZxISB7Me1ZyrvhaQGgx6DavfQjH3cfwpPFdDbDYmMXMuSv2xLS1kDB1kYKBV7fL2Vi16lRA==} + '@textlint/ast-node-types@15.5.1': + resolution: {integrity: sha512-2ABQSaQoM9u9fycXLJKcCv4XQulJWTUSwjo6F0i/ujjqOH8/AZ2A0RDKKbAddqxDhuabVB20lYoEsZZgzehccg==} - '@textlint/linter-formatter@15.4.0': - resolution: {integrity: sha512-rfqOZmnI1Wwc/Pa4LK+vagvVPmvxf9oRsBRqIOB04DwhucingZyAIJI/TyG18DIDYbP2aFXBZ3oOvyAxHe/8PQ==} + '@textlint/linter-formatter@15.5.1': + resolution: {integrity: sha512-7wfzpcQtk7TZ3UJO2deTI71mJCm4VvPGUmSwE4iuH6FoaxpdWpwSBiMLcZtjYrt/oIFOtNz0uf5rI+xJiHTFww==} - '@textlint/module-interop@15.4.0': - resolution: {integrity: sha512-uGf+SFIfzOLCbZI0gp+2NLsrkSArsvEWulPP6lJuKp7yRHadmy7Xf/YHORe46qhNyyxc8PiAfiixHJSaHGUrGg==} + '@textlint/module-interop@15.5.1': + resolution: {integrity: sha512-Y1jcFGCKNSmHxwsLO3mshOfLYX4Wavq2+w5BG6x5lGgZv0XrF1xxURRhbnhns4LzCu0fAcx6W+3V8/1bkyTZCw==} - '@textlint/resolver@15.4.0': - resolution: {integrity: sha512-Vh/QceKZQHFJFG4GxxIsKM1Xhwv93mbtKHmFE5/ybal1mIKHdqF03Z9Guaqt6Sx/AeNUshq0hkMOEhEyEWnehQ==} + '@textlint/resolver@15.5.1': + resolution: {integrity: sha512-CVHxMIm8iNGccqM12CQ/ycvh+HjJId4RyC6as5ynCcp2E1Uy1TCe0jBWOpmLsbT4Nx15Ke29BmspyByawuIRyA==} - '@textlint/types@15.4.0': - resolution: {integrity: sha512-ZMwJgw/xjxJufOD+IB7I2Enl9Si4Hxo04B76RwUZ5cKBKzOPcmd6WvGe2F7jqdgmTdGnfMU+Bo/joQrjPNIWqg==} + '@textlint/types@15.5.1': + resolution: {integrity: sha512-IY1OVZZk8LOOrbapYCsaeH7XSJT89HVukixDT8CoiWMrKGCTCZ3/Kzoa3DtMMbY8jtY777QmPOVCNnR+8fF6YQ==} '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -9722,6 +9930,11 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@twbs/fantasticon@3.1.0': + resolution: {integrity: sha512-dqJvW4k9qXt7ktLoCFkAFLtIhV/r8Psj8jtmwh+emIoXYHL+9Y39m0rLMRRTkX2YPuwBL7Y2vX8DtNtsyoGZLg==} + engines: {node: '>=16'} + hasBin: true + '@tybys/wasm-util@0.10.1': resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} @@ -9822,8 +10035,8 @@ packages: '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/express-serve-static-core@4.19.7': - resolution: {integrity: sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==} + '@types/express-serve-static-core@4.19.8': + resolution: {integrity: sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==} '@types/express@4.17.25': resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} @@ -9864,8 +10077,8 @@ packages: '@types/html-minifier-terser@6.1.0': resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} - '@types/http-cache-semantics@4.0.4': - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + '@types/http-cache-semantics@4.2.0': + resolution: {integrity: sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==} '@types/http-errors@2.0.5': resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} @@ -9942,9 +10155,6 @@ packages: '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} - '@types/mdurl@1.0.5': - resolution: {integrity: sha512-6L6VymKTzYSrEf4Nev4Xa1LCHKrlTlYCBMTlQKFuddo1CvQcE52I0mwfOJayueUC7MJuXOeHTcIU683lzd0cUA==} - '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} @@ -9982,17 +10192,14 @@ packages: '@types/node-fetch@2.6.13': resolution: {integrity: sha512-QGpRVpzSaUs30JBSGPjOg4Uveu384erbHBoT1zeONvyCfwQxIkUshLAOqN/k9EjGviPRmWTTe6aH2qySWKTVSw==} - '@types/node-forge@1.3.14': - resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} - '@types/node@16.18.126': resolution: {integrity: sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==} '@types/node@18.19.130': resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - '@types/node@20.19.25': - resolution: {integrity: sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==} + '@types/node@20.19.30': + resolution: {integrity: sha512-WJtwWJu7UdlvzEAUm484QNg5eAoq5QR08KDNx7g45Usrs2NtOPiX8ugDqmKdXkyL03rBqU5dYNYVQetEpBHq2g==} '@types/node@22.15.18': resolution: {integrity: sha512-v1DKRfUdyW+jJhZNEI1PYy29S2YRxMV5AOO/x/SjKmW0acCIOqmbj6Haf9eHAhsPmrhlHSxEhv/1WszcLWV4cg==} @@ -10093,8 +10300,8 @@ packages: '@types/scheduler@0.26.0': resolution: {integrity: sha512-WFHp9YUJQ6CKshqoC37iOlHnQSmxNc795UhB26CyBBttrN9svdIrUjl/NjnNmfcwtncN0h/0PPAFWv9ovP8mLA==} - '@types/selenium-webdriver@4.35.4': - resolution: {integrity: sha512-hZFsK0dt/2PA5eLrFOJwkoTBpPXtaKnln7NCtg3pMAPwg7DXG6kTilHoAw8KzsQeDFLJ0mYcL6dPSMt1Qk7eSw==} + '@types/selenium-webdriver@4.35.5': + resolution: {integrity: sha512-wCQCjWmahRkUAO7S703UAvBFkxz4o/rjX4T2AOSWKXSi0sTQPsrXxR0GjtFUT0ompedLkYH4R5HO5Urz0hyeog==} '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} @@ -10177,8 +10384,8 @@ packages: '@types/vscode-webview@1.57.5': resolution: {integrity: sha512-iBAUYNYkz+uk1kdsq05fEcoh8gJmwT3lqqFPN7MGyjQ3HVloViMdo7ZJ8DFIP8WOK74PjOEilosqAyxV2iUFUw==} - '@types/vscode@1.106.1': - resolution: {integrity: sha512-R/HV8u2h8CAddSbX8cjpdd7B8/GnE4UjgjpuGuHcbp1xV6yh4OeqU4L1pKjlwujCrSFS0MOpwJAIs/NexMB1fQ==} + '@types/vscode@1.108.1': + resolution: {integrity: sha512-DerV0BbSzt87TbrqmZ7lRDIYaMiqvP8tmJTzW2p49ZBVtGUnGAu2RGQd1Wv4XMzEVUpaHbsemVM5nfuQJj7H6w==} '@types/webpack-env@1.18.8': resolution: {integrity: sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A==} @@ -10221,39 +10428,6 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@5.48.2': - resolution: {integrity: sha512-sR0Gja9Ky1teIq4qJOl0nC+Tk64/uYdX+mi+5iB//MH8gwyx8e3SOyhEzeLZEFEEfCaLf8KJq+Bd/6je1t+CAg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/eslint-plugin@6.21.0': - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/eslint-plugin@7.18.0': - resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/eslint-plugin@8.32.1': resolution: {integrity: sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10262,14 +10436,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/eslint-plugin@8.33.1': - resolution: {integrity: sha512-TDCXj+YxLgtvxvFlAvpoRv9MAncDLBV2oT9Bd7YBGC/b/sEURoOYuIwLI99rjWOfY3QtDzO+mk0n4AmdFExW8A==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.33.1 - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/experimental-utils@2.34.0': resolution: {integrity: sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -10286,36 +10452,6 @@ packages: typescript: optional: true - '@typescript-eslint/parser@5.48.2': - resolution: {integrity: sha512-38zMsKsG2sIuM5Oi/olurGwYJXzmtdsHhn5mI/pQogP+BjYVkK5iRazCQ8RGS0V+YLk282uWElN70zAAUmaYHw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@6.21.0': - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@7.18.0': - resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/parser@8.32.1': resolution: {integrity: sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10323,79 +10459,14 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.33.1': - resolution: {integrity: sha512-qwxv6dq682yVvgKKp2qWwLgRbscDAYktPptK4JPojCwwi3R9cwrvIxS4lvBpzmcqzR4bdn54Z0IG1uHFskW4dA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/project-service@8.33.1': - resolution: {integrity: sha512-DZR0efeNklDIHHGRpMpR5gJITQpu6tLr9lDJnKdONTC7vvzOlLAG/wcfxcdxEWrbiZApcoBCzXqU/Z458Za5Iw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/scope-manager@5.48.2': - resolution: {integrity: sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/scope-manager@5.62.0': resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/scope-manager@7.18.0': - resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.32.1': resolution: {integrity: sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.33.1': - resolution: {integrity: sha512-dM4UBtgmzHR9bS0Rv09JST0RcHYearoEoo3pG5B6GoTR9XcyeqX87FEhPo+5kTvVfKCvfHaHrcgeJQc6mrDKrA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.33.1': - resolution: {integrity: sha512-STAQsGYbHCF0/e+ShUQ4EatXQ7ceh3fBCXkNU7/MZVKulrlq1usH7t2FhxvCpuCi5O5oi1vmVaAjrGeL71OK1g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/type-utils@5.48.2': - resolution: {integrity: sha512-QVWx7J5sPMRiOMJp5dYshPxABRoZV1xbRirqSk8yuIIsu0nvMTZesKErEA3Oix1k+uvsk8Cs8TGJ6kQ0ndAcew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/type-utils@6.21.0': - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/type-utils@7.18.0': - resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/type-utils@8.32.1': resolution: {integrity: sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10403,37 +10474,14 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/type-utils@8.33.1': - resolution: {integrity: sha512-1cG37d9xOkhlykom55WVwG2QRNC7YXlxMaMzqw2uPeJixBFfKWZgaP/hjAObqMN/u3fr5BrTwTnc31/L9jQ2ww==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/types@5.48.2': - resolution: {integrity: sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@5.62.0': resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/types@7.18.0': - resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.32.1': resolution: {integrity: sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.33.1': - resolution: {integrity: sha512-xid1WfizGhy/TKMTwhtVOgalHwPtV8T32MS9MaH50Cwvz6x6YqRIPdD2WvW0XaqOzTV9p5xdLY0h/ZusU5Lokg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@2.34.0': resolution: {integrity: sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -10443,15 +10491,6 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@5.48.2': - resolution: {integrity: sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@5.62.0': resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -10461,60 +10500,18 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/typescript-estree@7.18.0': - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@8.32.1': resolution: {integrity: sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.33.1': - resolution: {integrity: sha512-+s9LYcT8LWjdYWu7IWs7FvUxpQ/DGkdjZeE/GGulHvv8rvYwQvVaUZ6DE+j5x/prADUgSbbCWZ2nPI3usuVeOA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/utils@5.48.2': - resolution: {integrity: sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@5.62.0': resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - - '@typescript-eslint/utils@7.18.0': - resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - '@typescript-eslint/utils@8.32.1': resolution: {integrity: sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -10522,37 +10519,14 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.33.1': - resolution: {integrity: sha512-52HaBiEQUaRYqAXpfzWSR2U3gxk92Kw006+xZpElaPMg3C4PgM+A5LqwoQI1f9E5aZ/qlxAZxzm42WX+vn92SQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.9.0' - - '@typescript-eslint/visitor-keys@5.48.2': - resolution: {integrity: sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/visitor-keys@5.62.0': resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/visitor-keys@7.18.0': - resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.32.1': resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.33.1': - resolution: {integrity: sha512-3i8NrFcZeeDHJ+7ZUuDkGT+UHq+XoFGsymNK2jZCOHcfEzRQ0BdpRtdpSx/Iyf3MHLWIcLS0COuOPibKQboIiQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typespec/ts-http-runtime@0.3.2': resolution: {integrity: sha512-IlqQ/Gv22xUC1r/WQm4StLkYQmaaTsXAhUVsNE0+xiyf0yRFiH5++q78U3bw6bLKDCTmh0uqKB9eG9+Bt75Dkg==} engines: {node: '>=20.0.0'} @@ -10668,8 +10642,8 @@ packages: cpu: [x64] os: [win32] - '@vercel/oidc@3.0.5': - resolution: {integrity: sha512-fnYhv671l+eTTp48gB4zEsTW/YtRgRPnkI2nT7x6qw5rkI1Lq2hTmQIpHPgyThI0znLK+vX2n9XxKdXZ7BUbbw==} + '@vercel/oidc@3.1.0': + resolution: {integrity: sha512-Fw28YZpRnA3cAHHDlkt7xQHiJ0fcL+NRcIqsocZQUSmbzeIKRpwttJjik5ZGanXP+vlA4SbTg+AbA3bP363l+w==} engines: {node: '>= 20'} '@vitest/expect@2.0.5': @@ -10699,11 +10673,8 @@ packages: '@vscode-logging/wrapper@2.0.0': resolution: {integrity: sha512-XA8T61WL3vsrfEMUog1km8USEgnD/3H2qXk7fizFzuEFqNRGpVq9AYjxSUuBMsffIdtwfAOFYZJ8HIwzy+cGjA==} - '@vscode/codicons@0.0.33': - resolution: {integrity: sha512-VdgpnD75swH9hpXjd34VBgQ2w2quK63WljodlUcOoJDPKiV+rPjHrcUc2sjLCNKxhl6oKqmsZgwOWcDAY2GKKQ==} - - '@vscode/codicons@0.0.36': - resolution: {integrity: sha512-wsNOvNMMJ2BY8rC2N2MNBG7yOowV3ov8KlvUE/AiVUlHKTfWsw3OgAOQduX7h0Un6GssKD3aoTVH+TF3DSQwKQ==} + '@vscode/codicons@0.0.44': + resolution: {integrity: sha512-F7qPRumUK3EHjNdopfICLGRf3iNPoZQt+McTHAn4AlOWPB3W2kL4H0S7uqEqbyZ6rCxaeDjpAn3MCUnwTu/VJQ==} '@vscode/extension-telemetry@1.0.0': resolution: {integrity: sha512-vaTZE65zigWwSWYB6yaZUAyVC/Ux+6U82hnzy/ejuS/KpFifO+0oORNd5yAoPeIRnYjvllM6ES3YlX4K5tUuww==} @@ -11043,8 +11014,14 @@ packages: resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} engines: {node: '>=12'} - ai@5.0.106: - resolution: {integrity: sha512-M5obwavxSJJ3tGlAFqI6eltYNJB0D20X6gIBCFx/KVorb/X1fxVVfiZZpZb+Gslu4340droSOjT0aKQFCarNVg==} + ai@5.0.124: + resolution: {integrity: sha512-Li6Jw9F9qsvFJXZPBfxj38ddP2iURCnMs96f9Q3OeQzrDVcl1hvtwSEAuxA/qmfh6SDV2ERqFUOFzigvr0697g==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.25.76 || ^4.1.8 + + ai@6.0.67: + resolution: {integrity: sha512-xBnTcByHCj3OcG6V8G1s6zvSEqK0Bdiu+IEXYcpGrve1iGFFRgcrKeZtr/WAW/7gupnSvBbDF24BEv1OOfqi1g==} engines: {node: '>=18'} peerDependencies: zod: ^3.25.76 || ^4.1.8 @@ -11093,8 +11070,8 @@ packages: resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} engines: {node: '>=0.4.2'} - anser@2.3.3: - resolution: {integrity: sha512-QGY1oxYE7/kkeNmbtY/2ZjQ07BCG3zYdz+k/+sf69kMzEIxb93guHkPnIXITQ+BYi61oQwG74twMOX1tD4aesg==} + anser@2.3.5: + resolution: {integrity: sha512-vcZjxvvVoxTeR5XBNJB38oTu/7eDCZlwdz32N1eNgpyPF7j/Z7Idf+CUwQOkKKpJ7RJyjxgLHCM7vdIK0iCNMQ==} ansi-align@2.0.0: resolution: {integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==} @@ -11351,6 +11328,10 @@ packages: asn1@0.2.6: resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + asn1js@3.0.7: + resolution: {integrity: sha512-uLvq6KJu04qoQM6gvBfKFjlh6Gl0vOKQuR5cJMDHQkmwfMOQeN3F3SHCv9SNYSL+CRoHvOGFfllDlVz03GQjvQ==} + engines: {node: '>=12.0.0'} + assert-plus@1.0.0: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} @@ -11430,8 +11411,8 @@ packages: autolinker@3.16.2: resolution: {integrity: sha512-JiYl7j2Z19F9NdTmirENSUUIIL/9MytEWtmzhfmsKPCp9E+G35Y0UNCMoM9tFigxT59qSc8Ml2dlZXOCVTYwuA==} - autoprefixer@10.4.22: - resolution: {integrity: sha512-ARe0v/t9gO28Bznv6GgqARmVqcWOV3mfgUPn9becPHMiD3o9BwlRgaeccZnwTpZ7Zwqrm+c1sUSsMxIzQzc8Xg==} + autoprefixer@10.4.24: + resolution: {integrity: sha512-uHZg7N9ULTVbutaIsDRoUkoS8/h3bdsmVJYZ5l3wv8Cp/6UIIoRDm90hZ+BwxUj/hGBEzLxdHNSKuFpn8WOyZw==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -11463,8 +11444,8 @@ packages: aws4fetch@1.0.20: resolution: {integrity: sha512-/djoAN709iY65ETD6LKCtyyEI04XIBP5xVvfmNxsEP0uJB5tyaGBztSryRr4HqMStr9R06PisQE7m9zDTXKu6g==} - axe-core@4.11.0: - resolution: {integrity: sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==} + axe-core@4.11.1: + resolution: {integrity: sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==} engines: {node: '>=4'} axios@1.12.2: @@ -11663,8 +11644,8 @@ packages: babel-plugin-named-exports-order@0.0.2: resolution: {integrity: sha512-OgOYHOLoRK+/mvXU9imKHlG6GkPLYrUCvFXG/CM93R/aNNO8pOOF4aS+S8CCHMDQoNSeiOYEZb/G6RwL95Jktw==} - babel-plugin-polyfill-corejs2@0.4.14: - resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + babel-plugin-polyfill-corejs2@0.4.15: + resolution: {integrity: sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -11683,8 +11664,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - babel-plugin-polyfill-regenerator@0.6.5: - resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + babel-plugin-polyfill-regenerator@0.6.6: + resolution: {integrity: sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 @@ -11913,8 +11894,8 @@ packages: bare-abort-controller: optional: true - bare-fs@4.5.2: - resolution: {integrity: sha512-veTnRzkb6aPHOvSKIOy60KzURfBdUflr5VReI+NSaPL6xf+XLdONQgZgpYvUuZLVQ8dCqxpBAudaOM1+KpAUxw==} + bare-fs@4.5.3: + resolution: {integrity: sha512-9+kwVx8QYvt3hPWnmb19tPnh38c6Nihz8Lx3t0g9+4GoIf3/fTgYwM4Z6NxgI+B9elLQA7mLE9PpqcWtOMRDiQ==} engines: {bare: '>=1.16.0'} peerDependencies: bare-buffer: '*' @@ -11949,8 +11930,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.8.32: - resolution: {integrity: sha512-OPz5aBThlyLFgxyhdwf/s2+8ab3OvT7AdTNvKHBwpXomIYeXqpUUuT8LrdtxZSsWJ4R4CU1un4XGh5Ez3nlTpw==} + baseline-browser-mapping@2.9.19: + resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} hasBin: true basic-auth@2.0.1: @@ -12019,8 +12000,8 @@ packages: resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - body-parser@2.2.1: - resolution: {integrity: sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==} + body-parser@2.2.2: + resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} engines: {node: '>=18'} bonjour-service@1.3.0: @@ -12082,8 +12063,8 @@ packages: deprecated: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools. hasBin: true - browserslist@4.28.0: - resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==} + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -12156,6 +12137,10 @@ packages: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} + bytestreamjs@2.0.1: + resolution: {integrity: sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==} + engines: {node: '>=6.0.0'} + c8@10.1.3: resolution: {integrity: sha512-LvcyrOAaOnrrlMpW22n690PUvxiq4Uf9WMhQwNJ9vgagkL/ph1+D4uvjvDA5XCbykrc0sx+ay6pVi9YZ1GnhyA==} engines: {node: '>=18'} @@ -12194,8 +12179,8 @@ packages: resolution: {integrity: sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==} engines: {node: '>=18'} - cacheable@2.3.0: - resolution: {integrity: sha512-HHiAvOBmlcR2f3SQ7kdlYD8+AUJG+wlFZ/Ze8tl1Vzvz0MdOh8IYA/EFU4ve8t1/sZ0j4MGi7ST5MoTwHessQA==} + cacheable@2.3.2: + resolution: {integrity: sha512-w+ZuRNmex9c1TR9RcsxbfTKCjSL0rh1WA5SABbrWprIHeNBdmyQLSYonlDy9gpD+63XT8DgZ/wNh1Smvc9WnJA==} call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} @@ -12267,14 +12252,14 @@ packages: caniuse-api@3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - caniuse-db@1.0.30001757: - resolution: {integrity: sha512-A1KAcawhlASOv4/RwYwfJKld9x9//MUFfqqj7hT6vriXiGxVD6B1ZVLdfksa0WzZfGeUVd6JdW8SV+SH6HMSFw==} + caniuse-db@1.0.30001767: + resolution: {integrity: sha512-7tm2xRGN747GhoKBdUYRLdr4QbhOxEvj/I4jx7FWHO5sTaepFgNBIgxNv7IWdv9xLUIlnTIsQc9bD+qE1QOzSg==} - caniuse-lite@1.0.30001757: - resolution: {integrity: sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==} + caniuse-lite@1.0.30001767: + resolution: {integrity: sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==} - canvas@3.2.0: - resolution: {integrity: sha512-jk0GxrLtUEmW/TmFsk2WghvgHe8B0pxGilqCL21y8lHkPUGa6FTsnCNtHPOzT8O3y+N+m3espawV80bbBlgfTA==} + canvas@3.2.1: + resolution: {integrity: sha512-ej1sPFR5+0YWtaVp6S1N1FVz69TQCqmrkGeRvQxZeAB1nAIcjNTHVwrZtYtWFFBmQsF40/uDLehsW5KuYC99mg==} engines: {node: ^18.12.0 || >= 20.9.0} capture-exit@2.0.0: @@ -12365,21 +12350,18 @@ packages: chardet@0.4.2: resolution: {integrity: sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + check-error@2.1.3: + resolution: {integrity: sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==} engines: {node: '>= 16'} cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} - cheerio@1.1.2: - resolution: {integrity: sha512-IkxPpb5rS/d1IiLbHMgfPuS0FgiWTtFIm/Nj+2woXDLTZ7fOT2eqzgYbdMlLweqlHbsZjxEChoVK+7iph7jyQg==} + cheerio@1.2.0: + resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==} engines: {node: '>=20.18.1'} chokidar@1.7.0: @@ -12414,8 +12396,8 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - ci-info@4.3.1: - resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} citty@0.1.6: @@ -12424,8 +12406,8 @@ packages: cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} - cjs-module-lexer@2.1.1: - resolution: {integrity: sha512-+CmxIZ/L2vNcEfvNtLdU0ZQ6mbq3FZnwAP2PPTiKP+1QOoKwlKlPgb8UKV0Dds7QVaMnHm+FwSft2VB0s/SLjQ==} + cjs-module-lexer@2.2.0: + resolution: {integrity: sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==} clap@1.2.3: resolution: {integrity: sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==} @@ -12464,10 +12446,6 @@ packages: resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} engines: {node: '>=6'} - cli-color@2.0.4: - resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} - engines: {node: '>=0.10'} - cli-cursor@2.1.0: resolution: {integrity: sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==} engines: {node: '>=4'} @@ -12499,22 +12477,23 @@ packages: cli-width@2.2.1: resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} - cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} clipboard-copy@4.0.1: resolution: {integrity: sha512-wOlqdqziE/NNTUJsfSgXmBMIrYmfd5V0HCGsR8uAKHcg+h9NENWINcfRjtWGU77wDHC8B8ijV4hMTGYbrKovng==} + clipboard-image@0.1.0: + resolution: {integrity: sha512-SWk7FgaXLNFld19peQ/rTe0n97lwR1WbkqxV6JKCAOh7U52AKV/PeMFCyt/8IhBdqyDA8rdyewQMKZqvWT5Akg==} + engines: {node: '>=20'} + hasBin: true + clipboardy@4.0.0: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} - clipboardy@5.0.1: - resolution: {integrity: sha512-pJ5ZDWjOT593Nli4TqlRLy33KomlAPxIFntMFxXrCqJON1cGcGPT5nNFxRxJ9m4HbfrccsYve7XwXjywW6nXVw==} + clipboardy@5.2.0: + resolution: {integrity: sha512-qlXzpbPfFtMKUMeLRkKDe42uRfhRVGTv86VOy7vDVjFh5cHhkCrxPlXfgiJdL65X/Lr+iJtl1haUtq7dMfEilA==} engines: {node: '>=20'} cliui@3.2.0: @@ -12693,8 +12672,8 @@ packages: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} - commander@14.0.2: - resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} engines: {node: '>=20'} commander@2.13.0: @@ -12842,18 +12821,18 @@ packages: resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} hasBin: true - core-js-compat@3.47.0: - resolution: {integrity: sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ==} + core-js-compat@3.48.0: + resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==} - core-js-pure@3.47.0: - resolution: {integrity: sha512-BcxeDbzUrRnXGYIVAGFtcGQVNpFcUhVjr6W7F8XktvQW2iJP9e66GP6xdKotCRFlrxBvNIBrhwKteRXqMV86Nw==} + core-js-pure@3.48.0: + resolution: {integrity: sha512-1slJgk89tWC51HQ1AEqG+s2VuwpTRr8ocu4n20QUcH1v9lAN0RXen0Q0AABa/DK1I7RrNWLucplOHMx8hfTGTw==} core-js@2.6.12: resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. - core-js@3.47.0: - resolution: {integrity: sha512-c3Q2VVkGAUyupsjRnaNX6u8Dq2vAdzm9iuPj5FW0fRxzlxgq9Q39MDq10IvmQSpLgHQNyQzQmOo6bgGHmH3NNg==} + core-js@3.48.0: + resolution: {integrity: sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==} core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} @@ -12865,8 +12844,8 @@ packages: resolution: {integrity: sha512-8OBFwnzMgR4mNrAeAyOLB2EruS2z7u02of2bOu7i9kKYlZG+niS7CTHLPgEXKWW2NAOJWRry9RRCaL9lJRjNqg==} engines: {node: '>=0.10.0'} - cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} corser@2.0.1: @@ -12927,8 +12906,8 @@ packages: create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - create-storybook@8.6.14: - resolution: {integrity: sha512-xrKGHu1w1zbZDTjNJffbLh1W2UrYP7ciHfKw92A3BDU/jmDZwmqKQqCfwzbh2iBc6vTdt/uUn0U76zpgQ6A4XA==} + create-storybook@8.6.15: + resolution: {integrity: sha512-zcAJzOwF816mr60agZCZHmytg6xk6ZaiVpWEA03w17xdwXkW6NVr64VlppxrDKMIXZgl/urWXjtbhRSItnskEA==} hasBin: true crelt@1.0.6: @@ -12974,6 +12953,10 @@ packages: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} + crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + css-color-names@0.0.4: resolution: {integrity: sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==} @@ -13015,8 +12998,8 @@ packages: webpack: optional: true - css-loader@7.1.2: - resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==} + css-loader@7.1.3: + resolution: {integrity: sha512-frbERmjT0UC5lMheWpJmMilnt9GEhbZJN/heUb7/zaJYeIzj5St9HvDcfshzzOqbsS+rYpMk++2SD3vGETDSyA==} engines: {node: '>= 18.12.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -13216,8 +13199,8 @@ packages: decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - decode-named-character-reference@1.2.0: - resolution: {integrity: sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q==} + decode-named-character-reference@1.3.0: + resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==} decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} @@ -13230,8 +13213,8 @@ packages: dedent@0.7.0: resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dedent@1.7.0: - resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} + dedent@1.7.1: + resolution: {integrity: sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -13371,11 +13354,6 @@ packages: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true - detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} @@ -13407,8 +13385,8 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - dexie@4.2.1: - resolution: {integrity: sha512-Ckej0NS6jxQ4Po3OrSQBFddayRhTCic2DoCAG5zacOfOVB9P2Q5Xc5uL/nVa7ZVs+HdMnvUPzLFCB/JwpB6Csg==} + dexie@4.3.0: + resolution: {integrity: sha512-5EeoQpJvMKHe6zWt/FSIIuRa3CWlZeIl6zKXt+Lz7BU6RoRRLgX9dZEynRfXrkLcldKYCBiz7xekTEylnie1Ug==} diagnostic-channel-publishers@0.3.5: resolution: {integrity: sha512-AOIjw4T7Nxl0G2BoBPhkQ6i7T4bUd9+xvdYizwvG7vVAM1dvr+SDrcUudlmzwH0kbEwdR2V1EcnKT0wAeYLQNQ==} @@ -13429,20 +13407,8 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - - diff@5.2.0: - resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} - engines: {node: '>=0.3.1'} - - diff@7.0.0: - resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} + diff@8.0.3: + resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} engines: {node: '>=0.3.1'} dir-glob@2.2.2: @@ -13597,8 +13563,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.5.263: - resolution: {integrity: sha512-DrqJ11Knd+lo+dv+lltvfMDLU27g14LMdH2b0O3Pio4uk0x+z7OR+JrmyacTPN2M8w3BrZ7/RTwG3R9B7irPlg==} + electron-to-chromium@1.5.283: + resolution: {integrity: sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==} email-addresses@5.0.0: resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} @@ -13613,9 +13579,6 @@ packages: emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - emoji-regex@7.0.3: - resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -13633,10 +13596,6 @@ packages: enabled@2.0.0: resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -13657,8 +13616,8 @@ packages: resolution: {integrity: sha512-ZaAux1rigq1e2nQrztHn4h2ugvpzZxs64qneNah+8Mh/K0CRqJFJc+UoXnUsq+1yX+DmQFPPdVqboKAJ89e0Iw==} engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} - enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + enhanced-resolve@5.18.4: + resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} engines: {node: '>=10.13.0'} enquirer@2.4.1: @@ -13679,6 +13638,10 @@ packages: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -13708,8 +13671,8 @@ packages: error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} - es-abstract@1.24.0: - resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} + es-abstract@1.24.1: + resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} engines: {node: '>= 0.4'} es-array-method-boxes-properly@1.0.0: @@ -13726,13 +13689,16 @@ packages: es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - es-iterator-helpers@1.2.1: - resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} + es-iterator-helpers@1.2.2: + resolution: {integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==} engines: {node: '>= 0.4'} es-module-lexer@1.7.0: resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.0.0: + resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} + es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} engines: {node: '>= 0.4'} @@ -13749,8 +13715,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es-toolkit@1.42.0: - resolution: {integrity: sha512-SLHIyY7VfDJBM8clz4+T2oquwTQxEzu263AyhVK4jREOAwJ+8eebaa4wM3nlvnAqhDrMm2EsA6hWHaQsMPQ1nA==} + es-toolkit@1.44.0: + resolution: {integrity: sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==} es5-ext@0.10.64: resolution: {integrity: sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==} @@ -13773,9 +13739,6 @@ packages: resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} engines: {node: '>=0.12'} - es6-weak-map@2.0.3: - resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} - esbuild-plugin-alias@0.2.1: resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} @@ -13908,8 +13871,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react-refresh@0.4.24: - resolution: {integrity: sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==} + eslint-plugin-react-refresh@0.4.26: + resolution: {integrity: sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==} peerDependencies: eslint: '>=8.40' @@ -13938,36 +13901,18 @@ packages: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-utils@1.4.3: - resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==} - engines: {node: '>=6'} - eslint-utils@2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} engines: {node: '>=6'} - eslint-utils@3.0.0: - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - eslint-visitor-keys@1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} - eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -13976,30 +13921,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@6.8.0: - resolution: {integrity: sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - - eslint@9.26.0: - resolution: {integrity: sha512-Hx0MOjPh6uK9oq9nVsATZKE/Wlbai7KFjfCuw9UHaguDW3x+HF0O5nIi3ud39TWgrTjTO5nHxmL3R1eANinWHQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - - eslint@9.27.0: - resolution: {integrity: sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==} + eslint@9.39.2: + resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -14016,14 +13939,6 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@6.2.1: - resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==} - engines: {node: '>=6.0.0'} - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@2.7.3: resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} engines: {node: '>=0.10.0'} @@ -14034,8 +13949,8 @@ packages: engines: {node: '>=4'} hasBin: true - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} engines: {node: '>=0.10'} esrecurse@4.3.0: @@ -14097,8 +14012,8 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} events-universal@1.0.1: resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} @@ -14218,10 +14133,6 @@ packages: resolution: {integrity: sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==} engines: {node: '>=0.12'} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - extract-text-webpack-plugin@3.0.2: resolution: {integrity: sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==} engines: {node: '>= 4.8 < 5.0.0 || >= 5.10'} @@ -14237,11 +14148,6 @@ packages: resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} engines: {'0': node >=0.6.0} - fantasticon@3.0.0: - resolution: {integrity: sha512-PylulixZA8I0SeiUKtuyOhwrz/ojZTSA1KXddipvEyQXCVrpPMTnSXzaE9nXXK7nCjJWFkqoBAQ1aBdaxMltrg==} - engines: {node: '>= 16.0.0'} - hasBin: true - fast-deep-equal@1.1.0: resolution: {integrity: sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==} @@ -14280,8 +14186,8 @@ packages: fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} - fast-xml-parser@5.2.5: - resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} + fast-xml-parser@5.3.4: + resolution: {integrity: sha512-EFd6afGmXlCx8H8WTZHhAoDaWaGyuIBoZJ2mknrNxug+aZKjkp0a0dlars9Izl+jF+7Gu1/5f/2h68cQpe0IiA==} hasBin: true fastest-levenshtein@1.0.16: @@ -14291,8 +14197,8 @@ packages: fastparse@1.1.2: resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} - fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} fault@1.0.4: resolution: {integrity: sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==} @@ -14356,16 +14262,8 @@ packages: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} engines: {node: '>=18'} - file-entry-cache@11.1.1: - resolution: {integrity: sha512-TPVFSDE7q91Dlk1xpFLvFllf8r0HyOMOlnWy7Z2HBku5H3KhIeOGInexrIeg2D64DosVB/JXkrrk6N/7Wriq4A==} - - file-entry-cache@5.0.1: - resolution: {integrity: sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==} - engines: {node: '>=4'} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@11.1.2: + resolution: {integrity: sha512-N2WFfK12gmrK1c1GXOqiAJ1tc5YE+R53zvQ+t5P8S5XhnmKYVB5eZEiLNZKDSmoG8wqqbF9EXYBBW/nef19log==} file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} @@ -14490,10 +14388,6 @@ packages: resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} engines: {node: '>=18'} - flat-cache@2.0.1: - resolution: {integrity: sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==} - engines: {node: '>=4'} - flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -14502,16 +14396,13 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flat-cache@6.1.19: - resolution: {integrity: sha512-l/K33newPTZMTGAnnzaiqSl6NnH7Namh8jBNjrgjprWxGmZUuxx/sJNIRaijOh3n7q7ESbhNZC+pvVZMFdeU4A==} + flat-cache@6.1.20: + resolution: {integrity: sha512-AhHYqwvN62NVLp4lObVXGVluiABTHapoB57EyegZVmazN+hhGhLTn3uZbOofoTw4DSDvVCadzzyChXhOAvy8uQ==} flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - flatted@2.0.2: - resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} - flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -14519,8 +14410,8 @@ packages: resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==} deprecated: flatten is deprecated in favor of utility frameworks such as lodash. - flow-parser@0.291.0: - resolution: {integrity: sha512-MLqjFn72Dvndqrkjy280HaIs4AV9Z6nxVRmNPO3TjbYcipg4hR7QX7tEYZYsVvaaZWZPGe6Mithluk2aPGlDOw==} + flow-parser@0.299.0: + resolution: {integrity: sha512-phGMRoNt6SNglPHGRbCyWm9/pxfe6t/t4++EIYPaBGWT6e0lphLBgUMrvpL62NbRo9R549o3oqrbKHq82kANCw==} engines: {node: '>=0.4.0'} flush-write-stream@1.1.1: @@ -14658,8 +14549,8 @@ packages: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} - fs-extra@11.3.2: - resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} + fs-extra@11.3.3: + resolution: {integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==} engines: {node: '>=14.14'} fs-extra@3.0.1: @@ -14929,14 +14820,6 @@ packages: global@4.4.0: resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==} - globals@12.4.0: - resolution: {integrity: sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==} - engines: {node: '>=8'} - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -15108,8 +14991,8 @@ packages: resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} engines: {node: '>= 0.4.0'} - hashery@1.3.0: - resolution: {integrity: sha512-fWltioiy5zsSAs9ouEnvhsVJeAXRybGCNNv0lvzpzNOSDbULXRy7ivFWwCCv4I5Am6kSo75hmbsCduOoc2/K4w==} + hashery@1.4.0: + resolution: {integrity: sha512-Wn2i1In6XFxl8Az55kkgnFRiAlIAushzh26PTjL2AKtQcEfXrcLa7Hn5QOWGZEf3LU057P9TwwZjFyxfS1VuvQ==} engines: {node: '>=20'} hasown@2.0.2: @@ -15155,8 +15038,8 @@ packages: hast-util-to-parse5@7.1.0: resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} - hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + hast-util-to-parse5@8.0.1: + resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==} hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} @@ -15201,8 +15084,8 @@ packages: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} - hookified@1.13.0: - resolution: {integrity: sha512-6sPYUY8olshgM/1LDNW4QZQN0IqgKhtl/1C8koNZBJrKLBk3AZl6chQtNwpNztvfiApHMEwMHek5rv993PRbWw==} + hookified@1.15.1: + resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -15284,8 +15167,8 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 - html-webpack-plugin@5.6.5: - resolution: {integrity: sha512-4xynFbKNNk+WlzXeQQ+6YYsH2g7mpfPszQZUi3ovKlj+pDmngQ7vRXjrrmGROabmKwyQkcgcX5hqfOwHbFmK5g==} + html-webpack-plugin@5.6.6: + resolution: {integrity: sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw==} engines: {node: '>=10.13.0'} peerDependencies: '@rspack/core': 0.x || 1.x @@ -15296,8 +15179,8 @@ packages: webpack: optional: true - htmlparser2@10.0.0: - resolution: {integrity: sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==} + htmlparser2@10.1.0: + resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} htmlparser2@6.1.0: resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} @@ -15308,14 +15191,10 @@ packages: http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} + http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} engines: {node: '>= 0.6'} - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - http-errors@2.0.1: resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} @@ -15389,8 +15268,8 @@ packages: resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} - humanize-duration@3.33.1: - resolution: {integrity: sha512-hwzSCymnRdFx9YdRkQQ0OYequXiVAV6ZGQA2uzocwB0F4309Ke6pO8dg0P8LHhRQJyVjGteRTAA/zNfEcpXn8A==} + humanize-duration@3.33.2: + resolution: {integrity: sha512-K7Ny/ULO1hDm2nnhvAY+SJV1skxFb61fd073SG1IWJl+D44ULrruCuTyjHKjBVVcSuTlnY99DKtgEG39CM5QOQ==} humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} @@ -15417,8 +15296,8 @@ packages: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} - iconv-lite@0.7.0: - resolution: {integrity: sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==} + iconv-lite@0.7.2: + resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} engines: {node: '>=0.10.0'} icss-replace-symbols@1.1.0: @@ -15538,10 +15417,6 @@ packages: inquirer@3.3.0: resolution: {integrity: sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==} - inquirer@7.3.3: - resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} - engines: {node: '>=8.0.0'} - internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} @@ -15890,9 +15765,6 @@ packages: resolution: {integrity: sha512-GljRxhWvlCNRfZyORiH77FwdFwGcMO620o37EOYC0ORWdq+WYNVqW0w2Juzew4M+L81l6/QS3t5gkkihyRqv9w==} engines: {node: '>=0.10.0'} - is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} - is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} @@ -16769,6 +16641,9 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + json-schema@0.4.0: resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} @@ -16820,8 +16695,8 @@ packages: resolution: {integrity: sha512-3I3CwAR5YRLGEApVjTYIDVzjryfvQq1sdEu8FLLCirGYBA9j0qDhIFHjtxEEyV0UApRgdAG8l4Za0VllZENHyA==} engines: {'0': node >= 0.8.0} - jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + jsonwebtoken@9.0.3: + resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} engines: {node: '>=12', npm: '>=6'} jsprim@1.4.2: @@ -16855,8 +16730,8 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - keyv@5.5.4: - resolution: {integrity: sha512-eohl3hKTiVyD1ilYdw9T0OiB4hnjef89e3dMYKz+mVKDzj+5IteTseASUsOB+EU9Tf6VNTCjDePcP6wkDGmLKQ==} + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} kill-port@2.0.1: resolution: {integrity: sha512-e0SVOV5jFo0mx8r7bS29maVWp17qGqLBZ5ricNSajON6//kmb7qqqNnml4twNE8Dtj97UQD+gNFOaipS/q1zzQ==} @@ -17097,8 +16972,8 @@ packages: lodash.xor@4.5.0: resolution: {integrity: sha512-sVN2zimthq7aZ5sPGXnSz32rZPuqcparVW50chJQe+mzTYV+IsxSsl/2gnkWWE2Of7K3myBQBqtLKOUEHJKRsQ==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} log-symbols@3.0.0: resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==} @@ -17177,8 +17052,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.4: - resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} + lru-cache@11.2.5: + resolution: {integrity: sha512-vFrFJkWtJvJnD5hg+hJvVE8Lh/TcMzKnTgCWmtBipwI5yLX/iX+5UB2tfuyODF5E7k9xEzMdYgGqaSb1c0c5Yw==} engines: {node: 20 || >=22} lru-cache@4.1.5: @@ -17195,9 +17070,6 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} - lru-queue@0.1.0: - resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==} - lucide-react@0.523.0: resolution: {integrity: sha512-rUjQoy7egZT9XYVXBK1je9ckBnNp7qzRZOhLQx5RcEp2dCGlXo+mv6vf7Am4LimEcFBJIIZzSGfgTqc9QCrPSw==} peerDependencies: @@ -17211,6 +17083,10 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true + macos-version@6.0.0: + resolution: {integrity: sha512-O2S8voA+pMfCHhBn/TIYDXzJ1qNHpPDU32oFxglKnVdJABiYYITt45oLkV9yhwA3E2FDwn3tQqUFrTsr1p3sBQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} @@ -17405,12 +17281,8 @@ packages: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} - memfs@4.51.1: - resolution: {integrity: sha512-Eyt3XrufitN2ZL9c/uIRMyDwXanLI88h/L3MoWqNY747ha3dMR9dWqp8cRT5ntjZ0U1TNuq4U91ZXK0sMBjYOQ==} - - memoizee@0.4.17: - resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} - engines: {node: '>=0.12'} + memfs@4.56.10: + resolution: {integrity: sha512-eLvzyrwqLHnLYalJP7YZ3wBe79MXktMdfQbvMrVD80K+NhrIukCVBvgP30zTJYEEDh9hZ/ep9z0KOdD7FSHo7w==} memoizerific@1.11.3: resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==} @@ -17658,8 +17530,8 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - mini-css-extract-plugin@2.9.4: - resolution: {integrity: sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==} + mini-css-extract-plugin@2.10.0: + resolution: {integrity: sha512-540P2c5dYnJlyJxTaSloliZexv8rji6rY8FhQN+WF/82iHQfA23j/xtJx97L+mXOML27EqksSek/g4eK7jaL3g==} engines: {node: '>= 12.13.0'} peerDependencies: webpack: ^5.0.0 @@ -17689,10 +17561,6 @@ packages: resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} engines: {node: '>=10'} - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -17837,8 +17705,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nan@2.23.1: - resolution: {integrity: sha512-r7bBUGKzlqk8oPBDYxt6Z0aEdF1G1rwlMcLk8LCOMbOzf0mG+JUfUzG4fIMWwHWP0iyaLWEQZJmtB7nOHEm/qw==} + nan@2.25.0: + resolution: {integrity: sha512-0M90Ag7Xn5KMLLZ7zliPWP3rT90P6PN+IzVFS0VqmnPktBk3700xUVv8Ikm9EUaUE5SDWdp/BIxdENzVznpm1g==} nano-spawn@2.0.0: resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==} @@ -17865,9 +17733,6 @@ packages: engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} hasBin: true - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -17908,8 +17773,8 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - node-abi@3.85.0: - resolution: {integrity: sha512-zsFhmbkAzwhTft6nd3VxcG0cvJsT70rL+BIGHWVq5fi6MwGrHwzqKaxXE+Hl2GmnGItnDKPPkO5/LQqjVkIdFg==} + node-abi@3.87.0: + resolution: {integrity: sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ==} engines: {node: '>=10'} node-abort-controller@3.1.1: @@ -17963,10 +17828,6 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-forge@1.3.2: - resolution: {integrity: sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==} - engines: {node: '>= 6.13.0'} - node-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true @@ -18005,8 +17866,8 @@ packages: node-releases@2.0.27: resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} - node-sarif-builder@3.3.1: - resolution: {integrity: sha512-8z5dAbhpxmk/WRQHXlv4V0h+9Y4Ugk+w08lyhV/7E/CQX9yDdBc3025/EG+RSMJU2aPFh/IQ7XDV7Ti5TLt/TA==} + node-sarif-builder@3.4.0: + resolution: {integrity: sha512-tGnJW6OKRii9u/b2WiUViTJS+h7Apxx17qsMUjsUeNDiMMX5ZFf8F8Fcz7PAQ6omvOxHZtvDTmOYKJQwmfpjeg==} engines: {node: '>=20'} node-schedule@2.1.1: @@ -18056,8 +17917,8 @@ packages: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} - normalize-url@8.1.0: - resolution: {integrity: sha512-X06Mfd/5aKsRHc0O0J5CUedwnPmnDtLF2+nq+KN9KSDlJHkPuh0JUviWjEWMe0SW/9TDdSLVPuk7L5gGTIA1/w==} + normalize-url@8.1.1: + resolution: {integrity: sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ==} engines: {node: '>=14.16'} npm-run-path@2.0.2: @@ -18105,8 +17966,8 @@ packages: nwmatcher@1.4.4: resolution: {integrity: sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==} - nwsapi@2.2.22: - resolution: {integrity: sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==} + nwsapi@2.2.23: + resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} nypm@0.5.4: resolution: {integrity: sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA==} @@ -18148,9 +18009,9 @@ packages: resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} engines: {node: '>= 0.4'} - object.getownpropertydescriptors@2.1.8: - resolution: {integrity: sha512-qkHIGe4q0lSYMv0XI4SsBTJz3WaURhLvd0lKSgtVuOsJ2krg4SgMw3PIRQFMp07yi++UR3se2mkcLqsBNpBb/A==} - engines: {node: '>= 0.8'} + object.getownpropertydescriptors@2.1.9: + resolution: {integrity: sha512-mt8YM6XwsTTovI+kdZdHSxoyF2DI59up034orlC9NfweclcWOt7CVascNNLp6U+bjFVCVCIh9PwS76tDM/rH8g==} + engines: {node: '>= 0.4'} object.groupby@1.0.3: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} @@ -18685,6 +18546,10 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + pkijs@3.3.3: + resolution: {integrity: sha512-+KD8hJtqQMYoTuL1bbGOqxb4z+nZkTAwVdNtWwe8Tc2xNbEmdJYIYoc6Qt0uF55e6YW6KuTHw1DjQ18gMhzepw==} + engines: {node: '>=16.0.0'} + playwright-core@1.55.1: resolution: {integrity: sha512-Z6Mh9mkwX+zxSlHqdr5AOcJnfp+xUWLCt9uKV18fhzA8eyxUd8NUWzAjxUh55RZKSYwDGX0cfaySdhZJGMoJ+w==} engines: {node: '>=18'} @@ -19155,6 +19020,10 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + powershell-utils@0.2.0: + resolution: {integrity: sha512-ZlsFlG7MtSFCoc5xreOvBAozCJ6Pf06opgJjh9ONEv418xpZSAzNjstD36C6+JwOnfSqOW/9uDkqKjezTdxZhw==} + engines: {node: '>=20'} + prebuild-install@7.1.3: resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} engines: {node: '>=10'} @@ -19176,8 +19045,8 @@ packages: resolution: {integrity: sha512-E6rsNU1QNJgB3sjj7OANinGncFKuK+164sLXw1/CqBjj/EkXSoSdHCtWQGBNlREIGLnL7IEUEGa08YFVUbrhVg==} engines: {node: '>=16'} - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + prettier-linter-helpers@1.0.1: + resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} engines: {node: '>=6.0.0'} prettier@1.19.1: @@ -19332,8 +19201,8 @@ packages: prosemirror-keymap@1.2.3: resolution: {integrity: sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==} - prosemirror-markdown@1.13.2: - resolution: {integrity: sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==} + prosemirror-markdown@1.13.3: + resolution: {integrity: sha512-3E+Et6cdXIH0EgN2tGYQ+EBT7N4kMiZFsW+hzx+aPtOmADDHWCdd2uUQb7yklJrfUYUOjEEu22BiN6UFgPe4cQ==} prosemirror-model@1.25.4: resolution: {integrity: sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==} @@ -19347,11 +19216,11 @@ packages: prosemirror-state@1.4.4: resolution: {integrity: sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==} - prosemirror-transform@1.10.5: - resolution: {integrity: sha512-RPDQCxIDhIBb1o36xxwsaeAvivO8VLJcgBtzmOwQ64bMtsVFh5SSuJ6dWSxO1UsHTiTXPCgQm3PDJt7p6IOLbw==} + prosemirror-transform@1.11.0: + resolution: {integrity: sha512-4I7Ce4KpygXb9bkiPS3hTEk4dSHorfRw8uI0pE8IhxlK2GXsqv5tIA7JUSxtSu7u8APVOTtbUBxTmnHIxVkIJw==} - prosemirror-view@1.41.4: - resolution: {integrity: sha512-WkKgnyjNncri03Gjaz3IFWvCAE94XoiEgvtr0/r2Xw7R8/IjK3sKLSiDoCHWcsXSAinVaKlGRZDvMCsF1kbzjA==} + prosemirror-view@1.41.5: + resolution: {integrity: sha512-UDQbIPnDrjE8tqUBbPmCOZgtd75htE6W3r0JCmY9bL6W1iemDM37MZEKC49d+tdQ0v/CKx4gjxLoLsfkD2NiZA==} protobufjs@7.5.4: resolution: {integrity: sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==} @@ -19409,6 +19278,13 @@ packages: pure-rand@7.0.1: resolution: {integrity: sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==} + pvtsutils@1.3.6: + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + + pvutils@1.1.5: + resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} + engines: {node: '>=16.0.0'} + q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} @@ -19417,12 +19293,12 @@ packages: (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) - qified@0.5.2: - resolution: {integrity: sha512-7gJ6mxcQb9vUBOtbKm5mDevbe2uRcOEVp1g4gb/Q+oLntB3HY8eBhOYRxFI2mlDFlY1e4DOSCptzxarXRvzxCA==} + qified@0.6.0: + resolution: {integrity: sha512-tsSGN1x3h569ZSU1u6diwhltLyfUWDp3YbFHedapTmpBl0B3P6U3+Qptg7xu+v+1io1EwhdPyyRHYbEw0KN2FA==} engines: {node: '>=20'} - qs@6.14.0: - resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + qs@6.14.1: + resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} engines: {node: '>=0.6'} qs@6.5.3: @@ -19593,10 +19469,10 @@ packages: peerDependencies: react: '>=16.13.1' - react-error-boundary@6.0.0: - resolution: {integrity: sha512-gdlJjD7NWr0IfkPlaREN2d9uUZUlksrfOx7SX62VRerwXbMY6ftGCIZua1VG1aXFNOimhISsTq+Owp725b9SiA==} + react-error-boundary@6.0.3: + resolution: {integrity: sha512-5guqn2UYpCFjE8UDMA8J7Kke+YSGBFrKQRJb3XdcaGZXYINZfQXgBt3ifY6MvjkN7QROc5A8zclyoSCwrcRUKw==} peerDependencies: - react: '>=16.13.1' + react: ^18.0.0 || ^19.0.0 react-error-overlay@4.0.1: resolution: {integrity: sha512-xXUbDAZkU08aAkjtUvldqbvI04ogv+a1XdHxvYuHPYKIVk/42BIOD0zSKTHAWV4+gDy3yGm283z2072rA2gdtw==} @@ -19678,8 +19554,8 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-is@19.2.0: - resolution: {integrity: sha512-x3Ax3kNSMIIkyVYhWPyO09bu0uttcAIoecO/um/rKGQ4EltYWVYtyiGkS/3xMynrbVQdS69Jhlv8FXUEZehlzA==} + react-is@19.2.4: + resolution: {integrity: sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==} react-json-view-lite@2.5.0: resolution: {integrity: sha512-tk7o7QG9oYyELWHL8xiMQ8x4WzjCzbWNyig3uexmkLb54r8jO0yH3WCWx8UZS0c49eSA4QUmG5caiRJ8fAn58g==} @@ -19813,10 +19689,10 @@ packages: peerDependencies: react: '>= 0.14.0' - react-test-renderer@19.1.1: - resolution: {integrity: sha512-aGRXI+zcBTtg0diHofc7+Vy97nomBs9WHHFY1Csl3iV0x6xucjNYZZAkiVKGiNYUv23ecOex5jE67t8ZzqYObA==} + react-test-renderer@19.1.5: + resolution: {integrity: sha512-V+ZFUbqCiXshpb1JIqs/XLukYXvpvUGTy0syzKajbzAh1fMIAaz0x6d1I3kzCYGgBzr8FtFYnlllg1/6WimbZA==} peerDependencies: - react: ^19.1.1 + react: ^19.1.5 react-textarea-autosize@8.5.9: resolution: {integrity: sha512-U1DGlIQN5AwgjTyOEnI1oCcMuEr1pv1qOtklB2l4nyMGbHzWrI0eFsYK0zos2YWqAolJyG0IWJaqWmWj5ETh0A==} @@ -19967,6 +19843,9 @@ packages: redux@5.0.1: resolution: {integrity: sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==} + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} @@ -19994,10 +19873,6 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - regexpp@2.0.1: - resolution: {integrity: sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==} - engines: {node: '>=6.5.0'} - regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} @@ -20312,8 +20187,8 @@ packages: resolution: {integrity: sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==} hasBin: true - rollup@4.53.3: - resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} + rollup@4.57.1: + resolution: {integrity: sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -20336,6 +20211,10 @@ packages: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} + run-jxa@3.0.0: + resolution: {integrity: sha512-4f2CrY7H+sXkKXJn/cE6qRA3z+NMVO7zvlZ/nUV0e62yWftpiLAfw5eV9ZdomzWd2TXWwEIiGjAT57+lWIzzvA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -20348,10 +20227,6 @@ packages: rx-lite@4.0.8: resolution: {integrity: sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA==} - rxjs@6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} - rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} @@ -20442,16 +20317,17 @@ packages: webpack: optional: true - sass@1.94.2: - resolution: {integrity: sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==} + sass@1.97.3: + resolution: {integrity: sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==} engines: {node: '>=14.0.0'} hasBin: true sax@1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - sax@1.4.3: - resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==} + sax@1.4.4: + resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} + engines: {node: '>=11.0.0'} saxes@3.1.11: resolution: {integrity: sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==} @@ -20502,13 +20378,13 @@ packages: select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - selenium-webdriver@4.38.0: - resolution: {integrity: sha512-5/UXXFSQmn7FGQkbcpAqvfhzflUdMWtT7QqpEgkFD6Q6rDucxB5EUfzgjmr6JbUj30QodcW3mDXehzoeS/Vy5w==} + selenium-webdriver@4.40.0: + resolution: {integrity: sha512-dU0QbnVKdPmoNP8OtMCazRdtU2Ux6Wl4FEpG1iwUbDeajJK1dBAywBLrC1D7YFRtogHzN96AbXBgBAJaarcysw==} engines: {node: '>= 20.0.0'} - selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} + selfsigned@5.5.0: + resolution: {integrity: sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==} + engines: {node: '>=18'} semver-diff@2.1.0: resolution: {integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==} @@ -20531,16 +20407,12 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} + send@0.19.2: + resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} engines: {node: '>= 0.8.0'} - send@0.19.1: - resolution: {integrity: sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==} - engines: {node: '>= 0.8.0'} - - send@1.2.0: - resolution: {integrity: sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==} + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} engines: {node: '>= 18'} serialize-error@8.1.0: @@ -20566,16 +20438,16 @@ packages: serve-handler@6.1.6: resolution: {integrity: sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==} - serve-index@1.9.1: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} + serve-index@1.9.2: + resolution: {integrity: sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==} engines: {node: '>= 0.8.0'} - serve-static@1.16.2: - resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} + serve-static@1.16.3: + resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} engines: {node: '>= 0.8.0'} - serve-static@2.2.0: - resolution: {integrity: sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==} + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} serviceworker-cache-polyfill@4.0.0: @@ -20603,9 +20475,6 @@ packages: setimmediate@1.0.5: resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -20719,10 +20588,6 @@ packages: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} - slice-ansi@2.1.0: - resolution: {integrity: sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==} - engines: {node: '>=6'} - slice-ansi@4.0.0: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} @@ -20910,10 +20775,6 @@ packages: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - statuses@2.0.2: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} @@ -20933,8 +20794,8 @@ packages: store2@2.14.4: resolution: {integrity: sha512-srTItn1GOvyvOycgxjAnPA63FZNwy0PTyUBFMHRM+hVFltAeoh0LmNBz9SZqUS9mMqGk8rfyWyXn3GH5ReJ8Zw==} - storybook@8.6.14: - resolution: {integrity: sha512-sVKbCj/OTx67jhmauhxc2dcr1P+yOgz/x3h0krwjyMgdc5Oubvxyg4NYDZmzAw+ym36g/lzH8N0Ccp4dwtdfxw==} + storybook@8.6.15: + resolution: {integrity: sha512-Ob7DMlwWx8s7dMvcQ3xPc02TvUeralb+xX3oaPRk9wY9Hc6M1IBC/7cEoITkSmRS2v38DHubC+mtEKNc1u2gQg==} hasBin: true peerDependencies: prettier: ^2 || ^3 @@ -20989,10 +20850,6 @@ packages: resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} engines: {node: '>=4'} - string-width@3.1.0: - resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} - engines: {node: '>=6'} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -21005,8 +20862,8 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - string-width@8.1.0: - resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} + string-width@8.1.1: + resolution: {integrity: sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw==} engines: {node: '>=20'} string.fromcodepoint@0.2.1: @@ -21131,8 +20988,8 @@ packages: resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} engines: {node: '>=0.10.0'} - strnum@2.1.1: - resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + strnum@2.1.2: + resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} strtok3@7.1.1: resolution: {integrity: sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg==} @@ -21216,6 +21073,10 @@ packages: subarg@1.0.0: resolution: {integrity: sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==} + subsume@4.0.0: + resolution: {integrity: sha512-BWnYJElmHbYZ/zKevy+TG+SsyoFCmRPDHJbR1MzLxkPOv1Jp/4hGhVUtP98s+wZBsBsHwCXvPTP0x287/WMjGg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + sucrase@3.35.1: resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==} engines: {node: '>=16 || 14 >=14.17'} @@ -21322,8 +21183,8 @@ packages: resolution: {integrity: sha512-v/hu7KQQtospyDLpZxz7m5c7s90aj53YEkJ/A8x3mLPlSgIkZ6RKJkTjBG75P1p/fo5IeSA4TycyJg3VSu/aPw==} deprecated: 'Please migrate to Workbox: https://developers.google.com/web/tools/workbox/guides/migrations/migrate-from-sw' - swagger-client@3.36.0: - resolution: {integrity: sha512-9fkjxGHXuKy20jj8zwE6RwgFSOGKAyOD5U7aKgW/+/futtHZHOdZeqiEkb97sptk2rdBv7FEiUQDNlWZR186RA==} + swagger-client@3.36.1: + resolution: {integrity: sha512-bcYpeN4P3sOoKi22zsxIlL9lSgouBAmQmL5hH4g5yeOvyTUvq1+OFtGTs0l1C5Dkb0ZN+2vNgp0FBAFulmUklA==} swagger-ui-react@5.21.0: resolution: {integrity: sha512-lS5paITM1kkcBb/BTTSMHKelh8elHfcuUP4T3R3mO80tDR0AYJL2HR5UdQD6nV1LwdvekzRM8gKjJA6hVayi0A==} @@ -21337,8 +21198,8 @@ packages: react: '>=16.8.0 <19' react-dom: '>=16.8.0 <19' - swc-loader@0.2.6: - resolution: {integrity: sha512-9Zi9UP2YmDpgmQVbyOPJClY0dwf58JDyDMQ7uRc4krmc72twNI2fvlBWHLqVekBpPc7h5NJkGVT1zNDxFrqhvg==} + swc-loader@0.2.7: + resolution: {integrity: sha512-nwYWw3Fh9ame3Rtm7StS9SBLpHRRnYcK7bnpF3UKZmesAK0gw2/ADvlURFAINmPvKtDLzp+GBiP9yLoEjg6S9w==} peerDependencies: '@swc/core': ^1.2.147 webpack: '>=2' @@ -21353,8 +21214,8 @@ packages: synchronous-promise@2.0.17: resolution: {integrity: sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g==} - synckit@0.11.11: - resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==} + synckit@0.11.12: + resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} engines: {node: ^14.18.0 || >=16.0.0} system-architecture@0.1.0: @@ -21364,27 +21225,23 @@ packages: tabbable@5.3.3: resolution: {integrity: sha512-QD9qKY3StfbZqWOPLp0++pOrAVb/HbUi5xCc8cUo4XjP19808oaMiDzn0leBY5mCespIBM0CIZePzZjgzR83kA==} - tabbable@6.3.0: - resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} - - table@5.4.6: - resolution: {integrity: sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==} - engines: {node: '>=6.0.0'} + tabbable@6.4.0: + resolution: {integrity: sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==} table@6.9.0: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} - tailwind-merge@2.6.0: - resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} + tailwind-merge@2.6.1: + resolution: {integrity: sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==} - tailwindcss@3.4.18: - resolution: {integrity: sha512-6A2rnmW5xZMdw11LYjhcI5846rt9pbLSabY5XPxo+XWdxwZaFEn47Go4NzFiHu9sNNmr/kXivP1vStfvMaK1GQ==} + tailwindcss@3.4.19: + resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==} engines: {node: '>=14.0.0'} hasBin: true - tailwindcss@4.1.17: - resolution: {integrity: sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==} + tailwindcss@4.1.18: + resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} tapable@0.2.9: resolution: {integrity: sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==} @@ -21406,11 +21263,12 @@ packages: tar@2.2.2: resolution: {integrity: sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==} - deprecated: This version of tar is no longer supported, and will not receive security updates. Please upgrade asap. + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me targz@1.0.1: resolution: {integrity: sha512-6q4tP9U55mZnRuMTBqnqc3nwYQY3kv+QthCFZuMk+Tn1qYUnMPmL/JZ/mzgXINzFpSqfU+242IFmFU9VPvqaQw==} @@ -21454,8 +21312,8 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 - terser-webpack-plugin@5.3.14: - resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} + terser-webpack-plugin@5.3.16: + resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -21475,8 +21333,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - terser@5.44.1: - resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} + terser@5.46.0: + resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==} engines: {node: '>=10'} hasBin: true @@ -21539,10 +21397,6 @@ packages: resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} engines: {node: '>=0.10.0'} - timers-ext@0.1.8: - resolution: {integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==} - engines: {node: '>=0.12'} - timezone-support@3.1.0: resolution: {integrity: sha512-N04dOzxt7Bw3PZ5ts8ofkQx6RsqWDo8cUQ/a8fdtywB58NIctmdbUUDWZSrgtI7c2jzA6MZ1Z6jY6OtBvc+CUQ==} engines: {node: '>=14.8'} @@ -21661,9 +21515,6 @@ packages: tree-sitter: optional: true - tree-sitter@0.21.1: - resolution: {integrity: sha512-7dxoA6kYvtgWw80265MyqJlkRl4yawIjO7S5MigytjELkX43fV2WsAXzsNfO7sBpPPCF5Gp0+XzHk0DwLCq3xQ==} - tree-sitter@0.22.4: resolution: {integrity: sha512-usbHZP9/oxNsUY65MQUsduGRqDHQOou1cagUSwjhoSYAmSahjQDAVsh9s+SlZkn8X8+O1FULRGwHu7AFP3kjzg==} @@ -21709,14 +21560,8 @@ packages: ts-algebra@2.0.0: resolution: {integrity: sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw==} - ts-api-utils@1.4.3: - resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - - ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -21893,6 +21738,10 @@ packages: peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + tsyringe@4.10.0: + resolution: {integrity: sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==} + engines: {node: '>= 6.0.0'} + ttf2eot@2.0.0: resolution: {integrity: sha512-U56aG2Ylw7psLOmakjemAzmpqVgeadwENg9oaDjaZG5NYX4WB6+7h74bNPcc+0BXsoU5A/XWiHabDXyzFOmsxQ==} hasBin: true @@ -22041,8 +21890,8 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - ufo@1.6.1: - resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + ufo@1.6.3: + resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} uglify-es@3.3.9: resolution: {integrity: sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==} @@ -22079,8 +21928,8 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici@7.16.0: - resolution: {integrity: sha512-QEg3HPMll0o3t2ourKwOeUAZ159Kn9mx5pnzHRQO8+Wixmh88YdZRiIwat0iNzNNXn0yoEtXJqFpyW7eM8BV7g==} + undici@7.20.0: + resolution: {integrity: sha512-MJZrkjyd7DeC+uPZh+5/YaMDxFiiEEaDgbUSVMXayofAkDWF1088CDo+2RPg7B1BuS1qf1vgNE7xqwPxE0DuSQ==} engines: {node: '>=20.18.1'} unfetch@4.2.0: @@ -22157,6 +22006,10 @@ packages: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} + unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + unist-builder@2.0.3: resolution: {integrity: sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==} @@ -22208,8 +22061,8 @@ packages: unist-util-visit@4.1.2: resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.1.0: + resolution: {integrity: sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==} unit-compare@1.0.1: resolution: {integrity: sha512-AeLMQr8gcen2WOTwV0Gvi1nKKbY4Mms79MoltZ6hrZV/VANgE/YQly3jtWZJA/fa9m4ajhynq3XMqh5rOyZclA==} @@ -22262,8 +22115,8 @@ packages: resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} engines: {node: '>=4'} - update-browserslist-db@1.1.4: - resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -22417,9 +22270,6 @@ packages: v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - v8-compile-cache@2.4.0: - resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} - v8-to-istanbul@4.1.4: resolution: {integrity: sha512-Rw6vJHj1mbdK8edjR7+zuJrpDtKIgNdAvTSAcpYfgMIw+u2dPDntD3dgN4XQFLU2/fvFQdzj+EeSGfd/jnY5fQ==} engines: {node: 8.x.x || >=10.10.0} @@ -22650,8 +22500,8 @@ packages: resolution: {integrity: sha512-FAk18nzhYggg939xgRRLJjvqmAKZciO24wr8neoxNPl87w8J3m784wxL4zFBwME+0gNQ2Sv/vfsCrUxPxU2Dmg==} engines: {'0': node >=0.1.95} - watchpack@2.4.4: - resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} + watchpack@2.5.1: + resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} engines: {node: '>=10.13.0'} wbuf@1.7.3: @@ -22767,8 +22617,8 @@ packages: webpack: optional: true - webpack-dev-server@5.2.2: - resolution: {integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==} + webpack-dev-server@5.2.3: + resolution: {integrity: sha512-9Gyu2F7+bg4Vv+pjbovuYDhHX+mqdqITykfzdM9UyKqKHlsE5aAjRhR+oOEfXW5vBeu8tarzlJFIZva4ZjAdrQ==} engines: {node: '>= 18.12.0'} hasBin: true peerDependencies: @@ -22829,8 +22679,8 @@ packages: webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - webpack@5.103.0: - resolution: {integrity: sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw==} + webpack@5.104.1: + resolution: {integrity: sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -22849,14 +22699,17 @@ packages: whatwg-encoding@1.0.5: resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-encoding@2.0.0: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} engines: {node: '>=12'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-fetch@2.0.3: resolution: {integrity: sha512-SA2KdOXATOroD3EBUYvcdugsusXS5YiQFqwskSbsp5b1gK8HpNi/YP0jcy/BDpdllp305HMnrsVf9K7Be9GiEQ==} @@ -22910,8 +22763,8 @@ packages: which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} engines: {node: '>= 0.4'} which@1.3.1: @@ -23010,10 +22863,6 @@ packages: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - write@1.0.3: - resolution: {integrity: sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==} - engines: {node: '>=4'} - ws@5.2.4: resolution: {integrity: sha512-fFCejsuC8f9kOSu9FYaOw8CdO68O3h5v0lg4p74o8JqWpwTf9tniOD+nOB78aWoVSS6WptVUmDrp/KPsMVBWFQ==} @@ -23032,8 +22881,8 @@ packages: utf-8-validate: optional: true - ws@8.18.3: - resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -23210,8 +23059,8 @@ packages: zenscroll@4.0.2: resolution: {integrity: sha512-jEA1znR7b4C/NnaycInCU6h/d15ZzCd1jmsruqOKnZP6WXQSMH3W2GL+OXbkruslU4h+Tzuos0HdswzRUk/Vgg==} - zod-to-json-schema@3.25.0: - resolution: {integrity: sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==} + zod-to-json-schema@3.25.1: + resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} peerDependencies: zod: ^3.25 || ^4 @@ -23221,8 +23070,8 @@ packages: zod@4.1.11: resolution: {integrity: sha512-WPsqwxITS2tzx1bzhIKsEs19ABD5vmCVa4xBo2tq/SrV4RNZtfws1EnCWQXM6yh8bD08a1idvkB5MZSBiZsjwg==} - zustand@5.0.9: - resolution: {integrity: sha512-ALBtUj0AfjJt3uNRQoL1tL2tMvj6Gp/6e39dnfT6uzpelGru8v1tPOGBzayOWbPJvujM8JojDk3E1LxeFisBNg==} + zustand@5.0.11: + resolution: {integrity: sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg==} engines: {node: '>=12.20.0'} peerDependencies: '@types/react': '>=18.0.0' @@ -23249,57 +23098,61 @@ snapshots: '@adobe/css-tools@4.4.4': {} - '@ai-sdk/amazon-bedrock@3.0.65(zod@4.1.11)': + '@ai-sdk/amazon-bedrock@4.0.46(zod@4.1.11)': dependencies: - '@ai-sdk/anthropic': 2.0.53(zod@4.1.11) - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.18(zod@4.1.11) - '@smithy/eventstream-codec': 4.2.5 + '@ai-sdk/anthropic': 3.0.35(zod@4.1.11) + '@ai-sdk/provider': 3.0.7 + '@ai-sdk/provider-utils': 4.0.13(zod@4.1.11) + '@smithy/eventstream-codec': 4.2.8 '@smithy/util-utf8': 4.2.0 aws4fetch: 1.0.20 zod: 4.1.11 - '@ai-sdk/anthropic@2.0.53(zod@3.25.76)': + '@ai-sdk/anthropic@2.0.58(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.18(zod@3.25.76) + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) zod: 3.25.76 - '@ai-sdk/anthropic@2.0.53(zod@4.1.11)': + '@ai-sdk/anthropic@3.0.35(zod@4.1.11)': dependencies: - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.18(zod@4.1.11) + '@ai-sdk/provider': 3.0.7 + '@ai-sdk/provider-utils': 4.0.13(zod@4.1.11) zod: 4.1.11 - '@ai-sdk/gateway@2.0.18(zod@3.25.76)': + '@ai-sdk/gateway@2.0.30(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.18(zod@3.25.76) - '@vercel/oidc': 3.0.5 + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) + '@vercel/oidc': 3.1.0 zod: 3.25.76 - '@ai-sdk/gateway@2.0.18(zod@4.1.11)': + '@ai-sdk/gateway@3.0.32(zod@4.1.11)': dependencies: - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.18(zod@4.1.11) - '@vercel/oidc': 3.0.5 + '@ai-sdk/provider': 3.0.7 + '@ai-sdk/provider-utils': 4.0.13(zod@4.1.11) + '@vercel/oidc': 3.1.0 zod: 4.1.11 - '@ai-sdk/provider-utils@3.0.18(zod@3.25.76)': + '@ai-sdk/provider-utils@3.0.20(zod@3.25.76)': dependencies: - '@ai-sdk/provider': 2.0.0 - '@standard-schema/spec': 1.0.0 + '@ai-sdk/provider': 2.0.1 + '@standard-schema/spec': 1.1.0 eventsource-parser: 3.0.6 zod: 3.25.76 - '@ai-sdk/provider-utils@3.0.18(zod@4.1.11)': + '@ai-sdk/provider-utils@4.0.13(zod@4.1.11)': dependencies: - '@ai-sdk/provider': 2.0.0 - '@standard-schema/spec': 1.0.0 + '@ai-sdk/provider': 3.0.7 + '@standard-schema/spec': 1.1.0 eventsource-parser: 3.0.6 zod: 4.1.11 - '@ai-sdk/provider@2.0.0': + '@ai-sdk/provider@2.0.1': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/provider@3.0.7': dependencies: json-schema: 0.4.0 @@ -23329,21 +23182,21 @@ snapshots: '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.936.0 + '@aws-sdk/types': 3.973.1 tslib: 2.8.1 '@aws-crypto/crc32c@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.936.0 + '@aws-sdk/types': 3.973.1 tslib: 2.8.1 '@aws-crypto/sha1-browser@5.2.0': dependencies: '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.936.0 - '@aws-sdk/util-locate-window': 3.893.0 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-locate-window': 3.965.4 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 @@ -23352,15 +23205,15 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.936.0 - '@aws-sdk/util-locate-window': 3.893.0 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-locate-window': 3.965.4 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.936.0 + '@aws-sdk/types': 3.973.1 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -23369,441 +23222,447 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.936.0 + '@aws-sdk/types': 3.973.1 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-s3@3.943.0': + '@aws-sdk/client-s3@3.980.0': dependencies: '@aws-crypto/sha1-browser': 5.2.0 '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.943.0 - '@aws-sdk/credential-provider-node': 3.943.0 - '@aws-sdk/middleware-bucket-endpoint': 3.936.0 - '@aws-sdk/middleware-expect-continue': 3.936.0 - '@aws-sdk/middleware-flexible-checksums': 3.943.0 - '@aws-sdk/middleware-host-header': 3.936.0 - '@aws-sdk/middleware-location-constraint': 3.936.0 - '@aws-sdk/middleware-logger': 3.936.0 - '@aws-sdk/middleware-recursion-detection': 3.936.0 - '@aws-sdk/middleware-sdk-s3': 3.943.0 - '@aws-sdk/middleware-ssec': 3.936.0 - '@aws-sdk/middleware-user-agent': 3.943.0 - '@aws-sdk/region-config-resolver': 3.936.0 - '@aws-sdk/signature-v4-multi-region': 3.943.0 - '@aws-sdk/types': 3.936.0 - '@aws-sdk/util-endpoints': 3.936.0 - '@aws-sdk/util-user-agent-browser': 3.936.0 - '@aws-sdk/util-user-agent-node': 3.943.0 - '@smithy/config-resolver': 4.4.3 - '@smithy/core': 3.18.6 - '@smithy/eventstream-serde-browser': 4.2.5 - '@smithy/eventstream-serde-config-resolver': 4.3.5 - '@smithy/eventstream-serde-node': 4.2.5 - '@smithy/fetch-http-handler': 5.3.6 - '@smithy/hash-blob-browser': 4.2.6 - '@smithy/hash-node': 4.2.5 - '@smithy/hash-stream-node': 4.2.5 - '@smithy/invalid-dependency': 4.2.5 - '@smithy/md5-js': 4.2.5 - '@smithy/middleware-content-length': 4.2.5 - '@smithy/middleware-endpoint': 4.3.13 - '@smithy/middleware-retry': 4.4.13 - '@smithy/middleware-serde': 4.2.6 - '@smithy/middleware-stack': 4.2.5 - '@smithy/node-config-provider': 4.3.5 - '@smithy/node-http-handler': 4.4.5 - '@smithy/protocol-http': 5.3.5 - '@smithy/smithy-client': 4.9.9 - '@smithy/types': 4.9.0 - '@smithy/url-parser': 4.2.5 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/credential-provider-node': 3.972.4 + '@aws-sdk/middleware-bucket-endpoint': 3.972.3 + '@aws-sdk/middleware-expect-continue': 3.972.3 + '@aws-sdk/middleware-flexible-checksums': 3.972.3 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-location-constraint': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-sdk-s3': 3.972.5 + '@aws-sdk/middleware-ssec': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/signature-v4-multi-region': 3.980.0 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.980.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.3 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.22.0 + '@smithy/eventstream-serde-browser': 4.2.8 + '@smithy/eventstream-serde-config-resolver': 4.3.8 + '@smithy/eventstream-serde-node': 4.2.8 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-blob-browser': 4.2.9 + '@smithy/hash-node': 4.2.8 + '@smithy/hash-stream-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/md5-js': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-retry': 4.4.29 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.12 - '@smithy/util-defaults-mode-node': 4.2.15 - '@smithy/util-endpoints': 3.2.5 - '@smithy/util-middleware': 4.2.5 - '@smithy/util-retry': 4.2.5 - '@smithy/util-stream': 4.5.6 + '@smithy/util-defaults-mode-browser': 4.3.28 + '@smithy/util-defaults-mode-node': 4.2.31 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 + '@smithy/util-stream': 4.5.10 '@smithy/util-utf8': 4.2.0 - '@smithy/util-waiter': 4.2.5 + '@smithy/util-waiter': 4.2.8 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.943.0': + '@aws-sdk/client-sso@3.980.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.943.0 - '@aws-sdk/middleware-host-header': 3.936.0 - '@aws-sdk/middleware-logger': 3.936.0 - '@aws-sdk/middleware-recursion-detection': 3.936.0 - '@aws-sdk/middleware-user-agent': 3.943.0 - '@aws-sdk/region-config-resolver': 3.936.0 - '@aws-sdk/types': 3.936.0 - '@aws-sdk/util-endpoints': 3.936.0 - '@aws-sdk/util-user-agent-browser': 3.936.0 - '@aws-sdk/util-user-agent-node': 3.943.0 - '@smithy/config-resolver': 4.4.3 - '@smithy/core': 3.18.6 - '@smithy/fetch-http-handler': 5.3.6 - '@smithy/hash-node': 4.2.5 - '@smithy/invalid-dependency': 4.2.5 - '@smithy/middleware-content-length': 4.2.5 - '@smithy/middleware-endpoint': 4.3.13 - '@smithy/middleware-retry': 4.4.13 - '@smithy/middleware-serde': 4.2.6 - '@smithy/middleware-stack': 4.2.5 - '@smithy/node-config-provider': 4.3.5 - '@smithy/node-http-handler': 4.4.5 - '@smithy/protocol-http': 5.3.5 - '@smithy/smithy-client': 4.9.9 - '@smithy/types': 4.9.0 - '@smithy/url-parser': 4.2.5 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.980.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.3 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.22.0 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-retry': 4.4.29 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.12 - '@smithy/util-defaults-mode-node': 4.2.15 - '@smithy/util-endpoints': 3.2.5 - '@smithy/util-middleware': 4.2.5 - '@smithy/util-retry': 4.2.5 + '@smithy/util-defaults-mode-browser': 4.3.28 + '@smithy/util-defaults-mode-node': 4.2.31 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.943.0': - dependencies: - '@aws-sdk/types': 3.936.0 - '@aws-sdk/xml-builder': 3.930.0 - '@smithy/core': 3.18.6 - '@smithy/node-config-provider': 4.3.5 - '@smithy/property-provider': 4.2.5 - '@smithy/protocol-http': 5.3.5 - '@smithy/signature-v4': 5.3.5 - '@smithy/smithy-client': 4.9.9 - '@smithy/types': 4.9.0 + '@aws-sdk/core@3.973.5': + dependencies: + '@aws-sdk/types': 3.973.1 + '@aws-sdk/xml-builder': 3.972.2 + '@smithy/core': 3.22.0 + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 '@smithy/util-base64': 4.3.0 - '@smithy/util-middleware': 4.2.5 + '@smithy/util-middleware': 4.2.8 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.943.0': + '@aws-sdk/crc64-nvme@3.972.0': + dependencies: + '@smithy/types': 4.12.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.972.3': dependencies: - '@aws-sdk/core': 3.943.0 - '@aws-sdk/types': 3.936.0 - '@smithy/property-provider': 4.2.5 - '@smithy/types': 4.9.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.943.0': - dependencies: - '@aws-sdk/core': 3.943.0 - '@aws-sdk/types': 3.936.0 - '@smithy/fetch-http-handler': 5.3.6 - '@smithy/node-http-handler': 4.4.5 - '@smithy/property-provider': 4.2.5 - '@smithy/protocol-http': 5.3.5 - '@smithy/smithy-client': 4.9.9 - '@smithy/types': 4.9.0 - '@smithy/util-stream': 4.5.6 + '@aws-sdk/credential-provider-http@3.972.5': + dependencies: + '@aws-sdk/core': 3.973.5 + '@aws-sdk/types': 3.973.1 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/node-http-handler': 4.4.8 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/util-stream': 4.5.10 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.943.0': - dependencies: - '@aws-sdk/core': 3.943.0 - '@aws-sdk/credential-provider-env': 3.943.0 - '@aws-sdk/credential-provider-http': 3.943.0 - '@aws-sdk/credential-provider-login': 3.943.0 - '@aws-sdk/credential-provider-process': 3.943.0 - '@aws-sdk/credential-provider-sso': 3.943.0 - '@aws-sdk/credential-provider-web-identity': 3.943.0 - '@aws-sdk/nested-clients': 3.943.0 - '@aws-sdk/types': 3.936.0 - '@smithy/credential-provider-imds': 4.2.5 - '@smithy/property-provider': 4.2.5 - '@smithy/shared-ini-file-loader': 4.4.0 - '@smithy/types': 4.9.0 + '@aws-sdk/credential-provider-ini@3.972.3': + dependencies: + '@aws-sdk/core': 3.973.5 + '@aws-sdk/credential-provider-env': 3.972.3 + '@aws-sdk/credential-provider-http': 3.972.5 + '@aws-sdk/credential-provider-login': 3.972.3 + '@aws-sdk/credential-provider-process': 3.972.3 + '@aws-sdk/credential-provider-sso': 3.972.3 + '@aws-sdk/credential-provider-web-identity': 3.972.3 + '@aws-sdk/nested-clients': 3.980.0 + '@aws-sdk/types': 3.973.1 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-login@3.943.0': + '@aws-sdk/credential-provider-login@3.972.3': dependencies: - '@aws-sdk/core': 3.943.0 - '@aws-sdk/nested-clients': 3.943.0 - '@aws-sdk/types': 3.936.0 - '@smithy/property-provider': 4.2.5 - '@smithy/protocol-http': 5.3.5 - '@smithy/shared-ini-file-loader': 4.4.0 - '@smithy/types': 4.9.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/nested-clients': 3.980.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.943.0': - dependencies: - '@aws-sdk/credential-provider-env': 3.943.0 - '@aws-sdk/credential-provider-http': 3.943.0 - '@aws-sdk/credential-provider-ini': 3.943.0 - '@aws-sdk/credential-provider-process': 3.943.0 - '@aws-sdk/credential-provider-sso': 3.943.0 - '@aws-sdk/credential-provider-web-identity': 3.943.0 - '@aws-sdk/types': 3.936.0 - '@smithy/credential-provider-imds': 4.2.5 - '@smithy/property-provider': 4.2.5 - '@smithy/shared-ini-file-loader': 4.4.0 - '@smithy/types': 4.9.0 + '@aws-sdk/credential-provider-node@3.972.4': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.3 + '@aws-sdk/credential-provider-http': 3.972.5 + '@aws-sdk/credential-provider-ini': 3.972.3 + '@aws-sdk/credential-provider-process': 3.972.3 + '@aws-sdk/credential-provider-sso': 3.972.3 + '@aws-sdk/credential-provider-web-identity': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.943.0': + '@aws-sdk/credential-provider-process@3.972.3': dependencies: - '@aws-sdk/core': 3.943.0 - '@aws-sdk/types': 3.936.0 - '@smithy/property-provider': 4.2.5 - '@smithy/shared-ini-file-loader': 4.4.0 - '@smithy/types': 4.9.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.943.0': + '@aws-sdk/credential-provider-sso@3.972.3': dependencies: - '@aws-sdk/client-sso': 3.943.0 - '@aws-sdk/core': 3.943.0 - '@aws-sdk/token-providers': 3.943.0 - '@aws-sdk/types': 3.936.0 - '@smithy/property-provider': 4.2.5 - '@smithy/shared-ini-file-loader': 4.4.0 - '@smithy/types': 4.9.0 + '@aws-sdk/client-sso': 3.980.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/token-providers': 3.980.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.943.0': + '@aws-sdk/credential-provider-web-identity@3.972.3': dependencies: - '@aws-sdk/core': 3.943.0 - '@aws-sdk/nested-clients': 3.943.0 - '@aws-sdk/types': 3.936.0 - '@smithy/property-provider': 4.2.5 - '@smithy/shared-ini-file-loader': 4.4.0 - '@smithy/types': 4.9.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/nested-clients': 3.980.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/middleware-bucket-endpoint@3.936.0': + '@aws-sdk/middleware-bucket-endpoint@3.972.3': dependencies: - '@aws-sdk/types': 3.936.0 - '@aws-sdk/util-arn-parser': 3.893.0 - '@smithy/node-config-provider': 4.3.5 - '@smithy/protocol-http': 5.3.5 - '@smithy/types': 4.9.0 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-arn-parser': 3.972.2 + '@smithy/node-config-provider': 4.3.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 '@smithy/util-config-provider': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-expect-continue@3.936.0': + '@aws-sdk/middleware-expect-continue@3.972.3': dependencies: - '@aws-sdk/types': 3.936.0 - '@smithy/protocol-http': 5.3.5 - '@smithy/types': 4.9.0 + '@aws-sdk/types': 3.973.1 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-flexible-checksums@3.943.0': + '@aws-sdk/middleware-flexible-checksums@3.972.3': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/crc32c': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/core': 3.943.0 - '@aws-sdk/types': 3.936.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/crc64-nvme': 3.972.0 + '@aws-sdk/types': 3.973.1 '@smithy/is-array-buffer': 4.2.0 - '@smithy/node-config-provider': 4.3.5 - '@smithy/protocol-http': 5.3.5 - '@smithy/types': 4.9.0 - '@smithy/util-middleware': 4.2.5 - '@smithy/util-stream': 4.5.6 + '@smithy/node-config-provider': 4.3.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-stream': 4.5.10 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-host-header@3.936.0': + '@aws-sdk/middleware-host-header@3.972.3': dependencies: - '@aws-sdk/types': 3.936.0 - '@smithy/protocol-http': 5.3.5 - '@smithy/types': 4.9.0 + '@aws-sdk/types': 3.973.1 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-location-constraint@3.936.0': + '@aws-sdk/middleware-location-constraint@3.972.3': dependencies: - '@aws-sdk/types': 3.936.0 - '@smithy/types': 4.9.0 + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.936.0': + '@aws-sdk/middleware-logger@3.972.3': dependencies: - '@aws-sdk/types': 3.936.0 - '@smithy/types': 4.9.0 + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.936.0': + '@aws-sdk/middleware-recursion-detection@3.972.3': dependencies: - '@aws-sdk/types': 3.936.0 - '@aws/lambda-invoke-store': 0.2.1 - '@smithy/protocol-http': 5.3.5 - '@smithy/types': 4.9.0 + '@aws-sdk/types': 3.973.1 + '@aws/lambda-invoke-store': 0.2.3 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-sdk-s3@3.943.0': - dependencies: - '@aws-sdk/core': 3.943.0 - '@aws-sdk/types': 3.936.0 - '@aws-sdk/util-arn-parser': 3.893.0 - '@smithy/core': 3.18.6 - '@smithy/node-config-provider': 4.3.5 - '@smithy/protocol-http': 5.3.5 - '@smithy/signature-v4': 5.3.5 - '@smithy/smithy-client': 4.9.9 - '@smithy/types': 4.9.0 + '@aws-sdk/middleware-sdk-s3@3.972.5': + dependencies: + '@aws-sdk/core': 3.973.5 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-arn-parser': 3.972.2 + '@smithy/core': 3.22.0 + '@smithy/node-config-provider': 4.3.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 '@smithy/util-config-provider': 4.2.0 - '@smithy/util-middleware': 4.2.5 - '@smithy/util-stream': 4.5.6 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-stream': 4.5.10 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/middleware-ssec@3.936.0': + '@aws-sdk/middleware-ssec@3.972.3': dependencies: - '@aws-sdk/types': 3.936.0 - '@smithy/types': 4.9.0 + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.943.0': + '@aws-sdk/middleware-user-agent@3.972.5': dependencies: - '@aws-sdk/core': 3.943.0 - '@aws-sdk/types': 3.936.0 - '@aws-sdk/util-endpoints': 3.936.0 - '@smithy/core': 3.18.6 - '@smithy/protocol-http': 5.3.5 - '@smithy/types': 4.9.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.980.0 + '@smithy/core': 3.22.0 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.943.0': + '@aws-sdk/nested-clients@3.980.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.943.0 - '@aws-sdk/middleware-host-header': 3.936.0 - '@aws-sdk/middleware-logger': 3.936.0 - '@aws-sdk/middleware-recursion-detection': 3.936.0 - '@aws-sdk/middleware-user-agent': 3.943.0 - '@aws-sdk/region-config-resolver': 3.936.0 - '@aws-sdk/types': 3.936.0 - '@aws-sdk/util-endpoints': 3.936.0 - '@aws-sdk/util-user-agent-browser': 3.936.0 - '@aws-sdk/util-user-agent-node': 3.943.0 - '@smithy/config-resolver': 4.4.3 - '@smithy/core': 3.18.6 - '@smithy/fetch-http-handler': 5.3.6 - '@smithy/hash-node': 4.2.5 - '@smithy/invalid-dependency': 4.2.5 - '@smithy/middleware-content-length': 4.2.5 - '@smithy/middleware-endpoint': 4.3.13 - '@smithy/middleware-retry': 4.4.13 - '@smithy/middleware-serde': 4.2.6 - '@smithy/middleware-stack': 4.2.5 - '@smithy/node-config-provider': 4.3.5 - '@smithy/node-http-handler': 4.4.5 - '@smithy/protocol-http': 5.3.5 - '@smithy/smithy-client': 4.9.9 - '@smithy/types': 4.9.0 - '@smithy/url-parser': 4.2.5 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/middleware-host-header': 3.972.3 + '@aws-sdk/middleware-logger': 3.972.3 + '@aws-sdk/middleware-recursion-detection': 3.972.3 + '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/region-config-resolver': 3.972.3 + '@aws-sdk/types': 3.973.1 + '@aws-sdk/util-endpoints': 3.980.0 + '@aws-sdk/util-user-agent-browser': 3.972.3 + '@aws-sdk/util-user-agent-node': 3.972.3 + '@smithy/config-resolver': 4.4.6 + '@smithy/core': 3.22.0 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/hash-node': 4.2.8 + '@smithy/invalid-dependency': 4.2.8 + '@smithy/middleware-content-length': 4.2.8 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-retry': 4.4.29 + '@smithy/middleware-serde': 4.2.9 + '@smithy/middleware-stack': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/node-http-handler': 4.4.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.12 - '@smithy/util-defaults-mode-node': 4.2.15 - '@smithy/util-endpoints': 3.2.5 - '@smithy/util-middleware': 4.2.5 - '@smithy/util-retry': 4.2.5 + '@smithy/util-defaults-mode-browser': 4.3.28 + '@smithy/util-defaults-mode-node': 4.2.31 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.936.0': + '@aws-sdk/region-config-resolver@3.972.3': dependencies: - '@aws-sdk/types': 3.936.0 - '@smithy/config-resolver': 4.4.3 - '@smithy/node-config-provider': 4.3.5 - '@smithy/types': 4.9.0 + '@aws-sdk/types': 3.973.1 + '@smithy/config-resolver': 4.4.6 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/signature-v4-multi-region@3.943.0': + '@aws-sdk/signature-v4-multi-region@3.980.0': dependencies: - '@aws-sdk/middleware-sdk-s3': 3.943.0 - '@aws-sdk/types': 3.936.0 - '@smithy/protocol-http': 5.3.5 - '@smithy/signature-v4': 5.3.5 - '@smithy/types': 4.9.0 + '@aws-sdk/middleware-sdk-s3': 3.972.5 + '@aws-sdk/types': 3.973.1 + '@smithy/protocol-http': 5.3.8 + '@smithy/signature-v4': 5.3.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.943.0': + '@aws-sdk/token-providers@3.980.0': dependencies: - '@aws-sdk/core': 3.943.0 - '@aws-sdk/nested-clients': 3.943.0 - '@aws-sdk/types': 3.936.0 - '@smithy/property-provider': 4.2.5 - '@smithy/shared-ini-file-loader': 4.4.0 - '@smithy/types': 4.9.0 + '@aws-sdk/core': 3.973.5 + '@aws-sdk/nested-clients': 3.980.0 + '@aws-sdk/types': 3.973.1 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.936.0': + '@aws-sdk/types@3.973.1': dependencies: - '@smithy/types': 4.9.0 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/util-arn-parser@3.893.0': + '@aws-sdk/util-arn-parser@3.972.2': dependencies: tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.936.0': + '@aws-sdk/util-endpoints@3.980.0': dependencies: - '@aws-sdk/types': 3.936.0 - '@smithy/types': 4.9.0 - '@smithy/url-parser': 4.2.5 - '@smithy/util-endpoints': 3.2.5 + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-endpoints': 3.2.8 tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.893.0': + '@aws-sdk/util-locate-window@3.965.4': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.936.0': + '@aws-sdk/util-user-agent-browser@3.972.3': dependencies: - '@aws-sdk/types': 3.936.0 - '@smithy/types': 4.9.0 + '@aws-sdk/types': 3.973.1 + '@smithy/types': 4.12.0 bowser: 2.13.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.943.0': + '@aws-sdk/util-user-agent-node@3.972.3': dependencies: - '@aws-sdk/middleware-user-agent': 3.943.0 - '@aws-sdk/types': 3.936.0 - '@smithy/node-config-provider': 4.3.5 - '@smithy/types': 4.9.0 + '@aws-sdk/middleware-user-agent': 3.972.5 + '@aws-sdk/types': 3.973.1 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.930.0': + '@aws-sdk/xml-builder@3.972.2': dependencies: - '@smithy/types': 4.9.0 - fast-xml-parser: 5.2.5 + '@smithy/types': 4.12.0 + fast-xml-parser: 5.3.4 tslib: 2.8.1 - '@aws/lambda-invoke-store@0.2.1': {} + '@aws/lambda-invoke-store@0.2.3': {} '@azu/format-text@1.0.2': {} @@ -23868,8 +23727,8 @@ snapshots: '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 - '@azure/msal-browser': 4.26.2 - '@azure/msal-node': 3.8.3 + '@azure/msal-browser': 4.28.1 + '@azure/msal-node': 3.8.6 open: 10.2.0 tslib: 2.8.1 transitivePeerDependencies: @@ -23882,41 +23741,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/msal-browser@4.26.2': + '@azure/msal-browser@4.28.1': dependencies: - '@azure/msal-common': 15.13.2 + '@azure/msal-common': 15.14.1 - '@azure/msal-common@15.13.2': {} + '@azure/msal-common@15.14.1': {} - '@azure/msal-node@3.8.3': + '@azure/msal-node@3.8.6': dependencies: - '@azure/msal-common': 15.13.2 - jsonwebtoken: 9.0.2 + '@azure/msal-common': 15.14.1 + jsonwebtoken: 9.0.3 uuid: 8.3.2 - '@babel/code-frame@7.27.1': + '@babel/code-frame@7.29.0': dependencies: '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.28.5': {} + '@babel/compat-data@7.29.0': {} '@babel/core@7.12.9': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.12.9) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.0 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.12.9) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 convert-source-map: 1.9.0 debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 - lodash: 4.17.21 + lodash: 4.17.23 resolve: 1.22.11 semver: 5.7.2 source-map: 0.5.7 @@ -23926,15 +23785,15 @@ snapshots: '@babel/core@7.27.7': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.27.7) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.0 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.27.7) + '@babel/helpers': 7.28.6 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 convert-source-map: 2.0.0 debug: 4.4.3(supports-color@8.1.1) gensync: 1.0.0-beta.2 @@ -23943,35 +23802,35 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.28.5': + '@babel/generator@7.29.0': dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-annotate-as-pure@7.27.3': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 - '@babel/helper-compilation-targets@7.27.2': + '@babel/helper-compilation-targets@7.28.6': dependencies: - '@babel/compat-data': 7.28.5 + '@babel/compat-data': 7.29.0 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.0 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.27.7)': + '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.7) + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.27.7) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.29.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -23986,10 +23845,10 @@ snapshots: '@babel/helper-define-polyfill-provider@0.0.3(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 debug: 4.4.3(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.11 @@ -24000,10 +23859,10 @@ snapshots: '@babel/helper-define-polyfill-provider@0.1.5(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 debug: 4.4.3(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.11 @@ -24011,11 +23870,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.27.7)': + '@babel/helper-define-polyfill-provider@0.6.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 debug: 4.4.3(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.11 @@ -24026,66 +23885,66 @@ snapshots: '@babel/helper-member-expression-to-functions@7.28.5': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.27.1': + '@babel/helper-module-imports@7.28.6': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.12.9)': + '@babel/helper-module-transforms@7.28.6(@babel/core@7.12.9)': dependencies: '@babel/core': 7.12.9 - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.28.6 '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.27.7)': + '@babel/helper-module-transforms@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.28.6 '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 '@babel/helper-plugin-utils@7.10.4': {} - '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-plugin-utils@7.28.6': {} '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.28.3 - '@babel/traverse': 7.28.5 + '@babel/helper-wrap-function': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helper-replace-supers@7.27.1(@babel/core@7.27.7)': + '@babel/helper-replace-supers@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color '@babel/helper-skip-transparent-expression-wrappers@7.27.1': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -24095,84 +23954,84 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} - '@babel/helper-wrap-function@7.28.3': + '@babel/helper-wrap-function@7.28.6': dependencies: - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/template': 7.28.6 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/helpers@7.28.4': + '@babel/helpers@7.28.6': dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 - '@babel/parser@7.28.5': + '@babel/parser@7.29.0': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.27.7) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.27.7) transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.27.7)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-decorators@7.28.0(@babel/core@7.27.7)': + '@babel/plugin-proposal-decorators@7.29.0(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-decorators': 7.27.1(@babel/core@7.27.7) + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-decorators': 7.28.6(@babel/core@7.27.7) transitivePeerDependencies: - supports-color '@babel/plugin-proposal-export-default-from@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-proposal-nullish-coalescing-operator@7.18.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.27.7) '@babel/plugin-proposal-object-rest-spread@7.12.1(@babel/core@7.12.9)': @@ -24184,17 +24043,17 @@ snapshots: '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.27.7)': dependencies: - '@babel/compat-data': 7.28.5 + '@babel/compat-data': 7.29.0 '@babel/core': 7.27.7 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.27.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) '@babel/plugin-proposal-optional-chaining@7.21.0(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.27.7) transitivePeerDependencies: @@ -24203,8 +24062,8 @@ snapshots: '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -24216,8 +24075,8 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.27.7) transitivePeerDependencies: - supports-color @@ -24225,148 +24084,148 @@ snapshots: '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-decorators@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-syntax-decorators@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-flow@7.22.5(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-jsx@7.12.1(@babel/core@7.12.9)': dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.12.9)': dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.27.7)': + '@babel/plugin-transform-async-generator-functions@7.29.0(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.7) - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.27.7) transitivePeerDependencies: - supports-color @@ -24374,97 +24233,97 @@ snapshots: '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.27.7)': + '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.27.7)': + '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.28.4(@babel/core@7.27.7)': + '@babel/plugin-transform-classes@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.7) - '@babel/traverse': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.27.7) + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/template': 7.28.6 '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.27.7)': + '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color @@ -24472,115 +24331,115 @@ snapshots: '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-literals@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.27.7)': + '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.27.7)': + '@babel/plugin-transform-modules-systemjs@7.29.0(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-named-capturing-groups-regex@7.29.0(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.27.7)': + '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.27.7) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.27.7)': + '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color @@ -24588,55 +24447,55 @@ snapshots: '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.12.9)': dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-react-display-name@7.28.0(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-react-jsx-development@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.7) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-react-jsx@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.7) - '@babel/types': 7.28.5 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.27.7) + '@babel/types': 7.29.0 transitivePeerDependencies: - supports-color @@ -24644,33 +24503,33 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.27.7)': + '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-spread@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color @@ -24678,123 +24537,123 @@ snapshots: '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-typescript@7.28.5(@babel/core@7.27.7)': + '@babel/plugin-transform-typescript@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.27.7) + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.27.7) transitivePeerDependencies: - supports-color '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.27.7)': + '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.27.7) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/preset-env@7.27.2(@babel/core@7.27.7)': dependencies: - '@babel/compat-data': 7.28.5 + '@babel/compat-data': 7.29.0 '@babel/core': 7.27.7 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.27.7) '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.27.7) '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.27.7) '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.27.7) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.27.7) '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.27.7) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.27.7) '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.27.7) '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.27.7) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-async-generator-functions': 7.29.0(@babel/core@7.27.7) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.27.7) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.27.7) - '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.27.7) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.29.0(@babel/core@7.27.7) '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-exponentiation-operator': 7.28.5(@babel/core@7.27.7) + '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-logical-assignment-operators': 7.28.5(@babel/core@7.27.7) + '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.27.7) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-modules-systemjs': 7.29.0(@babel/core@7.27.7) '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.27.7) '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.27.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.27.7) + '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.27.7) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-regenerator': 7.29.0(@babel/core@7.27.7) + '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.27.7) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.27.7) - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.27.7) + babel-plugin-polyfill-corejs2: 0.4.15(@babel/core@7.27.7) babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.27.7) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.27.7) - core-js-compat: 3.47.0 + babel-plugin-polyfill-regenerator: 0.6.6(@babel/core@7.27.7) + core-js-compat: 3.48.0 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -24802,24 +24661,24 @@ snapshots: '@babel/preset-flow@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.27.7) '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/types': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/types': 7.29.0 esutils: 2.0.3 '@babel/preset-react@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 '@babel/plugin-transform-react-display-name': 7.28.0(@babel/core@7.27.7) - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-react-jsx-development': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-react-pure-annotations': 7.27.1(@babel/core@7.27.7) transitivePeerDependencies: @@ -24828,26 +24687,26 @@ snapshots: '@babel/preset-typescript@7.22.15(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.27.7) + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.27.7) transitivePeerDependencies: - supports-color '@babel/preset-typescript@7.27.1(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.27.7) + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.27.7) transitivePeerDependencies: - supports-color - '@babel/register@7.28.3(@babel/core@7.27.7)': + '@babel/register@7.28.6(@babel/core@7.27.7)': dependencies: '@babel/core': 7.27.7 clone-deep: 4.0.1 @@ -24856,31 +24715,31 @@ snapshots: pirates: 4.0.7 source-map-support: 0.5.21 - '@babel/runtime-corejs3@7.28.4': + '@babel/runtime-corejs3@7.29.0': dependencies: - core-js-pure: 3.47.0 + core-js-pure: 3.48.0 - '@babel/runtime@7.28.4': {} + '@babel/runtime@7.28.6': {} - '@babel/template@7.27.2': + '@babel/template@7.28.6': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 - '@babel/traverse@7.28.5': + '@babel/traverse@7.29.0': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.0 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.5 - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 debug: 4.4.3(supports-color@8.1.1) transitivePeerDependencies: - supports-color - '@babel/types@7.28.5': + '@babel/types@7.29.0': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 @@ -24928,17 +24787,17 @@ snapshots: '@biomejs/cli-win32-x64@1.9.4': optional: true - '@cacheable/memory@2.0.6': + '@cacheable/memory@2.0.7': dependencies: - '@cacheable/utils': 2.3.2 - '@keyv/bigmap': 1.3.0(keyv@5.5.4) - hookified: 1.13.0 - keyv: 5.5.4 + '@cacheable/utils': 2.3.3 + '@keyv/bigmap': 1.3.1(keyv@5.6.0) + hookified: 1.15.1 + keyv: 5.6.0 - '@cacheable/utils@2.3.2': + '@cacheable/utils@2.3.3': dependencies: - hashery: 1.3.0 - keyv: 5.5.4 + hashery: 1.4.0 + keyv: 5.6.0 '@cnakazawa/watch@1.0.4': dependencies: @@ -24948,45 +24807,45 @@ snapshots: '@codemirror/autocomplete@6.19.1': dependencies: '@codemirror/language': 6.11.3 - '@codemirror/state': 6.5.2 + '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 - '@codemirror/commands@6.10.0': + '@codemirror/commands@6.10.1': dependencies: '@codemirror/language': 6.11.3 - '@codemirror/state': 6.5.2 + '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@codemirror/lang-angular@0.1.4': dependencies: '@codemirror/lang-html': 6.4.11 '@codemirror/lang-javascript': 6.2.4 '@codemirror/language': 6.11.3 - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 '@codemirror/lang-cpp@6.0.3': dependencies: '@codemirror/language': 6.11.3 - '@lezer/cpp': 1.1.3 + '@lezer/cpp': 1.1.5 '@codemirror/lang-css@6.3.1': dependencies: '@codemirror/autocomplete': 6.19.1 '@codemirror/language': 6.11.3 - '@codemirror/state': 6.5.2 - '@lezer/common': 1.4.0 + '@codemirror/state': 6.5.4 + '@lezer/common': 1.5.0 '@lezer/css': 1.3.0 '@codemirror/lang-go@6.0.1': dependencies: '@codemirror/autocomplete': 6.19.1 '@codemirror/language': 6.11.3 - '@codemirror/state': 6.5.2 - '@lezer/common': 1.4.0 + '@codemirror/state': 6.5.4 + '@lezer/common': 1.5.0 '@lezer/go': 1.0.1 '@codemirror/lang-html@6.4.11': @@ -24995,11 +24854,11 @@ snapshots: '@codemirror/lang-css': 6.3.1 '@codemirror/lang-javascript': 6.2.4 '@codemirror/language': 6.11.3 - '@codemirror/state': 6.5.2 + '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/css': 1.3.0 - '@lezer/html': 1.3.12 + '@lezer/html': 1.3.13 '@codemirror/lang-java@6.0.2': dependencies: @@ -25011,18 +24870,18 @@ snapshots: '@codemirror/autocomplete': 6.19.1 '@codemirror/language': 6.11.3 '@codemirror/lint': 6.8.5 - '@codemirror/state': 6.5.2 + '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/javascript': 1.5.4 '@codemirror/lang-jinja@6.0.0': dependencies: '@codemirror/lang-html': 6.4.11 '@codemirror/language': 6.11.3 - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 '@codemirror/lang-json@6.0.2': dependencies: @@ -25033,45 +24892,45 @@ snapshots: dependencies: '@codemirror/lang-css': 6.3.1 '@codemirror/language': 6.11.3 - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 - '@codemirror/lang-liquid@6.3.0': + '@codemirror/lang-liquid@6.3.1': dependencies: '@codemirror/autocomplete': 6.19.1 '@codemirror/lang-html': 6.4.11 '@codemirror/language': 6.11.3 - '@codemirror/state': 6.5.2 + '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 '@codemirror/lang-markdown@6.5.0': dependencies: '@codemirror/autocomplete': 6.19.1 '@codemirror/lang-html': 6.4.11 '@codemirror/language': 6.11.3 - '@codemirror/state': 6.5.2 + '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 - '@lezer/common': 1.4.0 - '@lezer/markdown': 1.6.0 + '@lezer/common': 1.5.0 + '@lezer/markdown': 1.6.3 '@codemirror/lang-php@6.0.2': dependencies: '@codemirror/lang-html': 6.4.11 '@codemirror/language': 6.11.3 - '@codemirror/state': 6.5.2 - '@lezer/common': 1.4.0 + '@codemirror/state': 6.5.4 + '@lezer/common': 1.5.0 '@lezer/php': 1.0.5 '@codemirror/lang-python@6.2.1': dependencies: '@codemirror/autocomplete': 6.19.1 '@codemirror/language': 6.11.3 - '@codemirror/state': 6.5.2 - '@lezer/common': 1.4.0 + '@codemirror/state': 6.5.4 + '@lezer/common': 1.5.0 '@lezer/python': 1.1.18 '@codemirror/lang-rust@6.0.2': @@ -25083,53 +24942,53 @@ snapshots: dependencies: '@codemirror/lang-css': 6.3.1 '@codemirror/language': 6.11.3 - '@codemirror/state': 6.5.2 - '@lezer/common': 1.4.0 + '@codemirror/state': 6.5.4 + '@lezer/common': 1.5.0 '@lezer/sass': 1.1.0 '@codemirror/lang-sql@6.10.0': dependencies: '@codemirror/autocomplete': 6.19.1 '@codemirror/language': 6.11.3 - '@codemirror/state': 6.5.2 - '@lezer/common': 1.4.0 + '@codemirror/state': 6.5.4 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 '@codemirror/lang-vue@0.1.3': dependencies: '@codemirror/lang-html': 6.4.11 '@codemirror/lang-javascript': 6.2.4 '@codemirror/language': 6.11.3 - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 '@codemirror/lang-wast@6.0.2': dependencies: '@codemirror/language': 6.11.3 - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 '@codemirror/lang-xml@6.1.0': dependencies: '@codemirror/autocomplete': 6.19.1 '@codemirror/language': 6.11.3 - '@codemirror/state': 6.5.2 + '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/xml': 1.0.6 '@codemirror/lang-yaml@6.1.2': dependencies: '@codemirror/autocomplete': 6.19.1 '@codemirror/language': 6.11.3 - '@codemirror/state': 6.5.2 - '@lezer/common': 1.4.0 + '@codemirror/state': 6.5.4 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 - '@lezer/yaml': 1.0.3 + '@lezer/lr': 1.4.8 + '@lezer/yaml': 1.0.4 '@codemirror/language-data@6.5.2': dependencies: @@ -25143,7 +25002,7 @@ snapshots: '@codemirror/lang-jinja': 6.0.0 '@codemirror/lang-json': 6.0.2 '@codemirror/lang-less': 6.0.2 - '@codemirror/lang-liquid': 6.3.0 + '@codemirror/lang-liquid': 6.3.1 '@codemirror/lang-markdown': 6.5.0 '@codemirror/lang-php': 6.0.2 '@codemirror/lang-python': 6.2.1 @@ -25159,11 +25018,11 @@ snapshots: '@codemirror/language@6.11.3': dependencies: - '@codemirror/state': 6.5.2 + '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 style-mod: 4.1.3 '@codemirror/legacy-modes@6.5.2': @@ -25172,38 +25031,38 @@ snapshots: '@codemirror/lint@6.8.5': dependencies: - '@codemirror/state': 6.5.2 + '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 crelt: 1.0.6 '@codemirror/merge@6.11.2': dependencies: '@codemirror/language': 6.11.3 - '@codemirror/state': 6.5.2 + '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.3 style-mod: 4.1.3 - '@codemirror/search@6.5.11': + '@codemirror/search@6.6.0': dependencies: - '@codemirror/state': 6.5.2 + '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 crelt: 1.0.6 - '@codemirror/state@6.5.2': + '@codemirror/state@6.5.4': dependencies: '@marijn/find-cluster-break': 1.0.2 '@codemirror/theme-one-dark@6.1.3': dependencies: '@codemirror/language': 6.11.3 - '@codemirror/state': 6.5.2 + '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.3 '@codemirror/view@6.38.8': dependencies: - '@codemirror/state': 6.5.2 + '@codemirror/state': 6.5.4 crelt: 1.0.6 style-mod: 4.1.3 w3c-keyname: 2.2.8 @@ -25225,18 +25084,18 @@ snapshots: '@codesandbox/sandpack-react@2.20.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@codemirror/autocomplete': 6.19.1 - '@codemirror/commands': 6.10.0 + '@codemirror/commands': 6.10.1 '@codemirror/lang-css': 6.3.1 '@codemirror/lang-html': 6.4.11 '@codemirror/lang-javascript': 6.2.4 '@codemirror/language': 6.11.3 - '@codemirror/state': 6.5.2 + '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 '@codesandbox/sandpack-client': 2.19.8 '@lezer/highlight': 1.2.3 '@react-hook/intersection-observer': 3.1.2(react@18.2.0) '@stitches/core': 1.2.8 - anser: 2.3.3 + anser: 2.3.5 clean-set: 1.1.2 dequal: 2.0.3 escape-carriage: 1.3.1 @@ -25259,7 +25118,7 @@ snapshots: dependencies: '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.0.20': {} + '@csstools/css-syntax-patches-for-csstree@1.0.26': {} '@csstools/css-tokenizer@3.0.4': {} @@ -25292,13 +25151,13 @@ snapshots: '@dual-bundle/import-meta-resolve@4.2.1': {} - '@emnapi/core@1.7.1': + '@emnapi/core@1.8.1': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.7.1': + '@emnapi/runtime@1.8.1': dependencies: tslib: 2.8.1 optional: true @@ -25310,8 +25169,8 @@ snapshots: '@emotion/babel-plugin@11.13.5': dependencies: - '@babel/helper-module-imports': 7.27.1 - '@babel/runtime': 7.28.4 + '@babel/helper-module-imports': 7.28.6 + '@babel/runtime': 7.28.6 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 '@emotion/serialize': 1.3.3 @@ -25360,7 +25219,7 @@ snapshots: '@emotion/react@11.14.0(@types/react@17.0.90)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -25376,7 +25235,7 @@ snapshots: '@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -25392,7 +25251,7 @@ snapshots: '@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@emotion/babel-plugin': 11.13.5 '@emotion/cache': 11.14.0 '@emotion/serialize': 1.3.3 @@ -25418,7 +25277,7 @@ snapshots: '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@17.0.90)(react@19.1.0))(@types/react@17.0.90)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 '@emotion/react': 11.14.0(@types/react@17.0.90)(react@19.1.0) @@ -25433,7 +25292,7 @@ snapshots: '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 '@emotion/react': 11.14.0(@types/react@18.2.0)(react@18.2.0) @@ -25448,7 +25307,7 @@ snapshots: '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 '@emotion/react': 11.14.0(@types/react@18.2.0)(react@19.1.0) @@ -25463,7 +25322,7 @@ snapshots: '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@emotion/babel-plugin': 11.13.5 '@emotion/is-prop-valid': 1.4.0 '@emotion/react': 11.14.0(@types/react@18.2.0)(react@19.1.0) @@ -25568,24 +25427,14 @@ snapshots: '@esbuild/win32-x64@0.25.12': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@2.6.1))': dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/eslint-utils@4.9.0(eslint@9.26.0(jiti@2.6.1))': - dependencies: - eslint: 9.26.0(jiti@2.6.1) - eslint-visitor-keys: 3.4.3 - - '@eslint-community/eslint-utils@4.9.0(eslint@9.27.0(jiti@2.6.1))': - dependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.20.1': + '@eslint/config-array@0.21.1': dependencies: '@eslint/object-schema': 2.1.7 debug: 4.4.3(supports-color@8.1.1) @@ -25593,33 +25442,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.2.3': {} - - '@eslint/core@0.13.0': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/core@0.14.0': + '@eslint/config-helpers@0.4.2': dependencies: - '@types/json-schema': 7.0.15 + '@eslint/core': 0.17.0 '@eslint/core@0.15.2': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@2.1.4': + '@eslint/core@0.17.0': dependencies: - ajv: 6.12.6 - debug: 4.4.3(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + '@types/json-schema': 7.0.15 '@eslint/eslintrc@3.3.3': dependencies: @@ -25635,12 +25468,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} - - '@eslint/js@9.26.0': {} - '@eslint/js@9.27.0': {} + '@eslint/js@9.39.2': {} + '@eslint/object-schema@2.1.7': {} '@eslint/plugin-kit@0.3.5': @@ -25650,40 +25481,40 @@ snapshots: '@fal-works/esbuild-plugin-global-externals@2.1.2': {} - '@floating-ui/core@1.7.3': + '@floating-ui/core@1.7.4': dependencies: '@floating-ui/utils': 0.2.10 - '@floating-ui/dom@1.7.4': + '@floating-ui/dom@1.7.5': dependencies: - '@floating-ui/core': 1.7.3 + '@floating-ui/core': 1.7.4 '@floating-ui/utils': 0.2.10 - '@floating-ui/react-dom@2.1.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@floating-ui/react-dom@2.1.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@floating-ui/dom': 1.7.4 + '@floating-ui/dom': 1.7.5 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@floating-ui/react-dom@2.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@floating-ui/react-dom@2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/dom': 1.7.4 + '@floating-ui/dom': 1.7.5 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - '@floating-ui/react-dom@2.1.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@floating-ui/react-dom@2.1.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@floating-ui/dom': 1.7.4 + '@floating-ui/dom': 1.7.5 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) '@floating-ui/react@0.26.28(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@floating-ui/react-dom': 2.1.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@floating-ui/react-dom': 2.1.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@floating-ui/utils': 0.2.10 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - tabbable: 6.3.0 + tabbable: 6.4.0 '@floating-ui/utils@0.2.10': {} @@ -25783,14 +25614,14 @@ snapshots: '@headlessui/react@1.7.19(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@tanstack/react-virtual': 3.13.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tanstack/react-virtual': 3.13.18(react-dom@18.2.0(react@18.2.0))(react@18.2.0) client-only: 0.0.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) '@headlessui/react@1.7.19(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@tanstack/react-virtual': 3.13.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@tanstack/react-virtual': 3.13.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0) client-only: 0.0.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -25798,13 +25629,15 @@ snapshots: '@headlessui/react@2.2.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@floating-ui/react': 0.26.28(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-aria/focus': 3.21.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-aria/interactions': 3.25.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@tanstack/react-virtual': 3.13.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-aria/focus': 3.21.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-aria/interactions': 3.26.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@tanstack/react-virtual': 3.13.18(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) use-sync-external-store: 1.6.0(react@18.2.0) + '@hono/node-server@1.19.9': {} + '@hookform/resolvers@2.9.11(react-hook-form@7.56.4(react@18.2.0))': dependencies: react-hook-form: 7.56.4(react@18.2.0) @@ -25835,18 +25668,8 @@ snapshots: '@humanfs/core': 0.19.1 '@humanwhocodes/retry': 0.4.3 - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.3(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} - '@humanwhocodes/retry@0.4.3': {} '@iarna/toml@2.2.5': {} @@ -25938,7 +25761,7 @@ snapshots: - supports-color - utf-8-validate - '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3))': + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -25952,7 +25775,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -25973,7 +25796,7 @@ snapshots: - supports-color - ts-node - '@jest/core@30.2.0(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3))': + '@jest/core@30.2.0(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3))': dependencies: '@jest/console': 30.2.0 '@jest/pattern': 30.0.1 @@ -25984,11 +25807,11 @@ snapshots: '@types/node': 22.15.35 ansi-escapes: 4.3.2 chalk: 4.1.2 - ci-info: 4.3.1 + ci-info: 4.4.0 exit-x: 0.2.2 graceful-fs: 4.2.11 jest-changed-files: 30.2.0 - jest-config: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + jest-config: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-haste-map: 30.2.0 jest-message-util: 30.2.0 jest-regex-util: 30.0.1 @@ -26204,7 +26027,7 @@ snapshots: '@jest/schemas@30.0.5': dependencies: - '@sinclair/typebox': 0.34.41 + '@sinclair/typebox': 0.34.48 '@jest/snapshot-utils@30.2.0': dependencies: @@ -26394,12 +26217,12 @@ snapshots: '@types/yargs': 17.0.35 chalk: 4.1.2 - '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2))': + '@joshwooding/vite-plugin-react-docgen-typescript@0.5.0(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2))': dependencies: glob: 10.5.0 magic-string: 0.27.0 react-docgen-typescript: 2.4.0(typescript@5.8.3) - vite: 6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) optionalDependencies: typescript: 5.8.3 @@ -26433,14 +26256,82 @@ snapshots: dependencies: tslib: 2.8.1 + '@jsonjoy.com/base64@17.65.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)': dependencies: tslib: 2.8.1 + '@jsonjoy.com/buffers@17.65.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': dependencies: tslib: 2.8.1 + '@jsonjoy.com/codegen@17.65.0(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/fs-core@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-fsa@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-builtins@4.56.10(tslib@2.8.1)': + dependencies: + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-to-fsa@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node-utils@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-node@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1) + glob-to-regex.js: 1.2.0(tslib@2.8.1) + thingies: 2.5.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-print@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + + '@jsonjoy.com/fs-snapshot@4.56.10(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/json-pack': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) + tslib: 2.8.1 + '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': dependencies: '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) @@ -26453,25 +26344,48 @@ snapshots: tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 + '@jsonjoy.com/json-pack@17.65.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/base64': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/json-pointer': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) + hyperdyperid: 1.2.0 + thingies: 2.5.0(tslib@2.8.1) + tree-dump: 1.1.0(tslib@2.8.1) + tslib: 2.8.1 + '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': dependencies: '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) tslib: 2.8.1 + '@jsonjoy.com/json-pointer@17.65.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) + tslib: 2.8.1 + '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': dependencies: '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) tslib: 2.8.1 + '@jsonjoy.com/util@17.65.0(tslib@2.8.1)': + dependencies: + '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) + '@jsonjoy.com/codegen': 17.65.0(tslib@2.8.1) + tslib: 2.8.1 + '@juggle/resize-observer@3.4.0': {} - '@keyv/bigmap@1.3.0(keyv@5.5.4)': + '@keyv/bigmap@1.3.1(keyv@5.6.0)': dependencies: - hashery: 1.3.0 - hookified: 1.13.0 - keyv: 5.5.4 + hashery: 1.4.0 + hookified: 1.15.1 + keyv: 5.6.0 '@keyv/serialize@1.1.1': {} @@ -26621,98 +26535,98 @@ snapshots: '@lexical/offset': 0.17.1 lexical: 0.17.1 - '@lezer/common@1.4.0': {} + '@lezer/common@1.5.0': {} - '@lezer/cpp@1.1.3': + '@lezer/cpp@1.1.5': dependencies: - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 '@lezer/css@1.3.0': dependencies: - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 '@lezer/go@1.0.1': dependencies: - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 '@lezer/highlight@1.2.3': dependencies: - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 - '@lezer/html@1.3.12': + '@lezer/html@1.3.13': dependencies: - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 '@lezer/java@1.1.3': dependencies: - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 '@lezer/javascript@1.5.4': dependencies: - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 '@lezer/json@1.0.3': dependencies: - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 - '@lezer/lr@1.4.4': + '@lezer/lr@1.4.8': dependencies: - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 - '@lezer/markdown@1.6.0': + '@lezer/markdown@1.6.3': dependencies: - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 '@lezer/php@1.0.5': dependencies: - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 '@lezer/python@1.1.18': dependencies: - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 '@lezer/rust@1.0.2': dependencies: - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 '@lezer/sass@1.1.0': dependencies: - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 '@lezer/xml@1.0.6': dependencies: - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 - '@lezer/yaml@1.0.3': + '@lezer/yaml@1.0.4': dependencies: - '@lezer/common': 1.4.0 + '@lezer/common': 1.5.0 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.4 + '@lezer/lr': 1.4.8 '@marijn/find-cluster-break@1.0.2': {} @@ -26769,7 +26683,7 @@ snapshots: '@codemirror/lang-markdown': 6.5.0 '@codemirror/language-data': 6.5.2 '@codemirror/merge': 6.11.2 - '@codemirror/state': 6.5.2 + '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 '@codesandbox/sandpack-react': 2.20.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@lexical/clipboard': 0.17.1 @@ -26791,7 +26705,7 @@ snapshots: '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) classnames: 2.5.1 - cm6-theme-basic-light: 0.2.0(@codemirror/language@6.11.3)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.3) + cm6-theme-basic-light: 0.2.0(@codemirror/language@6.11.3)(@codemirror/state@6.5.4)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.3) codemirror: 6.0.2 downshift: 7.6.2(react@18.2.0) js-yaml: 4.1.1 @@ -26833,49 +26747,49 @@ snapshots: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@microsoft/1ds-core-js@4.3.10(tslib@2.8.1)': + '@microsoft/1ds-core-js@4.3.11(tslib@2.8.1)': dependencies: - '@microsoft/applicationinsights-core-js': 3.3.10(tslib@2.8.1) + '@microsoft/applicationinsights-core-js': 3.3.11(tslib@2.8.1) '@microsoft/applicationinsights-shims': 3.0.1 '@microsoft/dynamicproto-js': 2.0.3 - '@nevware21/ts-async': 0.5.4 + '@nevware21/ts-async': 0.5.5 '@nevware21/ts-utils': 0.12.5 transitivePeerDependencies: - tslib - '@microsoft/1ds-post-js@4.3.10(tslib@2.8.1)': + '@microsoft/1ds-post-js@4.3.11(tslib@2.8.1)': dependencies: - '@microsoft/1ds-core-js': 4.3.10(tslib@2.8.1) + '@microsoft/1ds-core-js': 4.3.11(tslib@2.8.1) '@microsoft/applicationinsights-shims': 3.0.1 '@microsoft/dynamicproto-js': 2.0.3 - '@nevware21/ts-async': 0.5.4 + '@nevware21/ts-async': 0.5.5 '@nevware21/ts-utils': 0.12.5 transitivePeerDependencies: - tslib - '@microsoft/applicationinsights-channel-js@3.3.10(tslib@2.8.1)': + '@microsoft/applicationinsights-channel-js@3.3.11(tslib@2.8.1)': dependencies: - '@microsoft/applicationinsights-common': 3.3.10(tslib@2.8.1) - '@microsoft/applicationinsights-core-js': 3.3.10(tslib@2.8.1) + '@microsoft/applicationinsights-common': 3.3.11(tslib@2.8.1) + '@microsoft/applicationinsights-core-js': 3.3.11(tslib@2.8.1) '@microsoft/applicationinsights-shims': 3.0.1 '@microsoft/dynamicproto-js': 2.0.3 - '@nevware21/ts-async': 0.5.4 + '@nevware21/ts-async': 0.5.5 '@nevware21/ts-utils': 0.12.5 tslib: 2.8.1 - '@microsoft/applicationinsights-common@3.3.10(tslib@2.8.1)': + '@microsoft/applicationinsights-common@3.3.11(tslib@2.8.1)': dependencies: - '@microsoft/applicationinsights-core-js': 3.3.10(tslib@2.8.1) + '@microsoft/applicationinsights-core-js': 3.3.11(tslib@2.8.1) '@microsoft/applicationinsights-shims': 3.0.1 '@microsoft/dynamicproto-js': 2.0.3 '@nevware21/ts-utils': 0.12.5 tslib: 2.8.1 - '@microsoft/applicationinsights-core-js@3.3.10(tslib@2.8.1)': + '@microsoft/applicationinsights-core-js@3.3.11(tslib@2.8.1)': dependencies: '@microsoft/applicationinsights-shims': 3.0.1 '@microsoft/dynamicproto-js': 2.0.3 - '@nevware21/ts-async': 0.5.4 + '@nevware21/ts-async': 0.5.5 '@nevware21/ts-utils': 0.12.5 tslib: 2.8.1 @@ -26883,14 +26797,14 @@ snapshots: dependencies: '@nevware21/ts-utils': 0.12.5 - '@microsoft/applicationinsights-web-basic@3.3.10(tslib@2.8.1)': + '@microsoft/applicationinsights-web-basic@3.3.11(tslib@2.8.1)': dependencies: - '@microsoft/applicationinsights-channel-js': 3.3.10(tslib@2.8.1) - '@microsoft/applicationinsights-common': 3.3.10(tslib@2.8.1) - '@microsoft/applicationinsights-core-js': 3.3.10(tslib@2.8.1) + '@microsoft/applicationinsights-channel-js': 3.3.11(tslib@2.8.1) + '@microsoft/applicationinsights-common': 3.3.11(tslib@2.8.1) + '@microsoft/applicationinsights-core-js': 3.3.11(tslib@2.8.1) '@microsoft/applicationinsights-shims': 3.0.1 '@microsoft/dynamicproto-js': 2.0.3 - '@nevware21/ts-async': 0.5.4 + '@nevware21/ts-async': 0.5.5 '@nevware21/ts-utils': 0.12.5 tslib: 2.8.1 @@ -26923,18 +26837,19 @@ snapshots: dependencies: exenv-es6: 1.1.1 - '@modelcontextprotocol/inspector-cli@0.17.2': + '@modelcontextprotocol/inspector-cli@0.17.5': dependencies: - '@modelcontextprotocol/sdk': 1.24.0 + '@modelcontextprotocol/sdk': 1.25.3 commander: 13.1.0 spawn-rx: 5.1.2 transitivePeerDependencies: - '@cfworker/json-schema' + - hono - supports-color - '@modelcontextprotocol/inspector-client@0.17.2(@types/react-dom@18.2.0)(@types/react@18.2.0)': + '@modelcontextprotocol/inspector-client@0.17.5(@types/react-dom@18.2.0)(@types/react@18.2.0)': dependencies: - '@modelcontextprotocol/sdk': 1.24.0 + '@modelcontextprotocol/sdk': 1.25.3 '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-dialog': 1.1.15(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-icons': 1.3.2(react@18.3.1) @@ -26957,41 +26872,43 @@ snapshots: react-dom: 18.3.1(react@18.3.1) react-simple-code-editor: 0.14.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) serve-handler: 6.1.6 - tailwind-merge: 2.6.0 + tailwind-merge: 2.6.1 zod: 3.25.76 transitivePeerDependencies: - '@cfworker/json-schema' - '@types/react' - '@types/react-dom' + - hono - supports-color - '@modelcontextprotocol/inspector-server@0.17.2': + '@modelcontextprotocol/inspector-server@0.17.5': dependencies: - '@modelcontextprotocol/sdk': 1.24.0 - cors: 2.8.5 + '@modelcontextprotocol/sdk': 1.25.3 + cors: 2.8.6 express: 5.2.1 shell-quote: 1.8.3 spawn-rx: 5.1.2 - ws: 8.18.3 + ws: 8.19.0 zod: 3.25.76 transitivePeerDependencies: - '@cfworker/json-schema' - bufferutil + - hono - supports-color - utf-8-validate - '@modelcontextprotocol/inspector@0.17.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(typescript@5.8.3)': + '@modelcontextprotocol/inspector@0.17.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(typescript@5.8.3)': dependencies: - '@modelcontextprotocol/inspector-cli': 0.17.2 - '@modelcontextprotocol/inspector-client': 0.17.2(@types/react-dom@18.2.0)(@types/react@18.2.0) - '@modelcontextprotocol/inspector-server': 0.17.2 - '@modelcontextprotocol/sdk': 1.24.0 + '@modelcontextprotocol/inspector-cli': 0.17.5 + '@modelcontextprotocol/inspector-client': 0.17.5(@types/react-dom@18.2.0)(@types/react@18.2.0) + '@modelcontextprotocol/inspector-server': 0.17.5 + '@modelcontextprotocol/sdk': 1.25.3 concurrently: 9.2.1 node-fetch: 3.3.2 open: 10.2.0 shell-quote: 1.8.3 spawn-rx: 5.1.2 - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.18)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.18)(typescript@5.8.3) zod: 3.25.76 transitivePeerDependencies: - '@cfworker/json-schema' @@ -27001,27 +26918,31 @@ snapshots: - '@types/react' - '@types/react-dom' - bufferutil + - hono - supports-color - typescript - utf-8-validate - '@modelcontextprotocol/sdk@1.24.0': + '@modelcontextprotocol/sdk@1.25.3': dependencies: + '@hono/node-server': 1.19.9 ajv: 8.17.1 ajv-formats: 3.0.1(ajv@8.17.1) content-type: 1.0.5 - cors: 2.8.5 + cors: 2.8.6 cross-spawn: 7.0.6 eventsource: 3.0.7 eventsource-parser: 3.0.6 express: 5.2.1 express-rate-limit: 7.5.1(express@5.2.1) jose: 6.1.3 + json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 raw-body: 3.0.2 zod: 3.25.76 - zod-to-json-schema: 3.25.0(zod@3.25.76) + zod-to-json-schema: 3.25.1(zod@3.25.76) transitivePeerDependencies: + - hono - supports-color '@monaco-editor/loader@1.7.0': @@ -27086,8 +27007,8 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.7.1 - '@emnapi/runtime': 1.7.1 + '@emnapi/core': 1.8.1 + '@emnapi/runtime': 1.8.1 '@tybys/wasm-util': 0.10.1 optional: true @@ -27101,12 +27022,14 @@ snapshots: - bare-buffer - react-native-b4a - '@nevware21/ts-async@0.5.4': + '@nevware21/ts-async@0.5.5': dependencies: '@nevware21/ts-utils': 0.12.5 '@nevware21/ts-utils@0.12.5': {} + '@noble/hashes@1.4.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -27119,7 +27042,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + fastq: 1.20.1 '@npmcli/fs@1.1.1': dependencies: @@ -27162,67 +27085,157 @@ snapshots: '@opentelemetry/api@1.9.0': {} - '@parcel/watcher-android-arm64@2.5.1': + '@parcel/watcher-android-arm64@2.5.6': optional: true - '@parcel/watcher-darwin-arm64@2.5.1': + '@parcel/watcher-darwin-arm64@2.5.6': optional: true - '@parcel/watcher-darwin-x64@2.5.1': + '@parcel/watcher-darwin-x64@2.5.6': optional: true - '@parcel/watcher-freebsd-x64@2.5.1': + '@parcel/watcher-freebsd-x64@2.5.6': optional: true - '@parcel/watcher-linux-arm-glibc@2.5.1': + '@parcel/watcher-linux-arm-glibc@2.5.6': optional: true - '@parcel/watcher-linux-arm-musl@2.5.1': + '@parcel/watcher-linux-arm-musl@2.5.6': optional: true - '@parcel/watcher-linux-arm64-glibc@2.5.1': + '@parcel/watcher-linux-arm64-glibc@2.5.6': optional: true - '@parcel/watcher-linux-arm64-musl@2.5.1': + '@parcel/watcher-linux-arm64-musl@2.5.6': optional: true - '@parcel/watcher-linux-x64-glibc@2.5.1': + '@parcel/watcher-linux-x64-glibc@2.5.6': optional: true - '@parcel/watcher-linux-x64-musl@2.5.1': + '@parcel/watcher-linux-x64-musl@2.5.6': optional: true - '@parcel/watcher-win32-arm64@2.5.1': + '@parcel/watcher-win32-arm64@2.5.6': optional: true - '@parcel/watcher-win32-ia32@2.5.1': + '@parcel/watcher-win32-ia32@2.5.6': optional: true - '@parcel/watcher-win32-x64@2.5.1': + '@parcel/watcher-win32-x64@2.5.6': optional: true - '@parcel/watcher@2.5.1': + '@parcel/watcher@2.5.6': dependencies: - detect-libc: 1.0.3 + detect-libc: 2.1.2 is-glob: 4.0.3 - micromatch: 4.0.8 node-addon-api: 7.1.1 + picomatch: 4.0.3 optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.1 - '@parcel/watcher-darwin-arm64': 2.5.1 - '@parcel/watcher-darwin-x64': 2.5.1 - '@parcel/watcher-freebsd-x64': 2.5.1 - '@parcel/watcher-linux-arm-glibc': 2.5.1 - '@parcel/watcher-linux-arm-musl': 2.5.1 - '@parcel/watcher-linux-arm64-glibc': 2.5.1 - '@parcel/watcher-linux-arm64-musl': 2.5.1 - '@parcel/watcher-linux-x64-glibc': 2.5.1 - '@parcel/watcher-linux-x64-musl': 2.5.1 - '@parcel/watcher-win32-arm64': 2.5.1 - '@parcel/watcher-win32-ia32': 2.5.1 - '@parcel/watcher-win32-x64': 2.5.1 + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 optional: true + '@peculiar/asn1-cms@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509-attr': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-csr@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-ecc@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-pfx@2.6.0': + dependencies: + '@peculiar/asn1-cms': 2.6.0 + '@peculiar/asn1-pkcs8': 2.6.0 + '@peculiar/asn1-rsa': 2.6.0 + '@peculiar/asn1-schema': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-pkcs8@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-pkcs9@2.6.0': + dependencies: + '@peculiar/asn1-cms': 2.6.0 + '@peculiar/asn1-pfx': 2.6.0 + '@peculiar/asn1-pkcs8': 2.6.0 + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + '@peculiar/asn1-x509-attr': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-rsa@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-schema@2.6.0': + dependencies: + asn1js: 3.0.7 + pvtsutils: 1.3.6 + tslib: 2.8.1 + + '@peculiar/asn1-x509-attr@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + asn1js: 3.0.7 + tslib: 2.8.1 + + '@peculiar/asn1-x509@2.6.0': + dependencies: + '@peculiar/asn1-schema': 2.6.0 + asn1js: 3.0.7 + pvtsutils: 1.3.6 + tslib: 2.8.1 + + '@peculiar/x509@1.14.3': + dependencies: + '@peculiar/asn1-cms': 2.6.0 + '@peculiar/asn1-csr': 2.6.0 + '@peculiar/asn1-ecc': 2.6.0 + '@peculiar/asn1-pkcs9': 2.6.0 + '@peculiar/asn1-rsa': 2.6.0 + '@peculiar/asn1-schema': 2.6.0 + '@peculiar/asn1-x509': 2.6.0 + pvtsutils: 1.3.6 + reflect-metadata: 0.2.2 + tslib: 2.8.1 + tsyringe: 4.10.0 + '@pkgjs/parseargs@0.11.0': optional: true @@ -27232,123 +27245,123 @@ snapshots: dependencies: playwright: 1.55.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.103.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': dependencies: ansi-html: 0.0.9 - core-js-pure: 3.47.0 + core-js-pure: 3.48.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 loader-utils: 2.0.4 react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: - '@types/webpack': 5.28.5(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + '@types/webpack': 5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) type-fest: 4.41.0 - webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.103.0) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.3(@swc/helpers@0.5.17)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))))(webpack-hot-middleware@2.26.1)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)))': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: ansi-html: 0.0.9 - core-js-pure: 3.47.0 + core-js-pure: 3.48.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 loader-utils: 2.0.4 react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: - '@types/webpack': 5.28.5(@swc/core@1.15.3(@swc/helpers@0.5.17)) + '@types/webpack': 5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)) type-fest: 4.41.0 - webpack-dev-server: 5.2.2(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + webpack-dev-server: 5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.103.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': dependencies: ansi-html: 0.0.9 - core-js-pure: 3.47.0 + core-js-pure: 3.48.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 loader-utils: 2.0.4 react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.103.0(webpack-cli@4.10.0) + webpack: 5.104.1(webpack-cli@4.10.0) optionalDependencies: '@types/webpack': 5.28.5(webpack-cli@4.10.0) type-fest: 4.41.0 - webpack-dev-server: 5.2.2(webpack-cli@4.10.0)(webpack@5.103.0) + webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.104.1) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.103.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': dependencies: ansi-html: 0.0.9 - core-js-pure: 3.47.0 + core-js-pure: 3.48.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 loader-utils: 2.0.4 react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: '@types/webpack': 5.28.5(webpack-cli@5.1.4) type-fest: 4.41.0 - webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.103.0) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.103.0))(webpack-hot-middleware@2.26.1)(webpack@5.103.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': dependencies: ansi-html: 0.0.9 - core-js-pure: 3.47.0 + core-js-pure: 3.48.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 loader-utils: 2.0.4 react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: '@types/webpack': 5.28.5 type-fest: 4.41.0 - webpack-dev-server: 5.2.2(webpack@5.103.0) + webpack-dev-server: 5.2.3(webpack@5.104.1) webpack-hot-middleware: 2.26.1 - '@pmmmwh/react-refresh-webpack-plugin@0.6.2(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.103.0)': + '@pmmmwh/react-refresh-webpack-plugin@0.6.2(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1)': dependencies: - anser: 2.3.3 - core-js-pure: 3.47.0 + anser: 2.3.5 + core-js-pure: 3.48.0 error-stack-parser: 2.1.4 html-entities: 2.6.0 react-refresh: 0.11.0 schema-utils: 4.3.3 source-map: 0.7.6 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: '@types/webpack': 5.28.5(webpack-cli@5.1.4) type-fest: 4.41.0 - webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.103.0) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) webpack-hot-middleware: 2.26.1 '@projectstorm/geometry@6.7.4': {} '@projectstorm/geometry@7.0.3': dependencies: - lodash: 4.17.21 + lodash: 4.17.23 - '@projectstorm/react-canvas-core@6.7.4(lodash@4.17.21)(react@18.2.0)': + '@projectstorm/react-canvas-core@6.7.4(lodash@4.17.23)(react@18.2.0)': dependencies: '@projectstorm/geometry': 6.7.4 - lodash: 4.17.21 + lodash: 4.17.23 react: 18.2.0 - '@projectstorm/react-canvas-core@6.7.4(lodash@4.17.21)(react@19.1.0)': + '@projectstorm/react-canvas-core@6.7.4(lodash@4.17.23)(react@19.1.0)': dependencies: '@projectstorm/geometry': 6.7.4 - lodash: 4.17.21 + lodash: 4.17.23 react: 19.1.0 '@projectstorm/react-canvas-core@7.0.3(@types/react@18.2.0)': @@ -27356,25 +27369,25 @@ snapshots: '@emotion/react': 11.14.0(@types/react@18.2.0)(react@18.2.0) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) '@projectstorm/geometry': 7.0.3 - lodash: 4.17.21 + lodash: 4.17.23 react: 18.2.0 transitivePeerDependencies: - '@types/react' - supports-color - '@projectstorm/react-diagrams-core@6.7.4(lodash@4.17.21)(react@18.2.0)(resize-observer-polyfill@1.5.1)': + '@projectstorm/react-diagrams-core@6.7.4(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1)': dependencies: '@projectstorm/geometry': 6.7.4 - '@projectstorm/react-canvas-core': 6.7.4(lodash@4.17.21)(react@18.2.0) - lodash: 4.17.21 + '@projectstorm/react-canvas-core': 6.7.4(lodash@4.17.23)(react@18.2.0) + lodash: 4.17.23 react: 18.2.0 resize-observer-polyfill: 1.5.1 - '@projectstorm/react-diagrams-core@6.7.4(lodash@4.17.21)(react@19.1.0)(resize-observer-polyfill@1.5.1)': + '@projectstorm/react-diagrams-core@6.7.4(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1)': dependencies: '@projectstorm/geometry': 6.7.4 - '@projectstorm/react-canvas-core': 6.7.4(lodash@4.17.21)(react@19.1.0) - lodash: 4.17.21 + '@projectstorm/react-canvas-core': 6.7.4(lodash@4.17.23)(react@19.1.0) + lodash: 4.17.23 react: 19.1.0 resize-observer-polyfill: 1.5.1 @@ -27383,7 +27396,7 @@ snapshots: '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) '@projectstorm/geometry': 7.0.3 '@projectstorm/react-canvas-core': 7.0.3(@types/react@18.2.0) - lodash: 4.17.21 + lodash: 4.17.23 react: 18.2.0 resize-observer-polyfill: 1.5.1 transitivePeerDependencies: @@ -27396,7 +27409,7 @@ snapshots: '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@18.2.0) '@projectstorm/geometry': 7.0.3 '@projectstorm/react-canvas-core': 7.0.3(@types/react@18.2.0) - lodash: 4.17.21 + lodash: 4.17.23 react: 18.2.0 resize-observer-polyfill: 1.5.1 transitivePeerDependencies: @@ -27404,22 +27417,22 @@ snapshots: - '@types/react' - supports-color - '@projectstorm/react-diagrams-defaults@6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(lodash@4.17.21)(react@18.2.0)(resize-observer-polyfill@1.5.1)': + '@projectstorm/react-diagrams-defaults@6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1)': dependencies: '@emotion/react': 11.14.0(@types/react@18.2.0)(react@18.2.0) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0) - '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.21)(react@18.2.0)(resize-observer-polyfill@1.5.1) - lodash: 4.17.21 + '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) + lodash: 4.17.23 react: 18.2.0 transitivePeerDependencies: - resize-observer-polyfill - '@projectstorm/react-diagrams-defaults@6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(lodash@4.17.21)(react@19.1.0)(resize-observer-polyfill@1.5.1)': + '@projectstorm/react-diagrams-defaults@6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1)': dependencies: '@emotion/react': 11.14.0(@types/react@18.2.0)(react@19.1.0) '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0) - '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.21)(react@19.1.0)(resize-observer-polyfill@1.5.1) - lodash: 4.17.21 + '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1) + lodash: 4.17.23 react: 19.1.0 transitivePeerDependencies: - resize-observer-polyfill @@ -27431,19 +27444,19 @@ snapshots: '@projectstorm/geometry': 7.0.3 '@projectstorm/react-canvas-core': 7.0.3(@types/react@18.2.0) '@projectstorm/react-diagrams-core': 7.0.3(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) - lodash: 4.17.21 + lodash: 4.17.23 react: 18.2.0 transitivePeerDependencies: - '@types/react' - supports-color - '@projectstorm/react-diagrams-routing@6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.21)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1)': + '@projectstorm/react-diagrams-routing@6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1)': dependencies: '@projectstorm/geometry': 6.7.4 - '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.21)(react@18.2.0)(resize-observer-polyfill@1.5.1) - '@projectstorm/react-diagrams-defaults': 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(lodash@4.17.21)(react@18.2.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-defaults': 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) dagre: 0.8.5 - lodash: 4.17.21 + lodash: 4.17.23 pathfinding: 0.4.18 paths-js: 0.4.11 react: 18.2.0 @@ -27452,13 +27465,13 @@ snapshots: - '@emotion/styled' - resize-observer-polyfill - '@projectstorm/react-diagrams-routing@6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(dagre@0.8.5)(lodash@4.17.21)(pathfinding@0.4.18)(paths-js@0.4.11)(react@19.1.0)(resize-observer-polyfill@1.5.1)': + '@projectstorm/react-diagrams-routing@6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@19.1.0)(resize-observer-polyfill@1.5.1)': dependencies: '@projectstorm/geometry': 6.7.4 - '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.21)(react@19.1.0)(resize-observer-polyfill@1.5.1) - '@projectstorm/react-diagrams-defaults': 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(lodash@4.17.21)(react@19.1.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-defaults': 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1) dagre: 0.8.5 - lodash: 4.17.21 + lodash: 4.17.23 pathfinding: 0.4.18 paths-js: 0.4.11 react: 19.1.0 @@ -27474,7 +27487,7 @@ snapshots: '@projectstorm/react-diagrams-core': 7.0.3(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0) '@projectstorm/react-diagrams-defaults': 7.1.3(@types/react@18.2.0) dagre: 0.8.5 - lodash: 4.17.21 + lodash: 4.17.23 pathfinding: 0.4.18 paths-js: 0.4.11 react: 18.2.0 @@ -27483,11 +27496,11 @@ snapshots: - '@types/react' - supports-color - '@projectstorm/react-diagrams@6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.21)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1)': + '@projectstorm/react-diagrams@6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1)': dependencies: - '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.21)(react@18.2.0)(resize-observer-polyfill@1.5.1) - '@projectstorm/react-diagrams-defaults': 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(lodash@4.17.21)(react@18.2.0)(resize-observer-polyfill@1.5.1) - '@projectstorm/react-diagrams-routing': 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.21)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-defaults': 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(lodash@4.17.23)(react@18.2.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-routing': 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@18.2.0))(@types/react@18.2.0)(react@18.2.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@18.2.0)(resize-observer-polyfill@1.5.1) transitivePeerDependencies: - '@emotion/react' - '@emotion/styled' @@ -27498,11 +27511,11 @@ snapshots: - react - resize-observer-polyfill - '@projectstorm/react-diagrams@6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(dagre@0.8.5)(lodash@4.17.21)(pathfinding@0.4.18)(paths-js@0.4.11)(react@19.1.0)(resize-observer-polyfill@1.5.1)': + '@projectstorm/react-diagrams@6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@19.1.0)(resize-observer-polyfill@1.5.1)': dependencies: - '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.21)(react@19.1.0)(resize-observer-polyfill@1.5.1) - '@projectstorm/react-diagrams-defaults': 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(lodash@4.17.21)(react@19.1.0)(resize-observer-polyfill@1.5.1) - '@projectstorm/react-diagrams-routing': 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(dagre@0.8.5)(lodash@4.17.21)(pathfinding@0.4.18)(paths-js@0.4.11)(react@19.1.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-core': 6.7.4(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-defaults': 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(lodash@4.17.23)(react@19.1.0)(resize-observer-polyfill@1.5.1) + '@projectstorm/react-diagrams-routing': 6.7.4(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.2.0)(react@19.1.0))(@types/react@18.2.0)(react@19.1.0))(dagre@0.8.5)(lodash@4.17.23)(pathfinding@0.4.18)(paths-js@0.4.11)(react@19.1.0)(resize-observer-polyfill@1.5.1) transitivePeerDependencies: - '@emotion/react' - '@emotion/styled' @@ -27551,19 +27564,19 @@ snapshots: '@radix-ui/number@1.0.1': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/number@1.1.1': {} '@radix-ui/primitive@1.0.1': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/primitive@1.1.3': {} '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -27573,7 +27586,7 @@ snapshots: '@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -27617,7 +27630,7 @@ snapshots: '@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -27630,7 +27643,7 @@ snapshots: '@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@19.1.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.0)(react@19.1.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -27679,14 +27692,14 @@ snapshots: '@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 react: 18.2.0 optionalDependencies: '@types/react': 18.2.0 '@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -27711,14 +27724,14 @@ snapshots: '@radix-ui/react-context@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 react: 18.2.0 optionalDependencies: '@types/react': 18.2.0 '@radix-ui/react-context@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -27787,14 +27800,14 @@ snapshots: '@radix-ui/react-direction@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 react: 18.2.0 optionalDependencies: '@types/react': 18.2.0 '@radix-ui/react-direction@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -27819,7 +27832,7 @@ snapshots: '@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -27833,7 +27846,7 @@ snapshots: '@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@19.1.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -27888,14 +27901,14 @@ snapshots: '@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 react: 18.2.0 optionalDependencies: '@types/react': 18.2.0 '@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -27914,7 +27927,7 @@ snapshots: '@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.0)(react@18.2.0) @@ -27926,7 +27939,7 @@ snapshots: '@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@19.1.0) '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.0)(react@19.1.0) @@ -27968,7 +27981,7 @@ snapshots: '@radix-ui/react-id@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.0)(react@18.2.0) react: 18.2.0 optionalDependencies: @@ -27976,7 +27989,7 @@ snapshots: '@radix-ui/react-id@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 optionalDependencies: @@ -28086,8 +28099,8 @@ snapshots: '@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 - '@floating-ui/react-dom': 2.1.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@babel/runtime': 7.28.6 + '@floating-ui/react-dom': 2.1.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.0)(react@18.2.0) @@ -28105,8 +28118,8 @@ snapshots: '@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 - '@floating-ui/react-dom': 2.1.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@babel/runtime': 7.28.6 + '@floating-ui/react-dom': 2.1.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@19.1.0) '@radix-ui/react-context': 1.0.1(@types/react@18.2.0)(react@19.1.0) @@ -28124,7 +28137,7 @@ snapshots: '@radix-ui/react-popper@1.2.8(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@floating-ui/react-dom': 2.1.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@floating-ui/react-dom': 2.1.7(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-arrow': 1.1.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.2.0) '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.2.0) @@ -28142,7 +28155,7 @@ snapshots: '@radix-ui/react-popper@1.2.8(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@floating-ui/react-dom': 2.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/react-dom': 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-arrow': 1.1.7(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.2.0)(react@18.3.1) '@radix-ui/react-context': 1.1.2(@types/react@18.2.0)(react@18.3.1) @@ -28160,7 +28173,7 @@ snapshots: '@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -28170,7 +28183,7 @@ snapshots: '@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -28220,7 +28233,7 @@ snapshots: '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -28230,7 +28243,7 @@ snapshots: '@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-slot': 1.0.2(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -28336,7 +28349,7 @@ snapshots: '@radix-ui/react-select@1.2.2(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -28366,7 +28379,7 @@ snapshots: '@radix-ui/react-select@1.2.2(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -28472,7 +28485,7 @@ snapshots: '@radix-ui/react-slot@1.0.2(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@18.2.0) react: 18.2.0 optionalDependencies: @@ -28480,7 +28493,7 @@ snapshots: '@radix-ui/react-slot@1.0.2(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 optionalDependencies: @@ -28696,14 +28709,14 @@ snapshots: '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 react: 18.2.0 optionalDependencies: '@types/react': 18.2.0 '@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -28728,7 +28741,7 @@ snapshots: '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.0)(react@18.2.0) react: 18.2.0 optionalDependencies: @@ -28736,7 +28749,7 @@ snapshots: '@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 optionalDependencies: @@ -28789,7 +28802,7 @@ snapshots: '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.0)(react@18.2.0) react: 18.2.0 optionalDependencies: @@ -28797,7 +28810,7 @@ snapshots: '@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 optionalDependencies: @@ -28819,14 +28832,14 @@ snapshots: '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 react: 18.2.0 optionalDependencies: '@types/react': 18.2.0 '@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -28851,14 +28864,14 @@ snapshots: '@radix-ui/react-use-previous@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 react: 18.2.0 optionalDependencies: '@types/react': 18.2.0 '@radix-ui/react-use-previous@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 react: 19.1.0 optionalDependencies: '@types/react': 18.2.0 @@ -28877,7 +28890,7 @@ snapshots: '@radix-ui/react-use-rect@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/rect': 1.0.1 react: 18.2.0 optionalDependencies: @@ -28885,7 +28898,7 @@ snapshots: '@radix-ui/react-use-rect@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/rect': 1.0.1 react: 19.1.0 optionalDependencies: @@ -28907,7 +28920,7 @@ snapshots: '@radix-ui/react-use-size@1.0.1(@types/react@18.2.0)(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.0)(react@18.2.0) react: 18.2.0 optionalDependencies: @@ -28915,7 +28928,7 @@ snapshots: '@radix-ui/react-use-size@1.0.1(@types/react@18.2.0)(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.0)(react@19.1.0) react: 19.1.0 optionalDependencies: @@ -28937,7 +28950,7 @@ snapshots: '@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -28947,7 +28960,7 @@ snapshots: '@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -28984,42 +28997,42 @@ snapshots: '@radix-ui/rect@1.0.1': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@radix-ui/rect@1.1.1': {} - '@react-aria/focus@3.21.2(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@react-aria/focus@3.21.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@react-aria/interactions': 3.25.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-aria/utils': 3.31.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-aria/interactions': 3.26.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-aria/utils': 3.32.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@react-types/shared': 3.32.1(react@18.2.0) - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.18 clsx: 2.1.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@react-aria/interactions@3.25.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@react-aria/interactions@3.26.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@react-aria/ssr': 3.9.10(react@18.2.0) - '@react-aria/utils': 3.31.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-aria/utils': 3.32.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@react-stately/flags': 3.1.2 '@react-types/shared': 3.32.1(react@18.2.0) - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) '@react-aria/ssr@3.9.10(react@18.2.0)': dependencies: - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.18 react: 18.2.0 - '@react-aria/utils@3.31.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@react-aria/utils@3.32.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@react-aria/ssr': 3.9.10(react@18.2.0) '@react-stately/flags': 3.1.2 - '@react-stately/utils': 3.10.8(react@18.2.0) + '@react-stately/utils': 3.11.0(react@18.2.0) '@react-types/shared': 3.32.1(react@18.2.0) - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.18 clsx: 2.1.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -29042,36 +29055,36 @@ snapshots: '@react-stately/flags@3.1.2': dependencies: - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.18 - '@react-stately/utils@3.10.8(react@18.2.0)': + '@react-stately/utils@3.11.0(react@18.2.0)': dependencies: - '@swc/helpers': 0.5.17 + '@swc/helpers': 0.5.18 react: 18.2.0 '@react-types/shared@3.32.1(react@18.2.0)': dependencies: react: 18.2.0 - '@redhat-developer/locators@1.17.0(@redhat-developer/page-objects@1.17.0(selenium-webdriver@4.38.0)(typescript@5.8.3))(selenium-webdriver@4.38.0)': + '@redhat-developer/locators@1.18.1(@redhat-developer/page-objects@1.18.1(selenium-webdriver@4.40.0)(typescript@5.8.3))(selenium-webdriver@4.40.0)': dependencies: - '@redhat-developer/page-objects': 1.17.0(selenium-webdriver@4.38.0)(typescript@5.8.3) - selenium-webdriver: 4.38.0 + '@redhat-developer/page-objects': 1.18.1(selenium-webdriver@4.40.0)(typescript@5.8.3) + selenium-webdriver: 4.40.0 - '@redhat-developer/page-objects@1.17.0(selenium-webdriver@4.38.0)(typescript@5.8.3)': + '@redhat-developer/page-objects@1.18.1(selenium-webdriver@4.40.0)(typescript@5.8.3)': dependencies: - clipboardy: 5.0.1 + clipboardy: 5.2.0 clone-deep: 4.0.1 compare-versions: 6.1.1 - fs-extra: 11.3.2 - selenium-webdriver: 4.38.0 + fs-extra: 11.3.3 + selenium-webdriver: 4.40.0 type-fest: 4.41.0 typescript: 5.8.3 '@rollup/plugin-babel@5.3.1(@babel/core@7.27.7)(@types/babel__core@7.20.5)(rollup@1.32.1)': dependencies: '@babel/core': 7.27.7 - '@babel/helper-module-imports': 7.27.1 + '@babel/helper-module-imports': 7.28.6 '@rollup/pluginutils': 3.1.0(rollup@1.32.1) rollup: 1.32.1 optionalDependencies: @@ -29090,9 +29103,9 @@ snapshots: resolve: 1.22.11 rollup: 1.32.1 - '@rollup/plugin-commonjs@28.0.9(rollup@4.53.3)': + '@rollup/plugin-commonjs@28.0.9(rollup@4.57.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.53.3) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.5.0(picomatch@4.0.3) @@ -29100,28 +29113,28 @@ snapshots: magic-string: 0.30.21 picomatch: 4.0.3 optionalDependencies: - rollup: 4.53.3 + rollup: 4.57.1 '@rollup/plugin-json@4.1.0(rollup@1.32.1)': dependencies: '@rollup/pluginutils': 3.1.0(rollup@1.32.1) rollup: 1.32.1 - '@rollup/plugin-json@6.1.0(rollup@4.53.3)': + '@rollup/plugin-json@6.1.0(rollup@4.57.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.53.3) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) optionalDependencies: - rollup: 4.53.3 + rollup: 4.57.1 - '@rollup/plugin-node-resolve@16.0.3(rollup@4.53.3)': + '@rollup/plugin-node-resolve@16.0.3(rollup@4.57.1)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.53.3) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.11 optionalDependencies: - rollup: 4.53.3 + rollup: 4.57.1 '@rollup/plugin-node-resolve@9.0.0(rollup@1.32.1)': dependencies: @@ -29151,78 +29164,87 @@ snapshots: estree-walker: 2.0.2 picomatch: 2.3.1 - '@rollup/pluginutils@5.3.0(rollup@4.53.3)': + '@rollup/pluginutils@5.3.0(rollup@4.57.1)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.53.3 + rollup: 4.57.1 + + '@rollup/rollup-android-arm-eabi@4.57.1': + optional: true + + '@rollup/rollup-android-arm64@4.57.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.57.1': + optional: true - '@rollup/rollup-android-arm-eabi@4.53.3': + '@rollup/rollup-darwin-x64@4.57.1': optional: true - '@rollup/rollup-android-arm64@4.53.3': + '@rollup/rollup-freebsd-arm64@4.57.1': optional: true - '@rollup/rollup-darwin-arm64@4.53.3': + '@rollup/rollup-freebsd-x64@4.57.1': optional: true - '@rollup/rollup-darwin-x64@4.53.3': + '@rollup/rollup-linux-arm-gnueabihf@4.57.1': optional: true - '@rollup/rollup-freebsd-arm64@4.53.3': + '@rollup/rollup-linux-arm-musleabihf@4.57.1': optional: true - '@rollup/rollup-freebsd-x64@4.53.3': + '@rollup/rollup-linux-arm64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + '@rollup/rollup-linux-arm64-musl@4.57.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.3': + '@rollup/rollup-linux-loong64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.3': + '@rollup/rollup-linux-loong64-musl@4.57.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.53.3': + '@rollup/rollup-linux-ppc64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.3': + '@rollup/rollup-linux-ppc64-musl@4.57.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.3': + '@rollup/rollup-linux-riscv64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.3': + '@rollup/rollup-linux-riscv64-musl@4.57.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.3': + '@rollup/rollup-linux-s390x-gnu@4.57.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.3': + '@rollup/rollup-linux-x64-gnu@4.57.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.53.3': + '@rollup/rollup-linux-x64-musl@4.57.1': optional: true - '@rollup/rollup-linux-x64-musl@4.53.3': + '@rollup/rollup-openbsd-x64@4.57.1': optional: true - '@rollup/rollup-openharmony-arm64@4.53.3': + '@rollup/rollup-openharmony-arm64@4.57.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.3': + '@rollup/rollup-win32-arm64-msvc@4.57.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.3': + '@rollup/rollup-win32-ia32-msvc@4.57.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.53.3': + '@rollup/rollup-win32-x64-gnu@4.57.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.53.3': + '@rollup/rollup-win32-x64-msvc@4.57.1': optional: true '@rtsao/scc@1.1.0': {} @@ -29259,9 +29281,9 @@ snapshots: dependencies: '@secretlint/resolver': 10.2.2 '@secretlint/types': 10.2.2 - '@textlint/linter-formatter': 15.4.0 - '@textlint/module-interop': 15.4.0 - '@textlint/types': 15.4.0 + '@textlint/linter-formatter': 15.5.1 + '@textlint/module-interop': 15.5.1 + '@textlint/types': 15.5.1 chalk: 5.6.2 debug: 4.4.3(supports-color@8.1.1) pluralize: 8.0.0 @@ -29290,7 +29312,7 @@ snapshots: '@secretlint/secretlint-formatter-sarif@10.2.2': dependencies: - node-sarif-builder: 3.3.1 + node-sarif-builder: 3.4.0 '@secretlint/secretlint-rule-no-dotenv@10.2.2': dependencies: @@ -29335,11 +29357,11 @@ snapshots: '@sinclair/typebox@0.27.8': {} - '@sinclair/typebox@0.34.41': {} + '@sinclair/typebox@0.34.48': {} '@sindresorhus/is@5.6.0': {} - '@sindresorhus/is@7.1.1': {} + '@sindresorhus/is@7.2.0': {} '@sindresorhus/merge-streams@2.3.0': {} @@ -29377,9 +29399,9 @@ snapshots: '@size-limit/file': 11.2.0(size-limit@11.2.0) size-limit: 11.2.0 - '@smithy/abort-controller@4.2.5': + '@smithy/abort-controller@4.2.8': dependencies: - '@smithy/types': 4.9.0 + '@smithy/types': 4.12.0 tslib: 2.8.1 '@smithy/chunked-blob-reader-native@4.2.1': @@ -29391,97 +29413,97 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/config-resolver@4.4.3': + '@smithy/config-resolver@4.4.6': dependencies: - '@smithy/node-config-provider': 4.3.5 - '@smithy/types': 4.9.0 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 '@smithy/util-config-provider': 4.2.0 - '@smithy/util-endpoints': 3.2.5 - '@smithy/util-middleware': 4.2.5 + '@smithy/util-endpoints': 3.2.8 + '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/core@3.18.6': + '@smithy/core@3.22.0': dependencies: - '@smithy/middleware-serde': 4.2.6 - '@smithy/protocol-http': 5.3.5 - '@smithy/types': 4.9.0 + '@smithy/middleware-serde': 4.2.9 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 - '@smithy/util-middleware': 4.2.5 - '@smithy/util-stream': 4.5.6 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-stream': 4.5.10 '@smithy/util-utf8': 4.2.0 '@smithy/uuid': 1.1.0 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.2.5': + '@smithy/credential-provider-imds@4.2.8': dependencies: - '@smithy/node-config-provider': 4.3.5 - '@smithy/property-provider': 4.2.5 - '@smithy/types': 4.9.0 - '@smithy/url-parser': 4.2.5 + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 tslib: 2.8.1 - '@smithy/eventstream-codec@4.2.5': + '@smithy/eventstream-codec@4.2.8': dependencies: '@aws-crypto/crc32': 5.2.0 - '@smithy/types': 4.9.0 + '@smithy/types': 4.12.0 '@smithy/util-hex-encoding': 4.2.0 tslib: 2.8.1 - '@smithy/eventstream-serde-browser@4.2.5': + '@smithy/eventstream-serde-browser@4.2.8': dependencies: - '@smithy/eventstream-serde-universal': 4.2.5 - '@smithy/types': 4.9.0 + '@smithy/eventstream-serde-universal': 4.2.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/eventstream-serde-config-resolver@4.3.5': + '@smithy/eventstream-serde-config-resolver@4.3.8': dependencies: - '@smithy/types': 4.9.0 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/eventstream-serde-node@4.2.5': + '@smithy/eventstream-serde-node@4.2.8': dependencies: - '@smithy/eventstream-serde-universal': 4.2.5 - '@smithy/types': 4.9.0 + '@smithy/eventstream-serde-universal': 4.2.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/eventstream-serde-universal@4.2.5': + '@smithy/eventstream-serde-universal@4.2.8': dependencies: - '@smithy/eventstream-codec': 4.2.5 - '@smithy/types': 4.9.0 + '@smithy/eventstream-codec': 4.2.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.3.6': + '@smithy/fetch-http-handler@5.3.9': dependencies: - '@smithy/protocol-http': 5.3.5 - '@smithy/querystring-builder': 4.2.5 - '@smithy/types': 4.9.0 + '@smithy/protocol-http': 5.3.8 + '@smithy/querystring-builder': 4.2.8 + '@smithy/types': 4.12.0 '@smithy/util-base64': 4.3.0 tslib: 2.8.1 - '@smithy/hash-blob-browser@4.2.6': + '@smithy/hash-blob-browser@4.2.9': dependencies: '@smithy/chunked-blob-reader': 5.2.0 '@smithy/chunked-blob-reader-native': 4.2.1 - '@smithy/types': 4.9.0 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/hash-node@4.2.5': + '@smithy/hash-node@4.2.8': dependencies: - '@smithy/types': 4.9.0 + '@smithy/types': 4.12.0 '@smithy/util-buffer-from': 4.2.0 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/hash-stream-node@4.2.5': + '@smithy/hash-stream-node@4.2.8': dependencies: - '@smithy/types': 4.9.0 + '@smithy/types': 4.12.0 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/invalid-dependency@4.2.5': + '@smithy/invalid-dependency@4.2.8': dependencies: - '@smithy/types': 4.9.0 + '@smithy/types': 4.12.0 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': @@ -29492,126 +29514,126 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/md5-js@4.2.5': + '@smithy/md5-js@4.2.8': dependencies: - '@smithy/types': 4.9.0 + '@smithy/types': 4.12.0 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/middleware-content-length@4.2.5': + '@smithy/middleware-content-length@4.2.8': dependencies: - '@smithy/protocol-http': 5.3.5 - '@smithy/types': 4.9.0 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.3.13': + '@smithy/middleware-endpoint@4.4.12': dependencies: - '@smithy/core': 3.18.6 - '@smithy/middleware-serde': 4.2.6 - '@smithy/node-config-provider': 4.3.5 - '@smithy/shared-ini-file-loader': 4.4.0 - '@smithy/types': 4.9.0 - '@smithy/url-parser': 4.2.5 - '@smithy/util-middleware': 4.2.5 + '@smithy/core': 3.22.0 + '@smithy/middleware-serde': 4.2.9 + '@smithy/node-config-provider': 4.3.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 + '@smithy/url-parser': 4.2.8 + '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.13': + '@smithy/middleware-retry@4.4.29': dependencies: - '@smithy/node-config-provider': 4.3.5 - '@smithy/protocol-http': 5.3.5 - '@smithy/service-error-classification': 4.2.5 - '@smithy/smithy-client': 4.9.9 - '@smithy/types': 4.9.0 - '@smithy/util-middleware': 4.2.5 - '@smithy/util-retry': 4.2.5 + '@smithy/node-config-provider': 4.3.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/service-error-classification': 4.2.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 + '@smithy/util-middleware': 4.2.8 + '@smithy/util-retry': 4.2.8 '@smithy/uuid': 1.1.0 tslib: 2.8.1 - '@smithy/middleware-serde@4.2.6': + '@smithy/middleware-serde@4.2.9': dependencies: - '@smithy/protocol-http': 5.3.5 - '@smithy/types': 4.9.0 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/middleware-stack@4.2.5': + '@smithy/middleware-stack@4.2.8': dependencies: - '@smithy/types': 4.9.0 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/node-config-provider@4.3.5': + '@smithy/node-config-provider@4.3.8': dependencies: - '@smithy/property-provider': 4.2.5 - '@smithy/shared-ini-file-loader': 4.4.0 - '@smithy/types': 4.9.0 + '@smithy/property-provider': 4.2.8 + '@smithy/shared-ini-file-loader': 4.4.3 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/node-http-handler@4.4.5': + '@smithy/node-http-handler@4.4.8': dependencies: - '@smithy/abort-controller': 4.2.5 - '@smithy/protocol-http': 5.3.5 - '@smithy/querystring-builder': 4.2.5 - '@smithy/types': 4.9.0 + '@smithy/abort-controller': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/querystring-builder': 4.2.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/property-provider@4.2.5': + '@smithy/property-provider@4.2.8': dependencies: - '@smithy/types': 4.9.0 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/protocol-http@5.3.5': + '@smithy/protocol-http@5.3.8': dependencies: - '@smithy/types': 4.9.0 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/querystring-builder@4.2.5': + '@smithy/querystring-builder@4.2.8': dependencies: - '@smithy/types': 4.9.0 + '@smithy/types': 4.12.0 '@smithy/util-uri-escape': 4.2.0 tslib: 2.8.1 - '@smithy/querystring-parser@4.2.5': + '@smithy/querystring-parser@4.2.8': dependencies: - '@smithy/types': 4.9.0 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/service-error-classification@4.2.5': + '@smithy/service-error-classification@4.2.8': dependencies: - '@smithy/types': 4.9.0 + '@smithy/types': 4.12.0 - '@smithy/shared-ini-file-loader@4.4.0': + '@smithy/shared-ini-file-loader@4.4.3': dependencies: - '@smithy/types': 4.9.0 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/signature-v4@5.3.5': + '@smithy/signature-v4@5.3.8': dependencies: '@smithy/is-array-buffer': 4.2.0 - '@smithy/protocol-http': 5.3.5 - '@smithy/types': 4.9.0 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 '@smithy/util-hex-encoding': 4.2.0 - '@smithy/util-middleware': 4.2.5 + '@smithy/util-middleware': 4.2.8 '@smithy/util-uri-escape': 4.2.0 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/smithy-client@4.9.9': + '@smithy/smithy-client@4.11.1': dependencies: - '@smithy/core': 3.18.6 - '@smithy/middleware-endpoint': 4.3.13 - '@smithy/middleware-stack': 4.2.5 - '@smithy/protocol-http': 5.3.5 - '@smithy/types': 4.9.0 - '@smithy/util-stream': 4.5.6 + '@smithy/core': 3.22.0 + '@smithy/middleware-endpoint': 4.4.12 + '@smithy/middleware-stack': 4.2.8 + '@smithy/protocol-http': 5.3.8 + '@smithy/types': 4.12.0 + '@smithy/util-stream': 4.5.10 tslib: 2.8.1 - '@smithy/types@4.9.0': + '@smithy/types@4.12.0': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.2.5': + '@smithy/url-parser@4.2.8': dependencies: - '@smithy/querystring-parser': 4.2.5 - '@smithy/types': 4.9.0 + '@smithy/querystring-parser': 4.2.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 '@smithy/util-base64@4.3.0': @@ -29642,49 +29664,49 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.3.12': + '@smithy/util-defaults-mode-browser@4.3.28': dependencies: - '@smithy/property-provider': 4.2.5 - '@smithy/smithy-client': 4.9.9 - '@smithy/types': 4.9.0 + '@smithy/property-provider': 4.2.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.2.15': + '@smithy/util-defaults-mode-node@4.2.31': dependencies: - '@smithy/config-resolver': 4.4.3 - '@smithy/credential-provider-imds': 4.2.5 - '@smithy/node-config-provider': 4.3.5 - '@smithy/property-provider': 4.2.5 - '@smithy/smithy-client': 4.9.9 - '@smithy/types': 4.9.0 + '@smithy/config-resolver': 4.4.6 + '@smithy/credential-provider-imds': 4.2.8 + '@smithy/node-config-provider': 4.3.8 + '@smithy/property-provider': 4.2.8 + '@smithy/smithy-client': 4.11.1 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/util-endpoints@3.2.5': + '@smithy/util-endpoints@3.2.8': dependencies: - '@smithy/node-config-provider': 4.3.5 - '@smithy/types': 4.9.0 + '@smithy/node-config-provider': 4.3.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 '@smithy/util-hex-encoding@4.2.0': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.2.5': + '@smithy/util-middleware@4.2.8': dependencies: - '@smithy/types': 4.9.0 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/util-retry@4.2.5': + '@smithy/util-retry@4.2.8': dependencies: - '@smithy/service-error-classification': 4.2.5 - '@smithy/types': 4.9.0 + '@smithy/service-error-classification': 4.2.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/util-stream@4.5.6': + '@smithy/util-stream@4.5.10': dependencies: - '@smithy/fetch-http-handler': 5.3.6 - '@smithy/node-http-handler': 4.4.5 - '@smithy/types': 4.9.0 + '@smithy/fetch-http-handler': 5.3.9 + '@smithy/node-http-handler': 4.4.8 + '@smithy/types': 4.12.0 '@smithy/util-base64': 4.3.0 '@smithy/util-buffer-from': 4.2.0 '@smithy/util-hex-encoding': 4.2.0 @@ -29705,10 +29727,10 @@ snapshots: '@smithy/util-buffer-from': 4.2.0 tslib: 2.8.1 - '@smithy/util-waiter@4.2.5': + '@smithy/util-waiter@4.2.8': dependencies: - '@smithy/abort-controller': 4.2.5 - '@smithy/types': 4.9.0 + '@smithy/abort-controller': 4.2.8 + '@smithy/types': 4.12.0 tslib: 2.8.1 '@smithy/uuid@1.1.0': @@ -29720,7 +29742,7 @@ snapshots: color: 5.0.3 text-hex: 1.0.0 - '@standard-schema/spec@1.0.0': {} + '@standard-schema/spec@1.1.0': {} '@standard-schema/utils@0.3.0': {} @@ -29735,10 +29757,10 @@ snapshots: '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 + core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 - lodash: 4.17.21 + lodash: 4.17.23 polished: 4.3.1 prop-types: 15.8.1 react-inspector: 5.1.1(react@18.2.0) @@ -29762,7 +29784,7 @@ snapshots: '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/types': 7.4.6 dequal: 2.0.3 - lodash: 4.17.21 + lodash: 4.17.23 polished: 4.3.1 prop-types: 15.8.1 react-inspector: 6.0.2(react@18.2.0) @@ -29787,7 +29809,7 @@ snapshots: '@storybook/theming': 7.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/types': 7.4.6 dequal: 2.0.3 - lodash: 4.17.21 + lodash: 4.17.23 polished: 4.3.1 prop-types: 15.8.1 react-inspector: 6.0.2(react@19.1.0) @@ -29801,13 +29823,22 @@ snapshots: - '@types/react' - '@types/react-dom' - '@storybook/addon-actions@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/addon-actions@8.6.14(storybook@8.6.15(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 '@types/uuid': 9.0.8 dequal: 2.0.3 polished: 4.3.1 - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) + uuid: 9.0.1 + + '@storybook/addon-actions@8.6.15(storybook@8.6.15(prettier@3.5.3))': + dependencies: + '@storybook/global': 5.0.0 + '@types/uuid': 9.0.8 + dequal: 2.0.3 + polished: 4.3.1 + storybook: 8.6.15(prettier@3.5.3) uuid: 9.0.1 '@storybook/addon-backgrounds@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': @@ -29819,7 +29850,7 @@ snapshots: '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 memoizerific: 1.11.3 regenerator-runtime: 0.13.11 @@ -29867,26 +29898,26 @@ snapshots: - '@types/react' - '@types/react-dom' - '@storybook/addon-backgrounds@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/addon-backgrounds@8.6.14(storybook@8.6.15(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 memoizerific: 1.11.3 - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-controls@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/addon-controls@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/node-logger': 6.5.16 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 - lodash: 4.17.21 + core-js: 3.48.0 + lodash: 4.17.23 ts-dedent: 2.2.0 optionalDependencies: react: 18.2.0 @@ -29901,19 +29932,19 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/addon-controls@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/addon-controls@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/node-logger': 6.5.16 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 - lodash: 4.17.21 + core-js: 3.48.0 + lodash: 4.17.23 ts-dedent: 2.2.0 optionalDependencies: react: 18.2.0 @@ -29940,7 +29971,7 @@ snapshots: '@storybook/preview-api': 7.4.6 '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/types': 7.4.6 - lodash: 4.17.21 + lodash: 4.17.23 ts-dedent: 2.2.0 optionalDependencies: react: 18.2.0 @@ -29963,7 +29994,7 @@ snapshots: '@storybook/preview-api': 7.4.6 '@storybook/theming': 7.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/types': 7.4.6 - lodash: 4.17.21 + lodash: 4.17.23 ts-dedent: 2.2.0 optionalDependencies: react: 19.1.0 @@ -29974,23 +30005,23 @@ snapshots: - encoding - supports-color - '@storybook/addon-controls@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/addon-controls@8.6.14(storybook@8.6.15(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 dequal: 2.0.3 - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.103.0)': + '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) '@jest/transform': 26.6.2 '@mdx-js/react': 1.6.22(react@18.2.0) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30001,11 +30032,11 @@ snapshots: '@storybook/source-loader': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) - core-js: 3.47.0 + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) + core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 - lodash: 4.17.21 + lodash: 4.17.23 regenerator-runtime: 0.13.11 remark-external-links: 8.0.0 remark-slug: 6.1.0 @@ -30026,16 +30057,16 @@ snapshots: - webpack - webpack-cli - '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.103.0)': + '@storybook/addon-docs@6.5.16(@babel/core@7.27.7)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1)': dependencies: - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) '@jest/transform': 26.6.2 '@mdx-js/react': 1.6.22(react@18.2.0) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30046,11 +30077,11 @@ snapshots: '@storybook/source-loader': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) - core-js: 3.47.0 + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) + core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 - lodash: 4.17.21 + lodash: 4.17.23 regenerator-runtime: 0.13.11 remark-external-links: 8.0.0 remark-slug: 6.1.0 @@ -30088,7 +30119,7 @@ snapshots: '@storybook/react-dom-shim': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/types': 7.4.6 - fs-extra: 11.3.2 + fs-extra: 11.3.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) remark-external-links: 8.0.0 @@ -30117,7 +30148,7 @@ snapshots: '@storybook/react-dom-shim': 7.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/theming': 7.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/types': 7.4.6 - fs-extra: 11.3.2 + fs-extra: 11.3.3 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) remark-external-links: 8.0.0 @@ -30129,42 +30160,55 @@ snapshots: - encoding - supports-color - '@storybook/addon-docs@8.6.14(@types/react@18.2.0)(storybook@8.6.14(prettier@3.5.3))': + '@storybook/addon-docs@8.6.14(@types/react@18.2.0)(storybook@8.6.15(prettier@3.5.3))': + dependencies: + '@mdx-js/react': 3.1.1(@types/react@18.2.0)(react@19.1.0) + '@storybook/blocks': 8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.15(prettier@3.5.3)) + '@storybook/csf-plugin': 8.6.14(storybook@8.6.15(prettier@3.5.3)) + '@storybook/react-dom-shim': 8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.15(prettier@3.5.3)) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + storybook: 8.6.15(prettier@3.5.3) + ts-dedent: 2.2.0 + transitivePeerDependencies: + - '@types/react' + + '@storybook/addon-docs@8.6.15(@types/react@18.2.0)(storybook@8.6.15(prettier@3.5.3))': dependencies: '@mdx-js/react': 3.1.1(@types/react@18.2.0)(react@19.1.0) - '@storybook/blocks': 8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3)) - '@storybook/csf-plugin': 8.6.14(storybook@8.6.14(prettier@3.5.3)) - '@storybook/react-dom-shim': 8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3)) + '@storybook/blocks': 8.6.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.15(prettier@3.5.3)) + '@storybook/csf-plugin': 8.6.15(storybook@8.6.15(prettier@3.5.3)) + '@storybook/react-dom-shim': 8.6.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.15(prettier@3.5.3)) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' - '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.103.0)': + '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: '@babel/core': 7.27.7 '@storybook/addon-actions': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-backgrounds': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-controls': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.103.0) + '@storybook/addon-controls': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) '@storybook/addon-measure': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-outline': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-toolbars': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-viewport': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 - core-js: 3.47.0 + core-js: 3.48.0 regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) transitivePeerDependencies: - '@storybook/mdx2-csf' - '@swc/core' @@ -30176,29 +30220,29 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.103.0)': + '@storybook/addon-essentials@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1)': dependencies: '@babel/core': 7.27.7 '@storybook/addon-actions': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-backgrounds': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/addon-controls': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.103.0) + '@storybook/addon-controls': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/addon-docs': 6.5.16(@babel/core@7.27.7)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1) '@storybook/addon-measure': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-outline': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-toolbars': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addon-viewport': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 - core-js: 3.47.0 + core-js: 3.48.0 regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/builder-webpack5': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.103.0(webpack-cli@4.10.0) + webpack: 5.104.1(webpack-cli@4.10.0) transitivePeerDependencies: - '@storybook/mdx2-csf' - '@swc/core' @@ -30258,18 +30302,18 @@ snapshots: - encoding - supports-color - '@storybook/addon-essentials@8.6.14(@types/react@18.2.0)(storybook@8.6.14(prettier@3.5.3))': + '@storybook/addon-essentials@8.6.14(@types/react@18.2.0)(storybook@8.6.15(prettier@3.5.3))': dependencies: - '@storybook/addon-actions': 8.6.14(storybook@8.6.14(prettier@3.5.3)) - '@storybook/addon-backgrounds': 8.6.14(storybook@8.6.14(prettier@3.5.3)) - '@storybook/addon-controls': 8.6.14(storybook@8.6.14(prettier@3.5.3)) - '@storybook/addon-docs': 8.6.14(@types/react@18.2.0)(storybook@8.6.14(prettier@3.5.3)) - '@storybook/addon-highlight': 8.6.14(storybook@8.6.14(prettier@3.5.3)) - '@storybook/addon-measure': 8.6.14(storybook@8.6.14(prettier@3.5.3)) - '@storybook/addon-outline': 8.6.14(storybook@8.6.14(prettier@3.5.3)) - '@storybook/addon-toolbars': 8.6.14(storybook@8.6.14(prettier@3.5.3)) - '@storybook/addon-viewport': 8.6.14(storybook@8.6.14(prettier@3.5.3)) - storybook: 8.6.14(prettier@3.5.3) + '@storybook/addon-actions': 8.6.14(storybook@8.6.15(prettier@3.5.3)) + '@storybook/addon-backgrounds': 8.6.14(storybook@8.6.15(prettier@3.5.3)) + '@storybook/addon-controls': 8.6.14(storybook@8.6.15(prettier@3.5.3)) + '@storybook/addon-docs': 8.6.14(@types/react@18.2.0)(storybook@8.6.15(prettier@3.5.3)) + '@storybook/addon-highlight': 8.6.14(storybook@8.6.15(prettier@3.5.3)) + '@storybook/addon-measure': 8.6.14(storybook@8.6.15(prettier@3.5.3)) + '@storybook/addon-outline': 8.6.14(storybook@8.6.15(prettier@3.5.3)) + '@storybook/addon-toolbars': 8.6.14(storybook@8.6.15(prettier@3.5.3)) + '@storybook/addon-viewport': 8.6.14(storybook@8.6.15(prettier@3.5.3)) + storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 transitivePeerDependencies: - '@types/react' @@ -30280,18 +30324,18 @@ snapshots: '@storybook/global': 5.0.0 '@storybook/preview-api': 7.4.6 - '@storybook/addon-highlight@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/addon-highlight@8.6.14(storybook@8.6.15(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) - '@storybook/addon-interactions@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/addon-interactions@8.6.14(storybook@8.6.15(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.6.14(storybook@8.6.14(prettier@3.5.3)) - '@storybook/test': 8.6.14(storybook@8.6.14(prettier@3.5.3)) + '@storybook/instrumenter': 8.6.14(storybook@8.6.15(prettier@3.5.3)) + '@storybook/test': 8.6.14(storybook@8.6.15(prettier@3.5.3)) polished: 4.3.1 - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 '@storybook/addon-links@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': @@ -30302,10 +30346,10 @@ snapshots: '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/router': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/qs': 6.14.0 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 prop-types: 15.8.1 - qs: 6.14.0 + qs: 6.14.1 regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 optionalDependencies: @@ -30328,10 +30372,10 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@storybook/addon-links@8.6.14(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))': + '@storybook/addon-links@8.6.15(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 optionalDependencies: react: 18.2.0 @@ -30344,7 +30388,7 @@ snapshots: '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 optionalDependencies: react: 18.2.0 @@ -30384,15 +30428,15 @@ snapshots: - '@types/react' - '@types/react-dom' - '@storybook/addon-measure@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/addon-measure@8.6.14(storybook@8.6.15(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) tiny-invariant: 1.3.3 - '@storybook/addon-onboarding@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/addon-onboarding@8.6.15(storybook@8.6.15(prettier@3.5.3))': dependencies: - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) '@storybook/addon-outline@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: @@ -30402,7 +30446,7 @@ snapshots: '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 @@ -30444,10 +30488,10 @@ snapshots: - '@types/react' - '@types/react-dom' - '@storybook/addon-outline@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/addon-outline@8.6.14(storybook@8.6.15(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 '@storybook/addon-toolbars@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': @@ -30457,7 +30501,7 @@ snapshots: '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 + core-js: 3.48.0 regenerator-runtime: 0.13.11 optionalDependencies: react: 18.2.0 @@ -30491,9 +30535,9 @@ snapshots: - '@types/react' - '@types/react-dom' - '@storybook/addon-toolbars@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/addon-toolbars@8.6.14(storybook@8.6.15(prettier@3.5.3))': dependencies: - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) '@storybook/addon-viewport@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: @@ -30503,7 +30547,7 @@ snapshots: '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/core-events': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 memoizerific: 1.11.3 prop-types: 15.8.1 @@ -30548,10 +30592,10 @@ snapshots: - '@types/react' - '@types/react-dom' - '@storybook/addon-viewport@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/addon-viewport@8.6.14(storybook@8.6.15(prettier@3.5.3))': dependencies: memoizerific: 1.11.3 - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) '@storybook/addons@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: @@ -30563,7 +30607,7 @@ snapshots: '@storybook/router': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/webpack-env': 1.18.8 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -30579,7 +30623,7 @@ snapshots: '@storybook/router': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/theming': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/webpack-env': 1.18.8 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -30610,10 +30654,10 @@ snapshots: '@storybook/router': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/semver': 7.3.2 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 + core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 - lodash: 4.17.21 + lodash: 4.17.23 memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -30632,10 +30676,10 @@ snapshots: '@storybook/router': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/semver': 7.3.2 '@storybook/theming': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - core-js: 3.47.0 + core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 - lodash: 4.17.21 + lodash: 4.17.23 memoizerific: 1.11.3 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -30661,7 +30705,7 @@ snapshots: '@types/lodash': 4.17.17 color-convert: 2.0.1 dequal: 2.0.3 - lodash: 4.17.21 + lodash: 4.17.23 markdown-to-jsx: 7.7.17(react@18.2.0) memoizerific: 1.11.3 polished: 4.3.1 @@ -30694,7 +30738,7 @@ snapshots: '@types/lodash': 4.17.17 color-convert: 2.0.1 dequal: 2.0.3 - lodash: 4.17.21 + lodash: 4.17.23 markdown-to-jsx: 7.7.17(react@19.1.0) memoizerific: 1.11.3 polished: 4.3.1 @@ -30711,30 +30755,39 @@ snapshots: - encoding - supports-color - '@storybook/blocks@8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))': + '@storybook/blocks@8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))': dependencies: '@storybook/icons': 1.6.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 optionalDependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@storybook/blocks@8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3))': + '@storybook/blocks@8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.15(prettier@3.5.3))': + dependencies: + '@storybook/icons': 1.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + storybook: 8.6.15(prettier@3.5.3) + ts-dedent: 2.2.0 + optionalDependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@storybook/blocks@8.6.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.15(prettier@3.5.3))': dependencies: '@storybook/icons': 1.6.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 optionalDependencies: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@storybook/builder-manager@7.6.20(encoding@0.1.13)': + '@storybook/builder-manager@7.6.21(encoding@0.1.13)': dependencies: '@fal-works/esbuild-plugin-global-externals': 2.1.2 - '@storybook/core-common': 7.6.20(encoding@0.1.13) - '@storybook/manager': 7.6.20 - '@storybook/node-logger': 7.6.20 + '@storybook/core-common': 7.6.21(encoding@0.1.13) + '@storybook/manager': 7.6.21 + '@storybook/node-logger': 7.6.21 '@types/ejs': 3.1.5 '@types/find-cache-dir': 3.2.1 '@yarnpkg/esbuild-plugin-pnp': 3.0.0-rc.15(esbuild@0.25.12) @@ -30744,84 +30797,22 @@ snapshots: esbuild-plugin-alias: 0.2.1 express: 4.22.1 find-cache-dir: 3.3.2 - fs-extra: 11.3.2 + fs-extra: 11.3.3 process: 0.11.10 util: 0.12.5 transitivePeerDependencies: - encoding - supports-color - '@storybook/builder-vite@8.6.14(storybook@8.6.14(prettier@3.5.3))(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2))': + '@storybook/builder-vite@8.6.15(storybook@8.6.15(prettier@3.5.3))(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2))': dependencies: - '@storybook/csf-plugin': 8.6.14(storybook@8.6.14(prettier@3.5.3)) + '@storybook/csf-plugin': 8.6.15(storybook@8.6.15(prettier@3.5.3)) browser-assert: 1.2.1 - storybook: 8.6.14(prettier@3.5.3) - ts-dedent: 2.2.0 - vite: 6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) - - '@storybook/builder-webpack4@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': - dependencies: - '@babel/core': 7.27.7 - '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/channel-postmessage': 6.5.16 - '@storybook/channels': 6.5.16 - '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/client-logger': 6.5.16 - '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/core-events': 6.5.16 - '@storybook/node-logger': 6.5.16 - '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/router': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/semver': 7.3.2 - '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@types/node': 16.18.126 - '@types/webpack': 4.41.40 - autoprefixer: 9.8.8 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.47.0 - css-loader: 3.6.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - file-loader: 6.2.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 4.1.6 - glob: 7.2.3 - glob-promise: 3.4.0(glob@7.2.3) - global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - pnp-webpack-plugin: 1.6.4(typescript@5.8.3) - postcss: 7.0.39 - postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - raw-loader: 4.0.2(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - stable: 0.1.8 - style-loader: 1.3.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - terser-webpack-plugin: 4.2.3(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))))(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - util-deprecate: 1.0.2 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) - webpack-dev-middleware: 3.7.3(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - webpack-hot-middleware: 2.26.1 - webpack-virtual-modules: 0.2.2 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - eslint - - supports-color - - uglify-js - - vue-template-compiler - - webpack-cli + vite: 6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) - '@storybook/builder-webpack4@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/builder-webpack4@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30831,7 +30822,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30843,33 +30834,33 @@ snapshots: '@types/node': 16.18.126 '@types/webpack': 4.41.40 autoprefixer: 9.8.8 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.47.0 - css-loader: 3.6.0(webpack@5.103.0) - file-loader: 6.2.0(webpack@5.103.0) + core-js: 3.48.0 + css-loader: 3.6.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + file-loader: 6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.103.0) + html-webpack-plugin: 4.5.2(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.103.0) - raw-loader: 4.0.2(webpack@5.103.0) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + raw-loader: 4.0.2(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.103.0) - terser-webpack-plugin: 4.2.3(webpack@5.103.0) + style-loader: 1.3.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + terser-webpack-plugin: 4.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.103.0))(webpack@5.103.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) util-deprecate: 1.0.2 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - webpack-dev-middleware: 3.7.3(webpack@5.103.0) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.103.0) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack-dev-middleware: 3.7.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -30883,7 +30874,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack4@6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/builder-webpack4@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30893,7 +30884,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30905,33 +30896,33 @@ snapshots: '@types/node': 16.18.126 '@types/webpack': 4.41.40 autoprefixer: 9.8.8 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.47.0 - css-loader: 3.6.0(webpack@5.103.0) - file-loader: 6.2.0(webpack@5.103.0) + core-js: 3.48.0 + css-loader: 3.6.0(webpack@5.104.1) + file-loader: 6.2.0(webpack@5.104.1) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.103.0) + html-webpack-plugin: 4.5.2(webpack@5.104.1) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.103.0) - raw-loader: 4.0.2(webpack@5.103.0) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.104.1) + raw-loader: 4.0.2(webpack@5.104.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.103.0) - terser-webpack-plugin: 4.2.3(webpack@5.103.0) + style-loader: 1.3.0(webpack@5.104.1) + terser-webpack-plugin: 4.2.3(webpack@5.104.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.103.0))(webpack@5.103.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.103.0) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.103.0) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-middleware: 3.7.3(webpack@5.104.1) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.104.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -30945,7 +30936,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/builder-webpack4@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30955,7 +30946,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -30967,33 +30958,33 @@ snapshots: '@types/node': 16.18.126 '@types/webpack': 4.41.40 autoprefixer: 9.8.8 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.47.0 - css-loader: 3.6.0(webpack@5.103.0) - file-loader: 6.2.0(webpack@5.103.0) + core-js: 3.48.0 + css-loader: 3.6.0(webpack@5.104.1) + file-loader: 6.2.0(webpack@5.104.1) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.103.0) + html-webpack-plugin: 4.5.2(webpack@5.104.1) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.103.0) - raw-loader: 4.0.2(webpack@5.103.0) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.104.1) + raw-loader: 4.0.2(webpack@5.104.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.103.0) - terser-webpack-plugin: 4.2.3(webpack@5.103.0) + style-loader: 1.3.0(webpack@5.104.1) + terser-webpack-plugin: 4.2.3(webpack@5.104.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.103.0))(webpack@5.103.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.103.0) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.104.1) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.104.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -31007,7 +30998,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/builder-webpack4@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31017,7 +31008,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31029,33 +31020,33 @@ snapshots: '@types/node': 16.18.126 '@types/webpack': 4.41.40 autoprefixer: 9.8.8 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.47.0 - css-loader: 3.6.0(webpack@5.103.0) - file-loader: 6.2.0(webpack@5.103.0) + core-js: 3.48.0 + css-loader: 3.6.0(webpack@5.104.1) + file-loader: 6.2.0(webpack@5.104.1) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.103.0) + html-webpack-plugin: 4.5.2(webpack@5.104.1) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.103.0) - raw-loader: 4.0.2(webpack@5.103.0) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.104.1) + raw-loader: 4.0.2(webpack@5.104.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.103.0) - terser-webpack-plugin: 4.2.3(webpack@5.103.0) + style-loader: 1.3.0(webpack@5.104.1) + terser-webpack-plugin: 4.2.3(webpack@5.104.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.103.0))(webpack@5.103.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.103.0) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@4.10.0) + webpack-dev-middleware: 3.7.3(webpack@5.104.1) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.104.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -31069,7 +31060,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack4@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': + '@storybook/builder-webpack4@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -31079,7 +31070,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -31091,33 +31082,33 @@ snapshots: '@types/node': 16.18.126 '@types/webpack': 4.41.40 autoprefixer: 9.8.8 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.47.0 - css-loader: 3.6.0(webpack@5.103.0) - file-loader: 6.2.0(webpack@5.103.0) + core-js: 3.48.0 + css-loader: 3.6.0(webpack@5.104.1) + file-loader: 6.2.0(webpack@5.104.1) find-up: 5.0.0 fork-ts-checker-webpack-plugin: 4.1.6 glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) global: 4.4.0 - html-webpack-plugin: 4.5.2(webpack@5.103.0) + html-webpack-plugin: 4.5.2(webpack@5.104.1) pnp-webpack-plugin: 1.6.4(typescript@4.9.5) postcss: 7.0.39 postcss-flexbugs-fixes: 4.2.1 - postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.103.0) - raw-loader: 4.0.2(webpack@5.103.0) + postcss-loader: 4.3.0(postcss@7.0.39)(webpack@5.104.1) + raw-loader: 4.0.2(webpack@5.104.1) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) stable: 0.1.8 - style-loader: 1.3.0(webpack@5.103.0) - terser-webpack-plugin: 4.2.3(webpack@5.103.0) + style-loader: 1.3.0(webpack@5.104.1) + terser-webpack-plugin: 4.2.3(webpack@5.104.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.103.0))(webpack@5.103.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.103.0) - webpack-filter-warnings-plugin: 1.2.1(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.104.1) + webpack-filter-warnings-plugin: 1.2.1(webpack@5.104.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.2.2 optionalDependencies: @@ -31131,7 +31122,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack5@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31141,7 +31132,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31150,27 +31141,27 @@ snapshots: '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.47.0 - css-loader: 5.2.7(webpack@5.103.0) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.103.0) + core-js: 3.48.0 + css-loader: 5.2.7(webpack@5.104.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) - html-webpack-plugin: 5.6.5(webpack@5.103.0) + html-webpack-plugin: 5.6.6(webpack@5.104.1) path-browserify: 1.0.1 process: 0.11.10 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 2.0.0(webpack@5.103.0) - terser-webpack-plugin: 5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0) + style-loader: 2.0.0(webpack@5.104.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - webpack-dev-middleware: 4.3.0(webpack@5.103.0) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-middleware: 4.3.0(webpack@5.104.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.4.6 optionalDependencies: @@ -31185,7 +31176,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31195,7 +31186,7 @@ snapshots: '@storybook/client-api': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/components': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/core-events': 6.5.16 '@storybook/node-logger': 6.5.16 '@storybook/preview-web': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31204,27 +31195,27 @@ snapshots: '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.47.0 - css-loader: 5.2.7(webpack@5.103.0) - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.103.0) + core-js: 3.48.0 + css-loader: 5.2.7(webpack@5.104.1) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) glob: 7.2.3 glob-promise: 3.4.0(glob@7.2.3) - html-webpack-plugin: 5.6.5(webpack@5.103.0) + html-webpack-plugin: 5.6.6(webpack@5.104.1) path-browserify: 1.0.1 process: 0.11.10 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) stable: 0.1.8 - style-loader: 2.0.0(webpack@5.103.0) - terser-webpack-plugin: 5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0) + style-loader: 2.0.0(webpack@5.104.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@4.10.0) - webpack-dev-middleware: 4.3.0(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@4.10.0) + webpack-dev-middleware: 4.3.0(webpack@5.104.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.4.6 optionalDependencies: @@ -31239,7 +31230,7 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/builder-webpack5@7.4.6(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@5.1.4)': + '@storybook/builder-webpack5@7.4.6(@swc/helpers@0.5.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@5.1.4)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) @@ -31258,33 +31249,33 @@ snapshots: '@storybook/router': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/store': 7.4.6 '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@swc/core': 1.15.3(@swc/helpers@0.5.17) + '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@types/node': 16.18.126 '@types/semver': 7.7.1 - babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.103.0) + babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.104.1) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.103.0) + css-loader: 6.11.0(webpack@5.104.1) express: 4.22.1 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.103.0) - fs-extra: 11.3.2 - html-webpack-plugin: 5.6.5(webpack@5.103.0) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.104.1) + fs-extra: 11.3.3 + html-webpack-plugin: 5.6.6(webpack@5.104.1) path-browserify: 1.0.1 process: 0.11.10 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) semver: 7.7.3 - style-loader: 3.3.4(webpack@5.103.0) - swc-loader: 0.2.6(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0) - terser-webpack-plugin: 5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0) + style-loader: 3.3.4(webpack@5.104.1) + swc-loader: 0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@5.1.4) - webpack-dev-middleware: 6.1.3(webpack@5.103.0) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4) + webpack-dev-middleware: 6.1.3(webpack@5.104.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.5.0 optionalDependencies: @@ -31300,7 +31291,7 @@ snapshots: - uglify-js - webpack-cli - '@storybook/builder-webpack5@7.4.6(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)': + '@storybook/builder-webpack5@7.4.6(@swc/helpers@0.5.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@storybook/addons': 7.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -31319,33 +31310,33 @@ snapshots: '@storybook/router': 7.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/store': 7.4.6 '@storybook/theming': 7.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@swc/core': 1.15.3(@swc/helpers@0.5.17) + '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@types/node': 16.18.126 '@types/semver': 7.7.1 - babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + babel-loader: 9.2.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) babel-plugin-named-exports-order: 0.0.2 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + css-loader: 6.11.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) express: 4.22.1 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - fs-extra: 11.3.2 - html-webpack-plugin: 5.6.5(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + fs-extra: 11.3.3 + html-webpack-plugin: 5.6.6(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) path-browserify: 1.0.1 process: 0.11.10 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) semver: 7.7.3 - style-loader: 3.3.4(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - swc-loader: 0.2.6(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - terser-webpack-plugin: 5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + style-loader: 3.3.4(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + swc-loader: 0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) - webpack-dev-middleware: 6.1.3(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack-dev-middleware: 6.1.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.5.0 optionalDependencies: @@ -31361,31 +31352,31 @@ snapshots: - uglify-js - webpack-cli - '@storybook/builder-webpack5@8.6.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3)': + '@storybook/builder-webpack5@8.6.15(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)': dependencies: - '@storybook/core-webpack': 8.6.14(storybook@8.6.14(prettier@3.5.3)) + '@storybook/core-webpack': 8.6.15(storybook@8.6.15(prettier@3.5.3)) '@types/semver': 7.7.1 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.4.3 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)) + css-loader: 6.11.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)) - html-webpack-plugin: 5.6.5(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + html-webpack-plugin: 5.6.6(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) magic-string: 0.30.21 path-browserify: 1.0.1 process: 0.11.10 semver: 7.7.3 - storybook: 8.6.14(prettier@3.5.3) - style-loader: 3.3.4(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)) - terser-webpack-plugin: 5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)) + storybook: 8.6.15(prettier@3.5.3) + style-loader: 3.3.4(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12) - webpack-dev-middleware: 6.1.3(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) + webpack-dev-middleware: 6.1.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -31397,31 +31388,31 @@ snapshots: - uglify-js - webpack-cli - '@storybook/builder-webpack5@8.6.14(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4)': + '@storybook/builder-webpack5@8.6.15(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4)': dependencies: - '@storybook/core-webpack': 8.6.14(storybook@8.6.14(prettier@3.5.3)) + '@storybook/core-webpack': 8.6.15(storybook@8.6.15(prettier@3.5.3)) '@types/semver': 7.7.1 browser-assert: 1.2.1 case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.4.3 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.103.0) + css-loader: 6.11.0(webpack@5.104.1) es-module-lexer: 1.7.0 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.103.0) - html-webpack-plugin: 5.6.5(webpack@5.103.0) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.8.3)(webpack@5.104.1) + html-webpack-plugin: 5.6.6(webpack@5.104.1) magic-string: 0.30.21 path-browserify: 1.0.1 process: 0.11.10 semver: 7.7.3 - storybook: 8.6.14(prettier@3.5.3) - style-loader: 3.3.4(webpack@5.103.0) - terser-webpack-plugin: 5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0) + storybook: 8.6.15(prettier@3.5.3) + style-loader: 3.3.4(webpack@5.104.1) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@5.1.4) - webpack-dev-middleware: 6.1.3(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@5.1.4) + webpack-dev-middleware: 6.1.3(webpack@5.104.1) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -31438,22 +31429,22 @@ snapshots: '@storybook/channels': 6.5.16 '@storybook/client-logger': 6.5.16 '@storybook/core-events': 6.5.16 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 - qs: 6.14.0 + qs: 6.14.1 telejson: 6.0.8 '@storybook/channel-websocket@6.5.16': dependencies: '@storybook/channels': 6.5.16 '@storybook/client-logger': 6.5.16 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 telejson: 6.0.8 '@storybook/channels@6.5.16': dependencies: - core-js: 3.47.0 + core-js: 3.48.0 ts-dedent: 2.2.0 util-deprecate: 1.0.2 @@ -31462,33 +31453,33 @@ snapshots: '@storybook/client-logger': 7.4.6 '@storybook/core-events': 7.4.6 '@storybook/global': 5.0.0 - qs: 6.14.0 + qs: 6.14.1 telejson: 7.2.0 tiny-invariant: 1.3.3 - '@storybook/channels@7.6.20': + '@storybook/channels@7.6.21': dependencies: - '@storybook/client-logger': 7.6.20 - '@storybook/core-events': 7.6.20 + '@storybook/client-logger': 7.6.21 + '@storybook/core-events': 7.6.21 '@storybook/global': 5.0.0 - qs: 6.14.0 + qs: 6.14.1 telejson: 7.2.0 tiny-invariant: 1.3.3 - '@storybook/cli@7.6.20(encoding@0.1.13)': + '@storybook/cli@7.6.21(encoding@0.1.13)': dependencies: '@babel/core': 7.27.7 '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 '@ndelangen/get-tarball': 3.0.9 - '@storybook/codemod': 7.6.20 - '@storybook/core-common': 7.6.20(encoding@0.1.13) - '@storybook/core-events': 7.6.20 - '@storybook/core-server': 7.6.20(encoding@0.1.13) - '@storybook/csf-tools': 7.6.20 - '@storybook/node-logger': 7.6.20 - '@storybook/telemetry': 7.6.20(encoding@0.1.13) - '@storybook/types': 7.6.20 + '@storybook/codemod': 7.6.21 + '@storybook/core-common': 7.6.21(encoding@0.1.13) + '@storybook/core-events': 7.6.21 + '@storybook/core-server': 7.6.21(encoding@0.1.13) + '@storybook/csf-tools': 7.6.21 + '@storybook/node-logger': 7.6.21 + '@storybook/telemetry': 7.6.21(encoding@0.1.13) + '@storybook/types': 7.6.21 '@types/semver': 7.7.1 '@yarnpkg/fslib': 2.10.3 '@yarnpkg/libzip': 2.3.0 @@ -31500,7 +31491,7 @@ snapshots: execa: 5.1.1 express: 4.22.1 find-up: 5.0.0 - fs-extra: 11.3.2 + fs-extra: 11.3.3 get-npm-tarball-url: 2.1.0 get-port: 5.1.1 giget: 1.2.5 @@ -31526,14 +31517,14 @@ snapshots: - supports-color - utf-8-validate - '@storybook/cli@8.6.14(@babel/preset-env@7.27.2(@babel/core@7.27.7))(prettier@3.5.3)': + '@storybook/cli@8.6.15(@babel/preset-env@7.27.2(@babel/core@7.27.7))(prettier@3.5.3)': dependencies: '@babel/core': 7.27.7 - '@babel/types': 7.28.5 - '@storybook/codemod': 8.6.14(storybook@8.6.14(prettier@3.5.3)) + '@babel/types': 7.29.0 + '@storybook/codemod': 8.6.15(storybook@8.6.15(prettier@3.5.3)) '@types/semver': 7.7.1 commander: 12.1.0 - create-storybook: 8.6.14 + create-storybook: 8.6.15 cross-spawn: 7.0.6 envinfo: 7.21.0 fd-package-json: 1.2.0 @@ -31546,7 +31537,7 @@ snapshots: p-limit: 6.2.0 prompts: 2.4.2 semver: 7.7.3 - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) tiny-invariant: 1.3.3 ts-dedent: 2.2.0 transitivePeerDependencies: @@ -31567,12 +31558,12 @@ snapshots: '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/qs': 6.14.0 '@types/webpack-env': 1.18.8 - core-js: 3.47.0 + core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 - lodash: 4.17.21 + lodash: 4.17.23 memoizerific: 1.11.3 - qs: 6.14.0 + qs: 6.14.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -31592,12 +31583,12 @@ snapshots: '@storybook/store': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/qs': 6.14.0 '@types/webpack-env': 1.18.8 - core-js: 3.47.0 + core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 - lodash: 4.17.21 + lodash: 4.17.23 memoizerific: 1.11.3 - qs: 6.14.0 + qs: 6.14.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) regenerator-runtime: 0.13.11 @@ -31613,45 +31604,45 @@ snapshots: '@storybook/client-logger@6.5.16': dependencies: - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 '@storybook/client-logger@7.4.6': dependencies: '@storybook/global': 5.0.0 - '@storybook/client-logger@7.6.20': + '@storybook/client-logger@7.6.21': dependencies: '@storybook/global': 5.0.0 - '@storybook/codemod@7.6.20': + '@storybook/codemod@7.6.21': dependencies: '@babel/core': 7.27.7 '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 '@storybook/csf': 0.1.13 - '@storybook/csf-tools': 7.6.20 - '@storybook/node-logger': 7.6.20 - '@storybook/types': 7.6.20 + '@storybook/csf-tools': 7.6.21 + '@storybook/node-logger': 7.6.21 + '@storybook/types': 7.6.21 '@types/cross-spawn': 6.0.6 cross-spawn: 7.0.6 globby: 11.1.0 jscodeshift: 0.15.2(@babel/preset-env@7.27.2(@babel/core@7.27.7)) - lodash: 4.17.21 + lodash: 4.17.23 prettier: 2.8.8 recast: 0.23.11 transitivePeerDependencies: - supports-color - '@storybook/codemod@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/codemod@8.6.15(storybook@8.6.15(prettier@3.5.3))': dependencies: '@babel/core': 7.27.7 '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/types': 7.28.5 - '@storybook/core': 8.6.14(prettier@3.5.3)(storybook@8.6.14(prettier@3.5.3)) + '@babel/types': 7.29.0 + '@storybook/core': 8.6.15(prettier@3.5.3)(storybook@8.6.15(prettier@3.5.3)) '@types/cross-spawn': 6.0.6 cross-spawn: 7.0.6 - es-toolkit: 1.42.0 + es-toolkit: 1.44.0 globby: 14.1.0 jscodeshift: 0.15.2(@babel/preset-env@7.27.2(@babel/core@7.27.7)) prettier: 3.5.3 @@ -31668,9 +31659,9 @@ snapshots: '@storybook/client-logger': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 + core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.0 + qs: 6.14.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -31681,9 +31672,9 @@ snapshots: '@storybook/client-logger': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/theming': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - core-js: 3.47.0 + core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.0 + qs: 6.14.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) regenerator-runtime: 0.13.11 @@ -31725,11 +31716,11 @@ snapshots: - '@types/react' - '@types/react-dom' - '@storybook/components@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/components@8.6.15(storybook@8.6.15(prettier@3.5.3))': dependencies: - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) - '@storybook/core-client@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)))': + '@storybook/core-client@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/channel-postmessage': 6.5.16 @@ -31743,21 +31734,21 @@ snapshots: '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 - lodash: 4.17.21 - qs: 6.14.0 + lodash: 4.17.23 + qs: 6.14.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: typescript: 5.8.3 - '@storybook/core-client@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0)': + '@storybook/core-client@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1)': dependencies: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/channel-postmessage': 6.5.16 @@ -31771,21 +31762,21 @@ snapshots: '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 - lodash: 4.17.21 - qs: 6.14.0 + lodash: 4.17.23 + qs: 6.14.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.3 - '@storybook/core-client@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.103.0)': + '@storybook/core-client@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.104.1)': dependencies: '@storybook/addons': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/channel-postmessage': 6.5.16 @@ -31799,17 +31790,17 @@ snapshots: '@storybook/ui': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 - lodash: 4.17.21 - qs: 6.14.0 + lodash: 4.17.23 + qs: 6.14.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) regenerator-runtime: 0.13.11 ts-dedent: 2.2.0 unfetch: 4.2.0 util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: typescript: 4.9.5 @@ -31818,11 +31809,11 @@ snapshots: '@storybook/client-logger': 7.4.6 '@storybook/preview-api': 7.4.6 - '@storybook/core-common@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-common@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) - '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.27.7) + '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.27.7) '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.7) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.7) '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.7) @@ -31831,30 +31822,30 @@ snapshots: '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.7) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.7) '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.27.7) - '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.27.7) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/register': 7.28.3(@babel/core@7.27.7) + '@babel/register': 7.28.6(@babel/core@7.27.7) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@types/node': 16.18.126 '@types/pretty-hrtime': 1.0.3 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -31871,7 +31862,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -31883,11 +31874,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-common@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/core-common@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) - '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.27.7) + '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.27.7) '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.7) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.7) '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.7) @@ -31896,30 +31887,30 @@ snapshots: '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.7) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.7) '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.27.7) - '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.27.7) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/register': 7.28.3(@babel/core@7.27.7) + '@babel/register': 7.28.6(@babel/core@7.27.7) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@types/node': 16.18.126 '@types/pretty-hrtime': 1.0.3 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.103.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -31936,7 +31927,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -31948,11 +31939,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-common@6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-common@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) - '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.27.7) + '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.27.7) '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.7) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.7) '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.7) @@ -31961,30 +31952,30 @@ snapshots: '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.7) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.7) '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.27.7) - '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.27.7) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/register': 7.28.3(@babel/core@7.27.7) + '@babel/register': 7.28.6(@babel/core@7.27.7) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@types/node': 16.18.126 '@types/pretty-hrtime': 1.0.3 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.103.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -32001,7 +31992,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32013,11 +32004,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-common@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-common@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) - '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.27.7) + '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.27.7) '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.7) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.7) '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.7) @@ -32026,30 +32017,30 @@ snapshots: '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.7) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.7) '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.27.7) - '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.27.7) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/register': 7.28.3(@babel/core@7.27.7) + '@babel/register': 7.28.6(@babel/core@7.27.7) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@types/node': 16.18.126 '@types/pretty-hrtime': 1.0.3 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.103.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -32066,7 +32057,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@4.10.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32078,11 +32069,11 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-common@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/core-common@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) - '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.27.7) + '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.27.7) '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.7) '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.7) '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.7) @@ -32091,95 +32082,30 @@ snapshots: '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.7) '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.7) '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.27.7) - '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.27.7) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.27.7) '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/register': 7.28.3(@babel/core@7.27.7) + '@babel/register': 7.28.6(@babel/core@7.27.7) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@types/node': 16.18.126 '@types/pretty-hrtime': 1.0.3 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) babel-plugin-macros: 3.1.0 babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 express: 4.22.1 file-system-cache: 1.1.0 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.103.0) - fs-extra: 9.1.0 - glob: 7.2.3 - handlebars: 4.7.8 - interpret: 2.2.0 - json5: 2.2.3 - lazy-universal-dotenv: 3.0.1 - picomatch: 2.3.1 - pkg-dir: 5.0.0 - pretty-hrtime: 1.0.3 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - resolve-from: 5.0.0 - slash: 3.0.0 - telejson: 6.0.8 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@4.10.0) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - eslint - - supports-color - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/core-common@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': - dependencies: - '@babel/core': 7.27.7 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) - '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.27.7) - '@babel/plugin-proposal-export-default-from': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6(@babel/core@7.27.7) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.27.7) - '@babel/plugin-proposal-optional-chaining': 7.21.0(@babel/core@7.27.7) - '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.27.7) - '@babel/plugin-proposal-private-property-in-object': 7.21.11(@babel/core@7.27.7) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.27.7) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.27.7) - '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.27.7) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.27.7) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.27.7) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.27.7) - '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@babel/preset-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/register': 7.28.3(@babel/core@7.27.7) - '@storybook/node-logger': 6.5.16 - '@storybook/semver': 7.3.2 - '@types/node': 16.18.126 - '@types/pretty-hrtime': 1.0.3 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) - babel-plugin-macros: 3.1.0 - babel-plugin-polyfill-corejs3: 0.1.7(@babel/core@7.27.7) - chalk: 4.1.2 - core-js: 3.47.0 - express: 4.22.1 - file-system-cache: 1.1.0 - find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@4.9.5)(webpack@5.103.0) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5)(webpack@5.104.1) fs-extra: 9.1.0 glob: 7.2.3 handlebars: 4.7.8 @@ -32196,7 +32122,7 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -32223,7 +32149,7 @@ snapshots: file-system-cache: 2.3.0 find-cache-dir: 3.3.2 find-up: 5.0.0 - fs-extra: 11.3.2 + fs-extra: 11.3.3 glob: 10.5.0 handlebars: 4.7.8 lazy-universal-dotenv: 4.0.0 @@ -32237,11 +32163,11 @@ snapshots: - encoding - supports-color - '@storybook/core-common@7.6.20(encoding@0.1.13)': + '@storybook/core-common@7.6.21(encoding@0.1.13)': dependencies: - '@storybook/core-events': 7.6.20 - '@storybook/node-logger': 7.6.20 - '@storybook/types': 7.6.20 + '@storybook/core-events': 7.6.21 + '@storybook/node-logger': 7.6.21 + '@storybook/types': 7.6.21 '@types/find-cache-dir': 3.2.1 '@types/node': 18.19.130 '@types/node-fetch': 2.6.13 @@ -32252,7 +32178,7 @@ snapshots: file-system-cache: 2.3.0 find-cache-dir: 3.3.2 find-up: 5.0.0 - fs-extra: 11.3.2 + fs-extra: 11.3.3 glob: 10.5.0 handlebars: 4.7.8 lazy-universal-dotenv: 4.0.0 @@ -32268,30 +32194,30 @@ snapshots: '@storybook/core-events@6.5.16': dependencies: - core-js: 3.47.0 + core-js: 3.48.0 '@storybook/core-events@7.4.6': dependencies: ts-dedent: 2.2.0 - '@storybook/core-events@7.6.20': + '@storybook/core-events@7.6.21': dependencies: ts-dedent: 2.2.0 - '@storybook/core-server@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/core-server@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/builder-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/manager-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/telemetry': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/telemetry': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@types/node': 16.18.126 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 @@ -32302,7 +32228,7 @@ snapshots: cli-table3: 0.6.5 commander: 6.2.1 compression: 1.8.1 - core-js: 3.47.0 + core-js: 3.48.0 cpy: 8.1.2 detect-port: 1.6.1 express: 4.22.1 @@ -32310,7 +32236,7 @@ snapshots: global: 4.4.0 globby: 11.1.0 ip: 2.0.1 - lodash: 4.17.21 + lodash: 4.17.23 node-fetch: 2.6.13(encoding@0.1.13) open: 8.4.2 pretty-hrtime: 1.0.3 @@ -32323,13 +32249,13 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - watchpack: 2.4.4 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - ws: 8.18.3 + watchpack: 2.5.1 + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -32344,20 +32270,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-server@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/core-server@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/builder-webpack4': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@types/node': 16.18.126 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 @@ -32368,7 +32294,7 @@ snapshots: cli-table3: 0.6.5 commander: 6.2.1 compression: 1.8.1 - core-js: 3.47.0 + core-js: 3.48.0 cpy: 8.1.2 detect-port: 1.6.1 express: 4.22.1 @@ -32376,7 +32302,7 @@ snapshots: global: 4.4.0 globby: 11.1.0 ip: 2.0.1 - lodash: 4.17.21 + lodash: 4.17.23 node-fetch: 2.6.13(encoding@0.1.13) open: 8.4.2 pretty-hrtime: 1.0.3 @@ -32389,13 +32315,13 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - watchpack: 2.4.4 - webpack: 5.103.0(webpack-cli@4.10.0) - ws: 8.18.3 + watchpack: 2.5.1 + webpack: 5.104.1(webpack-cli@4.10.0) + ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/builder-webpack5': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -32410,20 +32336,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-server@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-server@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - '@storybook/core-common': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/builder-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/manager-webpack4': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/telemetry': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/telemetry': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@types/node': 16.18.126 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 @@ -32434,7 +32360,7 @@ snapshots: cli-table3: 0.6.5 commander: 6.2.1 compression: 1.8.1 - core-js: 3.47.0 + core-js: 3.48.0 cpy: 8.1.2 detect-port: 1.6.1 express: 4.22.1 @@ -32442,7 +32368,7 @@ snapshots: global: 4.4.0 globby: 11.1.0 ip: 2.0.1 - lodash: 4.17.21 + lodash: 4.17.23 node-fetch: 2.6.13(encoding@0.1.13) open: 8.4.2 pretty-hrtime: 1.0.3 @@ -32455,9 +32381,9 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - watchpack: 2.4.4 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) - ws: 8.18.3 + watchpack: 2.5.1 + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: typescript: 5.8.3 @@ -32474,20 +32400,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0) - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/builder-webpack4': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@types/node': 16.18.126 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 @@ -32498,7 +32424,7 @@ snapshots: cli-table3: 0.6.5 commander: 6.2.1 compression: 1.8.1 - core-js: 3.47.0 + core-js: 3.48.0 cpy: 8.1.2 detect-port: 1.6.1 express: 4.22.1 @@ -32506,7 +32432,7 @@ snapshots: global: 4.4.0 globby: 11.1.0 ip: 2.0.1 - lodash: 4.17.21 + lodash: 4.17.23 node-fetch: 2.6.13(encoding@0.1.13) open: 8.4.2 pretty-hrtime: 1.0.3 @@ -32519,9 +32445,9 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - watchpack: 2.4.4 - webpack: 5.103.0(webpack-cli@5.1.4) - ws: 8.18.3 + watchpack: 2.5.1 + webpack: 5.104.1(webpack-cli@5.1.4) + ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: typescript: 5.8.3 @@ -32538,84 +32464,20 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/builder-webpack4': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/node-logger': 6.5.16 - '@storybook/semver': 7.3.2 - '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@types/node': 16.18.126 - '@types/node-fetch': 2.6.13 - '@types/pretty-hrtime': 1.0.3 - '@types/webpack': 4.41.40 - better-opn: 2.1.1 - boxen: 5.1.2 - chalk: 4.1.2 - cli-table3: 0.6.5 - commander: 6.2.1 - compression: 1.8.1 - core-js: 3.47.0 - cpy: 8.1.2 - detect-port: 1.6.1 - express: 4.22.1 - fs-extra: 9.1.0 - global: 4.4.0 - globby: 11.1.0 - ip: 2.0.1 - lodash: 4.17.21 - node-fetch: 2.6.13(encoding@0.1.13) - open: 8.4.2 - pretty-hrtime: 1.0.3 - prompts: 2.4.2 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - regenerator-runtime: 0.13.11 - serve-favicon: 2.5.1 - slash: 3.0.0 - telejson: 6.0.8 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - watchpack: 2.4.4 - webpack: 5.103.0(webpack-cli@5.1.4) - ws: 8.18.3 - x-default-browser: 0.4.0 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@storybook/mdx2-csf' - - '@swc/core' - - bufferutil - - encoding - - esbuild - - eslint - - supports-color - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - '@storybook/core-server@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': - dependencies: - '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) - '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.103.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) - '@storybook/core-events': 6.5.16 - '@storybook/csf': 0.0.2--canary.4566f4d.1 - '@storybook/csf-tools': 6.5.16 - '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/manager-webpack4': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/node-logger': 6.5.16 '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/telemetry': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@types/node': 16.18.126 '@types/node-fetch': 2.6.13 '@types/pretty-hrtime': 1.0.3 @@ -32626,7 +32488,7 @@ snapshots: cli-table3: 0.6.5 commander: 6.2.1 compression: 1.8.1 - core-js: 3.47.0 + core-js: 3.48.0 cpy: 8.1.2 detect-port: 1.6.1 express: 4.22.1 @@ -32634,7 +32496,7 @@ snapshots: global: 4.4.0 globby: 11.1.0 ip: 2.0.1 - lodash: 4.17.21 + lodash: 4.17.23 node-fetch: 2.6.13(encoding@0.1.13) open: 8.4.2 pretty-hrtime: 1.0.3 @@ -32647,9 +32509,9 @@ snapshots: telejson: 6.0.8 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - watchpack: 2.4.4 - webpack: 5.103.0(webpack-cli@5.1.4) - ws: 8.18.3 + watchpack: 2.5.1 + webpack: 5.104.1(webpack-cli@5.1.4) + ws: 8.19.0 x-default-browser: 0.4.0 optionalDependencies: typescript: 4.9.5 @@ -32666,23 +32528,23 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core-server@7.6.20(encoding@0.1.13)': + '@storybook/core-server@7.6.21(encoding@0.1.13)': dependencies: '@aw-web-design/x-default-browser': 1.4.126 '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-manager': 7.6.20(encoding@0.1.13) - '@storybook/channels': 7.6.20 - '@storybook/core-common': 7.6.20(encoding@0.1.13) - '@storybook/core-events': 7.6.20 + '@storybook/builder-manager': 7.6.21(encoding@0.1.13) + '@storybook/channels': 7.6.21 + '@storybook/core-common': 7.6.21(encoding@0.1.13) + '@storybook/core-events': 7.6.21 '@storybook/csf': 0.1.13 - '@storybook/csf-tools': 7.6.20 + '@storybook/csf-tools': 7.6.21 '@storybook/docs-mdx': 0.1.0 '@storybook/global': 5.0.0 - '@storybook/manager': 7.6.20 - '@storybook/node-logger': 7.6.20 - '@storybook/preview-api': 7.6.20 - '@storybook/telemetry': 7.6.20(encoding@0.1.13) - '@storybook/types': 7.6.20 + '@storybook/manager': 7.6.21 + '@storybook/node-logger': 7.6.21 + '@storybook/preview-api': 7.6.21 + '@storybook/telemetry': 7.6.21(encoding@0.1.13) + '@storybook/types': 7.6.21 '@types/detect-port': 1.3.5 '@types/node': 18.19.130 '@types/pretty-hrtime': 1.0.3 @@ -32693,9 +32555,9 @@ snapshots: compression: 1.8.1 detect-port: 1.6.1 express: 4.22.1 - fs-extra: 11.3.2 + fs-extra: 11.3.3 globby: 11.1.0 - lodash: 4.17.21 + lodash: 4.17.23 open: 8.4.2 pretty-hrtime: 1.0.3 prompts: 2.4.2 @@ -32706,8 +32568,8 @@ snapshots: ts-dedent: 2.2.0 util: 0.12.5 util-deprecate: 1.0.2 - watchpack: 2.4.4 - ws: 8.18.3 + watchpack: 2.5.1 + ws: 8.19.0 transitivePeerDependencies: - bufferutil - encoding @@ -32725,45 +32587,21 @@ snapshots: - encoding - supports-color - '@storybook/core-webpack@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/core-webpack@8.6.15(storybook@8.6.15(prettier@3.5.3))': dependencies: - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) ts-dedent: 2.2.0 - '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.103.0)': - dependencies: - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0) - '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - typescript: 5.8.3 - transitivePeerDependencies: - - '@storybook/mdx2-csf' - - '@swc/core' - - bufferutil - - encoding - - esbuild - - eslint - - supports-color - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.103.0)': + '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0) - '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) + '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.103.0(webpack-cli@4.10.0) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -32778,14 +32616,16 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)))': + '@storybook/core@6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1)': dependencies: - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - '@storybook/core-server': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) + '@storybook/core-server': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(webpack-cli@4.10.0) optionalDependencies: + '@storybook/builder-webpack5': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -32800,13 +32640,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0)': + '@storybook/core@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0) - '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@storybook/core-server': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32822,13 +32662,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1)': dependencies: - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0) - '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) + '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -32844,13 +32684,13 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.103.0)': + '@storybook/core@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.104.1)': dependencies: - '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.103.0) - '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.104.1) + '@storybook/core-server': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: typescript: 4.9.5 transitivePeerDependencies: @@ -32866,9 +32706,9 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/core@8.6.14(prettier@3.5.3)(storybook@8.6.14(prettier@3.5.3))': + '@storybook/core@8.6.15(prettier@3.5.3)(storybook@8.6.15(prettier@3.5.3))': dependencies: - '@storybook/theming': 8.6.14(storybook@8.6.14(prettier@3.5.3)) + '@storybook/theming': 8.6.15(storybook@8.6.15(prettier@3.5.3)) better-opn: 3.0.2 browser-assert: 1.2.1 esbuild: 0.25.12 @@ -32878,7 +32718,7 @@ snapshots: recast: 0.23.11 semver: 7.7.3 util: 0.12.5 - ws: 8.18.3 + ws: 8.19.0 optionalDependencies: prettier: 3.5.3 transitivePeerDependencies: @@ -32894,23 +32734,28 @@ snapshots: transitivePeerDependencies: - supports-color - '@storybook/csf-plugin@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/csf-plugin@8.6.14(storybook@8.6.15(prettier@3.5.3))': dependencies: - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) + unplugin: 1.16.1 + + '@storybook/csf-plugin@8.6.15(storybook@8.6.15(prettier@3.5.3))': + dependencies: + storybook: 8.6.15(prettier@3.5.3) unplugin: 1.16.1 '@storybook/csf-tools@6.5.16': dependencies: '@babel/core': 7.27.7 - '@babel/generator': 7.28.5 - '@babel/parser': 7.28.5 - '@babel/plugin-transform-react-jsx': 7.27.1(@babel/core@7.27.7) + '@babel/generator': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/plugin-transform-react-jsx': 7.28.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/mdx1-csf': 0.0.1(@babel/core@7.27.7) - core-js: 3.47.0 + core-js: 3.48.0 fs-extra: 9.1.0 global: 4.4.0 regenerator-runtime: 0.13.11 @@ -32920,27 +32765,27 @@ snapshots: '@storybook/csf-tools@7.4.6': dependencies: - '@babel/generator': 7.28.5 - '@babel/parser': 7.28.5 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/generator': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 '@storybook/csf': 0.1.13 '@storybook/types': 7.4.6 - fs-extra: 11.3.2 + fs-extra: 11.3.3 recast: 0.23.11 ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color - '@storybook/csf-tools@7.6.20': + '@storybook/csf-tools@7.6.21': dependencies: - '@babel/generator': 7.28.5 - '@babel/parser': 7.28.5 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/generator': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 '@storybook/csf': 0.1.13 - '@storybook/types': 7.6.20 - fs-extra: 11.3.2 + '@storybook/types': 7.6.21 + fs-extra: 11.3.3 recast: 0.23.11 ts-dedent: 2.2.0 transitivePeerDependencies: @@ -32948,11 +32793,11 @@ snapshots: '@storybook/csf@0.0.1': dependencies: - lodash: 4.17.21 + lodash: 4.17.23 '@storybook/csf@0.0.2--canary.4566f4d.1': dependencies: - lodash: 4.17.21 + lodash: 4.17.23 '@storybook/csf@0.1.13': dependencies: @@ -32965,9 +32810,9 @@ snapshots: '@babel/core': 7.27.7 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 + core-js: 3.48.0 doctrine: 3.0.0 - lodash: 4.17.21 + lodash: 4.17.23 regenerator-runtime: 0.13.11 transitivePeerDependencies: - react @@ -32979,9 +32824,9 @@ snapshots: '@babel/core': 7.27.7 '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/store': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - core-js: 3.47.0 + core-js: 3.48.0 doctrine: 3.0.0 - lodash: 4.17.21 + lodash: 4.17.23 regenerator-runtime: 0.13.11 transitivePeerDependencies: - react @@ -32995,7 +32840,7 @@ snapshots: '@storybook/types': 7.4.6 '@types/doctrine': 0.0.3 doctrine: 3.0.0 - lodash: 4.17.21 + lodash: 4.17.23 transitivePeerDependencies: - encoding - supports-color @@ -33012,11 +32857,17 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@storybook/instrumenter@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/instrumenter@8.6.14(storybook@8.6.15(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 '@vitest/utils': 2.1.9 - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) + + '@storybook/instrumenter@8.6.15(storybook@8.6.15(prettier@3.5.3))': + dependencies: + '@storybook/global': 5.0.0 + '@vitest/utils': 2.1.9 + storybook: 8.6.15(prettier@3.5.3) '@storybook/manager-api@7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: @@ -33029,7 +32880,7 @@ snapshots: '@storybook/theming': 7.4.6(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/types': 7.4.6 dequal: 2.0.3 - lodash: 4.17.21 + lodash: 4.17.23 memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -33049,7 +32900,7 @@ snapshots: '@storybook/theming': 7.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/types': 7.4.6 dequal: 2.0.3 - lodash: 4.17.21 + lodash: 4.17.23 memoizerific: 1.11.3 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -33058,33 +32909,33 @@ snapshots: telejson: 7.2.0 ts-dedent: 2.2.0 - '@storybook/manager-api@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/manager-api@8.6.15(storybook@8.6.15(prettier@3.5.3))': dependencies: - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) - '@storybook/manager-webpack4@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/manager-webpack4@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - '@storybook/core-common': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.47.0 - css-loader: 3.6.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + core-js: 3.48.0 + css-loader: 3.6.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) express: 4.22.1 - file-loader: 6.2.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + file-loader: 6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + html-webpack-plugin: 4.5.2(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -33092,14 +32943,14 @@ snapshots: read-pkg-up: 7.0.1 regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - style-loader: 1.3.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + style-loader: 1.3.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + terser-webpack-plugin: 4.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))))(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) util-deprecate: 1.0.2 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) - webpack-dev-middleware: 3.7.3(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) + webpack-dev-middleware: 3.7.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -33113,29 +32964,29 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack4@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/manager-webpack4@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.47.0 - css-loader: 3.6.0(webpack@5.103.0) + core-js: 3.48.0 + css-loader: 3.6.0(webpack@5.104.1) express: 4.22.1 - file-loader: 6.2.0(webpack@5.103.0) + file-loader: 6.2.0(webpack@5.104.1) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.103.0) + html-webpack-plugin: 4.5.2(webpack@5.104.1) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -33143,14 +32994,14 @@ snapshots: read-pkg-up: 7.0.1 regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - style-loader: 1.3.0(webpack@5.103.0) + style-loader: 1.3.0(webpack@5.104.1) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.103.0) + terser-webpack-plugin: 4.2.3(webpack@5.104.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.103.0))(webpack@5.103.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) util-deprecate: 1.0.2 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - webpack-dev-middleware: 3.7.3(webpack@5.103.0) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-middleware: 3.7.3(webpack@5.104.1) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -33164,29 +33015,29 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0) - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.47.0 - css-loader: 3.6.0(webpack@5.103.0) + core-js: 3.48.0 + css-loader: 3.6.0(webpack@5.104.1) express: 4.22.1 - file-loader: 6.2.0(webpack@5.103.0) + file-loader: 6.2.0(webpack@5.104.1) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.103.0) + html-webpack-plugin: 4.5.2(webpack@5.104.1) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -33194,14 +33045,14 @@ snapshots: read-pkg-up: 7.0.1 regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - style-loader: 1.3.0(webpack@5.103.0) + style-loader: 1.3.0(webpack@5.104.1) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.103.0) + terser-webpack-plugin: 4.2.3(webpack@5.104.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.103.0))(webpack@5.103.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.104.1) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -33215,29 +33066,29 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.47.0 - css-loader: 3.6.0(webpack@5.103.0) + core-js: 3.48.0 + css-loader: 3.6.0(webpack@5.104.1) express: 4.22.1 - file-loader: 6.2.0(webpack@5.103.0) + file-loader: 6.2.0(webpack@5.104.1) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.103.0) + html-webpack-plugin: 4.5.2(webpack@5.104.1) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@5.8.3) react: 18.2.0 @@ -33245,14 +33096,14 @@ snapshots: read-pkg-up: 7.0.1 regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - style-loader: 1.3.0(webpack@5.103.0) + style-loader: 1.3.0(webpack@5.104.1) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.103.0) + terser-webpack-plugin: 4.2.3(webpack@5.104.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.103.0))(webpack@5.103.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@4.10.0) + webpack-dev-middleware: 3.7.3(webpack@5.104.1) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 5.8.3 @@ -33266,80 +33117,29 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': - dependencies: - '@babel/core': 7.27.7 - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) - '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/node-logger': 6.5.16 - '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@types/node': 16.18.126 - '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) - case-sensitive-paths-webpack-plugin: 2.4.0 - chalk: 4.1.2 - core-js: 3.47.0 - css-loader: 3.6.0(webpack@5.103.0) - express: 4.22.1 - file-loader: 6.2.0(webpack@5.103.0) - find-up: 5.0.0 - fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.103.0) - node-fetch: 2.6.13(encoding@0.1.13) - pnp-webpack-plugin: 1.6.4(typescript@5.8.3) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - read-pkg-up: 7.0.1 - regenerator-runtime: 0.13.11 - resolve-from: 5.0.0 - style-loader: 1.3.0(webpack@5.103.0) - telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.103.0) - ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.103.0))(webpack@5.103.0) - util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@4.10.0) - webpack-dev-middleware: 3.7.3(webpack@5.103.0) - webpack-virtual-modules: 0.2.2 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - '@swc/core' - - encoding - - esbuild - - eslint - - supports-color - - uglify-js - - vue-template-compiler - - webpack-cli - - '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': + '@storybook/manager-webpack4@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.103.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/core-client': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/ui': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/node': 16.18.126 '@types/webpack': 4.41.40 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.47.0 - css-loader: 3.6.0(webpack@5.103.0) + core-js: 3.48.0 + css-loader: 3.6.0(webpack@5.104.1) express: 4.22.1 - file-loader: 6.2.0(webpack@5.103.0) + file-loader: 6.2.0(webpack@5.104.1) find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 4.5.2(webpack@5.103.0) + html-webpack-plugin: 4.5.2(webpack@5.104.1) node-fetch: 2.6.13(encoding@0.1.13) pnp-webpack-plugin: 1.6.4(typescript@4.9.5) react: 19.1.0 @@ -33347,14 +33147,14 @@ snapshots: read-pkg-up: 7.0.1 regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - style-loader: 1.3.0(webpack@5.103.0) + style-loader: 1.3.0(webpack@5.104.1) telejson: 6.0.8 - terser-webpack-plugin: 4.2.3(webpack@5.103.0) + terser-webpack-plugin: 4.2.3(webpack@5.104.1) ts-dedent: 2.2.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.103.0))(webpack@5.103.0) + url-loader: 4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1) util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@5.1.4) - webpack-dev-middleware: 3.7.3(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@5.1.4) + webpack-dev-middleware: 3.7.3(webpack@5.104.1) webpack-virtual-modules: 0.2.2 optionalDependencies: typescript: 4.9.5 @@ -33368,27 +33168,27 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack5@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.47.0 - css-loader: 5.2.7(webpack@5.103.0) + core-js: 3.48.0 + css-loader: 5.2.7(webpack@5.104.1) express: 4.22.1 find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 5.6.5(webpack@5.103.0) + html-webpack-plugin: 5.6.6(webpack@5.104.1) node-fetch: 2.6.13(encoding@0.1.13) process: 0.11.10 react: 18.2.0 @@ -33396,13 +33196,13 @@ snapshots: read-pkg-up: 7.0.1 regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - style-loader: 2.0.0(webpack@5.103.0) + style-loader: 2.0.0(webpack@5.104.1) telejson: 6.0.8 - terser-webpack-plugin: 5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - webpack-dev-middleware: 4.3.0(webpack@5.103.0) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-middleware: 4.3.0(webpack@5.104.1) webpack-virtual-modules: 0.4.6 optionalDependencies: typescript: 5.8.3 @@ -33417,27 +33217,27 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@babel/core': 7.27.7 '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-client': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/node-logger': 6.5.16 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/ui': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/node': 16.18.126 - babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.103.0) + babel-loader: 8.4.1(@babel/core@7.27.7)(webpack@5.104.1) case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 - core-js: 3.47.0 - css-loader: 5.2.7(webpack@5.103.0) + core-js: 3.48.0 + css-loader: 5.2.7(webpack@5.104.1) express: 4.22.1 find-up: 5.0.0 fs-extra: 9.1.0 - html-webpack-plugin: 5.6.5(webpack@5.103.0) + html-webpack-plugin: 5.6.6(webpack@5.104.1) node-fetch: 2.6.13(encoding@0.1.13) process: 0.11.10 react: 18.2.0 @@ -33445,13 +33245,13 @@ snapshots: read-pkg-up: 7.0.1 regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - style-loader: 2.0.0(webpack@5.103.0) + style-loader: 2.0.0(webpack@5.104.1) telejson: 6.0.8 - terser-webpack-plugin: 5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0) + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@4.10.0) - webpack-dev-middleware: 4.3.0(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@4.10.0) + webpack-dev-middleware: 4.3.0(webpack@5.104.1) webpack-virtual-modules: 0.4.6 optionalDependencies: typescript: 5.8.3 @@ -33466,19 +33266,19 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/manager@7.6.20': {} + '@storybook/manager@7.6.21': {} '@storybook/mdx1-csf@0.0.1(@babel/core@7.27.7)': dependencies: - '@babel/generator': 7.28.5 - '@babel/parser': 7.28.5 + '@babel/generator': 7.29.0 + '@babel/parser': 7.29.0 '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 '@mdx-js/mdx': 1.6.22 '@types/lodash': 4.17.17 js-string-escape: 1.0.1 loader-utils: 2.0.4 - lodash: 4.17.21 + lodash: 4.17.23 prettier: 2.3.0 ts-dedent: 2.2.0 transitivePeerDependencies: @@ -33491,40 +33291,40 @@ snapshots: dependencies: '@types/npmlog': 4.1.6 chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 npmlog: 5.0.1 pretty-hrtime: 1.0.3 '@storybook/node-logger@7.4.6': {} - '@storybook/node-logger@7.6.20': {} + '@storybook/node-logger@7.6.21': {} '@storybook/postinstall@6.5.16': dependencies: - core-js: 3.47.0 + core-js: 3.48.0 '@storybook/postinstall@7.4.6': {} - '@storybook/preset-react-webpack@7.4.6(@babel/core@7.27.7)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)': + '@storybook/preset-react-webpack@7.4.6(@babel/core@7.27.7)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.103.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@5.1.4))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@storybook/core-webpack': 7.4.6(encoding@0.1.13) '@storybook/docs-tools': 7.4.6(encoding@0.1.13) '@storybook/node-logger': 7.4.6 '@storybook/react': 7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.103.0) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1) '@types/node': 16.18.126 '@types/semver': 7.7.1 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - fs-extra: 11.3.2 + fs-extra: 11.3.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) react-refresh: 0.11.0 semver: 7.7.3 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.27.7 typescript: 5.8.3 @@ -33546,22 +33346,22 @@ snapshots: dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.103.0))(webpack-hot-middleware@2.26.1)(webpack@5.103.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@storybook/core-webpack': 7.4.6(encoding@0.1.13) '@storybook/docs-tools': 7.4.6(encoding@0.1.13) '@storybook/node-logger': 7.4.6 '@storybook/react': 7.4.6(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.103.0) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1) '@types/node': 16.18.126 '@types/semver': 7.7.1 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - fs-extra: 11.3.2 + fs-extra: 11.3.3 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) react-refresh: 0.11.0 semver: 7.7.3 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.27.7 typescript: 5.8.3 @@ -33579,11 +33379,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/preset-react-webpack@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3)': + '@storybook/preset-react-webpack@8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)': dependencies: - '@storybook/core-webpack': 8.6.14(storybook@8.6.14(prettier@3.5.3)) - '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)) + '@storybook/core-webpack': 8.6.15(storybook@8.6.15(prettier@3.5.3)) + '@storybook/react': 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) '@types/semver': 7.7.1 find-up: 5.0.0 magic-string: 0.30.21 @@ -33592,9 +33392,9 @@ snapshots: react-dom: 18.2.0(react@18.2.0) resolve: 1.22.11 semver: 7.7.3 - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) tsconfig-paths: 4.2.0 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -33605,11 +33405,11 @@ snapshots: - uglify-js - webpack-cli - '@storybook/preset-react-webpack@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4)': + '@storybook/preset-react-webpack@8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4)': dependencies: - '@storybook/core-webpack': 8.6.14(storybook@8.6.14(prettier@3.5.3)) - '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.103.0) + '@storybook/core-webpack': 8.6.15(storybook@8.6.15(prettier@3.5.3)) + '@storybook/react': 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1) '@types/semver': 7.7.1 find-up: 5.0.0 magic-string: 0.30.21 @@ -33618,9 +33418,9 @@ snapshots: react-dom: 18.2.0(react@18.2.0) resolve: 1.22.11 semver: 7.7.3 - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) tsconfig-paths: 4.2.0 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -33641,33 +33441,33 @@ snapshots: '@storybook/types': 7.4.6 '@types/qs': 6.14.0 dequal: 2.0.3 - lodash: 4.17.21 + lodash: 4.17.23 memoizerific: 1.11.3 - qs: 6.14.0 + qs: 6.14.1 synchronous-promise: 2.0.17 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - '@storybook/preview-api@7.6.20': + '@storybook/preview-api@7.6.21': dependencies: - '@storybook/channels': 7.6.20 - '@storybook/client-logger': 7.6.20 - '@storybook/core-events': 7.6.20 + '@storybook/channels': 7.6.21 + '@storybook/client-logger': 7.6.21 + '@storybook/core-events': 7.6.21 '@storybook/csf': 0.1.13 '@storybook/global': 5.0.0 - '@storybook/types': 7.6.20 + '@storybook/types': 7.6.21 '@types/qs': 6.14.0 dequal: 2.0.3 - lodash: 4.17.21 + lodash: 4.17.23 memoizerific: 1.11.3 - qs: 6.14.0 + qs: 6.14.1 synchronous-promise: 2.0.17 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - '@storybook/preview-api@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/preview-api@8.6.15(storybook@8.6.15(prettier@3.5.3))': dependencies: - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) '@storybook/preview-web@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: @@ -33678,10 +33478,10 @@ snapshots: '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) ansi-to-html: 0.6.15 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 - lodash: 4.17.21 - qs: 6.14.0 + lodash: 4.17.23 + qs: 6.14.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -33699,10 +33499,10 @@ snapshots: '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/store': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) ansi-to-html: 0.6.15 - core-js: 3.47.0 + core-js: 3.48.0 global: 4.4.0 - lodash: 4.17.21 - qs: 6.14.0 + lodash: 4.17.23 + qs: 6.14.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) regenerator-runtime: 0.13.11 @@ -33713,7 +33513,7 @@ snapshots: '@storybook/preview@7.4.6': {} - '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.103.0)': + '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.104.1)': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33723,11 +33523,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@4.9.5) tslib: 2.8.1 typescript: 4.9.5 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)))': + '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)))': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33737,11 +33537,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.103.0)': + '@storybook/react-docgen-typescript-plugin@1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.104.1)': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33751,11 +33551,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12))': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12))': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33765,11 +33565,11 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) transitivePeerDependencies: - supports-color - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.103.0)': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.8.3)(webpack@5.104.1)': dependencies: debug: 4.4.3(supports-color@8.1.1) endent: 2.1.0 @@ -33779,7 +33579,7 @@ snapshots: react-docgen-typescript: 2.4.0(typescript@5.8.3) tslib: 2.8.1 typescript: 5.8.3 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) transitivePeerDependencies: - supports-color @@ -33793,44 +33593,50 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@storybook/react-dom-shim@8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))': + '@storybook/react-dom-shim@8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.15(prettier@3.5.3))': + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + storybook: 8.6.15(prettier@3.5.3) + + '@storybook/react-dom-shim@8.6.15(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))': dependencies: react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) - '@storybook/react-dom-shim@8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3))': + '@storybook/react-dom-shim@8.6.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.15(prettier@3.5.3))': dependencies: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) - '@storybook/react-vite@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.53.3)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2))': + '@storybook/react-vite@8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(rollup@4.57.1)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2))': dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2)) - '@rollup/pluginutils': 5.3.0(rollup@4.53.3) - '@storybook/builder-vite': 8.6.14(storybook@8.6.14(prettier@3.5.3))(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2)) - '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2)) + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) + '@storybook/builder-vite': 8.6.15(storybook@8.6.15(prettier@3.5.3))(vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2)) + '@storybook/react': 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) find-up: 5.0.0 magic-string: 0.30.21 react: 19.1.0 react-docgen: 7.1.1 react-dom: 19.1.0(react@19.1.0) resolve: 1.22.11 - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) tsconfig-paths: 4.2.0 - vite: 6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2) + vite: 6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) optionalDependencies: - '@storybook/test': 8.6.14(storybook@8.6.14(prettier@3.5.3)) + '@storybook/test': 8.6.15(storybook@8.6.15(prettier@3.5.3)) transitivePeerDependencies: - rollup - supports-color - typescript - '@storybook/react-webpack5@7.4.6(@babel/core@7.27.7)(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)': + '@storybook/react-webpack5@7.4.6(@babel/core@7.27.7)(@swc/helpers@0.5.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)': dependencies: - '@storybook/builder-webpack5': 7.4.6(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@5.1.4) - '@storybook/preset-react-webpack': 7.4.6(@babel/core@7.27.7)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1) + '@storybook/builder-webpack5': 7.4.6(@swc/helpers@0.5.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@5.1.4) + '@storybook/preset-react-webpack': 7.4.6(@babel/core@7.27.7)(@types/webpack@5.28.5(webpack-cli@5.1.4))(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1) '@storybook/react': 7.4.6(encoding@0.1.13)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@types/node': 16.18.126 react: 18.2.0 @@ -33856,9 +33662,9 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react-webpack5@7.4.6(@babel/core@7.27.7)(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(@types/webpack@5.28.5)(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)': + '@storybook/react-webpack5@7.4.6(@babel/core@7.27.7)(@swc/helpers@0.5.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(@types/webpack@5.28.5)(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)': dependencies: - '@storybook/builder-webpack5': 7.4.6(@swc/helpers@0.5.17)(@types/react-dom@18.2.0)(@types/react@18.2.0)(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) + '@storybook/builder-webpack5': 7.4.6(@swc/helpers@0.5.18)(@types/react-dom@18.2.0)(@types/react@18.2.0)(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) '@storybook/preset-react-webpack': 7.4.6(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(type-fest@4.41.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1) '@storybook/react': 7.4.6(encoding@0.1.13)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) '@types/node': 16.18.126 @@ -33885,14 +33691,14 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react-webpack5@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3)': + '@storybook/react-webpack5@8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)': dependencies: - '@storybook/builder-webpack5': 8.6.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) - '@storybook/preset-react-webpack': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) - '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) + '@storybook/builder-webpack5': 8.6.15(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) + '@storybook/preset-react-webpack': 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) + '@storybook/react': 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -33904,14 +33710,14 @@ snapshots: - uglify-js - webpack-cli - '@storybook/react-webpack5@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4)': + '@storybook/react-webpack5@8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4)': dependencies: - '@storybook/builder-webpack5': 8.6.14(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4) - '@storybook/preset-react-webpack': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4) - '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3) + '@storybook/builder-webpack5': 8.6.15(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4) + '@storybook/preset-react-webpack': 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)(webpack-cli@5.1.4) + '@storybook/react': 8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -33923,83 +33729,19 @@ snapshots: - uglify-js - webpack-cli - '@storybook/react@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/webpack@5.28.5(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)': - dependencies: - '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) - '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.103.0) - '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.103.0) - '@storybook/core-common': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/csf': 0.0.2--canary.4566f4d.1 - '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.103.0) - '@storybook/semver': 7.3.2 - '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@types/estree': 0.0.51 - '@types/node': 16.18.126 - '@types/webpack-env': 1.18.8 - acorn: 7.4.1 - acorn-jsx: 5.3.2(acorn@7.4.1) - acorn-walk: 7.2.0 - babel-plugin-add-react-displayname: 0.0.5 - babel-plugin-react-docgen: 4.2.1 - core-js: 3.47.0 - escodegen: 2.1.0 - fs-extra: 9.1.0 - global: 4.4.0 - html-tags: 3.3.1 - lodash: 4.17.21 - prop-types: 15.8.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-element-to-jsx-string: 14.3.4(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - react-refresh: 0.11.0 - read-pkg-up: 7.0.1 - regenerator-runtime: 0.13.11 - require-from-string: 2.0.2 - ts-dedent: 2.2.0 - util-deprecate: 1.0.2 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - optionalDependencies: - '@babel/core': 7.27.7 - '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) - typescript: 5.8.3 - transitivePeerDependencies: - - '@storybook/mdx2-csf' - - '@swc/core' - - '@types/webpack' - - bufferutil - - encoding - - esbuild - - eslint - - sockjs-client - - supports-color - - type-fest - - uglify-js - - utf-8-validate - - vue-template-compiler - - webpack-cli - - webpack-dev-server - - webpack-hot-middleware - - webpack-plugin-serve - - '@storybook/react@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@types/webpack@5.28.5(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2)(webpack-hot-middleware@2.26.1)(webpack@5.103.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.103.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@storybook/manager-webpack5@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1))(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.103.0) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.104.1) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/estree': 0.0.51 @@ -34010,12 +33752,12 @@ snapshots: acorn-walk: 7.2.0 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - core-js: 3.47.0 + core-js: 3.48.0 escodegen: 2.1.0 fs-extra: 9.1.0 global: 4.4.0 html-tags: 3.3.1 - lodash: 4.17.21 + lodash: 4.17.23 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -34026,11 +33768,11 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@4.10.0) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: '@babel/core': 7.27.7 - '@storybook/builder-webpack5': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) - '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/builder-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/manager-webpack5': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -34051,19 +33793,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/webpack@5.28.5(@swc/core@1.15.3(@swc/helpers@0.5.17)))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@types/webpack@5.28.5(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.3(@swc/helpers@0.5.17)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))))(webpack-hot-middleware@2.26.1)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(webpack-cli@4.10.0))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3)(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - '@storybook/core-common': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core': 6.5.16(@storybook/builder-webpack5@6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(@storybook/manager-webpack5@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.104.1) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/estree': 0.0.51 @@ -34074,12 +33816,12 @@ snapshots: acorn-walk: 7.2.0 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - core-js: 3.47.0 + core-js: 3.48.0 escodegen: 2.1.0 fs-extra: 9.1.0 global: 4.4.0 html-tags: 3.3.1 - lodash: 4.17.21 + lodash: 4.17.23 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -34090,9 +33832,11 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(webpack-cli@4.10.0) optionalDependencies: '@babel/core': 7.27.7 + '@storybook/builder-webpack5': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/manager-webpack5': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) typescript: 5.8.3 transitivePeerDependencies: - '@storybook/mdx2-csf' @@ -34113,19 +33857,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.103.0))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.103.0))(webpack-hot-middleware@2.26.1)(webpack@5.103.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18)))(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack-hot-middleware@2.26.1)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0) - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.103.0) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/estree': 0.0.51 @@ -34136,12 +33880,12 @@ snapshots: acorn-walk: 7.2.0 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - core-js: 3.47.0 + core-js: 3.48.0 escodegen: 2.1.0 fs-extra: 9.1.0 global: 4.4.0 html-tags: 3.3.1 - lodash: 4.17.21 + lodash: 4.17.23 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -34152,7 +33896,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: '@babel/core': 7.27.7 typescript: 5.8.3 @@ -34175,19 +33919,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.2(webpack@5.103.0))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@5.8.3)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.103.0))(webpack-hot-middleware@2.26.1)(webpack@5.103.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.103.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.103.0) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@5.8.3)(webpack@5.104.1) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@types/estree': 0.0.51 @@ -34198,12 +33942,12 @@ snapshots: acorn-walk: 7.2.0 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - core-js: 3.47.0 + core-js: 3.48.0 escodegen: 2.1.0 fs-extra: 9.1.0 global: 4.4.0 html-tags: 3.3.1 - lodash: 4.17.21 + lodash: 4.17.23 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -34214,7 +33958,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.27.7 typescript: 5.8.3 @@ -34237,19 +33981,19 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.2(webpack@5.103.0))(webpack-hot-middleware@2.26.1)': + '@storybook/react@6.5.16(@babel/core@7.27.7)(@types/webpack@5.28.5)(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(require-from-string@2.0.2)(type-fest@4.41.0)(typescript@4.9.5)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)': dependencies: '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-react': 7.27.1(@babel/core@7.27.7) - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.2(webpack@5.103.0))(webpack-hot-middleware@2.26.1)(webpack@5.103.0) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17(@types/webpack@5.28.5)(react-refresh@0.11.0)(type-fest@4.41.0)(webpack-dev-server@5.2.3(webpack@5.104.1))(webpack-hot-middleware@2.26.1)(webpack@5.104.1) '@storybook/addons': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/client-logger': 6.5.16 - '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.103.0) - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/core': 6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)(webpack@5.104.1) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) '@storybook/csf': 0.0.2--canary.4566f4d.1 '@storybook/docs-tools': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/node-logger': 6.5.16 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.103.0) + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.6.9d540b91e815f8fc2f8829189deb00553559ff63.0(typescript@4.9.5)(webpack@5.104.1) '@storybook/semver': 7.3.2 '@storybook/store': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/estree': 0.0.51 @@ -34260,12 +34004,12 @@ snapshots: acorn-walk: 7.2.0 babel-plugin-add-react-displayname: 0.0.5 babel-plugin-react-docgen: 4.2.1 - core-js: 3.47.0 + core-js: 3.48.0 escodegen: 2.1.0 fs-extra: 9.1.0 global: 4.4.0 html-tags: 3.3.1 - lodash: 4.17.21 + lodash: 4.17.23 prop-types: 15.8.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -34276,7 +34020,7 @@ snapshots: require-from-string: 2.0.2 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: '@babel/core': 7.27.7 typescript: 4.9.5 @@ -34316,7 +34060,7 @@ snapshots: acorn-walk: 7.2.0 escodegen: 2.1.0 html-tags: 3.3.1 - lodash: 4.17.21 + lodash: 4.17.23 prop-types: 15.8.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -34347,7 +34091,7 @@ snapshots: acorn-walk: 7.2.0 escodegen: 2.1.0 html-tags: 3.3.1 - lodash: 4.17.21 + lodash: 4.17.23 prop-types: 15.8.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -34361,42 +34105,42 @@ snapshots: - encoding - supports-color - '@storybook/react@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3)': + '@storybook/react@8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)': dependencies: - '@storybook/components': 8.6.14(storybook@8.6.14(prettier@3.5.3)) + '@storybook/components': 8.6.15(storybook@8.6.15(prettier@3.5.3)) '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.6.14(storybook@8.6.14(prettier@3.5.3)) - '@storybook/preview-api': 8.6.14(storybook@8.6.14(prettier@3.5.3)) - '@storybook/react-dom-shim': 8.6.14(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.14(prettier@3.5.3)) - '@storybook/theming': 8.6.14(storybook@8.6.14(prettier@3.5.3)) + '@storybook/manager-api': 8.6.15(storybook@8.6.15(prettier@3.5.3)) + '@storybook/preview-api': 8.6.15(storybook@8.6.15(prettier@3.5.3)) + '@storybook/react-dom-shim': 8.6.15(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(storybook@8.6.15(prettier@3.5.3)) + '@storybook/theming': 8.6.15(storybook@8.6.15(prettier@3.5.3)) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) optionalDependencies: - '@storybook/test': 8.6.14(storybook@8.6.14(prettier@3.5.3)) + '@storybook/test': 8.6.15(storybook@8.6.15(prettier@3.5.3)) typescript: 5.8.3 - '@storybook/react@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3))(typescript@5.8.3)': + '@storybook/react@8.6.15(@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3)))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.15(prettier@3.5.3))(typescript@5.8.3)': dependencies: - '@storybook/components': 8.6.14(storybook@8.6.14(prettier@3.5.3)) + '@storybook/components': 8.6.15(storybook@8.6.15(prettier@3.5.3)) '@storybook/global': 5.0.0 - '@storybook/manager-api': 8.6.14(storybook@8.6.14(prettier@3.5.3)) - '@storybook/preview-api': 8.6.14(storybook@8.6.14(prettier@3.5.3)) - '@storybook/react-dom-shim': 8.6.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.14(prettier@3.5.3)) - '@storybook/theming': 8.6.14(storybook@8.6.14(prettier@3.5.3)) + '@storybook/manager-api': 8.6.15(storybook@8.6.15(prettier@3.5.3)) + '@storybook/preview-api': 8.6.15(storybook@8.6.15(prettier@3.5.3)) + '@storybook/react-dom-shim': 8.6.15(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(storybook@8.6.15(prettier@3.5.3)) + '@storybook/theming': 8.6.15(storybook@8.6.15(prettier@3.5.3)) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) optionalDependencies: - '@storybook/test': 8.6.14(storybook@8.6.14(prettier@3.5.3)) + '@storybook/test': 8.6.15(storybook@8.6.15(prettier@3.5.3)) typescript: 5.8.3 '@storybook/router@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@storybook/client-logger': 6.5.16 - core-js: 3.47.0 + core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.0 + qs: 6.14.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -34404,9 +34148,9 @@ snapshots: '@storybook/router@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@storybook/client-logger': 6.5.16 - core-js: 3.47.0 + core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.0 + qs: 6.14.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) regenerator-runtime: 0.13.11 @@ -34415,7 +34159,7 @@ snapshots: dependencies: '@storybook/client-logger': 7.4.6 memoizerific: 1.11.3 - qs: 6.14.0 + qs: 6.14.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -34423,13 +34167,13 @@ snapshots: dependencies: '@storybook/client-logger': 7.4.6 memoizerific: 1.11.3 - qs: 6.14.0 + qs: 6.14.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) '@storybook/semver@7.3.2': dependencies: - core-js: 3.47.0 + core-js: 3.48.0 find-up: 4.1.0 '@storybook/source-loader@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': @@ -34437,11 +34181,11 @@ snapshots: '@storybook/addons': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/client-logger': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.47.0 + core-js: 3.48.0 estraverse: 5.3.0 global: 4.4.0 loader-utils: 2.0.4 - lodash: 4.17.21 + lodash: 4.17.23 prettier: 2.3.0 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -34453,10 +34197,10 @@ snapshots: '@storybook/client-logger': 6.5.16 '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.47.0 + core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 - lodash: 4.17.21 + lodash: 4.17.23 memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -34473,10 +34217,10 @@ snapshots: '@storybook/client-logger': 6.5.16 '@storybook/core-events': 6.5.16 '@storybook/csf': 0.0.2--canary.4566f4d.1 - core-js: 3.47.0 + core-js: 3.48.0 fast-deep-equal: 3.1.3 global: 4.4.0 - lodash: 4.17.21 + lodash: 4.17.23 memoizerific: 1.11.3 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -34492,12 +34236,12 @@ snapshots: '@storybook/client-logger': 7.4.6 '@storybook/preview-api': 7.4.6 - '@storybook/telemetry@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/telemetry@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 fs-extra: 9.1.0 @@ -34519,12 +34263,12 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': + '@storybook/telemetry@6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1)': dependencies: '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(@swc/core@1.15.3(@swc/helpers@0.5.17))(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) + '@storybook/core-common': 6.5.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@6.0.1) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 fs-extra: 9.1.0 @@ -34546,12 +34290,12 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': dependencies: '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(eslint@9.26.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 fs-extra: 9.1.0 @@ -34573,12 +34317,12 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)': + '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': dependencies: '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 fs-extra: 9.1.0 @@ -34600,12 +34344,12 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0)': + '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': dependencies: '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(typescript@5.8.3)(webpack-cli@4.10.0) + '@storybook/core-common': 6.5.16(eslint@9.39.2(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) chalk: 4.1.2 - core-js: 3.47.0 + core-js: 3.48.0 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 fs-extra: 9.1.0 @@ -34627,62 +34371,46 @@ snapshots: - vue-template-compiler - webpack-cli - '@storybook/telemetry@6.5.16(encoding@0.1.13)(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5)': + '@storybook/telemetry@7.6.21(encoding@0.1.13)': dependencies: - '@storybook/client-logger': 6.5.16 - '@storybook/core-common': 6.5.16(eslint@9.27.0(jiti@2.6.1))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@4.9.5) + '@storybook/client-logger': 7.6.21 + '@storybook/core-common': 7.6.21(encoding@0.1.13) + '@storybook/csf-tools': 7.6.21 chalk: 4.1.2 - core-js: 3.47.0 detect-package-manager: 2.0.1 fetch-retry: 5.0.6 - fs-extra: 9.1.0 - global: 4.4.0 - isomorphic-unfetch: 3.1.0(encoding@0.1.13) - nanoid: 3.3.11 + fs-extra: 11.3.3 read-pkg-up: 7.0.1 - regenerator-runtime: 0.13.11 transitivePeerDependencies: - - '@swc/core' - encoding - - esbuild - - eslint - - react - - react-dom - supports-color - - typescript - - uglify-js - - vue-template-compiler - - webpack-cli - '@storybook/telemetry@7.6.20(encoding@0.1.13)': + '@storybook/test@8.6.14(storybook@8.6.15(prettier@3.5.3))': dependencies: - '@storybook/client-logger': 7.6.20 - '@storybook/core-common': 7.6.20(encoding@0.1.13) - '@storybook/csf-tools': 7.6.20 - chalk: 4.1.2 - detect-package-manager: 2.0.1 - fetch-retry: 5.0.6 - fs-extra: 11.3.2 - read-pkg-up: 7.0.1 - transitivePeerDependencies: - - encoding - - supports-color + '@storybook/global': 5.0.0 + '@storybook/instrumenter': 8.6.14(storybook@8.6.15(prettier@3.5.3)) + '@testing-library/dom': 10.4.0 + '@testing-library/jest-dom': 6.5.0 + '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) + '@vitest/expect': 2.0.5 + '@vitest/spy': 2.0.5 + storybook: 8.6.15(prettier@3.5.3) - '@storybook/test@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/test@8.6.15(storybook@8.6.15(prettier@3.5.3))': dependencies: '@storybook/global': 5.0.0 - '@storybook/instrumenter': 8.6.14(storybook@8.6.14(prettier@3.5.3)) + '@storybook/instrumenter': 8.6.15(storybook@8.6.15(prettier@3.5.3)) '@testing-library/dom': 10.4.0 '@testing-library/jest-dom': 6.5.0 '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0) '@vitest/expect': 2.0.5 '@vitest/spy': 2.0.5 - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) '@storybook/theming@6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@storybook/client-logger': 6.5.16 - core-js: 3.47.0 + core-js: 3.48.0 memoizerific: 1.11.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -34691,7 +34419,7 @@ snapshots: '@storybook/theming@6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: '@storybook/client-logger': 6.5.16 - core-js: 3.47.0 + core-js: 3.48.0 memoizerific: 1.11.3 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) @@ -34715,9 +34443,9 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@storybook/theming@8.6.14(storybook@8.6.14(prettier@3.5.3))': + '@storybook/theming@8.6.15(storybook@8.6.15(prettier@3.5.3))': dependencies: - storybook: 8.6.14(prettier@3.5.3) + storybook: 8.6.15(prettier@3.5.3) '@storybook/types@7.4.6': dependencies: @@ -34726,9 +34454,9 @@ snapshots: '@types/express': 4.17.25 file-system-cache: 2.3.0 - '@storybook/types@7.6.20': + '@storybook/types@7.6.21': dependencies: - '@storybook/channels': 7.6.20 + '@storybook/channels': 7.6.21 '@types/babel__core': 7.20.5 '@types/express': 4.17.25 file-system-cache: 2.3.0 @@ -34744,9 +34472,9 @@ snapshots: '@storybook/router': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@storybook/semver': 7.3.2 '@storybook/theming': 6.5.16(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - core-js: 3.47.0 + core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.0 + qs: 6.14.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) regenerator-runtime: 0.13.11 @@ -34763,28 +34491,28 @@ snapshots: '@storybook/router': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@storybook/semver': 7.3.2 '@storybook/theming': 6.5.16(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - core-js: 3.47.0 + core-js: 3.48.0 memoizerific: 1.11.3 - qs: 6.14.0 + qs: 6.14.1 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) regenerator-runtime: 0.13.11 resolve-from: 5.0.0 - '@swagger-api/apidom-ast@1.0.0-rc.4': + '@swagger-api/apidom-ast@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-error': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-error': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) unraw: 3.0.0 - '@swagger-api/apidom-core@1.0.0-rc.4': + '@swagger-api/apidom-core@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-ast': 1.0.0-rc.4 - '@swagger-api/apidom-error': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-ast': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 '@types/ramda': 0.30.2 minim: 0.23.8 ramda: 0.30.1 @@ -34792,293 +34520,326 @@ snapshots: short-unique-id: 5.3.2 ts-mixer: 6.0.4 - '@swagger-api/apidom-error@1.0.0-rc.4': + '@swagger-api/apidom-error@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 + '@babel/runtime-corejs3': 7.29.0 - '@swagger-api/apidom-json-pointer@1.0.0-rc.4': + '@swagger-api/apidom-json-pointer@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-error': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 '@swaggerexpert/json-pointer': 2.10.2 - '@swagger-api/apidom-ns-api-design-systems@1.0.0-rc.4': + '@swagger-api/apidom-ns-api-design-systems@1.3.0': + dependencies: + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.3.0 + '@types/ramda': 0.30.2 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + ts-mixer: 6.0.4 + optional: true + + '@swagger-api/apidom-ns-arazzo-1@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-error': 1.0.0-rc.4 - '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-json-schema-2020-12': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-arazzo-1@1.0.0-rc.4': + '@swagger-api/apidom-ns-asyncapi-2@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-ns-json-schema-2020-12': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-json-schema-draft-7': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-asyncapi-2@1.0.0-rc.4': + '@swagger-api/apidom-ns-asyncapi-3@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-ns-json-schema-draft-7': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-asyncapi-2': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-json-schema-2019-09@1.0.0-rc.4': + '@swagger-api/apidom-ns-json-schema-2019-09@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-error': 1.0.0-rc.4 - '@swagger-api/apidom-ns-json-schema-draft-7': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-ns-json-schema-draft-7': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-2020-12@1.0.0-rc.4': + '@swagger-api/apidom-ns-json-schema-2020-12@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-error': 1.0.0-rc.4 - '@swagger-api/apidom-ns-json-schema-2019-09': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-ns-json-schema-2019-09': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-draft-4@1.0.0-rc.4': + '@swagger-api/apidom-ns-json-schema-draft-4@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-ast': 1.0.0-rc.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-ast': 1.3.0 + '@swagger-api/apidom-core': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-draft-6@1.0.0-rc.4': + '@swagger-api/apidom-ns-json-schema-draft-6@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-error': 1.0.0-rc.4 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-ns-json-schema-draft-4': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-json-schema-draft-7@1.0.0-rc.4': + '@swagger-api/apidom-ns-json-schema-draft-7@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-error': 1.0.0-rc.4 - '@swagger-api/apidom-ns-json-schema-draft-6': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-ns-json-schema-draft-6': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-openapi-2@1.0.0-rc.4': + '@swagger-api/apidom-ns-openapi-2@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-error': 1.0.0-rc.4 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-ns-json-schema-draft-4': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 optional: true - '@swagger-api/apidom-ns-openapi-3-0@1.0.0-rc.4': + '@swagger-api/apidom-ns-openapi-3-0@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-error': 1.0.0-rc.4 - '@swagger-api/apidom-ns-json-schema-draft-4': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-ns-json-schema-draft-4': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-ns-openapi-3-1@1.0.0-rc.4': + '@swagger-api/apidom-ns-openapi-3-1@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-ast': 1.0.0-rc.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-json-pointer': 1.0.0-rc.4 - '@swagger-api/apidom-ns-json-schema-2020-12': 1.0.0-rc.4 - '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-ast': 1.3.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-json-pointer': 1.3.0 + '@swagger-api/apidom-ns-json-schema-2020-12': 1.3.0 + '@swagger-api/apidom-ns-openapi-3-0': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) ts-mixer: 6.0.4 - '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.0.0-rc.4': + '@swagger-api/apidom-parser-adapter-api-design-systems-json@1.3.0': + dependencies: + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-api-design-systems': 1.3.0 + '@swagger-api/apidom-parser-adapter-json': 1.3.0 + '@types/ramda': 0.30.2 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + optional: true + + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-ns-api-design-systems': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-api-design-systems': 1.3.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml@1.0.0-rc.4': + '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-ns-api-design-systems': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-arazzo-1': 1.3.0 + '@swagger-api/apidom-parser-adapter-json': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-arazzo-json-1@1.0.0-rc.4': + '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-ns-arazzo-1': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-arazzo-1': 1.3.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1@1.0.0-rc.4': + '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-ns-arazzo-1': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-asyncapi-2': 1.3.0 + '@swagger-api/apidom-parser-adapter-json': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-asyncapi-json-2@1.0.0-rc.4': + '@swagger-api/apidom-parser-adapter-asyncapi-json-3@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-ns-asyncapi-2': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-asyncapi-3': 1.3.0 + '@swagger-api/apidom-parser-adapter-json': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.0.0-rc.4': + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-ns-asyncapi-2': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-asyncapi-2': 1.3.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-json@1.0.0-rc.4': + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-ast': 1.0.0-rc.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-error': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-asyncapi-3': 1.3.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) - tree-sitter: 0.21.1 - tree-sitter-json: 0.24.8(tree-sitter@0.21.1) + optional: true + + '@swagger-api/apidom-parser-adapter-json@1.3.0': + dependencies: + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-ast': 1.3.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 + '@types/ramda': 0.30.2 + ramda: 0.30.1 + ramda-adjunct: 5.1.0(ramda@0.30.1) + tree-sitter: 0.22.4 + tree-sitter-json: 0.24.8(tree-sitter@0.22.4) web-tree-sitter: 0.24.5 optional: true - '@swagger-api/apidom-parser-adapter-openapi-json-2@1.0.0-rc.4': + '@swagger-api/apidom-parser-adapter-openapi-json-2@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-ns-openapi-2': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-openapi-2': 1.3.0 + '@swagger-api/apidom-parser-adapter-json': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.0.0-rc.4': + '@swagger-api/apidom-parser-adapter-openapi-json-3-0@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-openapi-3-0': 1.3.0 + '@swagger-api/apidom-parser-adapter-json': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.0.0-rc.4': + '@swagger-api/apidom-parser-adapter-openapi-json-3-1@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.3.0 + '@swagger-api/apidom-parser-adapter-json': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.0.0-rc.4': + '@swagger-api/apidom-parser-adapter-openapi-yaml-2@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-ns-openapi-2': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-openapi-2': 1.3.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.0.0-rc.4': + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-openapi-3-0': 1.3.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.0.0-rc.4': + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.3.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 '@types/ramda': 0.30.2 ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optional: true - '@swagger-api/apidom-parser-adapter-yaml-1-2@1.0.0-rc.4': + '@swagger-api/apidom-parser-adapter-yaml-1-2@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-ast': 1.0.0-rc.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-error': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-ast': 1.3.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 '@tree-sitter-grammars/tree-sitter-yaml': 0.7.1(tree-sitter@0.22.4) '@types/ramda': 0.30.2 ramda: 0.30.1 @@ -35087,11 +34848,11 @@ snapshots: web-tree-sitter: 0.24.5 optional: true - '@swagger-api/apidom-reference@1.0.0-rc.4': + '@swagger-api/apidom-reference@1.3.0': dependencies: - '@babel/runtime-corejs3': 7.28.4 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-error': 1.0.0-rc.4 + '@babel/runtime-corejs3': 7.29.0 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 '@types/ramda': 0.30.2 axios: 1.12.2 minimatch: 7.4.6 @@ -35099,26 +34860,28 @@ snapshots: ramda: 0.30.1 ramda-adjunct: 5.1.0(ramda@0.30.1) optionalDependencies: - '@swagger-api/apidom-json-pointer': 1.0.0-rc.4 - '@swagger-api/apidom-ns-arazzo-1': 1.0.0-rc.4 - '@swagger-api/apidom-ns-asyncapi-2': 1.0.0-rc.4 - '@swagger-api/apidom-ns-openapi-2': 1.0.0-rc.4 - '@swagger-api/apidom-ns-openapi-3-0': 1.0.0-rc.4 - '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-api-design-systems-json': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-api-design-systems-yaml': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-arazzo-json-1': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-arazzo-yaml-1': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-asyncapi-json-2': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-json': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-openapi-json-2': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-openapi-json-3-0': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-openapi-json-3-1': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-openapi-yaml-2': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1': 1.0.0-rc.4 - '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.0.0-rc.4 + '@swagger-api/apidom-json-pointer': 1.3.0 + '@swagger-api/apidom-ns-arazzo-1': 1.3.0 + '@swagger-api/apidom-ns-asyncapi-2': 1.3.0 + '@swagger-api/apidom-ns-openapi-2': 1.3.0 + '@swagger-api/apidom-ns-openapi-3-0': 1.3.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.3.0 + '@swagger-api/apidom-parser-adapter-api-design-systems-json': 1.3.0 + '@swagger-api/apidom-parser-adapter-api-design-systems-yaml': 1.3.0 + '@swagger-api/apidom-parser-adapter-arazzo-json-1': 1.3.0 + '@swagger-api/apidom-parser-adapter-arazzo-yaml-1': 1.3.0 + '@swagger-api/apidom-parser-adapter-asyncapi-json-2': 1.3.0 + '@swagger-api/apidom-parser-adapter-asyncapi-json-3': 1.3.0 + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-2': 1.3.0 + '@swagger-api/apidom-parser-adapter-asyncapi-yaml-3': 1.3.0 + '@swagger-api/apidom-parser-adapter-json': 1.3.0 + '@swagger-api/apidom-parser-adapter-openapi-json-2': 1.3.0 + '@swagger-api/apidom-parser-adapter-openapi-json-3-0': 1.3.0 + '@swagger-api/apidom-parser-adapter-openapi-json-3-1': 1.3.0 + '@swagger-api/apidom-parser-adapter-openapi-yaml-2': 1.3.0 + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-0': 1.3.0 + '@swagger-api/apidom-parser-adapter-openapi-yaml-3-1': 1.3.0 + '@swagger-api/apidom-parser-adapter-yaml-1-2': 1.3.0 transitivePeerDependencies: - debug @@ -35130,56 +34893,56 @@ snapshots: dependencies: apg-lite: 1.0.5 - '@swc/core-darwin-arm64@1.15.3': + '@swc/core-darwin-arm64@1.15.11': optional: true - '@swc/core-darwin-x64@1.15.3': + '@swc/core-darwin-x64@1.15.11': optional: true - '@swc/core-linux-arm-gnueabihf@1.15.3': + '@swc/core-linux-arm-gnueabihf@1.15.11': optional: true - '@swc/core-linux-arm64-gnu@1.15.3': + '@swc/core-linux-arm64-gnu@1.15.11': optional: true - '@swc/core-linux-arm64-musl@1.15.3': + '@swc/core-linux-arm64-musl@1.15.11': optional: true - '@swc/core-linux-x64-gnu@1.15.3': + '@swc/core-linux-x64-gnu@1.15.11': optional: true - '@swc/core-linux-x64-musl@1.15.3': + '@swc/core-linux-x64-musl@1.15.11': optional: true - '@swc/core-win32-arm64-msvc@1.15.3': + '@swc/core-win32-arm64-msvc@1.15.11': optional: true - '@swc/core-win32-ia32-msvc@1.15.3': + '@swc/core-win32-ia32-msvc@1.15.11': optional: true - '@swc/core-win32-x64-msvc@1.15.3': + '@swc/core-win32-x64-msvc@1.15.11': optional: true - '@swc/core@1.15.3(@swc/helpers@0.5.17)': + '@swc/core@1.15.11(@swc/helpers@0.5.18)': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.25 optionalDependencies: - '@swc/core-darwin-arm64': 1.15.3 - '@swc/core-darwin-x64': 1.15.3 - '@swc/core-linux-arm-gnueabihf': 1.15.3 - '@swc/core-linux-arm64-gnu': 1.15.3 - '@swc/core-linux-arm64-musl': 1.15.3 - '@swc/core-linux-x64-gnu': 1.15.3 - '@swc/core-linux-x64-musl': 1.15.3 - '@swc/core-win32-arm64-msvc': 1.15.3 - '@swc/core-win32-ia32-msvc': 1.15.3 - '@swc/core-win32-x64-msvc': 1.15.3 - '@swc/helpers': 0.5.17 + '@swc/core-darwin-arm64': 1.15.11 + '@swc/core-darwin-x64': 1.15.11 + '@swc/core-linux-arm-gnueabihf': 1.15.11 + '@swc/core-linux-arm64-gnu': 1.15.11 + '@swc/core-linux-arm64-musl': 1.15.11 + '@swc/core-linux-x64-gnu': 1.15.11 + '@swc/core-linux-x64-musl': 1.15.11 + '@swc/core-win32-arm64-msvc': 1.15.11 + '@swc/core-win32-ia32-msvc': 1.15.11 + '@swc/core-win32-x64-msvc': 1.15.11 + '@swc/helpers': 0.5.18 '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.17': + '@swc/helpers@0.5.18': dependencies: tslib: 2.8.1 @@ -35193,7 +34956,7 @@ snapshots: '@tanstack/query-core@4.27.0': {} - '@tanstack/query-core@4.41.0': {} + '@tanstack/query-core@4.43.0': {} '@tanstack/query-core@5.76.0': {} @@ -35201,7 +34964,7 @@ snapshots: '@tanstack/query-core@5.77.1': {} - '@tanstack/query-core@5.90.11': {} + '@tanstack/query-core@5.90.20': {} '@tanstack/query-persist-client-core@4.27.0': dependencies: @@ -35214,7 +34977,7 @@ snapshots: '@tanstack/react-query@4.0.10(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@tanstack/query-core': 4.41.0 + '@tanstack/query-core': 4.43.0 '@types/use-sync-external-store': 0.0.3 react: 18.2.0 use-sync-external-store: 1.6.0(react@18.2.0) @@ -35223,7 +34986,7 @@ snapshots: '@tanstack/react-query@4.0.10(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@tanstack/query-core': 4.41.0 + '@tanstack/query-core': 4.43.0 '@types/use-sync-external-store': 0.0.3 react: 19.1.0 use-sync-external-store: 1.6.0(react@19.1.0) @@ -35253,24 +35016,24 @@ snapshots: '@tanstack/query-core': 5.77.1 react: 18.2.0 - '@tanstack/react-virtual@3.13.12(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@tanstack/react-virtual@3.13.18(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@tanstack/virtual-core': 3.13.12 + '@tanstack/virtual-core': 3.13.18 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@tanstack/react-virtual@3.13.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@tanstack/react-virtual@3.13.18(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@tanstack/virtual-core': 3.13.12 + '@tanstack/virtual-core': 3.13.18 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@tanstack/virtual-core@3.13.12': {} + '@tanstack/virtual-core@3.13.18': {} '@testing-library/dom@10.4.0': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.28.4 + '@babel/code-frame': 7.29.0 + '@babel/runtime': 7.28.6 '@types/aria-query': 5.0.4 aria-query: 5.3.0 chalk: 4.1.2 @@ -35280,8 +35043,8 @@ snapshots: '@testing-library/dom@10.4.1': dependencies: - '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.28.4 + '@babel/code-frame': 7.29.0 + '@babel/runtime': 7.28.6 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -35296,7 +35059,7 @@ snapshots: chalk: 3.0.0 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 - lodash: 4.17.21 + lodash: 4.17.23 redent: 3.0.0 '@testing-library/jest-dom@6.6.4': @@ -35305,13 +35068,13 @@ snapshots: aria-query: 5.3.2 css.escape: 1.5.1 dom-accessibility-api: 0.6.3 - lodash: 4.17.21 + lodash: 4.17.23 picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@18.2.0)(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@testing-library/dom': 10.4.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -35323,19 +35086,19 @@ snapshots: dependencies: '@testing-library/dom': 10.4.0 - '@textlint/ast-node-types@15.4.0': {} + '@textlint/ast-node-types@15.5.1': {} - '@textlint/linter-formatter@15.4.0': + '@textlint/linter-formatter@15.5.1': dependencies: '@azu/format-text': 1.0.2 '@azu/style-format': 1.0.1 - '@textlint/module-interop': 15.4.0 - '@textlint/resolver': 15.4.0 - '@textlint/types': 15.4.0 + '@textlint/module-interop': 15.5.1 + '@textlint/resolver': 15.5.1 + '@textlint/types': 15.5.1 chalk: 4.1.2 debug: 4.4.3(supports-color@8.1.1) js-yaml: 4.1.1 - lodash: 4.17.21 + lodash: 4.17.23 pluralize: 2.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 @@ -35344,13 +35107,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@textlint/module-interop@15.4.0': {} + '@textlint/module-interop@15.5.1': {} - '@textlint/resolver@15.4.0': {} + '@textlint/resolver@15.5.1': {} - '@textlint/types@15.4.0': + '@textlint/types@15.5.1': dependencies: - '@textlint/ast-node-types': 15.4.0 + '@textlint/ast-node-types': 15.5.1 '@tokenizer/token@0.3.0': {} @@ -35389,6 +35152,23 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@twbs/fantasticon@3.1.0': + dependencies: + case: 1.6.3 + commander: 11.1.0 + figures: 3.2.0 + glob: 7.2.3 + handlebars: 4.7.8 + picocolors: 1.1.1 + slugify: 1.6.6 + svg2ttf: 6.0.3 + svgicons2svgfont: 12.0.0 + ttf2eot: 3.1.0 + ttf2woff: 3.0.0 + ttf2woff2: 5.0.0 + transitivePeerDependencies: + - supports-color + '@tybys/wasm-util@0.10.1': dependencies: tslib: 2.8.1 @@ -35398,24 +35178,24 @@ snapshots: '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.5 - '@babel/types': 7.28.5 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 '@types/blueimp-md5@2.18.2': {} @@ -35448,7 +35228,7 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: - '@types/express-serve-static-core': 4.19.7 + '@types/express-serve-static-core': 4.19.8 '@types/node': 22.15.35 '@types/connect@3.4.38': @@ -35501,7 +35281,7 @@ snapshots: '@types/estree@1.0.8': {} - '@types/express-serve-static-core@4.19.7': + '@types/express-serve-static-core@4.19.8': dependencies: '@types/node': 22.15.35 '@types/qs': 6.14.0 @@ -35511,7 +35291,7 @@ snapshots: '@types/express@4.17.25': dependencies: '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.7 + '@types/express-serve-static-core': 4.19.8 '@types/qs': 6.14.0 '@types/serve-static': 1.15.10 @@ -35557,7 +35337,7 @@ snapshots: '@types/html-minifier-terser@6.1.0': {} - '@types/http-cache-semantics@4.0.4': {} + '@types/http-cache-semantics@4.2.0': {} '@types/http-errors@2.0.5': {} @@ -35646,8 +35426,6 @@ snapshots: dependencies: '@types/unist': 3.0.3 - '@types/mdurl@1.0.5': {} - '@types/mdurl@2.0.0': {} '@types/mdx@2.0.13': {} @@ -35677,17 +35455,13 @@ snapshots: '@types/node': 22.15.35 form-data: 4.0.5 - '@types/node-forge@1.3.14': - dependencies: - '@types/node': 22.15.35 - '@types/node@16.18.126': {} '@types/node@18.19.130': dependencies: undici-types: 5.26.5 - '@types/node@20.19.25': + '@types/node@20.19.30': dependencies: undici-types: 6.21.0 @@ -35794,7 +35568,7 @@ snapshots: '@types/scheduler@0.26.0': {} - '@types/selenium-webdriver@4.35.4': + '@types/selenium-webdriver@4.35.5': dependencies: '@types/node': 22.15.35 '@types/ws': 8.18.1 @@ -35875,7 +35649,7 @@ snapshots: '@types/vscode-webview@1.57.5': {} - '@types/vscode@1.106.1': {} + '@types/vscode@1.108.1': {} '@types/webpack-env@1.18.8': {} @@ -35898,7 +35672,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35906,11 +35680,11 @@ snapshots: - webpack-cli optional: true - '@types/webpack@5.28.5(@swc/core@1.15.3(@swc/helpers@0.5.17))': + '@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))': dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35918,11 +35692,11 @@ snapshots: - webpack-cli optional: true - '@types/webpack@5.28.5(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1)': + '@types/webpack@5.28.5(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1)': dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35933,7 +35707,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.103.0(webpack-cli@4.10.0) + webpack: 5.104.1(webpack-cli@4.10.0) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35945,7 +35719,7 @@ snapshots: dependencies: '@types/node': 22.15.35 tapable: 2.3.0 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -35972,11 +35746,11 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0)(typescript@3.9.10)': + '@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10))(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10)': dependencies: - '@typescript-eslint/experimental-utils': 2.34.0(eslint@6.8.0)(typescript@3.9.10) - '@typescript-eslint/parser': 2.34.0(eslint@6.8.0)(typescript@3.9.10) - eslint: 6.8.0 + '@typescript-eslint/experimental-utils': 2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10) + '@typescript-eslint/parser': 2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10) + eslint: 9.39.2(jiti@2.6.1) functional-red-black-tree: 1.0.1 regexpp: 3.2.0 tsutils: 3.21.0(typescript@3.9.10) @@ -35985,390 +35759,90 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@5.48.2(@typescript-eslint/parser@5.48.2(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@typescript-eslint/parser': 5.48.2(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 5.48.2 - '@typescript-eslint/type-utils': 5.48.2(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/utils': 5.48.2(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 - ignore: 5.3.2 - natural-compare-lite: 1.4.0 - regexpp: 3.2.0 - semver: 7.7.3 - tsutils: 3.21.0(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - semver: 7.7.3 - ts-api-utils: 1.4.3(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@8.33.1(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.33.1(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - semver: 7.7.3 - ts-api-utils: 1.4.3(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.27.0(jiti@2.6.1) - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/type-utils': 8.32.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.26.0(jiti@2.6.1) - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/parser': 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.27.0(jiti@2.6.1) - graphemer: 1.4.0 - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@8.33.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.33.1 - '@typescript-eslint/type-utils': 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/utils': 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.33.1 - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.8.3) + ts-api-utils: 2.4.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/experimental-utils@2.34.0(eslint@6.8.0)(typescript@3.9.10)': + '@typescript-eslint/experimental-utils@2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10)': dependencies: '@types/json-schema': 7.0.15 '@typescript-eslint/typescript-estree': 2.34.0(typescript@3.9.10) - eslint: 6.8.0 + eslint: 9.39.2(jiti@2.6.1) eslint-scope: 5.1.1 eslint-utils: 2.1.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10)': + '@typescript-eslint/parser@2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10)': dependencies: '@types/eslint-visitor-keys': 1.0.0 - '@typescript-eslint/experimental-utils': 2.34.0(eslint@6.8.0)(typescript@3.9.10) + '@typescript-eslint/experimental-utils': 2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10) '@typescript-eslint/typescript-estree': 2.34.0(typescript@3.9.10) - eslint: 6.8.0 + eslint: 9.39.2(jiti@2.6.1) eslint-visitor-keys: 1.3.0 optionalDependencies: typescript: 3.9.10 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.48.2(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@typescript-eslint/scope-manager': 5.48.2 - '@typescript-eslint/types': 5.48.2 - '@typescript-eslint/typescript-estree': 5.48.2(typescript@5.8.3) - debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': + '@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.32.1 '@typescript-eslint/types': 8.32.1 '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.32.1 debug: 4.4.3(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.6.1) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.33.1(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.33.1 - '@typescript-eslint/types': 8.33.1 - '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.33.1 - debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.33.1 - '@typescript-eslint/types': 8.33.1 - '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.33.1 - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.26.0(jiti@2.6.1) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.33.1 - '@typescript-eslint/types': 8.33.1 - '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.33.1 - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.6.1) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.33.1(typescript@5.8.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) - '@typescript-eslint/types': 8.33.1 - debug: 4.4.3(supports-color@8.1.1) + eslint: 9.39.2(jiti@2.6.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@5.48.2': - dependencies: - '@typescript-eslint/types': 5.48.2 - '@typescript-eslint/visitor-keys': 5.48.2 - '@typescript-eslint/scope-manager@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - '@typescript-eslint/scope-manager@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - - '@typescript-eslint/scope-manager@7.18.0': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@8.32.1': dependencies: '@typescript-eslint/types': 8.32.1 '@typescript-eslint/visitor-keys': 8.32.1 - '@typescript-eslint/scope-manager@8.33.1': - dependencies: - '@typescript-eslint/types': 8.33.1 - '@typescript-eslint/visitor-keys': 8.33.1 - - '@typescript-eslint/tsconfig-utils@8.33.1(typescript@5.8.3)': - dependencies: - typescript: 5.8.3 - - '@typescript-eslint/type-utils@5.48.2(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@typescript-eslint/typescript-estree': 5.48.2(typescript@5.8.3) - '@typescript-eslint/utils': 5.48.2(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 - tsutils: 3.21.0(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/type-utils@6.21.0(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.3) - debug: 4.4.3(supports-color@8.1.1) - eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/type-utils@8.32.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3) - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.26.0(jiti@2.6.1) - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/type-utils@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) - debug: 4.4.3(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.6.1) - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/type-utils@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/utils': 8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 9.27.0(jiti@2.6.1) - ts-api-utils: 2.1.0(typescript@5.8.3) + eslint: 9.39.2(jiti@2.6.1) + ts-api-utils: 2.4.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@5.48.2': {} - '@typescript-eslint/types@5.62.0': {} - '@typescript-eslint/types@6.21.0': {} - - '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.32.1': {} - '@typescript-eslint/types@8.33.1': {} - '@typescript-eslint/typescript-estree@2.34.0(typescript@3.9.10)': dependencies: debug: 4.4.3(supports-color@8.1.1) eslint-visitor-keys: 1.3.0 glob: 7.2.3 is-glob: 4.0.3 - lodash: 4.17.21 + lodash: 4.17.23 semver: 7.7.3 tsutils: 3.21.0(typescript@3.9.10) optionalDependencies: @@ -36376,20 +35850,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@5.48.2(typescript@5.8.3)': - dependencies: - '@typescript-eslint/types': 5.48.2 - '@typescript-eslint/visitor-keys': 5.48.2 - debug: 4.4.3(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.7.3 - tsutils: 3.21.0(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 5.62.0 @@ -36404,36 +35864,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.8.3)': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.3(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.7.3 - ts-api-utils: 1.4.3(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.3)': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.3(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.3 - ts-api-utils: 1.4.3(typescript@5.8.3) - optionalDependencies: - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.32.1(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 8.32.1 @@ -36443,145 +35873,47 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.3 - ts-api-utils: 2.1.0(typescript@5.8.3) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.33.1(typescript@5.8.3)': - dependencies: - '@typescript-eslint/project-service': 8.33.1(typescript@5.8.3) - '@typescript-eslint/tsconfig-utils': 8.33.1(typescript@5.8.3) - '@typescript-eslint/types': 8.33.1 - '@typescript-eslint/visitor-keys': 8.33.1 - debug: 4.4.3(supports-color@8.1.1) - fast-glob: 3.3.3 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.7.3 - ts-api-utils: 2.1.0(typescript@5.8.3) + ts-api-utils: 2.4.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.48.2(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@types/json-schema': 7.0.15 - '@types/semver': 7.7.1 - '@typescript-eslint/scope-manager': 5.48.2 - '@typescript-eslint/types': 5.48.2 - '@typescript-eslint/typescript-estree': 5.48.2(typescript@5.8.3) - eslint: 8.57.1 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@8.57.1) - semver: 7.7.3 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.8.3)': + '@typescript-eslint/utils@5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@types/json-schema': 7.0.15 '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.3) - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.6.1) eslint-scope: 5.1.1 semver: 7.7.3 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@types/json-schema': 7.0.15 - '@types/semver': 7.7.1 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.8.3) - eslint: 8.57.1 - semver: 7.7.3 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.3) - eslint: 8.57.1 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@8.32.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.26.0(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/types': 8.32.1 - '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) - eslint: 9.26.0(jiti@2.6.1) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.32.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': + '@typescript-eslint/utils@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.27.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.32.1 '@typescript-eslint/types': 8.32.1 '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) - eslint: 9.27.0(jiti@2.6.1) - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.27.0(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.33.1 - '@typescript-eslint/types': 8.33.1 - '@typescript-eslint/typescript-estree': 8.33.1(typescript@5.8.3) - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@5.48.2': - dependencies: - '@typescript-eslint/types': 5.48.2 - eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@5.62.0': dependencies: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 - - '@typescript-eslint/visitor-keys@7.18.0': - dependencies: - '@typescript-eslint/types': 7.18.0 - eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.32.1': dependencies: '@typescript-eslint/types': 8.32.1 eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@8.33.1': - dependencies: - '@typescript-eslint/types': 8.33.1 - eslint-visitor-keys: 4.2.1 - '@typespec/ts-http-runtime@0.3.2': dependencies: http-proxy-agent: 7.0.2 @@ -36593,18 +35925,18 @@ snapshots: '@uiw/codemirror-extensions-basic-setup@4.23.14(@codemirror/lint@6.8.5)': dependencies: '@codemirror/autocomplete': 6.19.1 - '@codemirror/commands': 6.10.0 + '@codemirror/commands': 6.10.1 '@codemirror/language': 6.11.3 '@codemirror/lint': 6.8.5 - '@codemirror/search': 6.5.11 - '@codemirror/state': 6.5.2 + '@codemirror/search': 6.6.0 + '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 '@uiw/react-codemirror@4.23.14(@codemirror/lint@6.8.5)(@codemirror/theme-one-dark@6.1.3)(@codemirror/view@6.38.8)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@babel/runtime': 7.28.4 - '@codemirror/commands': 6.10.0 - '@codemirror/state': 6.5.2 + '@babel/runtime': 7.28.6 + '@codemirror/commands': 6.10.1 + '@codemirror/state': 6.5.4 '@codemirror/theme-one-dark': 6.1.3 '@codemirror/view': 6.38.8 '@uiw/codemirror-extensions-basic-setup': 4.23.14(@codemirror/lint@6.8.5) @@ -36675,7 +36007,7 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vercel/oidc@3.0.5': {} + '@vercel/oidc@3.1.0': {} '@vitest/expect@2.0.5': dependencies: @@ -36714,7 +36046,7 @@ snapshots: '@vscode-logging/types': 2.0.0 fast-safe-stringify: 2.1.1 fs-extra: 11.2.0 - lodash: 4.17.21 + lodash: 4.17.23 stacktrace-js: 2.0.2 streamroller: 3.1.5 triple-beam: 1.4.1 @@ -36732,15 +36064,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@vscode/codicons@0.0.33': {} - - '@vscode/codicons@0.0.36': {} + '@vscode/codicons@0.0.44': {} '@vscode/extension-telemetry@1.0.0(tslib@2.8.1)': dependencies: - '@microsoft/1ds-core-js': 4.3.10(tslib@2.8.1) - '@microsoft/1ds-post-js': 4.3.10(tslib@2.8.1) - '@microsoft/applicationinsights-web-basic': 3.3.10(tslib@2.8.1) + '@microsoft/1ds-core-js': 4.3.11(tslib@2.8.1) + '@microsoft/1ds-post-js': 4.3.11(tslib@2.8.1) + '@microsoft/applicationinsights-web-basic': 3.3.11(tslib@2.8.1) transitivePeerDependencies: - tslib @@ -36801,7 +36131,7 @@ snapshots: '@vscode/vsce-sign': 2.0.9 azure-devops-node-api: 12.5.0 chalk: 2.4.2 - cheerio: 1.1.2 + cheerio: 1.2.0 cockatiel: 3.2.1 commander: 6.2.1 form-data: 4.0.5 @@ -36839,7 +36169,7 @@ snapshots: '@vscode/vsce-sign': 2.0.9 azure-devops-node-api: 12.5.0 chalk: 4.1.2 - cheerio: 1.1.2 + cheerio: 1.2.0 cockatiel: 3.2.1 commander: 12.1.0 form-data: 4.0.5 @@ -36960,69 +36290,69 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.103.0)': + '@webpack-cli/configtest@1.2.0(webpack-cli@4.10.0)(webpack@5.104.1)': dependencies: - webpack: 5.103.0(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.103.0)': + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.104.1)': dependencies: - webpack: 5.103.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.104.1) - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.103.0)': + '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: - webpack: 5.103.0(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.104.1) '@webpack-cli/info@1.5.0(webpack-cli@4.10.0)': dependencies: envinfo: 7.21.0 - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.103.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.103.0)': + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.104.1)': dependencies: - webpack: 5.103.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.104.1) - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.103.0)': + '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: - webpack: 5.103.0(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.104.1) '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)': dependencies: - webpack-cli: 4.10.0(webpack@5.103.0) + webpack-cli: 4.10.0(webpack@5.104.1) - '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)(webpack-dev-server@5.2.2)': + '@webpack-cli/serve@1.7.0(webpack-cli@4.10.0)(webpack-dev-server@5.2.3)': dependencies: - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.103.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@4.10.0)(webpack@5.103.0) + webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.104.1) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack@5.103.0)': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack@5.104.1)': dependencies: - webpack: 5.103.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.103.0) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.103.0)': + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.104.1)': dependencies: - webpack: 5.103.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.104.1) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.103.0)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.104.1)': dependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.103.0) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.103.0) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.103.0)': + '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)': dependencies: - webpack: 5.103.0(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack@5.104.1) '@xmldom/xmldom@0.7.13': {} @@ -37143,19 +36473,19 @@ snapshots: clean-stack: 4.2.0 indent-string: 5.0.0 - ai@5.0.106(zod@3.25.76): + ai@5.0.124(zod@3.25.76): dependencies: - '@ai-sdk/gateway': 2.0.18(zod@3.25.76) - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.18(zod@3.25.76) + '@ai-sdk/gateway': 2.0.30(zod@3.25.76) + '@ai-sdk/provider': 2.0.1 + '@ai-sdk/provider-utils': 3.0.20(zod@3.25.76) '@opentelemetry/api': 1.9.0 zod: 3.25.76 - ai@5.0.106(zod@4.1.11): + ai@6.0.67(zod@4.1.11): dependencies: - '@ai-sdk/gateway': 2.0.18(zod@4.1.11) - '@ai-sdk/provider': 2.0.0 - '@ai-sdk/provider-utils': 3.0.18(zod@4.1.11) + '@ai-sdk/gateway': 3.0.32(zod@4.1.11) + '@ai-sdk/provider': 3.0.7 + '@ai-sdk/provider-utils': 4.0.13(zod@4.1.11) '@opentelemetry/api': 1.9.0 zod: 4.1.11 @@ -37170,7 +36500,7 @@ snapshots: globalthis: 1.0.4 object.entries: 1.1.9 object.fromentries: 2.0.8 - object.getownpropertydescriptors: 2.1.8 + object.getownpropertydescriptors: 2.1.9 object.values: 1.2.1 promise.allsettled: 1.0.7 promise.prototype.finally: 3.1.8 @@ -37224,7 +36554,7 @@ snapshots: amdefine@1.0.1: optional: true - anser@2.3.3: {} + anser@2.3.5: {} ansi-align@2.0.0: dependencies: @@ -37381,7 +36711,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 is-string: 1.1.1 @@ -37403,7 +36733,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -37413,7 +36743,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 es-shim-unscopables: 1.1.0 @@ -37422,14 +36752,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-shim-unscopables: 1.1.0 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-shim-unscopables: 1.1.0 array.prototype.map@1.0.8: @@ -37437,7 +36767,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-array-method-boxes-properly: 1.0.0 es-object-atoms: 1.1.1 is-string: 1.1.1 @@ -37447,7 +36777,7 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-array-method-boxes-properly: 1.0.0 es-errors: 1.3.0 es-object-atoms: 1.1.1 @@ -37457,7 +36787,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 es-shim-unscopables: 1.1.0 @@ -37466,7 +36796,7 @@ snapshots: array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 @@ -37481,6 +36811,12 @@ snapshots: dependencies: safer-buffer: 2.1.2 + asn1js@3.0.7: + dependencies: + pvtsutils: 1.3.6 + pvutils: 1.1.5 + tslib: 2.8.1 + assert-plus@1.0.0: {} assertion-error@1.1.0: {} @@ -37522,7 +36858,7 @@ snapshots: async@2.6.4: dependencies: - lodash: 4.17.21 + lodash: 4.17.23 async@3.2.6: {} @@ -37538,12 +36874,11 @@ snapshots: dependencies: tslib: 2.8.1 - autoprefixer@10.4.22(postcss@8.5.6): + autoprefixer@10.4.24(postcss@8.5.6): dependencies: - browserslist: 4.28.0 - caniuse-lite: 1.0.30001757 + browserslist: 4.28.1 + caniuse-lite: 1.0.30001767 fraction.js: 5.3.4 - normalize-range: 0.1.2 picocolors: 1.1.1 postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -37551,7 +36886,7 @@ snapshots: autoprefixer@6.7.7: dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001757 + caniuse-db: 1.0.30001767 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 5.2.18 @@ -37560,7 +36895,7 @@ snapshots: autoprefixer@7.1.6: dependencies: browserslist: 2.11.3 - caniuse-lite: 1.0.30001757 + caniuse-lite: 1.0.30001767 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 6.0.23 @@ -37568,8 +36903,8 @@ snapshots: autoprefixer@9.8.8: dependencies: - browserslist: 4.28.0 - caniuse-lite: 1.0.30001757 + browserslist: 4.28.1 + caniuse-lite: 1.0.30001767 normalize-range: 0.1.2 num2fraction: 1.2.2 picocolors: 0.2.1 @@ -37588,7 +36923,7 @@ snapshots: aws4fetch@1.0.20: {} - axe-core@4.11.0: {} + axe-core@4.11.1: {} axios@1.12.2: dependencies: @@ -37628,7 +36963,7 @@ snapshots: convert-source-map: 1.9.0 debug: 2.6.9 json5: 0.5.1 - lodash: 4.17.21 + lodash: 4.17.23 minimatch: 3.1.2 path-is-absolute: 1.0.1 private: 0.1.8 @@ -37639,13 +36974,13 @@ snapshots: dependencies: '@babel/core': 7.27.7 - babel-eslint@10.1.0(eslint@6.8.0): + babel-eslint@10.1.0(eslint@9.39.2(jiti@2.6.1)): dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.5 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 - eslint: 6.8.0 + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + eslint: 9.39.2(jiti@2.6.1) eslint-visitor-keys: 1.3.0 resolve: 1.22.11 transitivePeerDependencies: @@ -37658,7 +36993,7 @@ snapshots: babel-types: 6.26.0 detect-indent: 4.0.0 jsesc: 1.3.0 - lodash: 4.17.21 + lodash: 4.17.23 source-map: 0.5.7 trim-right: 1.0.1 @@ -37686,7 +37021,7 @@ snapshots: babel-helper-function-name: 6.24.1 babel-runtime: 6.26.0 babel-types: 6.26.0 - lodash: 4.17.21 + lodash: 4.17.23 babel-helper-explode-assignable-expression@6.24.1: dependencies: @@ -37721,7 +37056,7 @@ snapshots: dependencies: babel-runtime: 6.26.0 babel-types: 6.26.0 - lodash: 4.17.21 + lodash: 4.17.23 babel-helper-remap-async-to-generator@6.24.1: dependencies: @@ -37791,51 +37126,51 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@10.0.0(@babel/core@7.27.7)(webpack@5.103.0): + babel-loader@10.0.0(@babel/core@7.27.7)(webpack@5.104.1): dependencies: '@babel/core': 7.27.7 find-up: 5.0.0 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.103.0): + babel-loader@7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.104.1): dependencies: babel-core: 7.0.0-bridge.0(@babel/core@7.27.7) find-cache-dir: 1.0.0 loader-utils: 1.4.2 mkdirp: 0.5.6 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@babel/core': 7.27.7 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.103.0): + babel-loader@8.4.1(@babel/core@7.27.7)(webpack@5.104.1): dependencies: '@babel/core': 7.27.7 find-cache-dir: 3.3.2 loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@babel/core': 7.27.7 find-cache-dir: 4.0.0 schema-utils: 4.3.3 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.103.0): + babel-loader@9.2.1(@babel/core@7.27.7)(webpack@5.104.1): dependencies: '@babel/core': 7.27.7 find-cache-dir: 4.0.0 schema-utils: 4.3.3 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) babel-messages@6.23.0: dependencies: @@ -37880,7 +37215,7 @@ snapshots: babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -37890,7 +37225,7 @@ snapshots: babel-plugin-istanbul@7.0.1: dependencies: - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 6.0.3 @@ -37904,14 +37239,14 @@ snapshots: babel-plugin-jest-hoist@25.5.0: dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 '@types/babel__traverse': 7.28.0 babel-plugin-jest-hoist@29.6.3: dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 @@ -37921,23 +37256,23 @@ snapshots: babel-plugin-macros@2.8.0: dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 cosmiconfig: 6.0.0 resolve: 1.22.11 babel-plugin-macros@3.1.0: dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 cosmiconfig: 7.1.0 resolve: 1.22.11 babel-plugin-named-exports-order@0.0.2: {} - babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.27.7): + babel-plugin-polyfill-corejs2@0.4.15(@babel/core@7.27.7): dependencies: - '@babel/compat-data': 7.28.5 + '@babel/compat-data': 7.29.0 '@babel/core': 7.27.7 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.27.7) + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.27.7) semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -37946,15 +37281,15 @@ snapshots: dependencies: '@babel/core': 7.27.7 '@babel/helper-define-polyfill-provider': 0.1.5(@babel/core@7.27.7) - core-js-compat: 3.47.0 + core-js-compat: 3.48.0 transitivePeerDependencies: - supports-color babel-plugin-polyfill-corejs3@0.11.1(@babel/core@7.27.7): dependencies: '@babel/core': 7.27.7 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.27.7) - core-js-compat: 3.47.0 + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.27.7) + core-js-compat: 3.48.0 transitivePeerDependencies: - supports-color @@ -37965,17 +37300,17 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.27.7): + babel-plugin-polyfill-regenerator@0.6.6(@babel/core@7.27.7): dependencies: '@babel/core': 7.27.7 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.27.7) + '@babel/helper-define-polyfill-provider': 0.6.6(@babel/core@7.27.7) transitivePeerDependencies: - supports-color babel-plugin-react-docgen@4.2.1: dependencies: ast-types: 0.14.2 - lodash: 4.17.21 + lodash: 4.17.23 react-docgen: 5.4.3 transitivePeerDependencies: - supports-color @@ -38023,7 +37358,7 @@ snapshots: babel-template: 6.26.0 babel-traverse: 6.26.0 babel-types: 6.26.0 - lodash: 4.17.21 + lodash: 4.17.23 babel-plugin-transform-es2015-classes@6.24.1: dependencies: @@ -38210,7 +37545,7 @@ snapshots: '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.7) '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.27.7) '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.27.7) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.27.7) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.27.7) '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.27.7) '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.27.7) '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.27.7) @@ -38318,7 +37653,7 @@ snapshots: babel-runtime: 6.26.0 core-js: 2.6.12 home-or-tmp: 2.0.0 - lodash: 4.17.21 + lodash: 4.17.23 mkdirp: 0.5.6 source-map-support: 0.4.18 @@ -38333,7 +37668,7 @@ snapshots: babel-traverse: 6.26.0 babel-types: 6.26.0 babylon: 6.18.0 - lodash: 4.17.21 + lodash: 4.17.23 babel-traverse@6.26.0: dependencies: @@ -38345,13 +37680,13 @@ snapshots: debug: 2.6.9 globals: 9.18.0 invariant: 2.2.4 - lodash: 4.17.21 + lodash: 4.17.23 babel-types@6.26.0: dependencies: babel-runtime: 6.26.0 esutils: 2.0.3 - lodash: 4.17.21 + lodash: 4.17.23 to-fast-properties: 1.0.3 babylon@6.18.0: {} @@ -38368,7 +37703,7 @@ snapshots: bare-events@2.8.2: {} - bare-fs@4.5.2: + bare-fs@4.5.3: dependencies: bare-events: 2.8.2 bare-path: 3.0.0 @@ -38407,7 +37742,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.8.32: {} + baseline-browser-mapping@2.9.19: {} basic-auth@2.0.1: dependencies: @@ -38476,20 +37811,20 @@ snapshots: http-errors: 2.0.1 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.14.0 + qs: 6.14.1 raw-body: 2.5.3 type-is: 1.6.18 unpipe: 1.0.0 - body-parser@2.2.1: + body-parser@2.2.2: dependencies: bytes: 3.1.2 content-type: 1.0.5 debug: 4.4.3(supports-color@8.1.1) http-errors: 2.0.1 - iconv-lite: 0.7.0 + iconv-lite: 0.7.2 on-finished: 2.4.1 - qs: 6.14.0 + qs: 6.14.1 raw-body: 3.0.2 type-is: 2.0.1 transitivePeerDependencies: @@ -38560,21 +37895,21 @@ snapshots: browserslist@1.7.7: dependencies: - caniuse-db: 1.0.30001757 - electron-to-chromium: 1.5.263 + caniuse-db: 1.0.30001767 + electron-to-chromium: 1.5.283 browserslist@2.11.3: dependencies: - caniuse-lite: 1.0.30001757 - electron-to-chromium: 1.5.263 + caniuse-lite: 1.0.30001767 + electron-to-chromium: 1.5.283 - browserslist@4.28.0: + browserslist@4.28.1: dependencies: - baseline-browser-mapping: 2.8.32 - caniuse-lite: 1.0.30001757 - electron-to-chromium: 1.5.263 + baseline-browser-mapping: 2.9.19 + caniuse-lite: 1.0.30001767 + electron-to-chromium: 1.5.283 node-releases: 2.0.27 - update-browserslist-db: 1.1.4(browserslist@4.28.0) + update-browserslist-db: 1.2.3(browserslist@4.28.1) bs-logger@0.2.6: dependencies: @@ -38632,6 +37967,8 @@ snapshots: bytes@3.1.2: {} + bytestreamjs@2.0.1: {} + c8@10.1.3: dependencies: '@bcoe/v8-coverage': 1.0.2 @@ -38723,31 +38060,31 @@ snapshots: cacheable-request@10.2.14: dependencies: - '@types/http-cache-semantics': 4.0.4 + '@types/http-cache-semantics': 4.2.0 get-stream: 6.0.1 http-cache-semantics: 4.2.0 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.1.0 + normalize-url: 8.1.1 responselike: 3.0.0 cacheable-request@12.0.1: dependencies: - '@types/http-cache-semantics': 4.0.4 + '@types/http-cache-semantics': 4.2.0 get-stream: 9.0.1 http-cache-semantics: 4.2.0 keyv: 4.5.4 mimic-response: 4.0.0 - normalize-url: 8.1.0 + normalize-url: 8.1.1 responselike: 3.0.0 - cacheable@2.3.0: + cacheable@2.3.2: dependencies: - '@cacheable/memory': 2.0.6 - '@cacheable/utils': 2.3.2 - hookified: 1.13.0 - keyv: 5.5.4 - qified: 0.5.2 + '@cacheable/memory': 2.0.7 + '@cacheable/utils': 2.3.3 + hookified: 1.15.1 + keyv: 5.6.0 + qified: 0.6.0 call-bind-apply-helpers@1.0.2: dependencies: @@ -38811,22 +38148,22 @@ snapshots: caniuse-api@1.6.1: dependencies: browserslist: 1.7.7 - caniuse-db: 1.0.30001757 + caniuse-db: 1.0.30001767 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 caniuse-api@3.0.0: dependencies: - browserslist: 4.28.0 - caniuse-lite: 1.0.30001757 + browserslist: 4.28.1 + caniuse-lite: 1.0.30001767 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 - caniuse-db@1.0.30001757: {} + caniuse-db@1.0.30001767: {} - caniuse-lite@1.0.30001757: {} + caniuse-lite@1.0.30001767: {} - canvas@3.2.0: + canvas@3.2.1: dependencies: node-addon-api: 7.1.1 prebuild-install: 7.1.3 @@ -38867,7 +38204,7 @@ snapshots: chai@5.3.3: dependencies: assertion-error: 2.0.1 - check-error: 2.1.1 + check-error: 2.1.3 deep-eql: 5.0.2 loupe: 3.2.1 pathval: 2.0.1 @@ -38920,13 +38257,11 @@ snapshots: chardet@0.4.2: {} - chardet@0.7.0: {} - check-error@1.0.3: dependencies: get-func-name: 2.0.2 - check-error@2.1.1: {} + check-error@2.1.3: {} cheerio-select@2.1.0: dependencies: @@ -38937,18 +38272,18 @@ snapshots: domhandler: 5.0.3 domutils: 3.2.2 - cheerio@1.1.2: + cheerio@1.2.0: dependencies: cheerio-select: 2.1.0 dom-serializer: 2.0.0 domhandler: 5.0.3 domutils: 3.2.2 encoding-sniffer: 0.2.1 - htmlparser2: 10.0.0 + htmlparser2: 10.1.0 parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.16.0 + undici: 7.20.0 whatwg-mimetype: 4.0.0 chokidar@1.7.0: @@ -38992,7 +38327,7 @@ snapshots: ci-info@3.9.0: {} - ci-info@4.3.1: {} + ci-info@4.4.0: {} citty@0.1.6: dependencies: @@ -39000,7 +38335,7 @@ snapshots: cjs-module-lexer@1.4.3: {} - cjs-module-lexer@2.1.1: {} + cjs-module-lexer@2.2.0: {} clap@1.2.3: dependencies: @@ -39032,14 +38367,6 @@ snapshots: cli-boxes@2.2.1: {} - cli-color@2.0.4: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - memoizee: 0.4.17 - timers-ext: 0.1.8 - cli-cursor@2.1.0: dependencies: restore-cursor: 2.0.0 @@ -39065,28 +38392,32 @@ snapshots: cli-truncate@5.1.1: dependencies: slice-ansi: 7.1.2 - string-width: 8.1.0 + string-width: 8.1.1 cli-width@2.2.1: {} - cli-width@3.0.0: {} - client-only@0.0.1: {} clipboard-copy@4.0.1: {} + clipboard-image@0.1.0: + dependencies: + run-jxa: 3.0.0 + clipboardy@4.0.0: dependencies: execa: 8.0.1 is-wsl: 3.1.0 is64bit: 2.0.0 - clipboardy@5.0.1: + clipboardy@5.2.0: dependencies: + clipboard-image: 0.1.0 execa: 9.6.1 is-wayland: 0.1.0 is-wsl: 3.1.0 is64bit: 2.0.0 + powershell-utils: 0.2.0 cliui@3.2.0: dependencies: @@ -39140,10 +38471,10 @@ snapshots: clsx@2.1.1: {} - cm6-theme-basic-light@0.2.0(@codemirror/language@6.11.3)(@codemirror/state@6.5.2)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.3): + cm6-theme-basic-light@0.2.0(@codemirror/language@6.11.3)(@codemirror/state@6.5.4)(@codemirror/view@6.38.8)(@lezer/highlight@1.2.3): dependencies: '@codemirror/language': 6.11.3 - '@codemirror/state': 6.5.2 + '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 '@lezer/highlight': 1.2.3 @@ -39184,11 +38515,11 @@ snapshots: codemirror@6.0.2: dependencies: '@codemirror/autocomplete': 6.19.1 - '@codemirror/commands': 6.10.0 + '@codemirror/commands': 6.10.1 '@codemirror/language': 6.11.3 '@codemirror/lint': 6.8.5 - '@codemirror/search': 6.5.11 - '@codemirror/state': 6.5.2 + '@codemirror/search': 6.6.0 + '@codemirror/state': 6.5.4 '@codemirror/view': 6.38.8 collapse-white-space@1.0.6: {} @@ -39266,7 +38597,7 @@ snapshots: commander@13.1.0: {} - commander@14.0.2: {} + commander@14.0.3: {} commander@2.13.0: {} @@ -39389,14 +38720,14 @@ snapshots: dependencies: toggle-selection: 1.0.6 - copy-webpack-plugin@13.0.1(webpack@5.103.0): + copy-webpack-plugin@13.0.1(webpack@5.104.1): dependencies: glob-parent: 6.0.2 normalize-path: 3.0.0 schema-utils: 4.3.3 serialize-javascript: 6.0.2 tinyglobby: 0.2.15 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) copyfiles@2.4.1: dependencies: @@ -39408,15 +38739,15 @@ snapshots: untildify: 4.0.0 yargs: 16.2.0 - core-js-compat@3.47.0: + core-js-compat@3.48.0: dependencies: - browserslist: 4.28.0 + browserslist: 4.28.1 - core-js-pure@3.47.0: {} + core-js-pure@3.48.0: {} core-js@2.6.12: {} - core-js@3.47.0: {} + core-js@3.48.0: {} core-util-is@1.0.2: {} @@ -39429,7 +38760,7 @@ snapshots: transitivePeerDependencies: - debug - cors@2.8.5: + cors@2.8.6: dependencies: object-assign: 4.1.1 vary: 1.1.2 @@ -39496,7 +38827,7 @@ snapshots: glob2base: 0.0.12 minimatch: 3.1.2 mkdirp: 0.5.6 - resolve: 1.22.11 + resolve: 1.6.0 safe-buffer: 5.2.1 shell-quote: 1.8.3 subarg: 1.0.0 @@ -39517,13 +38848,13 @@ snapshots: dependencies: capture-stack-trace: 1.0.2 - create-jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): + create-jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -39534,7 +38865,7 @@ snapshots: create-require@1.1.1: {} - create-storybook@8.6.14: + create-storybook@8.6.15: dependencies: recast: 0.23.11 semver: 7.7.3 @@ -39585,6 +38916,10 @@ snapshots: crypto-random-string@2.0.0: {} + crypto-random-string@4.0.0: + dependencies: + type-fest: 1.4.0 + css-color-names@0.0.4: {} css-declaration-sorter@6.4.1(postcss@8.5.6): @@ -39610,7 +38945,7 @@ snapshots: postcss-value-parser: 3.3.1 source-list-map: 2.0.1 - css-loader@3.6.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + css-loader@3.6.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: camelcase: 5.3.1 cssesc: 3.0.0 @@ -39625,9 +38960,9 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.1 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - css-loader@3.6.0(webpack@5.103.0): + css-loader@3.6.0(webpack@5.104.1): dependencies: camelcase: 5.3.1 cssesc: 3.0.0 @@ -39642,9 +38977,9 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.1 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - css-loader@5.2.7(webpack@5.103.0): + css-loader@5.2.7(webpack@5.104.1): dependencies: icss-utils: 5.1.0(postcss@8.5.6) loader-utils: 2.0.4 @@ -39656,9 +38991,9 @@ snapshots: postcss-value-parser: 4.2.0 schema-utils: 3.3.0 semver: 7.7.3 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) - css-loader@6.11.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)): + css-loader@6.11.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39669,9 +39004,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.3 optionalDependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - css-loader@6.11.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + css-loader@6.11.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39682,9 +39017,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.3 optionalDependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - css-loader@6.11.0(webpack@5.103.0): + css-loader@6.11.0(webpack@5.104.1): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39695,9 +39030,9 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.3 optionalDependencies: - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) - css-loader@7.1.2(webpack@5.103.0): + css-loader@7.1.3(webpack@5.104.1): dependencies: icss-utils: 5.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -39708,7 +39043,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.7.3 optionalDependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) css-select@4.3.0: dependencies: @@ -39871,7 +39206,7 @@ snapshots: dagre@0.8.5: dependencies: graphlib: 2.1.8 - lodash: 4.17.21 + lodash: 4.17.23 damerau-levenshtein@1.0.8: {} @@ -39956,7 +39291,7 @@ snapshots: decimal.js@10.6.0: {} - decode-named-character-reference@1.2.0: + decode-named-character-reference@1.3.0: dependencies: character-entities: 2.0.2 @@ -39968,7 +39303,7 @@ snapshots: dedent@0.7.0: {} - dedent@1.7.0(babel-plugin-macros@3.1.0): + dedent@1.7.1(babel-plugin-macros@3.1.0): optionalDependencies: babel-plugin-macros: 3.1.0 @@ -39997,7 +39332,7 @@ snapshots: side-channel: 1.1.0 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.19 + which-typed-array: 1.1.20 deep-extend@0.6.0: {} @@ -40128,9 +39463,6 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@1.0.3: - optional: true - detect-libc@2.1.2: {} detect-newline@3.1.0: {} @@ -40159,7 +39491,7 @@ snapshots: dependencies: dequal: 2.0.3 - dexie@4.2.1: {} + dexie@4.3.0: {} diagnostic-channel-publishers@0.3.5(diagnostic-channel@0.2.0): dependencies: @@ -40175,13 +39507,7 @@ snapshots: diff-sequences@29.6.3: {} - diff@3.5.0: {} - - diff@4.0.2: {} - - diff@5.2.0: {} - - diff@7.0.0: {} + diff@8.0.3: {} dir-glob@2.2.2: dependencies: @@ -40294,7 +39620,7 @@ snapshots: downshift@7.6.2(react@18.2.0): dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 compute-scroll-into-view: 2.0.4 prop-types: 15.8.1 react: 18.2.0 @@ -40345,7 +39671,7 @@ snapshots: dependencies: jake: 10.9.4 - electron-to-chromium@1.5.263: {} + electron-to-chromium@1.5.283: {} email-addresses@5.0.0: {} @@ -40357,8 +39683,6 @@ snapshots: emoji-regex@10.6.0: {} - emoji-regex@7.0.3: {} - emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -40369,8 +39693,6 @@ snapshots: enabled@2.0.0: {} - encodeurl@1.0.2: {} - encodeurl@2.0.0: {} encoding-sniffer@0.2.1: @@ -40400,7 +39722,7 @@ snapshots: object-assign: 4.1.1 tapable: 0.2.9 - enhanced-resolve@5.18.3: + enhanced-resolve@5.18.4: dependencies: graceful-fs: 4.2.11 tapable: 2.3.0 @@ -40418,6 +39740,8 @@ snapshots: entities@6.0.1: {} + entities@7.0.1: {} + env-paths@2.2.1: {} envinfo@7.21.0: {} @@ -40440,7 +39764,7 @@ snapshots: dependencies: stackframe: 1.3.4 - es-abstract@1.24.0: + es-abstract@1.24.1: dependencies: array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 @@ -40495,7 +39819,7 @@ snapshots: typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.7 unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 + which-typed-array: 1.1.20 es-array-method-boxes-properly@1.0.0: {} @@ -40515,12 +39839,12 @@ snapshots: isarray: 2.0.5 stop-iteration-iterator: 1.1.0 - es-iterator-helpers@1.2.1: + es-iterator-helpers@1.2.2: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 es-set-tostringtag: 2.1.0 function-bind: 1.1.2 @@ -40536,6 +39860,8 @@ snapshots: es-module-lexer@1.7.0: {} + es-module-lexer@2.0.0: {} + es-object-atoms@1.1.1: dependencies: es-errors: 1.3.0 @@ -40557,7 +39883,7 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es-toolkit@1.42.0: {} + es-toolkit@1.44.0: {} es5-ext@0.10.64: dependencies: @@ -40583,13 +39909,6 @@ snapshots: d: 1.0.2 ext: 1.7.0 - es6-weak-map@2.0.3: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esbuild-plugin-alias@0.2.1: {} esbuild-register@3.6.0(esbuild@0.25.12): @@ -40668,23 +39987,23 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@6.15.0(eslint@6.8.0): + eslint-config-prettier@6.15.0(eslint@9.39.2(jiti@2.6.1)): dependencies: - eslint: 6.8.0 + eslint: 9.39.2(jiti@2.6.1) get-stdin: 6.0.0 - eslint-config-react-app@5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0)(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(babel-eslint@10.1.0(eslint@6.8.0))(eslint-plugin-flowtype@3.13.0(eslint@6.8.0))(eslint-plugin-import@2.32.0(eslint@6.8.0))(eslint-plugin-jsx-a11y@6.10.2(eslint@6.8.0))(eslint-plugin-react-hooks@2.5.1(eslint@6.8.0))(eslint-plugin-react@7.37.5(eslint@6.8.0))(eslint@6.8.0): + eslint-config-react-app@5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10))(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10))(babel-eslint@10.1.0(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-flowtype@3.13.0(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-import@2.32.0(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-react-hooks@2.5.1(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): dependencies: - '@typescript-eslint/eslint-plugin': 2.34.0(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0)(typescript@3.9.10) - '@typescript-eslint/parser': 2.34.0(eslint@6.8.0)(typescript@3.9.10) - babel-eslint: 10.1.0(eslint@6.8.0) + '@typescript-eslint/eslint-plugin': 2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10))(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10) + '@typescript-eslint/parser': 2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10) + babel-eslint: 10.1.0(eslint@9.39.2(jiti@2.6.1)) confusing-browser-globals: 1.0.11 - eslint: 6.8.0 - eslint-plugin-flowtype: 3.13.0(eslint@6.8.0) - eslint-plugin-import: 2.32.0(eslint@6.8.0) - eslint-plugin-jsx-a11y: 6.10.2(eslint@6.8.0) - eslint-plugin-react: 7.37.5(eslint@6.8.0) - eslint-plugin-react-hooks: 2.5.1(eslint@6.8.0) + eslint: 9.39.2(jiti@2.6.1) + eslint-plugin-flowtype: 3.13.0(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-react-hooks: 2.5.1(eslint@9.39.2(jiti@2.6.1)) eslint-import-resolver-node@0.3.9: dependencies: @@ -40692,18 +40011,18 @@ snapshots: is-core-module: 2.16.1 resolve: 1.22.11 - eslint-module-utils@2.12.1(eslint@6.8.0): + eslint-module-utils@2.12.1(eslint@9.39.2(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - eslint: 6.8.0 + eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-flowtype@3.13.0(eslint@6.8.0): + eslint-plugin-flowtype@3.13.0(eslint@9.39.2(jiti@2.6.1)): dependencies: - eslint: 6.8.0 - lodash: 4.17.21 + eslint: 9.39.2(jiti@2.6.1) + lodash: 4.17.23 - eslint-plugin-import@2.32.0(eslint@6.8.0): + eslint-plugin-import@2.32.0(eslint@9.39.2(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -40712,9 +40031,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 6.8.0 + eslint: 9.39.2(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(eslint@6.8.0) + eslint-module-utils: 2.12.1(eslint@9.39.2(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -40726,17 +40045,17 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 - eslint-plugin-jsx-a11y@6.10.2(eslint@6.8.0): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.2(jiti@2.6.1)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 array.prototype.flatmap: 1.3.3 ast-types-flow: 0.0.8 - axe-core: 4.11.0 + axe-core: 4.11.1 axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 6.8.0 + eslint: 9.39.2(jiti@2.6.1) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -40745,73 +40064,39 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-prettier@3.4.1(eslint-config-prettier@6.15.0(eslint@6.8.0))(eslint@6.8.0)(prettier@1.19.1): + eslint-plugin-prettier@3.4.1(eslint-config-prettier@6.15.0(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(prettier@1.19.1): dependencies: - eslint: 6.8.0 + eslint: 9.39.2(jiti@2.6.1) prettier: 1.19.1 - prettier-linter-helpers: 1.0.0 + prettier-linter-helpers: 1.0.1 optionalDependencies: - eslint-config-prettier: 6.15.0(eslint@6.8.0) - - eslint-plugin-react-hooks@2.5.1(eslint@6.8.0): - dependencies: - eslint: 6.8.0 - - eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-react-hooks@5.2.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-react-hooks@5.2.0(eslint@9.26.0(jiti@2.6.1)): - dependencies: - eslint: 9.26.0(jiti@2.6.1) + eslint-config-prettier: 6.15.0(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-react-hooks@5.2.0(eslint@9.27.0(jiti@2.6.1)): + eslint-plugin-react-hooks@2.5.1(eslint@9.39.2(jiti@2.6.1)): dependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-react-refresh@0.4.24(eslint@8.57.1): + eslint-plugin-react-hooks@4.6.2(eslint@9.39.2(jiti@2.6.1)): dependencies: - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-react-refresh@0.4.24(eslint@9.27.0(jiti@2.6.1)): + eslint-plugin-react-hooks@5.2.0(eslint@9.39.2(jiti@2.6.1)): dependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-react@7.37.5(eslint@6.8.0): + eslint-plugin-react-refresh@0.4.26(eslint@9.39.2(jiti@2.6.1)): dependencies: - array-includes: 3.1.9 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.3 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.2.1 - eslint: 6.8.0 - estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.9 - object.fromentries: 2.0.8 - object.values: 1.2.1 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.12 - string.prototype.repeat: 1.0.0 + eslint: 9.39.2(jiti@2.6.1) - eslint-plugin-react@7.37.5(eslint@8.57.1): + eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.6.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.2.1 - eslint: 8.57.1 + es-iterator-helpers: 1.2.2 + eslint: 9.39.2(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -40825,166 +40110,57 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-storybook@0.8.0(eslint@8.57.1)(typescript@5.8.3): + eslint-plugin-storybook@0.8.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3): dependencies: '@storybook/csf': 0.0.1 - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3) - eslint: 8.57.1 + '@typescript-eslint/utils': 5.62.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) + eslint: 9.39.2(jiti@2.6.1) requireindex: 1.2.0 ts-dedent: 2.2.0 transitivePeerDependencies: - supports-color - typescript - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1)): + eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1)): dependencies: - eslint: 9.26.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3) - - eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1)): - dependencies: - eslint: 9.27.0(jiti@2.6.1) - optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.33.1(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3))(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3) + '@typescript-eslint/eslint-plugin': 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3))(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3) eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-utils@1.4.3: - dependencies: - eslint-visitor-keys: 1.3.0 - eslint-utils@2.1.0: dependencies: eslint-visitor-keys: 1.3.0 - eslint-utils@3.0.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 2.1.0 - eslint-visitor-keys@1.3.0: {} - eslint-visitor-keys@2.1.0: {} - eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.2.1: {} - eslint@6.8.0: - dependencies: - '@babel/code-frame': 7.27.1 - ajv: 6.12.6 - chalk: 2.4.2 - cross-spawn: 6.0.6 - debug: 4.4.3(supports-color@8.1.1) - doctrine: 3.0.0 - eslint-scope: 5.1.1 - eslint-utils: 1.4.3 - eslint-visitor-keys: 1.3.0 - espree: 6.2.1 - esquery: 1.6.0 - esutils: 2.0.3 - file-entry-cache: 5.0.1 - functional-red-black-tree: 1.0.1 - glob-parent: 5.1.2 - globals: 12.4.0 - ignore: 4.0.6 - import-fresh: 3.3.1 - imurmurhash: 0.1.4 - inquirer: 7.3.3 - is-glob: 4.0.3 - js-yaml: 4.1.1 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.3.0 - lodash: 4.17.21 - minimatch: 3.1.2 - mkdirp: 0.5.6 - natural-compare: 1.4.0 - optionator: 0.8.3 - progress: 2.0.3 - regexpp: 2.0.1 - semver: 6.3.1 - strip-ansi: 5.2.0 - strip-json-comments: 3.1.1 - table: 5.4.6 - text-table: 0.2.0 - v8-compile-cache: 2.4.0 - transitivePeerDependencies: - - supports-color - - eslint@8.57.1: - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.2 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.3.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@8.1.1) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.1 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - eslint@9.26.0(jiti@2.6.1): + eslint@9.39.2(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.26.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.20.1 - '@eslint/config-helpers': 0.2.3 - '@eslint/core': 0.13.0 + '@eslint/config-array': 0.21.1 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 '@eslint/eslintrc': 3.3.3 - '@eslint/js': 9.26.0 + '@eslint/js': 9.39.2 '@eslint/plugin-kit': 0.3.5 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 - '@modelcontextprotocol/sdk': 1.24.0 '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 @@ -40993,51 +40169,7 @@ snapshots: eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - 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.4 - zod: 3.25.76 - optionalDependencies: - jiti: 2.6.1 - transitivePeerDependencies: - - '@cfworker/json-schema' - - supports-color - - eslint@9.27.0(jiti@2.6.1): - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.27.0(jiti@2.6.1)) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.20.1 - '@eslint/config-helpers': 0.2.3 - '@eslint/core': 0.14.0 - '@eslint/eslintrc': 3.3.3 - '@eslint/js': 9.27.0 - '@eslint/plugin-kit': 0.3.5 - '@humanfs/node': 0.16.7 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3(supports-color@8.1.1) - escape-string-regexp: 4.0.0 - eslint-scope: 8.4.0 - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 - esquery: 1.6.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -41069,23 +40201,11 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 - espree@6.2.1: - dependencies: - acorn: 7.4.1 - acorn-jsx: 5.3.2(acorn@7.4.1) - eslint-visitor-keys: 1.3.0 - - espree@9.6.1: - dependencies: - acorn: 8.15.0 - acorn-jsx: 5.3.2(acorn@8.15.0) - eslint-visitor-keys: 3.4.3 - esprima@2.7.3: {} esprima@4.0.1: {} - esquery@1.6.0: + esquery@1.7.0: dependencies: estraverse: 5.3.0 @@ -41101,8 +40221,8 @@ snapshots: estree-to-babel@3.2.1: dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 c8: 7.14.0 transitivePeerDependencies: - supports-color @@ -41139,7 +40259,7 @@ snapshots: eventemitter3@4.0.7: {} - eventemitter3@5.0.1: {} + eventemitter3@5.0.4: {} events-universal@1.0.1: dependencies: @@ -41325,11 +40445,11 @@ snapshots: parseurl: 1.3.3 path-to-regexp: 0.1.12 proxy-addr: 2.0.7 - qs: 6.14.0 + qs: 6.14.1 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.19.1 - serve-static: 1.16.2 + send: 0.19.2 + serve-static: 1.16.3 setprototypeof: 1.2.0 statuses: 2.0.2 type-is: 1.6.18 @@ -41339,7 +40459,7 @@ snapshots: express@5.2.1: dependencies: accepts: 2.0.0 - body-parser: 2.2.1 + body-parser: 2.2.2 content-disposition: 1.0.1 content-type: 1.0.5 cookie: 0.7.2 @@ -41358,11 +40478,11 @@ snapshots: once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.14.0 + qs: 6.14.1 range-parser: 1.2.1 router: 2.2.0 - send: 1.2.0 - serve-static: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 statuses: 2.0.2 type-is: 2.0.1 vary: 1.1.2 @@ -41386,18 +40506,12 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.0.33 - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - - extract-text-webpack-plugin@3.0.2(webpack@5.103.0): + extract-text-webpack-plugin@3.0.2(webpack@5.104.1): dependencies: async: 2.6.4 loader-utils: 1.4.2 schema-utils: 0.3.0 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-sources: 1.4.3 extract-zip@1.7.0: @@ -41409,22 +40523,6 @@ snapshots: extsprintf@1.3.0: {} - fantasticon@3.0.0: - dependencies: - case: 1.6.3 - cli-color: 2.0.4 - commander: 12.1.0 - glob: 10.5.0 - handlebars: 4.7.8 - slugify: 1.6.6 - svg2ttf: 6.0.3 - svgicons2svgfont: 12.0.0 - ttf2eot: 3.1.0 - ttf2woff: 3.0.0 - ttf2woff2: 5.0.0 - transitivePeerDependencies: - - supports-color - fast-deep-equal@1.1.0: {} fast-deep-equal@3.1.3: {} @@ -41462,15 +40560,15 @@ snapshots: fast-uri@3.1.0: {} - fast-xml-parser@5.2.5: + fast-xml-parser@5.3.4: dependencies: - strnum: 2.1.1 + strnum: 2.1.2 fastest-levenshtein@1.0.16: {} fastparse@1.1.2: {} - fastq@1.19.1: + fastq@1.20.1: dependencies: reusify: 1.1.0 @@ -41547,17 +40645,9 @@ snapshots: dependencies: is-unicode-supported: 2.1.0 - file-entry-cache@11.1.1: + file-entry-cache@11.1.2: dependencies: - flat-cache: 6.1.19 - - file-entry-cache@5.0.1: - dependencies: - flat-cache: 2.0.1 - - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 + flat-cache: 6.1.20 file-entry-cache@8.0.0: dependencies: @@ -41569,23 +40659,23 @@ snapshots: minimatch: 3.1.2 proper-lockfile: 1.2.0 - file-loader@1.1.5(webpack@5.103.0): + file-loader@1.1.5(webpack@5.104.1): dependencies: loader-utils: 1.4.2 schema-utils: 0.3.0 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - file-loader@6.2.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + file-loader@6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - file-loader@6.2.0(webpack@5.103.0): + file-loader@6.2.0(webpack@5.104.1): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) file-system-cache@1.1.0: dependencies: @@ -41611,7 +40701,7 @@ snapshots: dependencies: bluebird: 3.7.2 file-js: 0.3.0 - lodash: 4.17.21 + lodash: 4.17.23 minimatch: 5.1.6 moment: 2.30.1 unit-compare: 1.0.1 @@ -41727,12 +40817,6 @@ snapshots: path-exists: 5.0.0 unicorn-magic: 0.1.0 - flat-cache@2.0.1: - dependencies: - flatted: 2.0.2 - rimraf: 2.6.3 - write: 1.0.3 - flat-cache@3.2.0: dependencies: flatted: 3.3.3 @@ -41744,21 +40828,19 @@ snapshots: flatted: 3.3.3 keyv: 4.5.4 - flat-cache@6.1.19: + flat-cache@6.1.20: dependencies: - cacheable: 2.3.0 + cacheable: 2.3.2 flatted: 3.3.3 - hookified: 1.13.0 + hookified: 1.15.1 flat@5.0.2: {} - flatted@2.0.2: {} - flatted@3.3.3: {} flatten@1.0.3: {} - flow-parser@0.291.0: {} + flow-parser@0.299.0: {} flush-write-stream@1.1.1: dependencies: @@ -41793,7 +40875,7 @@ snapshots: forever-agent@0.6.1: {} - fork-ts-checker-webpack-plugin@0.2.10(typescript@5.8.3)(webpack@5.103.0): + fork-ts-checker-webpack-plugin@0.2.10(typescript@5.8.3)(webpack@5.104.1): dependencies: babel-code-frame: 6.26.0 chalk: 1.1.3 @@ -41804,11 +40886,11 @@ snapshots: lodash.startswith: 4.2.1 minimatch: 3.1.2 typescript: 5.8.3 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) fork-ts-checker-webpack-plugin@4.1.6: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 chalk: 2.4.2 micromatch: 4.0.8 minimatch: 3.1.2 @@ -41816,29 +40898,9 @@ snapshots: tapable: 1.1.3 worker-rpc: 0.1.1 - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.26.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.103.0): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5)(webpack@5.104.1): dependencies: - '@babel/code-frame': 7.27.1 - '@types/json-schema': 7.0.15 - chalk: 4.1.2 - chokidar: 3.6.0 - cosmiconfig: 6.0.0 - deepmerge: 4.3.1 - fs-extra: 9.1.0 - glob: 7.2.3 - memfs: 3.5.3 - minimatch: 3.1.2 - schema-utils: 2.7.0 - semver: 7.7.3 - tapable: 1.1.3 - typescript: 5.8.3 - webpack: 5.103.0(webpack-cli@5.1.4) - optionalDependencies: - eslint: 9.26.0(jiti@2.6.1) - - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@4.9.5)(webpack@5.103.0): - dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 '@types/json-schema': 7.0.15 chalk: 4.1.2 chokidar: 3.6.0 @@ -41852,13 +40914,13 @@ snapshots: semver: 7.7.3 tapable: 1.1.3 typescript: 4.9.5 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 '@types/json-schema': 7.0.15 chalk: 4.1.2 chokidar: 3.6.0 @@ -41872,13 +40934,13 @@ snapshots: semver: 7.7.3 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) - fork-ts-checker-webpack-plugin@6.5.3(eslint@9.27.0(jiti@2.6.1))(typescript@5.8.3)(webpack@5.103.0): + fork-ts-checker-webpack-plugin@6.5.3(eslint@9.39.2(jiti@2.6.1))(typescript@5.8.3)(webpack@5.104.1): dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 '@types/json-schema': 7.0.15 chalk: 4.1.2 chokidar: 3.6.0 @@ -41892,13 +40954,13 @@ snapshots: semver: 7.7.3 tapable: 1.1.3 typescript: 5.8.3 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: - eslint: 9.27.0(jiti@2.6.1) + eslint: 9.39.2(jiti@2.6.1) - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 chalk: 4.1.2 chokidar: 3.6.0 cosmiconfig: 7.1.0 @@ -41911,11 +40973,11 @@ snapshots: semver: 7.7.3 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 chalk: 4.1.2 chokidar: 3.6.0 cosmiconfig: 7.1.0 @@ -41928,11 +40990,11 @@ snapshots: semver: 7.7.3 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.103.0): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.8.3)(webpack@5.104.1): dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 chalk: 4.1.2 chokidar: 3.6.0 cosmiconfig: 7.1.0 @@ -41945,11 +41007,11 @@ snapshots: semver: 7.7.3 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.103.0): + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.8.3)(webpack@5.104.1): dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 chalk: 4.1.2 chokidar: 4.0.3 cosmiconfig: 8.3.6(typescript@5.8.3) @@ -41962,7 +41024,7 @@ snapshots: semver: 7.7.3 tapable: 2.3.0 typescript: 5.8.3 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) form-data-encoder@2.1.4: {} @@ -42038,7 +41100,7 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 - fs-extra@11.3.2: + fs-extra@11.3.3: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.0 @@ -42087,7 +41149,7 @@ snapshots: fsevents@1.2.13: dependencies: bindings: 1.5.0 - nan: 2.23.1 + nan: 2.25.0 optional: true fsevents@2.3.2: @@ -42240,7 +41302,7 @@ snapshots: email-addresses: 5.0.0 filenamify: 4.3.0 find-cache-dir: 3.3.2 - fs-extra: 11.3.2 + fs-extra: 11.3.3 globby: 11.1.0 giget@1.2.5: @@ -42367,14 +41429,6 @@ snapshots: min-document: 2.19.2 process: 0.11.10 - globals@12.4.0: - dependencies: - type-fest: 0.8.1 - - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - globals@14.0.0: {} globals@9.18.0: {} @@ -42454,7 +41508,7 @@ snapshots: got@14.4.7: dependencies: - '@sindresorhus/is': 7.1.1 + '@sindresorhus/is': 7.2.0 '@szmarczak/http-timer': 5.0.1 cacheable-lookup: 7.0.0 cacheable-request: 12.0.1 @@ -42505,7 +41559,7 @@ snapshots: graphlib@2.1.8: dependencies: - lodash: 4.17.21 + lodash: 4.17.23 graphql-language-service@5.5.0(graphql@16.12.0): dependencies: @@ -42587,9 +41641,9 @@ snapshots: has@1.0.4: {} - hashery@1.3.0: + hashery@1.4.0: dependencies: - hookified: 1.13.0 + hookified: 1.15.1 hasown@2.0.2: dependencies: @@ -42678,12 +41732,12 @@ snapshots: '@types/unist': 3.0.3 '@ungap/structured-clone': 1.3.0 hast-util-from-parse5: 8.0.3 - hast-util-to-parse5: 8.0.0 + hast-util-to-parse5: 8.0.1 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.1 parse5: 7.3.0 unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 web-namespaces: 2.0.1 zwitch: 2.0.4 @@ -42725,12 +41779,12 @@ snapshots: web-namespaces: 2.0.1 zwitch: 2.0.4 - hast-util-to-parse5@8.0.0: + hast-util-to-parse5@8.0.1: dependencies: '@types/hast': 3.0.4 comma-separated-tokens: 2.0.3 devlop: 1.1.0 - property-information: 6.5.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 @@ -42788,7 +41842,7 @@ snapshots: dependencies: parse-passwd: 1.0.0 - hookified@1.13.0: {} + hookified@1.15.1: {} hosted-git-info@2.8.9: {} @@ -42841,7 +41895,7 @@ snapshots: he: 1.2.0 param-case: 3.0.4 relateurl: 0.2.7 - terser: 5.44.1 + terser: 5.46.0 html-minifier@3.5.21: dependencies: @@ -42865,78 +41919,78 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@2.29.0(webpack@5.103.0): + html-webpack-plugin@2.29.0(webpack@5.104.1): dependencies: bluebird: 3.7.2 html-minifier: 3.5.21 loader-utils: 0.2.17 - lodash: 4.17.21 + lodash: 4.17.23 pretty-error: 2.1.2 toposort: 1.0.7 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - html-webpack-plugin@4.5.2(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + html-webpack-plugin@4.5.2(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@types/html-minifier-terser': 5.1.2 '@types/tapable': 1.0.12 '@types/webpack': 4.41.40 html-minifier-terser: 5.1.1 loader-utils: 1.4.2 - lodash: 4.17.21 + lodash: 4.17.23 pretty-error: 2.1.2 tapable: 1.1.3 util.promisify: 1.0.0 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - html-webpack-plugin@4.5.2(webpack@5.103.0): + html-webpack-plugin@4.5.2(webpack@5.104.1): dependencies: '@types/html-minifier-terser': 5.1.2 '@types/tapable': 1.0.12 '@types/webpack': 4.41.40 html-minifier-terser: 5.1.1 loader-utils: 1.4.2 - lodash: 4.17.21 + lodash: 4.17.23 pretty-error: 2.1.2 tapable: 1.1.3 util.promisify: 1.0.0 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - html-webpack-plugin@5.6.5(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)): + html-webpack-plugin@5.6.6(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 - lodash: 4.17.21 + lodash: 4.17.23 pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - html-webpack-plugin@5.6.5(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + html-webpack-plugin@5.6.6(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 - lodash: 4.17.21 + lodash: 4.17.23 pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - html-webpack-plugin@5.6.5(webpack@5.103.0): + html-webpack-plugin@5.6.6(webpack@5.104.1): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 - lodash: 4.17.21 + lodash: 4.17.23 pretty-error: 4.0.0 tapable: 2.3.0 optionalDependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - htmlparser2@10.0.0: + htmlparser2@10.1.0: dependencies: domelementtype: 2.3.0 domhandler: 5.0.3 domutils: 3.2.2 - entities: 6.0.1 + entities: 7.0.1 htmlparser2@6.1.0: dependencies: @@ -42949,19 +42003,12 @@ snapshots: http-deceiver@1.2.7: {} - http-errors@1.6.3: + http-errors@1.8.1: dependencies: depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: 1.5.0 - - http-errors@2.0.0: - dependencies: - depd: 2.0.0 inherits: 2.0.4 setprototypeof: 1.2.0 - statuses: 2.0.1 + statuses: 1.5.0 toidentifier: 1.0.1 http-errors@2.0.1: @@ -43076,7 +42123,7 @@ snapshots: human-signals@8.0.1: {} - humanize-duration@3.33.1: {} + humanize-duration@3.33.2: {} humanize-ms@1.2.1: dependencies: @@ -43101,7 +42148,7 @@ snapshots: dependencies: safer-buffer: 2.1.2 - iconv-lite@0.7.0: + iconv-lite@0.7.2: dependencies: safer-buffer: 2.1.2 @@ -43198,7 +42245,7 @@ snapshots: cli-width: 2.2.1 external-editor: 2.2.0 figures: 2.0.0 - lodash: 4.17.21 + lodash: 4.17.23 mute-stream: 0.0.7 run-async: 2.4.1 rx-lite: 4.0.8 @@ -43207,22 +42254,6 @@ snapshots: strip-ansi: 4.0.0 through: 2.3.8 - inquirer@7.3.3: - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - run-async: 2.4.1 - rxjs: 6.6.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - internal-slot@1.1.0: dependencies: es-errors: 1.3.0 @@ -43496,8 +42527,6 @@ snapshots: is-primitive@3.0.1: {} - is-promise@2.2.2: {} - is-promise@4.0.0: {} is-redirect@1.0.0: {} @@ -43548,7 +42577,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.19 + which-typed-array: 1.1.20 is-typedarray@1.0.0: {} @@ -43624,9 +42653,9 @@ snapshots: transitivePeerDependencies: - encoding - isomorphic-ws@5.0.0(ws@8.18.3): + isomorphic-ws@5.0.0(ws@8.19.0): dependencies: - ws: 8.18.3 + ws: 8.19.0 isstream@0.1.2: {} @@ -43674,7 +42703,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.27.7 - '@babel/parser': 7.28.5 + '@babel/parser': 7.29.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -43684,7 +42713,7 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: '@babel/core': 7.27.7 - '@babel/parser': 7.28.5 + '@babel/parser': 7.29.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.7.3 @@ -43821,7 +42850,7 @@ snapshots: '@types/node': 22.15.35 chalk: 4.1.2 co: 4.6.0 - dedent: 1.7.0(babel-plugin-macros@3.1.0) + dedent: 1.7.1(babel-plugin-macros@3.1.0) is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -43847,7 +42876,7 @@ snapshots: '@types/node': 22.15.35 chalk: 4.1.2 co: 4.6.0 - dedent: 1.7.0(babel-plugin-macros@3.1.0) + dedent: 1.7.1(babel-plugin-macros@3.1.0) is-generator-fn: 2.1.0 jest-each: 30.2.0 jest-matcher-utils: 30.2.0 @@ -43919,16 +42948,16 @@ snapshots: - supports-color - utf-8-validate - jest-cli@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): + jest-cli@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + create-jest: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + jest-config: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -43938,15 +42967,15 @@ snapshots: - supports-color - ts-node - jest-cli@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): + jest-cli@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: - '@jest/core': 30.2.0(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + '@jest/core': 30.2.0(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) '@jest/test-result': 30.2.0 '@jest/types': 30.2.0 chalk: 4.1.2 exit-x: 0.2.2 import-local: 3.2.0 - jest-config: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + jest-config: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-util: 30.2.0 jest-validate: 30.2.0 yargs: 17.7.2 @@ -44011,7 +43040,7 @@ snapshots: - supports-color - utf-8-validate - jest-config@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): + jest-config@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: '@babel/core': 7.27.7 '@jest/test-sequencer': 29.7.0 @@ -44037,12 +43066,12 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 22.15.35 - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - jest-config@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): + jest-config@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: '@babel/core': 7.27.7 '@jest/get-type': 30.1.0 @@ -44051,7 +43080,7 @@ snapshots: '@jest/types': 30.2.0 babel-jest: 30.2.0(@babel/core@7.27.7) chalk: 4.1.2 - ci-info: 4.3.1 + ci-info: 4.4.0 deepmerge: 4.3.1 glob: 10.5.0 graceful-fs: 4.2.11 @@ -44071,7 +43100,7 @@ snapshots: optionalDependencies: '@types/node': 22.15.35 esbuild-register: 3.6.0(esbuild@0.25.12) - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -44079,14 +43108,14 @@ snapshots: jest-diff@20.0.3: dependencies: chalk: 1.1.3 - diff: 3.5.0 + diff: 8.0.3 jest-matcher-utils: 20.0.3 pretty-format: 20.0.3 jest-diff@22.4.3: dependencies: chalk: 2.4.2 - diff: 3.5.0 + diff: 8.0.3 jest-get-type: 22.4.3 pretty-format: 22.4.3 @@ -44336,7 +43365,7 @@ snapshots: jest-jasmine2@25.5.4: dependencies: - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.29.0 '@jest/environment': 25.5.0 '@jest/source-map': 25.5.0 '@jest/test-result': 25.5.0 @@ -44421,7 +43450,7 @@ snapshots: jest-message-util@22.4.3: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 chalk: 2.4.2 micromatch: 4.0.8 slash: 1.0.0 @@ -44429,7 +43458,7 @@ snapshots: jest-message-util@25.5.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 '@jest/types': 25.5.0 '@types/stack-utils': 1.0.1 chalk: 3.0.0 @@ -44440,7 +43469,7 @@ snapshots: jest-message-util@29.7.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -44452,7 +43481,7 @@ snapshots: jest-message-util@30.2.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 '@jest/types': 30.2.0 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -44534,7 +43563,7 @@ snapshots: dependencies: browser-resolve: 1.11.3 is-builtin-module: 1.0.0 - resolve: 1.22.11 + resolve: 1.6.0 jest-resolve@22.4.3: dependencies: @@ -44746,7 +43775,7 @@ snapshots: '@jest/types': 30.2.0 '@types/node': 22.15.35 chalk: 4.1.2 - cjs-module-lexer: 2.1.1 + cjs-module-lexer: 2.2.0 collect-v8-coverage: 1.0.3 glob: 10.5.0 graceful-fs: 4.2.11 @@ -44791,7 +43820,7 @@ snapshots: jest-snapshot@25.5.1: dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.29.0 '@jest/types': 25.5.0 '@types/prettier': 1.19.1 chalk: 3.0.0 @@ -44810,10 +43839,10 @@ snapshots: jest-snapshot@29.7.0: dependencies: '@babel/core': 7.27.7 - '@babel/generator': 7.28.5 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/types': 7.28.5 + '@babel/generator': 7.29.0 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.27.7) + '@babel/types': 7.29.0 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 @@ -44835,10 +43864,10 @@ snapshots: jest-snapshot@30.2.0: dependencies: '@babel/core': 7.27.7 - '@babel/generator': 7.28.5 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/types': 7.28.5 + '@babel/generator': 7.29.0 + '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.27.7) + '@babel/types': 7.29.0 '@jest/expect-utils': 30.2.0 '@jest/get-type': 30.1.0 '@jest/snapshot-utils': 30.2.0 @@ -44854,7 +43883,7 @@ snapshots: jest-util: 30.2.0 pretty-format: 30.2.0 semver: 7.7.3 - synckit: 0.11.11 + synckit: 0.11.12 transitivePeerDependencies: - supports-color @@ -44909,7 +43938,7 @@ snapshots: '@jest/types': 30.2.0 '@types/node': 22.15.35 chalk: 4.1.2 - ci-info: 4.3.1 + ci-info: 4.4.0 graceful-fs: 4.2.11 picomatch: 4.0.3 @@ -45048,24 +44077,24 @@ snapshots: - supports-color - utf-8-validate - jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): + jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: - '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + jest-cli: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - jest@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): + jest@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: - '@jest/core': 30.2.0(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + '@jest/core': 30.2.0(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) '@jest/types': 30.2.0 import-local: 3.2.0 - jest-cli: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + jest-cli: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -45110,18 +44139,18 @@ snapshots: jscodeshift@0.15.2(@babel/preset-env@7.27.2(@babel/core@7.27.7)): dependencies: '@babel/core': 7.27.7 - '@babel/parser': 7.28.5 - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.27.7) - '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.27.7) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.27.7) + '@babel/parser': 7.29.0 + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.27.7) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.27.7) '@babel/preset-flow': 7.27.1(@babel/core@7.27.7) '@babel/preset-typescript': 7.27.1(@babel/core@7.27.7) - '@babel/register': 7.28.3(@babel/core@7.27.7) + '@babel/register': 7.28.6(@babel/core@7.27.7) babel-core: 7.0.0-bridge.0(@babel/core@7.27.7) chalk: 4.1.2 - flow-parser: 0.291.0 + flow-parser: 0.299.0 graceful-fs: 4.2.11 micromatch: 4.0.8 neo-async: 2.6.2 @@ -45149,12 +44178,12 @@ snapshots: escodegen: 1.14.3 html-encoding-sniffer: 1.0.2 left-pad: 1.3.0 - nwsapi: 2.2.22 + nwsapi: 2.2.23 parse5: 4.0.0 pn: 1.1.0 request: 2.88.2 request-promise-native: 1.0.9(request@2.88.2) - sax: 1.4.3 + sax: 1.4.4 symbol-tree: 3.2.4 tough-cookie: 2.5.0 w3c-hr-time: 1.0.2 @@ -45177,7 +44206,7 @@ snapshots: domexception: 1.0.1 escodegen: 1.14.3 html-encoding-sniffer: 1.0.2 - nwsapi: 2.2.22 + nwsapi: 2.2.23 parse5: 5.1.0 pn: 1.1.0 request: 2.88.2 @@ -45213,7 +44242,7 @@ snapshots: http-proxy-agent: 5.0.0 https-proxy-agent: 5.0.1 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.22 + nwsapi: 2.2.23 parse5: 7.3.0 saxes: 6.0.0 symbol-tree: 3.2.4 @@ -45223,7 +44252,7 @@ snapshots: whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 - ws: 8.18.3 + ws: 8.19.0 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -45244,7 +44273,7 @@ snapshots: nwmatcher: 1.4.4 parse5: 1.5.1 request: 2.88.2 - sax: 1.4.3 + sax: 1.4.4 symbol-tree: 3.2.4 tough-cookie: 2.5.0 webidl-conversions: 4.0.2 @@ -45264,7 +44293,7 @@ snapshots: json-schema-to-ts@3.1.1: dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 ts-algebra: 2.0.0 json-schema-traverse@0.3.1: {} @@ -45273,6 +44302,8 @@ snapshots: json-schema-traverse@1.0.0: {} + json-schema-typed@8.0.2: {} + json-schema@0.4.0: {} json-stable-stringify-without-jsonify@1.0.1: {} @@ -45325,7 +44356,7 @@ snapshots: xmldom: '@xmldom/xmldom@0.8.11' xmlhttprequest: 1.8.0 - jsonwebtoken@9.0.2: + jsonwebtoken@9.0.3: dependencies: jws: 3.2.3 lodash.includes: 4.3.0 @@ -45387,7 +44418,7 @@ snapshots: dependencies: json-buffer: 3.0.1 - keyv@5.5.4: + keyv@5.6.0: dependencies: '@keyv/serialize': 1.1.1 @@ -45427,9 +44458,9 @@ snapshots: lazy-universal-dotenv@3.0.1: dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 app-root-dir: 1.0.2 - core-js: 3.47.0 + core-js: 3.48.0 dotenv: 8.6.0 dotenv-expand: 5.1.0 @@ -45481,7 +44512,7 @@ snapshots: lint-staged@16.2.7: dependencies: - commander: 14.0.2 + commander: 14.0.3 listr2: 9.0.5 micromatch: 4.0.8 nano-spawn: 2.0.0 @@ -45495,7 +44526,7 @@ snapshots: dependencies: cli-truncate: 5.1.1 colorette: 2.0.20 - eventemitter3: 5.0.1 + eventemitter3: 5.0.4 log-update: 6.1.0 rfdc: 1.4.1 wrap-ansi: 9.0.2 @@ -45616,7 +44647,7 @@ snapshots: lodash.xor@4.5.0: {} - lodash@4.17.21: {} + lodash@4.17.23: {} log-symbols@3.0.0: dependencies: @@ -45701,7 +44732,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.4: {} + lru-cache@11.2.5: {} lru-cache@4.1.5: dependencies: @@ -45718,10 +44749,6 @@ snapshots: lru-cache@7.18.3: {} - lru-queue@0.1.0: - dependencies: - es5-ext: 0.10.64 - lucide-react@0.523.0(react@18.3.1): dependencies: react: 18.3.1 @@ -45730,6 +44757,10 @@ snapshots: lz-string@1.5.0: {} + macos-version@6.0.0: + dependencies: + semver: 7.7.3 + magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 @@ -45870,7 +44901,7 @@ snapshots: dependencies: '@types/mdast': 4.0.4 '@types/unist': 3.0.3 - decode-named-character-reference: 1.2.0 + decode-named-character-reference: 1.3.0 devlop: 1.1.0 mdast-util-to-string: 4.0.0 micromark: 4.0.2 @@ -46030,7 +45061,7 @@ snapshots: micromark-util-sanitize-uri: 2.0.1 trim-lines: 3.0.1 unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 mdast-util-to-markdown@2.1.2: @@ -46042,7 +45073,7 @@ snapshots: mdast-util-to-string: 4.0.0 micromark-util-classify-character: 2.0.1 micromark-util-decode-string: 2.0.1 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 zwitch: 2.0.4 mdast-util-to-string@1.1.0: {} @@ -46076,8 +45107,16 @@ snapshots: dependencies: fs-monkey: 1.1.0 - memfs@4.51.1: + memfs@4.56.10: dependencies: + '@jsonjoy.com/fs-core': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-fsa': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-builtins': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-to-fsa': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-node-utils': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-print': 4.56.10(tslib@2.8.1) + '@jsonjoy.com/fs-snapshot': 4.56.10(tslib@2.8.1) '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) glob-to-regex.js: 1.2.0(tslib@2.8.1) @@ -46085,17 +45124,6 @@ snapshots: tree-dump: 1.1.0(tslib@2.8.1) tslib: 2.8.1 - memoizee@0.4.17: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-weak-map: 2.0.3 - event-emitter: 0.3.5 - is-promise: 2.2.2 - lru-queue: 0.1.0 - next-tick: 1.1.0 - timers-ext: 0.1.8 - memoizerific@1.11.3: dependencies: map-or-similar: 1.5.0 @@ -46161,7 +45189,7 @@ snapshots: micromark-core-commonmark@2.0.3: dependencies: - decode-named-character-reference: 1.2.0 + decode-named-character-reference: 1.3.0 devlop: 1.1.0 micromark-factory-destination: 2.0.1 micromark-factory-label: 2.0.1 @@ -46374,7 +45402,7 @@ snapshots: micromark-util-decode-string@2.0.1: dependencies: - decode-named-character-reference: 1.2.0 + decode-named-character-reference: 1.3.0 micromark-util-character: 2.1.1 micromark-util-decode-numeric-character-reference: 2.0.2 micromark-util-symbol: 2.0.1 @@ -46422,7 +45450,7 @@ snapshots: dependencies: '@types/debug': 4.1.12 debug: 4.4.3(supports-color@8.1.1) - decode-named-character-reference: 1.2.0 + decode-named-character-reference: 1.3.0 devlop: 1.1.0 micromark-core-commonmark: 2.0.3 micromark-factory-space: 2.0.1 @@ -46487,15 +45515,15 @@ snapshots: min-indent@1.0.1: {} - mini-css-extract-plugin@2.9.4(webpack@5.103.0): + mini-css-extract-plugin@2.10.0(webpack@5.104.1): dependencies: schema-utils: 4.3.3 tapable: 2.3.0 - webpack: 5.103.0(webpack-cli@4.10.0) + webpack: 5.104.1(webpack-cli@4.10.0) minim@0.23.8: dependencies: - lodash: 4.17.21 + lodash: 4.17.23 minimalistic-assert@1.0.1: {} @@ -46519,10 +45547,6 @@ snapshots: dependencies: brace-expansion: 2.0.2 - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.2 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.2 @@ -46600,7 +45624,7 @@ snapshots: acorn: 8.15.0 pathe: 2.0.3 pkg-types: 1.3.1 - ufo: 1.6.1 + ufo: 1.6.3 mocha@10.8.2: dependencies: @@ -46608,7 +45632,7 @@ snapshots: browser-stdout: 1.3.1 chokidar: 3.6.0 debug: 4.4.3(supports-color@8.1.1) - diff: 5.2.0 + diff: 8.0.3 escape-string-regexp: 4.0.0 find-up: 5.0.0 glob: 8.1.0 @@ -46630,7 +45654,7 @@ snapshots: browser-stdout: 1.3.1 chokidar: 4.0.3 debug: 4.4.3(supports-color@8.1.1) - diff: 7.0.0 + diff: 8.0.3 escape-string-regexp: 4.0.0 find-up: 5.0.0 glob: 10.5.0 @@ -46669,13 +45693,13 @@ snapshots: vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 - monaco-page-objects@3.14.1(selenium-webdriver@4.38.0)(typescript@5.8.3): + monaco-page-objects@3.14.1(selenium-webdriver@4.40.0)(typescript@5.8.3): dependencies: clipboardy: 4.0.0 clone-deep: 4.0.1 compare-versions: 6.1.1 - fs-extra: 11.3.2 - selenium-webdriver: 4.38.0 + fs-extra: 11.3.3 + selenium-webdriver: 4.40.0 type-fest: 4.41.0 typescript: 5.8.3 @@ -46715,7 +45739,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nan@2.23.1: {} + nan@2.25.0: {} nano-spawn@2.0.0: {} @@ -46731,8 +45755,6 @@ snapshots: napi-postinstall@0.3.4: {} - natural-compare-lite@1.4.0: {} - natural-compare@1.4.0: {} neatequal@1.0.0: @@ -46764,7 +45786,7 @@ snapshots: lower-case: 2.0.2 tslib: 2.8.1 - node-abi@3.85.0: + node-abi@3.87.0: dependencies: semver: 7.7.3 @@ -46809,8 +45831,6 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - node-forge@1.3.2: {} - node-gyp-build@4.8.4: optional: true @@ -46847,15 +45867,15 @@ snapshots: node-int64@0.4.0: {} - node-loader@2.0.0(webpack@5.103.0): + node-loader@2.0.0(webpack@5.104.1): dependencies: loader-utils: 2.0.4 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) - node-loader@2.1.0(webpack@5.103.0): + node-loader@2.1.0(webpack@5.104.1): dependencies: loader-utils: 2.0.4 - webpack: 5.103.0(webpack-cli@4.10.0) + webpack: 5.104.1(webpack-cli@4.10.0) node-notifier@5.4.5: dependencies: @@ -46876,10 +45896,10 @@ snapshots: node-releases@2.0.27: {} - node-sarif-builder@3.3.1: + node-sarif-builder@3.4.0: dependencies: '@types/sarif': 2.1.7 - fs-extra: 11.3.2 + fs-extra: 11.3.3 node-schedule@2.1.1: dependencies: @@ -46937,7 +45957,7 @@ snapshots: normalize-url@6.1.0: {} - normalize-url@8.1.0: {} + normalize-url@8.1.1: {} npm-run-path@2.0.2: dependencies: @@ -46989,7 +46009,7 @@ snapshots: nwmatcher@1.4.4: {} - nwsapi@2.2.22: {} + nwsapi@2.2.23: {} nypm@0.5.4: dependencies: @@ -46998,7 +46018,7 @@ snapshots: pathe: 2.0.3 pkg-types: 1.3.1 tinyexec: 0.3.2 - ufo: 1.6.1 + ufo: 1.6.3 oauth-sign@0.9.0: {} @@ -47035,15 +46055,15 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 - object.getownpropertydescriptors@2.1.8: + object.getownpropertydescriptors@2.1.9: dependencies: array.prototype.reduce: 1.0.8 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 gopd: 1.2.0 safe-array-concat: 1.1.3 @@ -47052,7 +46072,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 object.values@1.2.1: dependencies: @@ -47362,7 +46382,7 @@ snapshots: '@types/unist': 2.0.11 character-entities-legacy: 3.0.0 character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.2.0 + decode-named-character-reference: 1.3.0 is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 @@ -47373,14 +46393,14 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 parse-json@8.3.0: dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 index-to-position: 1.2.0 type-fest: 4.41.0 @@ -47453,7 +46473,7 @@ snapshots: path-scurry@2.0.1: dependencies: - lru-cache: 11.2.4 + lru-cache: 11.2.5 minipass: 7.1.2 path-to-regexp@0.1.12: {} @@ -47502,7 +46522,7 @@ snapshots: pdfjs-dist@4.8.69: optionalDependencies: - canvas: 3.2.0 + canvas: 3.2.1 path2d: 0.2.2 transitivePeerDependencies: - bare-abort-controller @@ -47581,6 +46601,15 @@ snapshots: mlly: 1.8.0 pathe: 2.0.3 + pkijs@3.3.3: + dependencies: + '@noble/hashes': 1.4.0 + asn1js: 3.0.7 + bytestreamjs: 2.0.1 + pvtsutils: 1.3.6 + pvutils: 1.1.5 + tslib: 2.8.1 + playwright-core@1.55.1: {} playwright@1.55.1: @@ -47616,7 +46645,7 @@ snapshots: polished@4.3.1: dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 popmotion@11.0.3: dependencies: @@ -47654,7 +46683,7 @@ snapshots: postcss-colormin@5.3.1(postcss@8.5.6): dependencies: - browserslist: 4.28.0 + browserslist: 4.28.1 caniuse-api: 3.0.0 colord: 2.9.3 postcss: 8.5.6 @@ -47667,7 +46696,7 @@ snapshots: postcss-convert-values@5.1.3(postcss@8.5.6): dependencies: - browserslist: 4.28.0 + browserslist: 4.28.1 postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -47739,13 +46768,13 @@ snapshots: postcss-load-options: 1.2.0 postcss-load-plugins: 2.3.0 - postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): + postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: postcss: 8.5.6 - ts-node: 10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3) + ts-node: 10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3) postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.6)(yaml@2.8.2): dependencies: @@ -47772,7 +46801,7 @@ snapshots: postcss-load-config: 1.2.0 schema-utils: 0.3.0 - postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 @@ -47780,9 +46809,9 @@ snapshots: postcss: 7.0.39 schema-utils: 3.3.0 semver: 7.7.3 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.103.0): + postcss-loader@4.3.0(postcss@7.0.39)(webpack@5.104.1): dependencies: cosmiconfig: 7.1.0 klona: 2.0.6 @@ -47790,16 +46819,16 @@ snapshots: postcss: 7.0.39 schema-utils: 3.3.0 semver: 7.7.3 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.103.0): + postcss-loader@8.2.0(postcss@8.5.6)(typescript@5.8.3)(webpack@5.104.1): dependencies: cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 2.6.1 postcss: 8.5.6 semver: 7.7.3 optionalDependencies: - webpack: 5.103.0(webpack-cli@6.0.1) + webpack: 5.104.1(webpack-cli@6.0.1) transitivePeerDependencies: - typescript @@ -47829,7 +46858,7 @@ snapshots: postcss-merge-rules@5.1.4(postcss@8.5.6): dependencies: - browserslist: 4.28.0 + browserslist: 4.28.1 caniuse-api: 3.0.0 cssnano-utils: 3.1.0(postcss@8.5.6) postcss: 8.5.6 @@ -47869,7 +46898,7 @@ snapshots: postcss-minify-params@5.1.4(postcss@8.5.6): dependencies: - browserslist: 4.28.0 + browserslist: 4.28.1 cssnano-utils: 3.1.0(postcss@8.5.6) postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -47999,7 +47028,7 @@ snapshots: postcss-normalize-unicode@5.1.1(postcss@8.5.6): dependencies: - browserslist: 4.28.0 + browserslist: 4.28.1 postcss: 8.5.6 postcss-value-parser: 4.2.0 @@ -48043,7 +47072,7 @@ snapshots: postcss-reduce-initial@5.1.2(postcss@8.5.6): dependencies: - browserslist: 4.28.0 + browserslist: 4.28.1 caniuse-api: 3.0.0 postcss: 8.5.6 @@ -48138,6 +47167,8 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + powershell-utils@0.2.0: {} + prebuild-install@7.1.3: dependencies: detect-libc: 2.1.2 @@ -48146,7 +47177,7 @@ snapshots: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 - node-abi: 3.85.0 + node-abi: 3.87.0 pump: 3.0.3 rc: 1.2.8 simple-get: 4.0.1 @@ -48165,7 +47196,7 @@ snapshots: presentable-error@0.0.1: {} - prettier-linter-helpers@1.0.0: + prettier-linter-helpers@1.0.1: dependencies: fast-diff: 1.3.0 @@ -48181,12 +47212,12 @@ snapshots: pretty-error@2.1.2: dependencies: - lodash: 4.17.21 + lodash: 4.17.23 renderkid: 2.0.7 pretty-error@4.0.0: dependencies: - lodash: 4.17.21 + lodash: 4.17.23 renderkid: 3.0.0 pretty-format@20.0.3: @@ -48250,7 +47281,7 @@ snapshots: dependencies: chalk: 2.4.2 cli-spinners: 1.3.1 - humanize-duration: 3.33.1 + humanize-duration: 3.33.2 log-update: 2.3.0 progress@2.0.3: {} @@ -48267,7 +47298,7 @@ snapshots: array.prototype.map: 1.0.8 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 get-intrinsic: 1.3.0 iterate-value: 1.0.2 @@ -48275,7 +47306,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 set-function-name: 2.0.2 @@ -48321,33 +47352,33 @@ snapshots: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.11.0 prosemirror-gapcursor@1.4.0: dependencies: prosemirror-keymap: 1.2.3 prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-view: 1.41.4 + prosemirror-view: 1.41.5 prosemirror-history@1.5.0: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 - prosemirror-view: 1.41.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.5 rope-sequence: 1.3.4 prosemirror-inputrules@1.5.1: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.11.0 prosemirror-keymap@1.2.3: dependencies: prosemirror-state: 1.4.4 w3c-keyname: 2.2.8 - prosemirror-markdown@1.13.2: + prosemirror-markdown@1.13.3: dependencies: '@types/markdown-it': 14.1.2 markdown-it: 14.1.0 @@ -48365,23 +47396,23 @@ snapshots: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.11.0 prosemirror-state@1.4.4: dependencies: prosemirror-model: 1.25.4 - prosemirror-transform: 1.10.5 - prosemirror-view: 1.41.4 + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.5 - prosemirror-transform@1.10.5: + prosemirror-transform@1.11.0: dependencies: prosemirror-model: 1.25.4 - prosemirror-view@1.41.4: + prosemirror-view@1.41.5: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.5 + prosemirror-transform: 1.11.0 protobufjs@7.5.4: dependencies: @@ -48458,13 +47489,19 @@ snapshots: pure-rand@7.0.1: {} + pvtsutils@1.3.6: + dependencies: + tslib: 2.8.1 + + pvutils@1.1.5: {} + q@1.5.1: {} - qified@0.5.2: + qified@0.6.0: dependencies: - hookified: 1.13.0 + hookified: 1.15.1 - qs@6.14.0: + qs@6.14.1: dependencies: side-channel: 1.1.0 @@ -48519,20 +47556,20 @@ snapshots: dependencies: bytes: 3.1.2 http-errors: 2.0.1 - iconv-lite: 0.7.0 + iconv-lite: 0.7.2 unpipe: 1.0.0 - raw-loader@4.0.2(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + raw-loader@4.0.2(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - raw-loader@4.0.2(webpack@5.103.0): + raw-loader@4.0.2(webpack@5.104.1): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) rc-config-loader@4.1.3: dependencies: @@ -48636,8 +47673,8 @@ snapshots: react-docgen@5.4.3: dependencies: '@babel/core': 7.27.7 - '@babel/generator': 7.28.5 - '@babel/runtime': 7.28.4 + '@babel/generator': 7.29.0 + '@babel/runtime': 7.28.6 ast-types: 0.14.2 commander: 2.20.3 doctrine: 3.0.0 @@ -48651,8 +47688,8 @@ snapshots: react-docgen@7.1.1: dependencies: '@babel/core': 7.27.7 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 '@types/doctrine': 0.0.9 @@ -48714,17 +47751,15 @@ snapshots: react-error-boundary@3.1.4(react@18.2.0): dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 react: 18.2.0 - react-error-boundary@6.0.0(react@18.2.0): + react-error-boundary@6.0.3(react@18.2.0): dependencies: - '@babel/runtime': 7.28.4 react: 18.2.0 - react-error-boundary@6.0.0(react@19.1.0): + react-error-boundary@6.0.3(react@19.1.0): dependencies: - '@babel/runtime': 7.28.4 react: 19.1.0 react-error-overlay@4.0.1: {} @@ -48773,7 +47808,7 @@ snapshots: react-inspector@5.1.1(react@18.2.0): dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 is-dom: 1.1.0 prop-types: 15.8.1 react: 18.2.0 @@ -48822,7 +47857,7 @@ snapshots: react-is@18.3.1: {} - react-is@19.2.0: {} + react-is@19.2.4: {} react-json-view-lite@2.5.0(react@18.2.0): dependencies: @@ -48869,7 +47904,7 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.2 unified: 11.0.5 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 transitivePeerDependencies: - supports-color @@ -48886,7 +47921,7 @@ snapshots: remark-parse: 11.0.0 remark-rehype: 11.1.2 unified: 11.0.5 - unist-util-visit: 5.0.0 + unist-util-visit: 5.1.0 vfile: 6.0.3 transitivePeerDependencies: - supports-color @@ -48995,22 +48030,22 @@ snapshots: optionalDependencies: '@types/react': 18.2.0 - react-scripts-ts@3.1.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3)(webpack-cli@6.0.1): + react-scripts-ts@3.1.0(@swc/core@1.15.11(@swc/helpers@0.5.18))(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(babel-runtime@6.26.0)(typescript@5.8.3)(webpack-cli@6.0.1): dependencies: autoprefixer: 7.1.6 babel-jest: 20.0.3 - babel-loader: 7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.103.0) + babel-loader: 7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.104.1) babel-preset-react-app: 3.1.2(babel-runtime@6.26.0) case-sensitive-paths-webpack-plugin: 2.1.1 chalk: 1.1.3 css-loader: 0.28.7 dotenv: 4.0.0 dotenv-expand: 4.2.0 - extract-text-webpack-plugin: 3.0.2(webpack@5.103.0) - file-loader: 1.1.5(webpack@5.103.0) - fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.103.0) + extract-text-webpack-plugin: 3.0.2(webpack@5.104.1) + file-loader: 1.1.5(webpack@5.104.1) + fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.104.1) fs-extra: 3.0.1 - html-webpack-plugin: 2.29.0(webpack@5.103.0) + html-webpack-plugin: 2.29.0(webpack@5.104.1) jest: 20.0.4 object-assign: 4.1.1 postcss-flexbugs-fixes: 3.2.0 @@ -49021,7 +48056,7 @@ snapshots: resolve: 1.6.0 source-map-loader: 0.2.4 style-loader: 0.19.0 - sw-precache-webpack-plugin: 0.11.4(webpack@5.103.0) + sw-precache-webpack-plugin: 0.11.4(webpack@5.104.1) ts-jest: 22.0.1(jest@20.0.4)(typescript@5.8.3) ts-loader: 2.3.7 tsconfig-paths-webpack-plugin: 2.0.0 @@ -49029,11 +48064,11 @@ snapshots: tslint-config-prettier: 1.18.0 tslint-react: 3.6.0(tslint@5.20.1(typescript@5.8.3))(typescript@5.8.3) typescript: 5.8.3 - uglifyjs-webpack-plugin: 1.2.5(webpack@5.103.0) - url-loader: 0.6.2(file-loader@1.1.5(webpack@5.103.0)) - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.103.0) - webpack-manifest-plugin: 1.3.2(webpack@5.103.0) + uglifyjs-webpack-plugin: 1.2.5(webpack@5.104.1) + url-loader: 0.6.2(file-loader@1.1.5(webpack@5.104.1)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) + webpack-manifest-plugin: 1.3.2(webpack@5.104.1) whatwg-fetch: 2.0.3 optionalDependencies: fsevents: 1.2.13 @@ -49053,18 +48088,18 @@ snapshots: dependencies: autoprefixer: 7.1.6 babel-jest: 20.0.3 - babel-loader: 7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.103.0) + babel-loader: 7.1.2(babel-core@7.0.0-bridge.0(@babel/core@7.27.7))(webpack@5.104.1) babel-preset-react-app: 3.1.2(babel-runtime@6.26.0) case-sensitive-paths-webpack-plugin: 2.1.1 chalk: 1.1.3 css-loader: 0.28.7 dotenv: 4.0.0 dotenv-expand: 4.2.0 - extract-text-webpack-plugin: 3.0.2(webpack@5.103.0) - file-loader: 1.1.5(webpack@5.103.0) - fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.103.0) + extract-text-webpack-plugin: 3.0.2(webpack@5.104.1) + file-loader: 1.1.5(webpack@5.104.1) + fork-ts-checker-webpack-plugin: 0.2.10(typescript@5.8.3)(webpack@5.104.1) fs-extra: 3.0.1 - html-webpack-plugin: 2.29.0(webpack@5.103.0) + html-webpack-plugin: 2.29.0(webpack@5.104.1) jest: 20.0.4 object-assign: 4.1.1 postcss-flexbugs-fixes: 3.2.0 @@ -49075,7 +48110,7 @@ snapshots: resolve: 1.6.0 source-map-loader: 0.2.4 style-loader: 0.19.0 - sw-precache-webpack-plugin: 0.11.4(webpack@5.103.0) + sw-precache-webpack-plugin: 0.11.4(webpack@5.104.1) ts-jest: 22.0.1(jest@20.0.4)(typescript@5.8.3) ts-loader: 2.3.7 tsconfig-paths-webpack-plugin: 2.0.0 @@ -49083,11 +48118,11 @@ snapshots: tslint-config-prettier: 1.18.0 tslint-react: 3.6.0(tslint@5.20.1(typescript@5.8.3))(typescript@5.8.3) typescript: 5.8.3 - uglifyjs-webpack-plugin: 1.2.5(webpack@5.103.0) - url-loader: 0.6.2(file-loader@1.1.5(webpack@5.103.0)) - webpack: 5.103.0(webpack-cli@5.1.4) - webpack-dev-server: 5.2.2(webpack@5.103.0) - webpack-manifest-plugin: 1.3.2(webpack@5.103.0) + uglifyjs-webpack-plugin: 1.2.5(webpack@5.104.1) + url-loader: 0.6.2(file-loader@1.1.5(webpack@5.104.1)) + webpack: 5.104.1(webpack-cli@5.1.4) + webpack-dev-server: 5.2.3(webpack@5.104.1) + webpack-manifest-plugin: 1.3.2(webpack@5.104.1) whatwg-fetch: 2.0.3 optionalDependencies: fsevents: 1.2.13 @@ -49146,7 +48181,7 @@ snapshots: react-syntax-highlighter@15.6.6(react@18.2.0): dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 highlight.js: 10.7.3 highlightjs-vue: 1.0.0 lowlight: 1.20.0 @@ -49154,15 +48189,15 @@ snapshots: react: 18.2.0 refractor: 3.6.0 - react-test-renderer@19.1.1(react@18.2.0): + react-test-renderer@19.1.5(react@18.2.0): dependencies: react: 18.2.0 - react-is: 19.2.0 + react-is: 19.2.4 scheduler: 0.26.0 react-textarea-autosize@8.5.9(@types/react@18.2.0)(react@18.2.0): dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 react: 18.2.0 use-composed-ref: 1.4.0(@types/react@18.2.0)(react@18.2.0) use-latest: 1.3.0(@types/react@18.2.0)(react@18.2.0) @@ -49357,15 +48392,17 @@ snapshots: redux@4.2.1: dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 redux@5.0.1: {} + reflect-metadata@0.2.2: {} + reflect.getprototypeof@1.0.10: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -49403,8 +48440,6 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 - regexpp@2.0.1: {} - regexpp@3.2.0: {} regexpu-core@2.0.0: @@ -49569,7 +48604,7 @@ snapshots: css-select: 4.3.0 dom-converter: 0.2.0 htmlparser2: 6.1.0 - lodash: 4.17.21 + lodash: 4.17.23 strip-ansi: 3.0.1 renderkid@3.0.0: @@ -49577,7 +48612,7 @@ snapshots: css-select: 4.3.0 dom-converter: 0.2.0 htmlparser2: 6.1.0 - lodash: 4.17.21 + lodash: 4.17.23 strip-ansi: 6.0.1 repeat-string@1.6.1: {} @@ -49588,7 +48623,7 @@ snapshots: request-promise-core@1.1.4(request@2.88.2): dependencies: - lodash: 4.17.21 + lodash: 4.17.23 request: 2.88.2 request-promise-native@1.0.9(request@2.88.2): @@ -49730,16 +48765,16 @@ snapshots: glob: 11.1.0 package-json-from-dist: 1.0.1 - rollup-plugin-import-css@3.5.8(rollup@4.53.3): + rollup-plugin-import-css@3.5.8(rollup@4.57.1): dependencies: - '@rollup/pluginutils': 5.3.0(rollup@4.53.3) - rollup: 4.53.3 + '@rollup/pluginutils': 5.3.0(rollup@4.57.1) + rollup: 4.57.1 - rollup-plugin-peer-deps-external@2.2.4(rollup@4.53.3): + rollup-plugin-peer-deps-external@2.2.4(rollup@4.57.1): dependencies: - rollup: 4.53.3 + rollup: 4.57.1 - rollup-plugin-postcss@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)): + rollup-plugin-postcss@4.0.2(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)): dependencies: chalk: 4.1.2 concat-with-sourcemaps: 1.1.0 @@ -49748,7 +48783,7 @@ snapshots: p-queue: 6.6.2 pify: 5.0.0 postcss: 8.5.6 - postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) postcss-modules: 4.3.1(postcss@8.5.6) promise.series: 0.2.0 resolve: 1.22.11 @@ -49776,7 +48811,7 @@ snapshots: rollup-plugin-terser@5.3.1(rollup@1.32.1): dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 jest-worker: 24.9.0 rollup: 1.32.1 rollup-pluginutils: 2.8.2 @@ -49793,12 +48828,12 @@ snapshots: tslib: 2.0.1 typescript: 3.9.10 - rollup-plugin-typescript2@0.36.0(rollup@4.53.3)(typescript@5.8.3): + rollup-plugin-typescript2@0.36.0(rollup@4.57.1)(typescript@5.8.3): dependencies: '@rollup/pluginutils': 4.2.1 find-cache-dir: 3.3.2 fs-extra: 10.1.0 - rollup: 4.53.3 + rollup: 4.57.1 semver: 7.7.3 tslib: 2.8.1 typescript: 5.8.3 @@ -49818,32 +48853,35 @@ snapshots: '@types/node': 22.15.35 acorn: 7.4.1 - rollup@4.53.3: + rollup@4.57.1: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.3 - '@rollup/rollup-android-arm64': 4.53.3 - '@rollup/rollup-darwin-arm64': 4.53.3 - '@rollup/rollup-darwin-x64': 4.53.3 - '@rollup/rollup-freebsd-arm64': 4.53.3 - '@rollup/rollup-freebsd-x64': 4.53.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 - '@rollup/rollup-linux-arm-musleabihf': 4.53.3 - '@rollup/rollup-linux-arm64-gnu': 4.53.3 - '@rollup/rollup-linux-arm64-musl': 4.53.3 - '@rollup/rollup-linux-loong64-gnu': 4.53.3 - '@rollup/rollup-linux-ppc64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-gnu': 4.53.3 - '@rollup/rollup-linux-riscv64-musl': 4.53.3 - '@rollup/rollup-linux-s390x-gnu': 4.53.3 - '@rollup/rollup-linux-x64-gnu': 4.53.3 - '@rollup/rollup-linux-x64-musl': 4.53.3 - '@rollup/rollup-openharmony-arm64': 4.53.3 - '@rollup/rollup-win32-arm64-msvc': 4.53.3 - '@rollup/rollup-win32-ia32-msvc': 4.53.3 - '@rollup/rollup-win32-x64-gnu': 4.53.3 - '@rollup/rollup-win32-x64-msvc': 4.53.3 + '@rollup/rollup-android-arm-eabi': 4.57.1 + '@rollup/rollup-android-arm64': 4.57.1 + '@rollup/rollup-darwin-arm64': 4.57.1 + '@rollup/rollup-darwin-x64': 4.57.1 + '@rollup/rollup-freebsd-arm64': 4.57.1 + '@rollup/rollup-freebsd-x64': 4.57.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.57.1 + '@rollup/rollup-linux-arm-musleabihf': 4.57.1 + '@rollup/rollup-linux-arm64-gnu': 4.57.1 + '@rollup/rollup-linux-arm64-musl': 4.57.1 + '@rollup/rollup-linux-loong64-gnu': 4.57.1 + '@rollup/rollup-linux-loong64-musl': 4.57.1 + '@rollup/rollup-linux-ppc64-gnu': 4.57.1 + '@rollup/rollup-linux-ppc64-musl': 4.57.1 + '@rollup/rollup-linux-riscv64-gnu': 4.57.1 + '@rollup/rollup-linux-riscv64-musl': 4.57.1 + '@rollup/rollup-linux-s390x-gnu': 4.57.1 + '@rollup/rollup-linux-x64-gnu': 4.57.1 + '@rollup/rollup-linux-x64-musl': 4.57.1 + '@rollup/rollup-openbsd-x64': 4.57.1 + '@rollup/rollup-openharmony-arm64': 4.57.1 + '@rollup/rollup-win32-arm64-msvc': 4.57.1 + '@rollup/rollup-win32-ia32-msvc': 4.57.1 + '@rollup/rollup-win32-x64-gnu': 4.57.1 + '@rollup/rollup-win32-x64-msvc': 4.57.1 fsevents: 2.3.3 rope-sequence@1.3.4: {} @@ -49864,6 +48902,13 @@ snapshots: run-async@2.4.1: {} + run-jxa@3.0.0: + dependencies: + execa: 5.1.1 + macos-version: 6.0.0 + subsume: 4.0.0 + type-fest: 2.19.0 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -49878,10 +48923,6 @@ snapshots: rx-lite@4.0.8: {} - rxjs@6.6.7: - dependencies: - tslib: 1.14.1 - rxjs@7.8.2: dependencies: tslib: 2.8.1 @@ -49945,31 +48986,31 @@ snapshots: dependencies: truncate-utf8-bytes: 1.0.2 - sass-loader@13.3.3(sass@1.94.2)(webpack@5.103.0): + sass-loader@13.3.3(sass@1.97.3)(webpack@5.104.1): dependencies: neo-async: 2.6.2 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: - sass: 1.94.2 + sass: 1.97.3 - sass-loader@16.0.6(sass@1.94.2)(webpack@5.103.0): + sass-loader@16.0.6(sass@1.97.3)(webpack@5.104.1): dependencies: neo-async: 2.6.2 optionalDependencies: - sass: 1.94.2 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + sass: 1.97.3 + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - sass@1.94.2: + sass@1.97.3: dependencies: chokidar: 4.0.3 immutable: 5.1.4 source-map-js: 1.2.1 optionalDependencies: - '@parcel/watcher': 2.5.1 + '@parcel/watcher': 2.5.6 sax@1.2.4: {} - sax@1.4.3: {} + sax@1.4.4: {} saxes@3.1.11: dependencies: @@ -50035,20 +49076,20 @@ snapshots: select-hose@2.0.0: {} - selenium-webdriver@4.38.0: + selenium-webdriver@4.40.0: dependencies: '@bazel/runfiles': 6.5.0 jszip: 3.10.1 tmp: 0.2.5 - ws: 8.18.3 + ws: 8.19.0 transitivePeerDependencies: - bufferutil - utf-8-validate - selfsigned@2.4.1: + selfsigned@5.5.0: dependencies: - '@types/node-forge': 1.3.14 - node-forge: 1.3.2 + '@peculiar/x509': 1.14.3 + pkijs: 3.3.3 semver-diff@2.1.0: dependencies: @@ -50062,23 +49103,7 @@ snapshots: semver@7.7.3: {} - send@0.19.0: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - - send@0.19.1: + send@0.19.2: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -50087,14 +49112,14 @@ snapshots: escape-html: 1.0.3 etag: 1.8.1 fresh: 0.5.2 - http-errors: 2.0.0 + http-errors: 2.0.1 mime: 1.6.0 ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.1 + statuses: 2.0.2 - send@1.2.0: + send@1.2.1: dependencies: debug: 4.4.3(supports-color@8.1.1) encodeurl: 2.0.0 @@ -50146,29 +49171,29 @@ snapshots: path-to-regexp: 3.3.0 range-parser: 1.2.0 - serve-index@1.9.1: + serve-index@1.9.2: dependencies: accepts: 1.3.8 batch: 0.6.1 debug: 2.6.9 escape-html: 1.0.3 - http-errors: 1.6.3 + http-errors: 1.8.1 mime-types: 2.1.35 parseurl: 1.3.3 - serve-static@1.16.2: + serve-static@1.16.3: dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.19.0 + send: 0.19.2 - serve-static@2.2.0: + serve-static@2.2.1: dependencies: encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 1.2.0 + send: 1.2.1 transitivePeerDependencies: - supports-color @@ -50205,8 +49230,6 @@ snapshots: setimmediate@1.0.5: {} - setprototypeof@1.1.0: {} - setprototypeof@1.2.0: {} sha.js@2.4.12: @@ -50318,12 +49341,6 @@ snapshots: slash@5.1.0: {} - slice-ansi@2.1.0: - dependencies: - ansi-styles: 3.2.1 - astral-regex: 1.0.0 - is-fullwidth-code-point: 2.0.0 - slice-ansi@4.0.0: dependencies: ansi-styles: 4.3.0 @@ -50382,17 +49399,17 @@ snapshots: async: 2.6.4 loader-utils: 1.4.2 - source-map-loader@4.0.2(webpack@5.103.0): + source-map-loader@4.0.2(webpack@5.104.1): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) - source-map-loader@5.0.0(webpack@5.103.0): + source-map-loader@5.0.0(webpack@5.104.1): dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) source-map-resolve@0.6.0: dependencies: @@ -50544,8 +49561,6 @@ snapshots: statuses@1.5.0: {} - statuses@2.0.1: {} - statuses@2.0.2: {} stdin-discarder@0.2.2: {} @@ -50559,9 +49574,9 @@ snapshots: store2@2.14.4: {} - storybook@8.6.14(prettier@3.5.3): + storybook@8.6.15(prettier@3.5.3): dependencies: - '@storybook/core': 8.6.14(prettier@3.5.3)(storybook@8.6.14(prettier@3.5.3)) + '@storybook/core': 8.6.15(prettier@3.5.3)(storybook@8.6.15(prettier@3.5.3)) optionalDependencies: prettier: 3.5.3 transitivePeerDependencies: @@ -50626,12 +49641,6 @@ snapshots: is-fullwidth-code-point: 2.0.0 strip-ansi: 4.0.0 - string-width@3.1.0: - dependencies: - emoji-regex: 7.0.3 - is-fullwidth-code-point: 2.0.0 - strip-ansi: 5.2.0 - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -50650,7 +49659,7 @@ snapshots: get-east-asian-width: 1.4.0 strip-ansi: 7.1.2 - string-width@8.1.0: + string-width@8.1.1: dependencies: get-east-asian-width: 1.4.0 strip-ansi: 7.1.2 @@ -50663,14 +49672,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-errors: 1.3.0 es-object-atoms: 1.1.1 get-intrinsic: 1.3.0 @@ -50685,7 +49694,7 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 string.prototype.padstart@3.1.7: @@ -50693,13 +49702,13 @@ snapshots: call-bind: 1.0.8 call-bound: 1.0.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 string.prototype.repeat@1.0.0: dependencies: define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 string.prototype.trim@1.2.10: dependencies: @@ -50707,7 +49716,7 @@ snapshots: call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.24.1 es-object-atoms: 1.1.1 has-property-descriptors: 1.0.2 @@ -50793,7 +49802,7 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - strnum@2.1.1: {} + strnum@2.1.2: {} strtok3@7.1.1: dependencies: @@ -50811,39 +49820,39 @@ snapshots: loader-utils: 1.4.2 schema-utils: 0.3.0 - style-loader@1.3.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + style-loader@1.3.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 schema-utils: 2.7.1 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - style-loader@1.3.0(webpack@5.103.0): + style-loader@1.3.0(webpack@5.104.1): dependencies: loader-utils: 2.0.4 schema-utils: 2.7.1 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) - style-loader@2.0.0(webpack@5.103.0): + style-loader@2.0.0(webpack@5.104.1): dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - style-loader@3.3.4(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)): + style-loader@3.3.4(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - style-loader@3.3.4(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + style-loader@3.3.4(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - style-loader@3.3.4(webpack@5.103.0): + style-loader@3.3.4(webpack@5.104.1): dependencies: - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) - style-loader@4.0.0(webpack@5.103.0): + style-loader@4.0.0(webpack@5.104.1): dependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) style-mod@4.1.3: {} @@ -50866,7 +49875,7 @@ snapshots: stylehacks@5.1.1(postcss@8.5.6): dependencies: - browserslist: 4.28.0 + browserslist: 4.28.1 postcss: 8.5.6 postcss-selector-parser: 6.1.2 @@ -50882,7 +49891,7 @@ snapshots: stylelint@16.26.1(typescript@5.8.3): dependencies: '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-syntax-patches-for-csstree': 1.0.20 + '@csstools/css-syntax-patches-for-csstree': 1.0.26 '@csstools/css-tokenizer': 3.0.4 '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.1) @@ -50895,7 +49904,7 @@ snapshots: debug: 4.4.3(supports-color@8.1.1) fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 - file-entry-cache: 11.1.1 + file-entry-cache: 11.1.2 global-modules: 2.0.0 globby: 11.1.0 globjoin: 0.1.4 @@ -50930,6 +49939,11 @@ snapshots: dependencies: minimist: 1.2.8 + subsume@4.0.0: + dependencies: + escape-string-regexp: 5.0.0 + unique-string: 3.0.0 + sucrase@3.35.1: dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -50982,16 +49996,16 @@ snapshots: svg-tags@1.0.0: {} - svg-url-loader@8.0.0(webpack@5.103.0): + svg-url-loader@8.0.0(webpack@5.104.1): dependencies: - file-loader: 6.2.0(webpack@5.103.0) - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + file-loader: 6.2.0(webpack@5.104.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) svg2ttf@4.3.0: dependencies: argparse: 1.0.10 cubic2quad: 1.2.1 - lodash: 4.17.21 + lodash: 4.17.23 microbuffer: 1.0.0 svgpath: 2.6.0 xmldom: '@xmldom/xmldom@0.8.11' @@ -51001,7 +50015,7 @@ snapshots: '@xmldom/xmldom': 0.7.13 argparse: 2.0.1 cubic2quad: 1.2.1 - lodash: 4.17.21 + lodash: 4.17.23 microbuffer: 1.0.0 svgpath: 2.6.0 @@ -51009,7 +50023,7 @@ snapshots: dependencies: commander: 9.5.0 glob: 8.1.0 - sax: 1.4.3 + sax: 1.4.4 svg-pathdata: 6.0.3 svgicons2svgfont@5.0.2: @@ -51017,7 +50031,7 @@ snapshots: commander: 2.20.3 neatequal: 1.0.0 readable-stream: 2.3.8 - sax: 1.4.3 + sax: 1.4.4 string.fromcodepoint: 0.2.1 string.prototype.codepointat: 0.2.1 svg-pathdata: 1.0.4 @@ -51044,12 +50058,12 @@ snapshots: svgpath@2.6.0: {} - sw-precache-webpack-plugin@0.11.4(webpack@5.103.0): + sw-precache-webpack-plugin@0.11.4(webpack@5.104.1): dependencies: del: 2.2.2 sw-precache: 5.2.1 uglify-js: 3.19.3 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) sw-precache@5.2.1: dependencies: @@ -51069,15 +50083,15 @@ snapshots: path-to-regexp: 1.9.0 serviceworker-cache-polyfill: 4.0.0 - swagger-client@3.36.0: + swagger-client@3.36.1: dependencies: - '@babel/runtime-corejs3': 7.28.4 + '@babel/runtime-corejs3': 7.29.0 '@scarf/scarf': 1.4.0 - '@swagger-api/apidom-core': 1.0.0-rc.4 - '@swagger-api/apidom-error': 1.0.0-rc.4 - '@swagger-api/apidom-json-pointer': 1.0.0-rc.4 - '@swagger-api/apidom-ns-openapi-3-1': 1.0.0-rc.4 - '@swagger-api/apidom-reference': 1.0.0-rc.4 + '@swagger-api/apidom-core': 1.3.0 + '@swagger-api/apidom-error': 1.3.0 + '@swagger-api/apidom-json-pointer': 1.3.0 + '@swagger-api/apidom-ns-openapi-3-1': 1.3.0 + '@swagger-api/apidom-reference': 1.3.0 '@swaggerexpert/cookie': 2.0.2 deepmerge: 4.3.1 fast-json-patch: 3.1.1 @@ -51094,7 +50108,7 @@ snapshots: swagger-ui-react@5.21.0(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime-corejs3': 7.28.4 + '@babel/runtime-corejs3': 7.29.0 '@scarf/scarf': 1.4.0 base64-js: 1.5.1 classnames: 2.5.1 @@ -51105,7 +50119,7 @@ snapshots: immutable: 3.8.2 js-file-download: 0.4.12 js-yaml: 4.1.1 - lodash: 4.17.21 + lodash: 4.17.23 prop-types: 15.8.1 randexp: 0.5.3 randombytes: 2.1.0 @@ -51124,7 +50138,7 @@ snapshots: reselect: 5.1.1 serialize-error: 8.1.0 sha.js: 2.4.12 - swagger-client: 3.36.0 + swagger-client: 3.36.1 url-parse: 1.5.10 xml: 1.0.1 xml-but-prettier: 1.0.1 @@ -51135,7 +50149,7 @@ snapshots: swagger-ui-react@5.22.0(@types/react@18.2.0)(react-dom@18.2.0(react@18.2.0))(react@18.2.0): dependencies: - '@babel/runtime-corejs3': 7.28.4 + '@babel/runtime-corejs3': 7.29.0 '@scarf/scarf': 1.4.0 base64-js: 1.5.1 classnames: 2.5.1 @@ -51146,7 +50160,7 @@ snapshots: immutable: 3.8.2 js-file-download: 0.4.12 js-yaml: 4.1.1 - lodash: 4.17.21 + lodash: 4.17.23 prop-types: 15.8.1 randexp: 0.5.3 randombytes: 2.1.0 @@ -51165,7 +50179,7 @@ snapshots: reselect: 5.1.1 serialize-error: 8.1.0 sha.js: 2.4.12 - swagger-client: 3.36.0 + swagger-client: 3.36.1 url-parse: 1.5.10 xml: 1.0.1 xml-but-prettier: 1.0.1 @@ -51174,17 +50188,17 @@ snapshots: - '@types/react' - debug - swc-loader@0.2.6(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + swc-loader@0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: - '@swc/core': 1.15.3(@swc/helpers@0.5.17) + '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@swc/counter': 0.1.3 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - swc-loader@0.2.6(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0): + swc-loader@0.2.7(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1): dependencies: - '@swc/core': 1.15.3(@swc/helpers@0.5.17) + '@swc/core': 1.15.11(@swc/helpers@0.5.18) '@swc/counter': 0.1.3 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) symbol-tree@3.2.4: {} @@ -51196,11 +50210,11 @@ snapshots: get-symbol-description: 1.1.0 gopd: 1.2.0 has-symbols: 1.1.0 - object.getownpropertydescriptors: 2.1.8 + object.getownpropertydescriptors: 2.1.9 synchronous-promise@2.0.17: {} - synckit@0.11.11: + synckit@0.11.12: dependencies: '@pkgr/core': 0.2.9 @@ -51208,14 +50222,7 @@ snapshots: tabbable@5.3.3: {} - tabbable@6.3.0: {} - - table@5.4.6: - dependencies: - ajv: 6.12.6 - lodash: 4.17.21 - slice-ansi: 2.1.0 - string-width: 3.1.0 + tabbable@6.4.0: {} table@6.9.0: dependencies: @@ -51225,9 +50232,9 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tailwind-merge@2.6.0: {} + tailwind-merge@2.6.1: {} - tailwindcss@3.4.18(yaml@2.8.2): + tailwindcss@3.4.19(yaml@2.8.2): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -51255,7 +50262,7 @@ snapshots: - tsx - yaml - tailwindcss@4.1.17: {} + tailwindcss@4.1.18: {} tapable@0.2.9: {} @@ -51268,7 +50275,7 @@ snapshots: pump: 3.0.3 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 4.5.2 + bare-fs: 4.5.3 bare-path: 3.0.0 transitivePeerDependencies: - bare-abort-controller @@ -51322,7 +50329,7 @@ snapshots: is-regex: 1.2.1 is-symbol: 1.1.1 isobject: 4.0.0 - lodash: 4.17.21 + lodash: 4.17.23 memoizerific: 1.11.3 telejson@7.2.0: @@ -51357,7 +50364,7 @@ snapshots: ansi-escapes: 7.2.0 supports-hyperlinks: 3.2.0 - terser-webpack-plugin@4.2.3(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + terser-webpack-plugin@4.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: cacache: 15.3.0 find-cache-dir: 3.3.2 @@ -51366,11 +50373,11 @@ snapshots: schema-utils: 3.3.0 serialize-javascript: 5.0.1 source-map: 0.6.1 - terser: 5.44.1 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + terser: 5.46.0 + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) webpack-sources: 1.4.3 - terser-webpack-plugin@4.2.3(webpack@5.103.0): + terser-webpack-plugin@4.2.3(webpack@5.104.1): dependencies: cacache: 15.3.0 find-cache-dir: 3.3.2 @@ -51379,43 +50386,43 @@ snapshots: schema-utils: 3.3.0 serialize-javascript: 5.0.1 source-map: 0.6.1 - terser: 5.44.1 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + terser: 5.46.0 + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-sources: 1.4.3 - terser-webpack-plugin@5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)): + terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 - terser: 5.44.1 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12) + terser: 5.46.0 + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) optionalDependencies: - '@swc/core': 1.15.3(@swc/helpers@0.5.17) + '@swc/core': 1.15.11(@swc/helpers@0.5.18) esbuild: 0.25.12 - terser-webpack-plugin@5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 - terser: 5.44.1 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + terser: 5.46.0 + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: - '@swc/core': 1.15.3(@swc/helpers@0.5.17) + '@swc/core': 1.15.11(@swc/helpers@0.5.18) - terser-webpack-plugin@5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0): + terser-webpack-plugin@5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 serialize-javascript: 6.0.2 - terser: 5.44.1 - webpack: 5.103.0(webpack-cli@5.1.4) + terser: 5.46.0 + webpack: 5.104.1(webpack-cli@5.1.4) optionalDependencies: - '@swc/core': 1.15.3(@swc/helpers@0.5.17) + '@swc/core': 1.15.11(@swc/helpers@0.5.18) terser@4.8.1: dependencies: @@ -51423,7 +50430,7 @@ snapshots: source-map: 0.6.1 source-map-support: 0.5.21 - terser@5.44.1: + terser@5.46.0: dependencies: '@jridgewell/source-map': 0.3.11 acorn: 8.15.0 @@ -51496,11 +50503,6 @@ snapshots: timed-out@4.0.1: {} - timers-ext@0.1.8: - dependencies: - es5-ext: 0.10.64 - next-tick: 1.1.0 - timezone-support@3.1.0: dependencies: moment-timezone: 0.5.39 @@ -51605,18 +50607,12 @@ snapshots: tree-kill@1.2.2: {} - tree-sitter-json@0.24.8(tree-sitter@0.21.1): + tree-sitter-json@0.24.8(tree-sitter@0.22.4): dependencies: node-addon-api: 8.5.0 node-gyp-build: 4.8.4 optionalDependencies: - tree-sitter: 0.21.1 - optional: true - - tree-sitter@0.21.1: - dependencies: - node-addon-api: 8.5.0 - node-gyp-build: 4.8.4 + tree-sitter: 0.22.4 optional: true tree-sitter@0.22.4: @@ -51653,11 +50649,7 @@ snapshots: ts-algebra@2.0.0: {} - ts-api-utils@1.4.3(typescript@5.8.3): - dependencies: - typescript: 5.8.3 - - ts-api-utils@2.1.0(typescript@5.8.3): + ts-api-utils@2.4.0(typescript@5.8.3): dependencies: typescript: 5.8.3 @@ -51695,12 +50687,12 @@ snapshots: typescript: 3.9.10 yargs-parser: 18.1.3 - ts-jest@29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3): + ts-jest@29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.27.7))(jest@29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + jest: 29.7.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -51715,12 +50707,12 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.27.7) - ts-jest@29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@30.2.0(@babel/core@7.27.7))(esbuild@0.25.12)(jest@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3): + ts-jest@29.3.4(@babel/core@7.27.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@30.2.0(@babel/core@7.27.7))(esbuild@0.25.12)(jest@30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)))(typescript@5.8.3): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3)) + jest: 30.2.0(@types/node@22.15.35)(babel-plugin-macros@3.1.0)(esbuild-register@3.6.0(esbuild@0.25.12))(ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -51743,15 +50735,15 @@ snapshots: loader-utils: 1.4.2 semver: 5.7.2 - ts-loader@9.5.4(typescript@5.8.3)(webpack@5.103.0): + ts-loader@9.5.4(typescript@5.8.3)(webpack@5.104.1): dependencies: chalk: 4.1.2 - enhanced-resolve: 5.18.3 + enhanced-resolve: 5.18.4 micromatch: 4.0.8 semver: 7.7.3 source-map: 0.7.6 typescript: 5.8.3 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) ts-mixer@6.0.4: {} @@ -51765,7 +50757,7 @@ snapshots: '@ts-morph/common': 0.27.0 code-block-writer: 13.0.3 - ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.18)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.18)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -51777,15 +50769,15 @@ snapshots: acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 - diff: 4.0.2 + diff: 8.0.3 make-error: 1.3.6 typescript: 5.8.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.3(@swc/helpers@0.5.17) + '@swc/core': 1.15.11(@swc/helpers@0.5.18) - ts-node@10.9.2(@swc/core@1.15.3(@swc/helpers@0.5.17))(@types/node@22.15.35)(typescript@5.8.3): + ts-node@10.9.2(@swc/core@1.15.11(@swc/helpers@0.5.18))(@types/node@22.15.35)(typescript@5.8.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 @@ -51797,13 +50789,13 @@ snapshots: acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 - diff: 4.0.2 + diff: 8.0.3 make-error: 1.3.6 typescript: 5.8.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.15.3(@swc/helpers@0.5.17) + '@swc/core': 1.15.11(@swc/helpers@0.5.18) optional: true ts-pnp@1.2.0(typescript@4.9.5): @@ -51834,25 +50826,25 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tsdx@0.14.1(@types/babel__core@7.20.5)(@types/node@22.15.35): + tsdx@0.14.1(@types/babel__core@7.20.5)(@types/node@22.15.35)(jiti@2.6.1): dependencies: '@babel/core': 7.27.7 - '@babel/helper-module-imports': 7.27.1 - '@babel/parser': 7.28.5 + '@babel/helper-module-imports': 7.28.6 + '@babel/parser': 7.29.0 '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.27.7) '@babel/preset-env': 7.27.2(@babel/core@7.27.7) - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.29.0 '@rollup/plugin-babel': 5.3.1(@babel/core@7.27.7)(@types/babel__core@7.20.5)(rollup@1.32.1) '@rollup/plugin-commonjs': 11.1.0(rollup@1.32.1) '@rollup/plugin-json': 4.1.0(rollup@1.32.1) '@rollup/plugin-node-resolve': 9.0.0(rollup@1.32.1) '@rollup/plugin-replace': 2.4.2(rollup@1.32.1) '@types/jest': 25.2.3 - '@typescript-eslint/eslint-plugin': 2.34.0(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0)(typescript@3.9.10) - '@typescript-eslint/parser': 2.34.0(eslint@6.8.0)(typescript@3.9.10) + '@typescript-eslint/eslint-plugin': 2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10))(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10) + '@typescript-eslint/parser': 2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10) ansi-escapes: 4.3.2 asyncro: 3.0.0 - babel-eslint: 10.1.0(eslint@6.8.0) + babel-eslint: 10.1.0(eslint@9.39.2(jiti@2.6.1)) babel-plugin-annotate-pure-calls: 0.4.0(@babel/core@7.27.7) babel-plugin-dev-expression: 0.2.3(@babel/core@7.27.7) babel-plugin-macros: 2.8.0 @@ -51861,15 +50853,15 @@ snapshots: camelcase: 6.3.0 chalk: 4.1.2 enquirer: 2.4.1 - eslint: 6.8.0 - eslint-config-prettier: 6.15.0(eslint@6.8.0) - eslint-config-react-app: 5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(eslint@6.8.0)(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@6.8.0)(typescript@3.9.10))(babel-eslint@10.1.0(eslint@6.8.0))(eslint-plugin-flowtype@3.13.0(eslint@6.8.0))(eslint-plugin-import@2.32.0(eslint@6.8.0))(eslint-plugin-jsx-a11y@6.10.2(eslint@6.8.0))(eslint-plugin-react-hooks@2.5.1(eslint@6.8.0))(eslint-plugin-react@7.37.5(eslint@6.8.0))(eslint@6.8.0) - eslint-plugin-flowtype: 3.13.0(eslint@6.8.0) - eslint-plugin-import: 2.32.0(eslint@6.8.0) - eslint-plugin-jsx-a11y: 6.10.2(eslint@6.8.0) - eslint-plugin-prettier: 3.4.1(eslint-config-prettier@6.15.0(eslint@6.8.0))(eslint@6.8.0)(prettier@1.19.1) - eslint-plugin-react: 7.37.5(eslint@6.8.0) - eslint-plugin-react-hooks: 2.5.1(eslint@6.8.0) + eslint: 9.39.2(jiti@2.6.1) + eslint-config-prettier: 6.15.0(eslint@9.39.2(jiti@2.6.1)) + eslint-config-react-app: 5.2.1(@typescript-eslint/eslint-plugin@2.34.0(@typescript-eslint/parser@2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10))(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10))(@typescript-eslint/parser@2.34.0(eslint@9.39.2(jiti@2.6.1))(typescript@3.9.10))(babel-eslint@10.1.0(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-flowtype@3.13.0(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-import@2.32.0(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-react-hooks@2.5.1(eslint@9.39.2(jiti@2.6.1)))(eslint-plugin-react@7.37.5(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-flowtype: 3.13.0(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-prettier: 3.4.1(eslint-config-prettier@6.15.0(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1))(prettier@1.19.1) + eslint-plugin-react: 7.37.5(eslint@9.39.2(jiti@2.6.1)) + eslint-plugin-react-hooks: 2.5.1(eslint@9.39.2(jiti@2.6.1)) execa: 4.1.0 fs-extra: 9.1.0 jest: 25.5.4 @@ -51897,6 +50889,7 @@ snapshots: - '@types/node' - bufferutil - canvas + - jiti - supports-color - utf-8-validate @@ -51944,11 +50937,11 @@ snapshots: tslint@5.20.1(typescript@5.8.3): dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 builtin-modules: 1.1.1 chalk: 2.4.2 commander: 2.20.3 - diff: 4.0.2 + diff: 8.0.3 glob: 7.2.3 js-yaml: 4.1.1 minimatch: 3.1.2 @@ -51961,11 +50954,11 @@ snapshots: tslint@6.1.3(typescript@4.9.5): dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 builtin-modules: 1.1.1 chalk: 2.4.2 commander: 2.20.3 - diff: 4.0.2 + diff: 8.0.3 glob: 7.2.3 js-yaml: 4.1.1 minimatch: 3.1.2 @@ -51978,11 +50971,11 @@ snapshots: tslint@6.1.3(typescript@5.8.3): dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.29.0 builtin-modules: 1.1.1 chalk: 2.4.2 commander: 2.20.3 - diff: 4.0.2 + diff: 8.0.3 glob: 7.2.3 js-yaml: 4.1.1 minimatch: 3.1.2 @@ -52018,6 +51011,10 @@ snapshots: tslib: 1.14.1 typescript: 5.8.3 + tsyringe@4.10.0: + dependencies: + tslib: 1.14.1 + ttf2eot@2.0.0: dependencies: argparse: 1.0.10 @@ -52031,14 +51028,14 @@ snapshots: dependencies: bindings: 1.5.0 bufferstreams: 1.1.3 - nan: 2.23.1 + nan: 2.25.0 node-gyp: 3.8.0 ttf2woff2@5.0.0: dependencies: bindings: 1.5.0 bufferstreams: 3.0.0 - nan: 2.23.1 + nan: 2.25.0 node-gyp: 9.4.1 transitivePeerDependencies: - supports-color @@ -52138,7 +51135,7 @@ snapshots: typed-rest-client@1.8.11: dependencies: - qs: 6.14.0 + qs: 6.14.1 tunnel: 0.0.6 underscore: 1.13.7 @@ -52164,7 +51161,7 @@ snapshots: uc.micro@2.1.0: {} - ufo@1.6.1: {} + ufo@1.6.3: {} uglify-es@3.3.9: dependencies: @@ -52178,7 +51175,7 @@ snapshots: commander: 2.19.0 source-map: 0.6.1 - uglifyjs-webpack-plugin@1.2.5(webpack@5.103.0): + uglifyjs-webpack-plugin@1.2.5(webpack@5.104.1): dependencies: cacache: 10.0.4 find-cache-dir: 1.0.0 @@ -52186,7 +51183,7 @@ snapshots: serialize-javascript: 1.9.1 source-map: 0.6.1 uglify-es: 3.3.9 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-sources: 1.4.3 worker-farm: 1.7.0 @@ -52203,7 +51200,7 @@ snapshots: undici-types@6.21.0: {} - undici@7.16.0: {} + undici@7.20.0: {} unfetch@4.2.0: {} @@ -52229,7 +51226,7 @@ snapshots: unidiff@1.0.4: dependencies: - diff: 5.2.0 + diff: 8.0.3 unified@10.1.2: dependencies: @@ -52262,7 +51259,7 @@ snapshots: union@0.5.0: dependencies: - qs: 6.14.0 + qs: 6.14.1 uniq@1.0.1: {} @@ -52292,6 +51289,10 @@ snapshots: dependencies: crypto-random-string: 2.0.0 + unique-string@3.0.0: + dependencies: + crypto-random-string: 4.0.0 + unist-builder@2.0.3: {} unist-util-generated@1.1.6: {} @@ -52359,7 +51360,7 @@ snapshots: unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 - unist-util-visit@5.0.0: + unist-util-visit@5.1.0: dependencies: '@types/unist': 3.0.3 unist-util-is: 6.0.1 @@ -52434,15 +51435,15 @@ snapshots: dependencies: bluebird: 3.7.2 duplexer2: 0.1.4 - fs-extra: 11.3.2 + fs-extra: 11.3.3 graceful-fs: 4.2.11 node-int64: 0.4.0 upath@2.0.1: {} - update-browserslist-db@1.1.4(browserslist@4.28.0): + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: - browserslist: 4.28.0 + browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 @@ -52471,30 +51472,30 @@ snapshots: url-join@4.0.1: {} - url-loader@0.6.2(file-loader@1.1.5(webpack@5.103.0)): + url-loader@0.6.2(file-loader@1.1.5(webpack@5.104.1)): dependencies: - file-loader: 1.1.5(webpack@5.103.0) + file-loader: 1.1.5(webpack@5.104.1) loader-utils: 1.4.2 mime: 1.6.0 schema-utils: 0.3.0 - url-loader@4.1.1(file-loader@6.2.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))))(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optionalDependencies: - file-loader: 6.2.0(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) + file-loader: 6.2.0(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) - url-loader@4.1.1(file-loader@6.2.0(webpack@5.103.0))(webpack@5.103.0): + url-loader@4.1.1(file-loader@6.2.0(webpack@5.104.1))(webpack@5.104.1): dependencies: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) optionalDependencies: - file-loader: 6.2.0(webpack@5.103.0) + file-loader: 6.2.0(webpack@5.104.1) url-parse-lax@1.0.0: dependencies: @@ -52508,7 +51509,7 @@ snapshots: url@0.11.4: dependencies: punycode: 1.4.1 - qs: 6.14.0 + qs: 6.14.1 use-callback-ref@1.3.3(@types/react@18.2.0)(react@18.2.0): dependencies: @@ -52601,7 +51602,7 @@ snapshots: util.promisify@1.0.0: dependencies: define-properties: 1.2.1 - object.getownpropertydescriptors: 2.1.8 + object.getownpropertydescriptors: 2.1.9 util@0.10.4: dependencies: @@ -52613,7 +51614,7 @@ snapshots: is-arguments: 1.2.0 is-generator-function: 1.1.2 is-typed-array: 1.1.15 - which-typed-array: 1.1.19 + which-typed-array: 1.1.20 utila@0.4.0: {} @@ -52631,8 +51632,6 @@ snapshots: v8-compile-cache-lib@3.0.1: {} - v8-compile-cache@2.4.0: {} - v8-to-istanbul@4.1.4: dependencies: '@types/istanbul-lib-coverage': 2.0.6 @@ -52688,20 +51687,20 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.94.2)(terser@5.44.1)(yaml@2.8.2): + vite@6.4.1(@types/node@22.15.35)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.53.3 + rollup: 4.57.1 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 22.15.35 fsevents: 2.3.3 jiti: 2.6.1 - sass: 1.94.2 - terser: 5.44.1 + sass: 1.97.3 + terser: 5.46.0 yaml: 2.8.2 vscode-debugadapter-testsupport@1.51.0: @@ -52719,30 +51718,30 @@ snapshots: dependencies: applicationinsights: 1.7.4 - vscode-extension-tester-locators@3.12.2(monaco-page-objects@3.14.1(selenium-webdriver@4.38.0)(typescript@5.8.3))(selenium-webdriver@4.38.0): + vscode-extension-tester-locators@3.12.2(monaco-page-objects@3.14.1(selenium-webdriver@4.40.0)(typescript@5.8.3))(selenium-webdriver@4.40.0): dependencies: - monaco-page-objects: 3.14.1(selenium-webdriver@4.38.0)(typescript@5.8.3) - selenium-webdriver: 4.38.0 + monaco-page-objects: 3.14.1(selenium-webdriver@4.40.0)(typescript@5.8.3) + selenium-webdriver: 4.40.0 vscode-extension-tester@5.10.0(mocha@10.8.2)(typescript@5.8.3): dependencies: - '@types/selenium-webdriver': 4.35.4 + '@types/selenium-webdriver': 4.35.5 '@vscode/vsce': 2.32.0 commander: 11.1.0 compare-versions: 6.1.1 - fs-extra: 11.3.2 + fs-extra: 11.3.3 glob: 10.5.0 got: 13.0.0 hpagent: 1.2.0 js-yaml: 4.1.1 mocha: 10.8.2 - monaco-page-objects: 3.14.1(selenium-webdriver@4.38.0)(typescript@5.8.3) + monaco-page-objects: 3.14.1(selenium-webdriver@4.40.0)(typescript@5.8.3) sanitize-filename: 1.6.3 - selenium-webdriver: 4.38.0 + selenium-webdriver: 4.40.0 targz: 1.0.1 typescript: 5.8.3 unzipper: 0.10.14 - vscode-extension-tester-locators: 3.12.2(monaco-page-objects@3.14.1(selenium-webdriver@4.38.0)(typescript@5.8.3))(selenium-webdriver@4.38.0) + vscode-extension-tester-locators: 3.12.2(monaco-page-objects@3.14.1(selenium-webdriver@4.40.0)(typescript@5.8.3))(selenium-webdriver@4.40.0) transitivePeerDependencies: - bare-abort-controller - bare-buffer @@ -52753,22 +51752,22 @@ snapshots: vscode-extension-tester@8.14.1(mocha@11.7.5)(typescript@5.8.3): dependencies: - '@redhat-developer/locators': 1.17.0(@redhat-developer/page-objects@1.17.0(selenium-webdriver@4.38.0)(typescript@5.8.3))(selenium-webdriver@4.38.0) - '@redhat-developer/page-objects': 1.17.0(selenium-webdriver@4.38.0)(typescript@5.8.3) - '@types/selenium-webdriver': 4.35.4 + '@redhat-developer/locators': 1.18.1(@redhat-developer/page-objects@1.18.1(selenium-webdriver@4.40.0)(typescript@5.8.3))(selenium-webdriver@4.40.0) + '@redhat-developer/page-objects': 1.18.1(selenium-webdriver@4.40.0)(typescript@5.8.3) + '@types/selenium-webdriver': 4.35.5 '@vscode/vsce': 3.7.1 c8: 10.1.3 commander: 13.1.0 compare-versions: 6.1.1 find-up: 7.0.0 - fs-extra: 11.3.2 + fs-extra: 11.3.3 glob: 11.1.0 got: 14.4.7 hpagent: 1.2.0 js-yaml: 4.1.1 mocha: 11.7.5 sanitize-filename: 1.6.3 - selenium-webdriver: 4.38.0 + selenium-webdriver: 4.40.0 targz: 1.0.1 typescript: 5.8.3 unzipper: 0.12.3 @@ -52893,7 +51892,7 @@ snapshots: watch@0.10.0: {} - watchpack@2.4.4: + watchpack@2.5.1: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 @@ -52934,12 +51933,12 @@ snapshots: webidl-conversions@7.0.0: {} - webpack-cli@4.10.0(webpack-dev-server@5.2.2)(webpack@5.103.0): + webpack-cli@4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.103.0) + '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.104.1) '@webpack-cli/info': 1.5.0(webpack-cli@4.10.0) - '@webpack-cli/serve': 1.7.0(webpack-cli@4.10.0)(webpack-dev-server@5.2.2) + '@webpack-cli/serve': 1.7.0(webpack-cli@4.10.0)(webpack-dev-server@5.2.3) colorette: 2.0.20 commander: 7.2.0 cross-spawn: 7.0.6 @@ -52947,15 +51946,15 @@ snapshots: import-local: 3.2.0 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.103.0(webpack-cli@4.10.0) + webpack: 5.104.1(webpack-cli@4.10.0) webpack-merge: 5.10.0 optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@4.10.0)(webpack@5.103.0) + webpack-dev-server: 5.2.3(webpack-cli@4.10.0)(webpack@5.104.1) - webpack-cli@4.10.0(webpack@5.103.0): + webpack-cli@4.10.0(webpack@5.104.1): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.103.0) + '@webpack-cli/configtest': 1.2.0(webpack-cli@4.10.0)(webpack@5.104.1) '@webpack-cli/info': 1.5.0(webpack-cli@4.10.0) '@webpack-cli/serve': 1.7.0(webpack-cli@4.10.0) colorette: 2.0.20 @@ -52965,15 +51964,15 @@ snapshots: import-local: 3.2.0 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.103.0(webpack-cli@4.10.0) + webpack: 5.104.1(webpack-cli@4.10.0) webpack-merge: 5.10.0 - webpack-cli@5.1.4(webpack-dev-server@5.2.2)(webpack@5.103.0): + webpack-cli@5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.103.0) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.103.0) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.2)(webpack@5.103.0) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.104.1) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.104.1) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack-dev-server@5.2.3)(webpack@5.104.1) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.6 @@ -52982,17 +51981,17 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) webpack-merge: 5.10.0 optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@5.1.4)(webpack@5.103.0) + webpack-dev-server: 5.2.3(webpack-cli@5.1.4)(webpack@5.104.1) - webpack-cli@5.1.4(webpack@5.103.0): + webpack-cli@5.1.4(webpack@5.104.1): dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.103.0) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.103.0) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.103.0) + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.104.1) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.104.1) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.104.1) colorette: 2.0.20 commander: 10.0.1 cross-spawn: 7.0.6 @@ -53001,15 +52000,15 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) webpack-merge: 5.10.0 - webpack-cli@6.0.1(webpack-dev-server@5.2.2)(webpack@5.103.0): + webpack-cli@6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.103.0) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.103.0) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.2)(webpack@5.103.0) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.104.1) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.104.1) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack-dev-server@5.2.3)(webpack@5.104.1) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -53018,17 +52017,17 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-merge: 6.0.1 optionalDependencies: - webpack-dev-server: 5.2.2(webpack-cli@6.0.1)(webpack@5.103.0) + webpack-dev-server: 5.2.3(webpack-cli@6.0.1)(webpack@5.104.1) - webpack-cli@6.0.1(webpack@5.103.0): + webpack-cli@6.0.1(webpack@5.104.1): dependencies: '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.103.0) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.103.0) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack@5.103.0) + '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.104.1) + '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.104.1) + '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack@5.104.1) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.6 @@ -53037,28 +52036,28 @@ snapshots: import-local: 3.2.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.103.0(webpack-cli@6.0.1) + webpack: 5.104.1(webpack-cli@6.0.1) webpack-merge: 6.0.1 - webpack-dev-middleware@3.7.3(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + webpack-dev-middleware@3.7.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: memory-fs: 0.4.1 mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) webpack-log: 2.0.0 - webpack-dev-middleware@3.7.3(webpack@5.103.0): + webpack-dev-middleware@3.7.3(webpack@5.104.1): dependencies: memory-fs: 0.4.1 mime: 2.6.0 mkdirp: 0.5.6 range-parser: 1.2.1 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-log: 2.0.0 - webpack-dev-middleware@4.3.0(webpack@5.103.0): + webpack-dev-middleware@4.3.0(webpack@5.104.1): dependencies: colorette: 1.4.0 mem: 8.1.1 @@ -53066,9 +52065,9 @@ snapshots: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 3.3.0 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) - webpack-dev-middleware@6.1.3(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)): + webpack-dev-middleware@6.1.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -53076,9 +52075,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12) - webpack-dev-middleware@6.1.3(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + webpack-dev-middleware@6.1.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -53086,9 +52085,9 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - webpack-dev-middleware@6.1.3(webpack@5.103.0): + webpack-dev-middleware@6.1.3(webpack@5.104.1): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -53096,37 +52095,37 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) - webpack-dev-middleware@7.4.5(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + webpack-dev-middleware@7.4.5(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: colorette: 2.0.20 - memfs: 4.51.1 + memfs: 4.56.10 mime-types: 3.0.2 on-finished: 2.4.1 range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) optional: true - webpack-dev-middleware@7.4.5(webpack@5.103.0): + webpack-dev-middleware@7.4.5(webpack@5.104.1): dependencies: colorette: 2.0.20 - memfs: 4.51.1 + memfs: 4.56.10 mime-types: 3.0.2 on-finished: 2.4.1 range-parser: 1.2.1 schema-utils: 4.3.3 optionalDependencies: - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) - webpack-dev-server@5.2.2(webpack-cli@4.10.0)(webpack@5.103.0): + webpack-dev-server@5.2.3(webpack-cli@4.10.0)(webpack@5.104.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 '@types/express': 4.17.25 - '@types/express-serve-static-core': 4.19.7 + '@types/express-serve-static-core': 4.19.8 '@types/serve-index': 1.9.4 '@types/serve-static': 1.15.10 '@types/sockjs': 0.3.36 @@ -53145,15 +52144,15 @@ snapshots: open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.3 - selfsigned: 2.4.1 - serve-index: 1.9.1 + selfsigned: 5.5.0 + serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.103.0) - ws: 8.18.3 + webpack-dev-middleware: 7.4.5(webpack@5.104.1) + ws: 8.19.0 optionalDependencies: - webpack: 5.103.0(webpack-cli@4.10.0) - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@4.10.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) transitivePeerDependencies: - bufferutil - debug @@ -53161,12 +52160,12 @@ snapshots: - utf-8-validate optional: true - webpack-dev-server@5.2.2(webpack-cli@5.1.4)(webpack@5.103.0): + webpack-dev-server@5.2.3(webpack-cli@5.1.4)(webpack@5.104.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 '@types/express': 4.17.25 - '@types/express-serve-static-core': 4.19.7 + '@types/express-serve-static-core': 4.19.8 '@types/serve-index': 1.9.4 '@types/serve-static': 1.15.10 '@types/sockjs': 0.3.36 @@ -53185,27 +52184,27 @@ snapshots: open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.3 - selfsigned: 2.4.1 - serve-index: 1.9.1 + selfsigned: 5.5.0 + serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.103.0) - ws: 8.18.3 + webpack-dev-middleware: 7.4.5(webpack@5.104.1) + ws: 8.19.0 optionalDependencies: - webpack: 5.103.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack-dev-server@5.2.2)(webpack@5.103.0) + webpack: 5.104.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack-dev-server@5.2.3)(webpack@5.104.1) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-dev-server@5.2.2(webpack-cli@6.0.1)(webpack@5.103.0): + webpack-dev-server@5.2.3(webpack-cli@6.0.1)(webpack@5.104.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 '@types/express': 4.17.25 - '@types/express-serve-static-core': 4.19.7 + '@types/express-serve-static-core': 4.19.8 '@types/serve-index': 1.9.4 '@types/serve-static': 1.15.10 '@types/sockjs': 0.3.36 @@ -53224,27 +52223,27 @@ snapshots: open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.3 - selfsigned: 2.4.1 - serve-index: 1.9.1 + selfsigned: 5.5.0 + serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.103.0) - ws: 8.18.3 + webpack-dev-middleware: 7.4.5(webpack@5.104.1) + ws: 8.19.0 optionalDependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.103.0) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-dev-server@5.2.2(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + webpack-dev-server@5.2.3(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 '@types/express': 4.17.25 - '@types/express-serve-static-core': 4.19.7 + '@types/express-serve-static-core': 4.19.8 '@types/serve-index': 1.9.4 '@types/serve-static': 1.15.10 '@types/sockjs': 0.3.36 @@ -53263,14 +52262,14 @@ snapshots: open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.3 - selfsigned: 2.4.1 - serve-index: 1.9.1 + selfsigned: 5.5.0 + serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - ws: 8.18.3 + webpack-dev-middleware: 7.4.5(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + ws: 8.19.0 optionalDependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) transitivePeerDependencies: - bufferutil - debug @@ -53278,12 +52277,12 @@ snapshots: - utf-8-validate optional: true - webpack-dev-server@5.2.2(webpack@5.103.0): + webpack-dev-server@5.2.3(webpack@5.104.1): dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 '@types/express': 4.17.25 - '@types/express-serve-static-core': 4.19.7 + '@types/express-serve-static-core': 4.19.8 '@types/serve-index': 1.9.4 '@types/serve-static': 1.15.10 '@types/sockjs': 0.3.36 @@ -53302,27 +52301,27 @@ snapshots: open: 10.2.0 p-retry: 6.2.1 schema-utils: 4.3.3 - selfsigned: 2.4.1 - serve-index: 1.9.1 + selfsigned: 5.5.0 + serve-index: 1.9.2 sockjs: 0.3.24 spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(webpack@5.103.0) - ws: 8.18.3 + webpack-dev-middleware: 7.4.5(webpack@5.104.1) + ws: 8.19.0 optionalDependencies: - webpack: 5.103.0(webpack-cli@5.1.4) + webpack: 5.104.1(webpack-cli@5.1.4) transitivePeerDependencies: - bufferutil - debug - supports-color - utf-8-validate - webpack-filter-warnings-plugin@1.2.1(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))): + webpack-filter-warnings-plugin@1.2.1(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))): dependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)) - webpack-filter-warnings-plugin@1.2.1(webpack@5.103.0): + webpack-filter-warnings-plugin@1.2.1(webpack@5.104.1): dependencies: - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-hot-middleware@2.26.1: dependencies: @@ -53335,11 +52334,11 @@ snapshots: ansi-colors: 3.2.4 uuid: 3.4.0 - webpack-manifest-plugin@1.3.2(webpack@5.103.0): + webpack-manifest-plugin@1.3.2(webpack@5.104.1): dependencies: fs-extra: 0.30.0 - lodash: 4.17.21 - webpack: 5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1) + lodash: 4.17.23 + webpack: 5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1) webpack-merge@5.10.0: dependencies: @@ -53374,7 +52373,7 @@ snapshots: webpack-virtual-modules@0.6.2: {} - webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17)): + webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18)): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -53384,10 +52383,10 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.28.0 + browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 - es-module-lexer: 1.7.0 + enhanced-resolve: 5.18.4 + es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -53398,15 +52397,15 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))) - watchpack: 2.4.4 + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))) + watchpack: 2.5.1 webpack-sources: 3.3.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12): + webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -53416,10 +52415,10 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.28.0 + browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 - es-module-lexer: 1.7.0 + enhanced-resolve: 5.18.4 + es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -53430,15 +52429,15 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)(webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(esbuild@0.25.12)) - watchpack: 2.4.4 + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)(webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(esbuild@0.25.12)) + watchpack: 2.5.1 webpack-sources: 3.3.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@5.1.4): + webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@5.1.4): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -53448,10 +52447,10 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.28.0 + browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 - es-module-lexer: 1.7.0 + enhanced-resolve: 5.18.4 + es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -53462,17 +52461,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0) - watchpack: 2.4.4 + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack@5.103.0) + webpack-cli: 5.1.4(webpack@5.104.1) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.103.0(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack-cli@6.0.1): + webpack@5.104.1(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -53482,10 +52481,10 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.28.0 + browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 - es-module-lexer: 1.7.0 + enhanced-resolve: 5.18.4 + es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -53496,17 +52495,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0) - watchpack: 2.4.4 + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 6.0.1(webpack-dev-server@5.2.2)(webpack@5.103.0) + webpack-cli: 6.0.1(webpack-dev-server@5.2.3)(webpack@5.104.1) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.103.0(webpack-cli@4.10.0): + webpack@5.104.1(webpack-cli@4.10.0): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -53516,10 +52515,10 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.28.0 + browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 - es-module-lexer: 1.7.0 + enhanced-resolve: 5.18.4 + es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -53530,17 +52529,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0) - watchpack: 2.4.4 + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 4.10.0(webpack-dev-server@5.2.2)(webpack@5.103.0) + webpack-cli: 4.10.0(webpack-dev-server@5.2.3)(webpack@5.104.1) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.103.0(webpack-cli@5.1.4): + webpack@5.104.1(webpack-cli@5.1.4): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -53550,10 +52549,10 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.28.0 + browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 - es-module-lexer: 1.7.0 + enhanced-resolve: 5.18.4 + es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -53564,17 +52563,17 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0) - watchpack: 2.4.4 + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 5.1.4(webpack@5.103.0) + webpack-cli: 5.1.4(webpack@5.104.1) transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - webpack@5.103.0(webpack-cli@6.0.1): + webpack@5.104.1(webpack-cli@6.0.1): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -53584,10 +52583,10 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.28.0 + browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 - es-module-lexer: 1.7.0 + enhanced-resolve: 5.18.4 + es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -53598,11 +52597,11 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.14(@swc/core@1.15.3(@swc/helpers@0.5.17))(webpack@5.103.0) - watchpack: 2.4.4 + terser-webpack-plugin: 5.3.16(@swc/core@1.15.11(@swc/helpers@0.5.18))(webpack@5.104.1) + watchpack: 2.5.1 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 6.0.1(webpack@5.103.0) + webpack-cli: 6.0.1(webpack@5.104.1) transitivePeerDependencies: - '@swc/core' - esbuild @@ -53687,7 +52686,7 @@ snapshots: isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.19 + which-typed-array: 1.1.20 which-collection@1.0.2: dependencies: @@ -53700,7 +52699,7 @@ snapshots: which-module@2.0.1: {} - which-typed-array@1.1.19: + which-typed-array@1.1.20: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 @@ -53831,10 +52830,6 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 - write@1.0.3: - dependencies: - mkdirp: 0.5.6 - ws@5.2.4: dependencies: async-limiter: 1.0.1 @@ -53845,7 +52840,7 @@ snapshots: ws@7.5.10: {} - ws@8.18.3: {} + ws@8.19.0: {} wsl-utils@0.1.0: dependencies: @@ -53863,7 +52858,7 @@ snapshots: xml-js@1.6.11: dependencies: - sax: 1.4.3 + sax: 1.4.4 xml-name-validator@2.0.1: {} @@ -53873,12 +52868,12 @@ snapshots: xml2js@0.5.0: dependencies: - sax: 1.4.3 + sax: 1.4.4 xmlbuilder: 11.0.1 xml2js@0.6.2: dependencies: - sax: 1.4.3 + sax: 1.4.4 xmlbuilder: 11.0.1 xml@1.0.1: {} @@ -54041,7 +53036,7 @@ snapshots: zenscroll@4.0.2: {} - zod-to-json-schema@3.25.0(zod@3.25.76): + zod-to-json-schema@3.25.1(zod@3.25.76): dependencies: zod: 3.25.76 @@ -54049,13 +53044,13 @@ snapshots: zod@4.1.11: {} - zustand@5.0.9(@types/react@18.2.0)(react@18.2.0)(use-sync-external-store@1.6.0(react@18.2.0)): + zustand@5.0.11(@types/react@18.2.0)(react@18.2.0)(use-sync-external-store@1.6.0(react@18.2.0)): optionalDependencies: '@types/react': 18.2.0 react: 18.2.0 use-sync-external-store: 1.6.0(react@18.2.0) - zustand@5.0.9(@types/react@18.2.0)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)): + zustand@5.0.11(@types/react@18.2.0)(react@19.1.0)(use-sync-external-store@1.6.0(react@19.1.0)): optionalDependencies: '@types/react': 18.2.0 react: 19.1.0 diff --git a/package.json b/package.json index 70c0fe585c0..7025b879b46 100644 --- a/package.json +++ b/package.json @@ -2,12 +2,14 @@ "name": "ballerina-vscode-extensions-mono-repo", "pnpm": { "overrides": { + "@modelcontextprotocol/sdk": "^1.25.2", "brace-expansion": "^2.0.2", "http-proxy": "^1.18.1", "prismjs": "^1.30.0", "webpack": "^5.94.0", "webpack-dev-server": "^5.2.1", "braces": "^3.0.3", + "js-yaml": "^4.1.1", "micromatch": "^4.0.8", "esbuild": "^0.25.0", "xmldom": "npm:@xmldom/xmldom@^0.8.10", @@ -15,7 +17,11 @@ "on-headers": "^1.1.0", "form-data": "^4.0.4", "tmp": "^0.2.4", - "express": "^4.22.1" + "express": "^4.22.1", + "qs": "^6.14.1", + "diff": "^8.0.3", + "undici": "^7.18.2", + "lodash": "4.17.23" } }, "scripts": { diff --git a/workspaces/api-designer/api-designer-core/eslint.config.cjs b/workspaces/api-designer/api-designer-core/eslint.config.cjs new file mode 100644 index 00000000000..f4716d3d34f --- /dev/null +++ b/workspaces/api-designer/api-designer-core/eslint.config.cjs @@ -0,0 +1,19 @@ +/* eslint-disable */ +const { FlatCompat } = require("@eslint/eslintrc"); +const { defineConfig } = require("eslint/config"); +const js = require("@eslint/js"); + +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all, +}); + +module.exports = defineConfig([ + ...compat.config(require("./.eslintrc.js")), + { + rules: { + "@typescript-eslint/no-unsafe-declaration-merging": "off", + }, + }, +]); diff --git a/workspaces/api-designer/api-designer-core/package.json b/workspaces/api-designer/api-designer-core/package.json index 3f3c282f7e2..ae549f7b49f 100644 --- a/workspaces/api-designer/api-designer-core/package.json +++ b/workspaces/api-designer/api-designer-core/package.json @@ -13,9 +13,9 @@ "author": "WSO2", "devDependencies": { "typescript": "5.8.3", - "@typescript-eslint/parser": "^6.9.1", - "@typescript-eslint/eslint-plugin": "^6.9.1", - "eslint": "^8.52.0" + "@typescript-eslint/parser": "8.32.1", + "@typescript-eslint/eslint-plugin": "8.32.1", + "eslint": "9.27.0" }, "dependencies": { "@types/vscode-webview": "^1.57.3", diff --git a/workspaces/api-designer/api-designer-extension/package.json b/workspaces/api-designer/api-designer-extension/package.json index b52074ee9bf..8913558fba7 100644 --- a/workspaces/api-designer/api-designer-extension/package.json +++ b/workspaces/api-designer/api-designer-extension/package.json @@ -100,9 +100,9 @@ "devDependencies": { "@types/vscode": "^1.81.0", "@types/node": "16.x", - "@typescript-eslint/eslint-plugin": "^6.4.1", - "@typescript-eslint/parser": "^6.4.1", - "eslint": "^8.47.0", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", + "eslint": "9.27.0", "typescript": "5.8.3", "ts-loader": "^9.4.4", "webpack": "^5.88.2", @@ -122,7 +122,7 @@ "@wso2/font-wso2-vscode": "workspace:*", "@types/xml2js": "~0.4.12", "jsonix": "~3.0.0", - "lodash": "~4.17.21", + "lodash": "4.17.23", "axios": "~1.12.0", "@types/lodash": "~4.14.199", "xstate": "^4.38.3", diff --git a/workspaces/api-designer/api-designer-rpc-client/eslint.config.cjs b/workspaces/api-designer/api-designer-rpc-client/eslint.config.cjs new file mode 100644 index 00000000000..91c2f84c5b6 --- /dev/null +++ b/workspaces/api-designer/api-designer-rpc-client/eslint.config.cjs @@ -0,0 +1,31 @@ +/* eslint-disable @typescript-eslint/no-require-imports, no-undef */ +const { + defineConfig, + globalIgnores, +} = require("eslint/config"); + +const tsParser = require("@typescript-eslint/parser"); +const typescriptEslint = require("@typescript-eslint/eslint-plugin"); +const js = require("@eslint/js"); + +const { + FlatCompat, +} = require("@eslint/eslintrc"); + +const compat = new FlatCompat({ + baseDirectory: __dirname, + recommendedConfig: js.configs.recommended, + allConfig: js.configs.all +}); + +module.exports = defineConfig([{ + extends: compat.extends("eslint:recommended", "plugin:@typescript-eslint/recommended"), + + languageOptions: { + parser: tsParser, + }, + + plugins: { + "@typescript-eslint": typescriptEslint, + }, +}, globalIgnores(["**/lib", "**/.eslintrc.js", "**/*.d.ts"])]); diff --git a/workspaces/api-designer/api-designer-rpc-client/package.json b/workspaces/api-designer/api-designer-rpc-client/package.json index 06c68013b32..e89db7812a1 100644 --- a/workspaces/api-designer/api-designer-rpc-client/package.json +++ b/workspaces/api-designer/api-designer-rpc-client/package.json @@ -15,9 +15,9 @@ "@types/react": "18.2.0", "@types/react-dom": "18.2.0", "typescript": "5.8.3", - "@typescript-eslint/parser": "^6.9.1", - "@typescript-eslint/eslint-plugin": "^6.9.1", - "eslint": "^8.52.0" + "@typescript-eslint/parser": "8.32.1", + "@typescript-eslint/eslint-plugin": "8.32.1", + "eslint": "9.27.0" }, "dependencies": { "@types/vscode-webview": "^1.57.3", diff --git a/workspaces/api-designer/api-designer-visualizer/package.json b/workspaces/api-designer/api-designer-visualizer/package.json index 911a8da70de..48eae5014a5 100644 --- a/workspaces/api-designer/api-designer-visualizer/package.json +++ b/workspaces/api-designer/api-designer-visualizer/package.json @@ -32,7 +32,7 @@ "@hookform/resolvers": "~3.3.4", "yup": "~1.4.0", "react-hook-form": "7.56.4", - "lodash": "~4.17.21", + "lodash": "4.17.23", "@tanstack/react-query": "4.0.10", "@tanstack/query-core": "^4.0.0-beta.1", "@mdxeditor/editor": "~3.14.0" @@ -60,7 +60,7 @@ "@types/node": "^20.10.6", "@types/react": "18.2.0", "@types/react-dom": "18.2.0", - "@vscode/codicons": "0.0.33", + "@vscode/codicons": "0.0.44", "copyfiles": "^2.4.1" } } diff --git a/workspaces/apk/apk-extension/package.json b/workspaces/apk/apk-extension/package.json index f08b7fffdf4..970d889c9a1 100644 --- a/workspaces/apk/apk-extension/package.json +++ b/workspaces/apk/apk-extension/package.json @@ -61,10 +61,10 @@ "@types/mocha": "^10.0.1", "@types/node": "^18.11.19", "@types/vscode": "^1.63.0", - "@typescript-eslint/eslint-plugin": "~5.48.2", - "@typescript-eslint/parser": "~5.48.2", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "@vscode/test-electron": "^2.3.2", - "eslint": "^8.32.0", + "eslint": "9.27.0", "glob": "^11.1.0", "mocha": "^10.2.0", "typescript": "5.8.3", diff --git a/workspaces/ballerina/ballerina-core/package.json b/workspaces/ballerina/ballerina-core/package.json index bdec8603660..e57eb2e1ec9 100644 --- a/workspaces/ballerina/ballerina-core/package.json +++ b/workspaces/ballerina/ballerina-core/package.json @@ -32,11 +32,11 @@ "devDependencies": { "@types/node": "^22.15.21", "@types/vscode": "^1.83.1", - "@typescript-eslint/eslint-plugin": "^8.32.1", - "@typescript-eslint/parser": "^8.32.1", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "@types/react": "18.2.0", "copyfiles": "^2.4.1", - "eslint": "^9.26.0", + "eslint": "9.27.0", "typescript": "5.8.3" }, "files": [ diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/ai-panel.ts b/workspaces/ballerina/ballerina-core/src/interfaces/ai-panel.ts index 54415539d0a..e17d274e170 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/ai-panel.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/ai-panel.ts @@ -17,14 +17,14 @@ */ export enum Command { - Code = '/code', - Tests = '/tests', + // Tests = '/tests', DataMap = '/datamap', TypeCreator = '/typecreator', - Healthcare = '/healthcare', + // Healthcare = '/healthcare', Ask = '/ask', NaturalProgramming = '/natural-programming (experimental)', OpenAPI = '/openapi', + Agent = '/agent', // Internal use only - agent is the default behavior Doc = '/doc' } @@ -32,10 +32,6 @@ export enum TemplateId { // Shared Wildcard = 'wildcard', - // Command.Code - GenerateCode = 'generate-code', - GenerateFromReadme = 'generate-from-readme', - // Command.Tests TestsForService = 'tests-for-service', TestsForFunction = 'tests-for-function', diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts index ed44a15fef7..e1670d8e31c 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/bi.ts @@ -19,6 +19,7 @@ import { NodePosition } from "@wso2/syntax-tree"; import { LinePosition } from "./common"; import { Diagnostic as VSCodeDiagnostic } from "vscode-languageserver-types"; +import { ValueTypeConstraint } from "../rpc-types/ai-agent/interfaces"; export type { NodePosition }; @@ -81,6 +82,7 @@ export type Metadata = { export type NodeMetadata = { isDataMappedFunction?: boolean; isAgentTool?: boolean; + connectorType?: string; isIsolatedFunction?: boolean; tools?: ToolData[]; model?: ToolData; @@ -121,10 +123,77 @@ export type Imports = { [prefix: string]: string; }; +export type FormFieldInputType = "TEXT" | + "BOOLEAN" | + "IDENTIFIER" | + "SINGLE_SELECT" | + "MULTIPLE_SELECT" | + "TEXTAREA" | + "TEMPLATE" | + "TYPE" | + "EXPRESSION" | + "REPEATABLE_PROPERTY" | + "PARAM_MANAGER" | + "STRING" | + "FILE_SELECT" | + "ACTION_OR_EXPRESSION" | + "MULTIPLE_SELECT_LISTENER" | + "SINGLE_SELECT_LISTENER" | + "EXPRESSION_SET" | + "TEXT_SET" | + "FLAG" | + "CHOICE" | + "LV_EXPRESSION" | + "RAW_TEMPLATE" | + "ai:Prompt" | + "FIXED_PROPERTY" | + "REPEATABLE_PROPERTY" | + "MAPPING_EXPRESSION_SET" | + "MAPPING_EXPRESSION" | + "ENUM" | + "DM_JOIN_CLAUSE_RHS_EXPRESSION" | + "RECORD_MAP_EXPRESSION" | + "PROMPT"; + +export interface BaseType { + fieldType: FormFieldInputType; + ballerinaType?: string; + selected: boolean; + typeMembers?: PropertyTypeMemberInfo[]; + minItems?: number; // minimum items for EXPRESSION_SET fields + defaultItems?: number; // default number of items for EXPRESSION_SET fields + pattern?: string; // regex pattern for validation (e.g., for TEXT fields) + patternErrorMessage?: string; // custom error message when pattern validation fails +} + +export interface EnumOptions { + label: string; + value: string; +} + +export interface DropdownType extends BaseType { + fieldType: "SINGLE_SELECT" | "MULTIPLE_SELECT"; + options: EnumOptions[]; +} + +export interface TemplateType extends BaseType { + template: Property | ValueTypeConstraint; +} + +export interface IdentifierType extends BaseType { + fieldType: "IDENTIFIER"; + scope: FieldScope; +} + +export type InputType = + | BaseType + | DropdownType + | TemplateType + | IdentifierType; + export type Property = { metadata: Metadata; diagnostics?: Diagnostic; - valueType: string; value: string | string[] | ELineRange | NodeProperties | Property[]; advanceProperties?: NodeProperties; optional: boolean; @@ -132,9 +201,8 @@ export type Property = { advanced?: boolean; hidden?: boolean; placeholder?: string; - valueTypeConstraint?: string | string[]; + types?: InputType[]; codedata?: CodeData; - typeMembers?: PropertyTypeMemberInfo[]; imports?: Imports; advancedValue?: string; modified?: boolean; @@ -280,6 +348,7 @@ export interface ProjectStructure { projectName: string; projectPath?: string; projectTitle?: string; + isLibrary?: boolean; directoryMap: ProjectDirectoryMap; } @@ -392,6 +461,8 @@ export type Repeatable = "ONE_OR_MORE" | "ZERO_OR_ONE" | "ONE" | "ZERO_OR_MORE"; export type Scope = "module" | "local" | "object"; +export type FieldScope = "Global" | "Local" | "Object"; + export type NodeKind = | "ACTION_OR_EXPRESSION" | "AGENT" diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts b/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts index c86aeebd74d..41ed5834e5d 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/constants.ts @@ -55,5 +55,5 @@ export const BI_COMMANDS = { CREATE_BI_PROJECT: 'BI.project.createBIProjectPure', CREATE_BI_MIGRATION_PROJECT: 'BI.project.createBIProjectMigration', ADD_INTEGRATION: 'BI.project-explorer.add-integration', - NOTIFY_PROJECT_EXPLORER: 'BI.project-explorer.notify', + NOTIFY_PROJECT_EXPLORER: 'BI.project-explorer.notify' }; diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/data-mapper.ts b/workspaces/ballerina/ballerina-core/src/interfaces/data-mapper.ts index 6ccb86a8d48..d003b56b632 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/data-mapper.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/data-mapper.ts @@ -17,7 +17,7 @@ */ import { TypeInfo } from "./ballerina"; -import { CodeData } from "./bi"; +import { CodeData, InputType } from "./bi"; import { LineRange } from "./common"; export enum TypeKind { @@ -54,11 +54,11 @@ export enum InputCategory { } export enum IntermediateClauseType { - LET = "let", WHERE = "where", - FROM = "from", + LET = "let", ORDER_BY = "order-by", LIMIT = "limit", + FROM = "from", JOIN = "join", GROUP_BY = "group-by" } @@ -69,18 +69,8 @@ export enum ResultClauseType { } export interface DMDiagnostic { - kind: string; + code: string; message: string; - range: { - start: { - line: number; - character: number; - }; - end: { - line: number; - character: number; - }; - }; } export interface IOType { @@ -179,6 +169,8 @@ export interface IOTypeField { ref?: string; focusExpression?: string; isSeq?: boolean; + isIterationVariable?: boolean; + isGroupingKey?: boolean; typeInfo?: TypeInfo; } @@ -269,7 +261,7 @@ export interface DMFormField { editable: boolean; documentation: string; value: any; - valueTypeConstraint: string; + types: InputType[]; enabled: boolean; items?: string[]; } diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts index 913b4a08e61..4cd2cfe64c1 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/extended-lang-client.ts @@ -23,7 +23,7 @@ import { DocumentIdentifier, LinePosition, LineRange, NOT_SUPPORTED_TYPE, Positi import { BallerinaConnectorInfo, BallerinaExampleCategory, BallerinaModuleResponse, BallerinaModulesRequest, BallerinaTrigger, BallerinaTriggerInfo, BallerinaConnector, ExecutorPosition, ExpressionRange, JsonToRecordMapperDiagnostic, MainTriggerModifyRequest, NoteBookCellOutputValue, NotebookCellMetaInfo, OASpec, PackageSummary, PartialSTModification, ResolvedTypeForExpression, ResolvedTypeForSymbol, STModification, SequenceModel, SequenceModelDiagnostic, ServiceTriggerModifyRequest, SymbolDocumentation, XMLToRecordConverterDiagnostic, TypeField, ComponentInfo } from "./ballerina"; import { ModulePart, STNode } from "@wso2/syntax-tree"; import { CodeActionParams, DefinitionParams, DocumentSymbolParams, ExecuteCommandParams, InitializeParams, InitializeResult, LocationLink, RenameParams } from "vscode-languageserver-protocol"; -import { Category, Flow, FlowNode, CodeData, ConfigVariable, FunctionNode, Property, PropertyTypeMemberInfo, DIRECTORY_MAP, Imports, NodeKind } from "./bi"; +import { Category, Flow, FlowNode, CodeData, ConfigVariable, FunctionNode, Property, PropertyTypeMemberInfo, DIRECTORY_MAP, Imports, NodeKind, InputType, FormFieldInputType } from "./bi"; import { ConnectorRequest, ConnectorResponse } from "../rpc-types/connector-wizard/interfaces"; import { SqFlow } from "../rpc-types/sequence-diagram/interfaces"; import { FieldType, FunctionModel, ListenerModel, ServiceClassModel, ServiceInitModel, ServiceModel } from "./service"; @@ -496,6 +496,16 @@ export interface ClausePositionResponse { position: LinePosition; } +export interface ConvertExpressionRequest { + outputType: string; + expression: string; + expressionType: string; +} + +export interface ConvertExpressionResponse { + convertedExpression: string; +} + export interface GraphqlDesignServiceParams { filePath: string; startLine: LinePosition; @@ -649,8 +659,7 @@ export interface Codedata { export interface ValueProperty { metadata?: TestFunctionMetadata; codedata?: Codedata; - valueType?: string; - valueTypeConstraint?: any; + types: InputType[]; originalName?: string; value?: any; placeholder?: string; @@ -823,9 +832,9 @@ export interface TypeBindingPair { // <------------ BI INTERFACES ---------> export interface BIFlowModelRequest { - filePath: string; - startLine: LinePosition; - endLine: LinePosition; + filePath?: string; + startLine?: LinePosition; + endLine?: LinePosition; forceAssign?: boolean; } @@ -1000,15 +1009,6 @@ export type ConfigVariableResponse = { errorMsg?: any; } -export interface UpdateConfigVariableRequest { - configFilePath: string; - configVariable: ConfigVariable; -} - -export interface UpdateConfigVariableResponse { - -} - export interface UpdateConfigVariableRequestV2 { configFilePath: string; configVariable: FlowNode | FunctionNode; @@ -1057,7 +1057,7 @@ export interface BICopilotContextResponse { } export interface BIDesignModelRequest { - projectPath: string; + projectPath?: string; } export type BIDesignModelResponse = { @@ -1303,10 +1303,13 @@ export interface ListenersResponse { listeners: string[]; } export interface ListenerModelRequest { - moduleName: string; - orgName?: string; - pkgName?: string; - listenerTypeName?: string; + codedata: { + orgName: string; + packageName: string; + moduleName: string; + version: string; + }; + filePath: string; } export interface ListenerModelResponse { listener: ListenerModel; @@ -1473,7 +1476,7 @@ export interface TypeCodeData { export interface TypeProperty { metadata: TypeMetadata; - valueType: string; + valueType: FormFieldInputType; value: string | string[]; // as required for qualifiers optional: boolean; editable: boolean; @@ -1923,6 +1926,8 @@ export interface Artifacts { export interface ArtifactsNotification { uri: string; artifacts: Artifacts; + moduleName?: string; + projectName?: string; } export interface ProjectArtifactsRequest { @@ -1968,8 +1973,6 @@ export interface BIInterface extends BaseLangClientInterface { getSequenceDiagramModel: (params: SequenceModelRequest) => Promise; generateServiceFromOAS: (params: ServiceFromOASRequest) => Promise; getExpressionCompletions: (params: ExpressionCompletionsRequest) => Promise; - getConfigVariables: (params: ConfigVariableRequest) => Promise; - updateConfigVariables: (params: UpdateConfigVariableRequest) => Promise; getConfigVariablesV2: (params: ConfigVariableRequest) => Promise; updateConfigVariablesV2: (params: UpdateConfigVariableRequestV2) => Promise; deleteConfigVariableV2: (params: DeleteConfigVariableRequestV2) => Promise; diff --git a/workspaces/ballerina/ballerina-core/src/interfaces/service.ts b/workspaces/ballerina/ballerina-core/src/interfaces/service.ts index f631f2f1411..16b2f872c24 100644 --- a/workspaces/ballerina/ballerina-core/src/interfaces/service.ts +++ b/workspaces/ballerina/ballerina-core/src/interfaces/service.ts @@ -16,7 +16,7 @@ * under the License. */ -import { DiagnosticMessage, Imports, PropertyTypeMemberInfo } from "./bi"; +import { DiagnosticMessage, Imports, PropertyTypeMemberInfo, InputType } from "./bi"; import { LineRange } from "./common"; @@ -107,8 +107,16 @@ export interface StatusCodeResponse extends PropertyModel { mediaType: PropertyModel; } +export enum Protocol { + HTTP = "HTTP", + MESSAGE_BROKER = "MESSAGE_BROKER", + GRAPHQL = "GRAPHQL", + FTP = "FTP", + CDC = "CDC" +} + export interface HttpPayloadContext { - protocol: "HTTP"; + protocol: Protocol.HTTP; serviceName: string; serviceBasePath: string; resourceBasePath?: string; @@ -118,13 +126,18 @@ export interface HttpPayloadContext { } export interface MessageQueuePayloadContext { - protocol: "MESSAGE_BROKER"; + protocol: Protocol.MESSAGE_BROKER | Protocol.CDC; serviceName: string; queueOrTopic?: string; messageDocumentation?: string; } -export type PayloadContext = HttpPayloadContext | MessageQueuePayloadContext; +export interface GeneralPayloadContext { + protocol: Protocol | string; + filterType?: string; +} + +export type PayloadContext = HttpPayloadContext | MessageQueuePayloadContext | GeneralPayloadContext; export interface ParamDetails { name: string; @@ -158,8 +171,7 @@ export interface PropertyModel { isHttpResponseType?: boolean; value?: string; values?: string[]; - valueType?: string; - valueTypeConstraint?: string; + types?: InputType[]; isType?: boolean; placeholder?: string; defaultValue?: string | PropertyModel; @@ -169,7 +181,6 @@ export interface PropertyModel { choices?: PropertyModel[]; properties?: ConfigProperties; addNewButton?: boolean; - typeMembers?: PropertyTypeMemberInfo[]; httpParamType?: "QUERY" | "HEADER" | "PAYLOAD"; diagnostics?: DiagnosticMessage[]; imports?: Imports; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/index.ts index 4a2951937ec..cafce784a40 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/index.ts @@ -16,11 +16,16 @@ * under the License. */ -import { ChatReqMessage, ChatRespMessage, TraceInput, TraceStatus } from "./interfaces"; +import { ChatReqMessage, ChatRespMessage, TraceInput, TraceStatus, ChatHistoryResponse, AgentStatusResponse, ClearChatResponse } from "./interfaces"; export interface AgentChatAPI { getChatMessage: (params: ChatReqMessage) => Promise; abortChatRequest: () => void; getTracingStatus: () => Promise; showTraceView: (params: TraceInput) => Promise; + getChatHistory: () => Promise; + clearChatHistory: () => Promise; + getAgentStatus: () => Promise; } + +export type { ChatReqMessage, ChatRespMessage, TraceInput, TraceStatus, ChatHistoryResponse, AgentStatusResponse, ClearChatResponse }; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts index 4e6c828156e..c6880ffae53 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/interfaces.ts @@ -31,3 +31,23 @@ export interface TraceStatus { export interface TraceInput { message: string; } + +export interface ChatHistoryMessage { + type: 'message' | 'error'; + text: string; + isUser: boolean; + traceId?: string; +} + +export interface ChatHistoryResponse { + messages: ChatHistoryMessage[]; + isAgentRunning: boolean; +} + +export interface AgentStatusResponse { + isRunning: boolean; +} + +export interface ClearChatResponse { + newSessionId: string; +} diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/rpc-type.ts index 13cd72be4a5..932beb1c1a3 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/agent-chat/rpc-type.ts @@ -17,7 +17,7 @@ * * THIS FILE INCLUDES AUTO GENERATED CODE */ -import { ChatReqMessage, ChatRespMessage, TraceInput, TraceStatus } from "./interfaces"; +import { ChatReqMessage, ChatRespMessage, TraceInput, TraceStatus, ChatHistoryResponse, AgentStatusResponse, ClearChatResponse } from "./interfaces"; import { RequestType, NotificationType } from "vscode-messenger-common"; const _preFix = "agent-chat"; @@ -25,3 +25,6 @@ export const getChatMessage: RequestType = { me export const abortChatRequest: NotificationType = { method: `${_preFix}/abortChatRequest` }; export const getTracingStatus: RequestType = { method: `${_preFix}/getTracingStatus` }; export const showTraceView: NotificationType = { method: `${_preFix}/showTraceView` }; +export const getChatHistory: RequestType = { method: `${_preFix}/getChatHistory` }; +export const clearChatHistory: RequestType = { method: `${_preFix}/clearChatHistory` }; +export const getAgentStatus: RequestType = { method: `${_preFix}/getAgentStatus` }; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/interfaces.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/interfaces.ts index 0b47ae9eb0f..c525eae9060 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/interfaces.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-agent/interfaces.ts @@ -18,7 +18,7 @@ */ import { NodePosition } from "@wso2/syntax-tree"; -import { CodeData, FlowNode, Metadata } from "../../interfaces/bi"; +import { CodeData, FlowNode, InputType, Metadata } from "../../interfaces/bi"; export interface AgentTool { toolName: string; @@ -101,8 +101,7 @@ export interface McpToolUpdateRequest { export interface ToolParameters { metadata: Metadata; - valueType: string; - valueTypeConstraint: ValueTypeConstraint; + types: InputType[]; value: ToolParametersValue; optional: boolean; editable: boolean; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-panel/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-panel/index.ts index 7a52708a484..3235186fc43 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-panel/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-panel/index.ts @@ -16,69 +16,90 @@ * under the License. */ import { LoginMethod } from "../../state-machine-types"; -import { GetFromFileRequest, DeleteFromProjectRequest, ProjectSource, ProjectDiagnostics, PostProcessRequest, PostProcessResponse, FetchDataRequest, FetchDataResponse, TestGenerationRequest, TestGenerationResponse, TestGenerationMentions, AIChatSummary, DeveloperDocument, RequirementSpecification, LLMDiagnostics, AIPanelPrompt, AIMachineSnapshot, SubmitFeedbackRequest, RelevantLibrariesAndFunctionsRequest, GenerateOpenAPIRequest, GenerateCodeRequest, TestPlanGenerationRequest, TestGeneratorIntermediaryState, RepairParams, RelevantLibrariesAndFunctionsResponse, DocGenerationRequest, AddFilesToProjectRequest, MetadataWithAttachments, ProcessContextTypeCreationRequest, ProcessMappingParametersRequest } from "./interfaces"; +import { + TestGenerationMentions, + RequirementSpecification, + LLMDiagnostics, + AIPanelPrompt, + AIMachineSnapshot, + SubmitFeedbackRequest, + GenerateOpenAPIRequest, + GenerateAgentCodeRequest, + DocGenerationRequest, + AddFilesToProjectRequest, + MetadataWithAttachments, + ProcessContextTypeCreationRequest, + ProcessMappingParametersRequest, + SemanticDiffRequest, + SemanticDiffResponse, + RestoreCheckpointRequest, + UpdateChatMessageRequest, + PlanApprovalRequest, + ApproveTaskRequest, + TaskDeclineRequest, + ConnectorSpecRequest, + ConnectorSpecCancelRequest, + UIChatMessage, + CheckpointInfo, + AbortAIGenerationRequest, +} from "./interfaces"; export interface AIPanelAPI { // ================================== // General Functions // ================================== - getBackendUrl: () => Promise; - getProjectUuid: () => Promise; getLoginMethod: () => Promise; - getAccessToken: () => Promise; - getRefreshedAccessToken: () => Promise; - getDefaultPrompt: () => Promise; - getAIMachineSnapshot: () => Promise; - fetchData: (params: FetchDataRequest) => Promise; - getFromFile: (params: GetFromFileRequest) => Promise; - getFileExists: (params: GetFromFileRequest) => Promise; - deleteFromProject: (params: DeleteFromProjectRequest) => void; - getShadowDiagnostics: (params: ProjectSource) => Promise; - checkSyntaxError: (params: ProjectSource) => Promise; - clearInitialPrompt: () => void; + getDefaultPrompt: () => Promise; //starting args + getAIMachineSnapshot: () => Promise; //login state machine + clearInitialPrompt: () => void; //starting args // Data-mapper related functions openChatWindowWithCommand: () => void; generateContextTypes: (params: ProcessContextTypeCreationRequest) => void; generateMappingCode: (params: ProcessMappingParametersRequest) => void; generateInlineMappingCode: (params: MetadataWithAttachments) => void; - // Test-generator related functions - getGeneratedTests: (params: TestGenerationRequest) => Promise; - getTestDiagnostics: (params: TestGenerationResponse) => Promise; - getServiceSourceForName: (params: string) => Promise; - getResourceSourceForMethodAndPath: (params: string) => Promise; getServiceNames: () => Promise; - getResourceMethodAndPaths: () => Promise; - abortTestGeneration: () => void; - applyDoOnFailBlocks: () => void; - postProcess: (params: PostProcessRequest) => Promise; promptGithubAuthorize: () => Promise; - promptWSO2AILogout: () => Promise; isCopilotSignedIn: () => Promise; showSignInAlert: () => Promise; markAlertShown: () => void; getFromDocumentation: (params: string) => Promise; - isRequirementsSpecificationFileExist:(params: string) => Promise; - getDriftDiagnosticContents:(params: string) => Promise; - addChatSummary:(params: AIChatSummary) => Promise; - handleChatSummaryError:(params: string) => void; - isNaturalProgrammingDirectoryExists:(params: string) => Promise; - readDeveloperMdFile:(params: string) => Promise; - updateDevelopmentDocument:(params: DeveloperDocument) => void; - updateRequirementSpecification:(params: RequirementSpecification) => void; - createTestDirecoryIfNotExists:(params: string) => void; + getDriftDiagnosticContents: () => Promise; + updateRequirementSpecification: (params: RequirementSpecification) => void; + createTestDirecoryIfNotExists: () => void; submitFeedback: (params: SubmitFeedbackRequest) => Promise; - getRelevantLibrariesAndFunctions: (params: RelevantLibrariesAndFunctionsRequest) => Promise; generateOpenAPI: (params: GenerateOpenAPIRequest) => void; - generateCode: (params: GenerateCodeRequest) => void; - repairGeneratedCode: (params: RepairParams) => void; - generateTestPlan: (params: TestPlanGenerationRequest) => void; - generateFunctionTests: (params: TestGeneratorIntermediaryState) => void; - generateHealthcareCode: (params: GenerateCodeRequest) => void; - abortAIGeneration: () => void; + generateAgent: (params: GenerateAgentCodeRequest) => Promise; + abortAIGeneration: (params: AbortAIGenerationRequest) => void; // ================================== // Doc Generation Related Functions // ================================== getGeneratedDocumentation: (params: DocGenerationRequest) => Promise; addFilesToProject: (params: AddFilesToProjectRequest) => Promise; isUserAuthenticated: () => Promise; + openAIPanel: (params: AIPanelPrompt) => Promise; + isPlanModeFeatureEnabled: () => Promise; + // AI schema related functions + getSemanticDiff: (params: SemanticDiffRequest) => Promise; + getAffectedPackages: () => Promise; + isWorkspaceProject: () => Promise; + acceptChanges: () => Promise; + declineChanges: () => Promise; + // ================================== + // Approval Related Functions (Human-in-the-Loop) + // ================================== + approvePlan: (params: PlanApprovalRequest) => Promise; + declinePlan: (params: PlanApprovalRequest) => Promise; + approveTask: (params: ApproveTaskRequest) => Promise; + declineTask: (params: TaskDeclineRequest) => Promise; + provideConnectorSpec: (params: ConnectorSpecRequest) => Promise; + cancelConnectorSpec: (params: ConnectorSpecCancelRequest) => Promise; + // ================================== + // Chat State Management + // ================================== + getChatMessages: () => Promise; + getCheckpoints: () => Promise; + restoreCheckpoint: (params: RestoreCheckpointRequest) => Promise; + clearChat: () => Promise; + updateChatMessage: (params: UpdateChatMessageRequest) => Promise; + getActiveTempDir: () => Promise; } diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-panel/interfaces.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-panel/interfaces.ts index aabcee88cdb..85f647e0fce 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-panel/interfaces.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-panel/interfaces.ts @@ -20,15 +20,15 @@ import { FunctionDefinition } from "@wso2/syntax-tree"; import { AIMachineContext, AIMachineStateValue } from "../../state-machine-types"; import { Command, TemplateId } from "../../interfaces/ai-panel"; -import { AllDataMapperSourceRequest, DataMapperSourceResponse, ExtendedDataMapperMetadata } from "../../interfaces/extended-lang-client"; -import { ComponentInfo, DataMapperMetadata, Diagnostics, DMModel, ImportStatements } from "../.."; +import { AllDataMapperSourceRequest, ExtendedDataMapperMetadata } from "../../interfaces/extended-lang-client"; +import { ComponentInfo, DataMapperMetadata, Diagnostics, DMModel, ImportStatements, LinePosition, LineRange, OperationType } from "../.."; // ================================== // General Interfaces // ================================== export type AIPanelPrompt = - | { type: 'command-template'; command: Command; templateId: TemplateId; text?: string; params?: Map; metadata?: Record } - | { type: 'text'; text: string } + | { type: 'command-template'; command: Command; templateId: TemplateId; text?: string; params?: Record; metadata?: Record } + | { type: 'text'; text: string; planMode: boolean; codeContext?: CodeContext } | undefined; export interface AIMachineSnapshot { @@ -36,20 +36,6 @@ export interface AIMachineSnapshot { context: AIMachineContext; } -export type ErrorCode = { - code: number; - message: string; -} - -export interface FetchDataRequest { - url: string; - options: RequestInit; -} - -export interface FetchDataResponse { - response: Response -} - export interface ProjectSource { projectModules?: ProjectModule[]; projectTests?: SourceFile[]; @@ -75,10 +61,6 @@ export interface GetModuleDirParams { moduleName: string; } -export interface ProjectDiagnostics { - diagnostics: DiagnosticEntry[]; -} - export interface MappingDiagnostics { uri: string; diagnostics: DiagnosticEntry[]; @@ -99,14 +81,6 @@ export interface FileChanges { content: string; } -export interface GetFromFileRequest { - filePath: string; -} - -export interface DeleteFromProjectRequest { - filePath: string; -} - export interface ProjectImports { projectPath: string; imports: ImportStatements[]; @@ -119,7 +93,6 @@ export interface MetadataWithAttachments { } export interface InlineMappingsSourceResult { - sourceResponse: DataMapperSourceResponse; allMappingsRequest: AllDataMapperSourceRequest; tempFileMetadata: ExtendedDataMapperMetadata; tempDir: string; @@ -233,41 +206,10 @@ export interface RepairCodeResponse { repairedMappings: RepairedMapping[]; } -// Test-generator related interfaces -export enum TestGenerationTarget { - Service = "service", - Function = "function" -} - -export interface TestGenerationRequest { - targetType: TestGenerationTarget; - targetIdentifier: string; - testPlan?: string; - diagnostics?: ProjectDiagnostics; - existingTests?: string; -} - -export interface TestGenerationResponse { - testSource: string; - testConfig?: string; -} - -export interface TestPlanGenerationRequest { - targetType: TestGenerationTarget; - targetSource: string; - target : string; -} - export interface TestGenerationMentions { mentions: string[]; } -export interface TestGeneratorIntermediaryState { - // content: [string, Attachment[]]; - resourceFunction: string; - testPlan: string; -} - export interface DocumentationGeneratorIntermediaryState { serviceName: string; documentation: string; @@ -275,28 +217,7 @@ export interface DocumentationGeneratorIntermediaryState { openApiSpec?: string; } -export interface PostProcessRequest { - sourceFiles: SourceFile[]; - updatedFileNames: string[]; -} - -export interface PostProcessResponse { - sourceFiles: SourceFile[]; - diagnostics: ProjectDiagnostics; -} - -export interface AIChatSummary { - filepath: string; - summary: string; -} - -export interface DeveloperDocument { - filepath: string; - content: string; -} - export interface RequirementSpecification { - filepath: string; content: string; } @@ -350,14 +271,6 @@ export interface FeedbackMessage { role : string; } -export interface RelevantLibrariesAndFunctionsRequest { - query: string; -} - -export interface RelevantLibrariesAndFunctionsResponse { - libraries: any[]; -} - export interface ChatEntry { actor: string; message: string; @@ -380,26 +293,17 @@ export interface FileAttatchment { content: string; } -export type OperationType = "CODE_GENERATION" | "CODE_FOR_USER_REQUIREMENT" | "TESTS_FOR_USER_REQUIREMENT"; -export interface GenerateCodeRequest { +export type CodeContext = + | { type: 'addition'; position: LinePosition, filePath: string } + | { type: 'selection'; startPosition: LinePosition; endPosition: LinePosition, filePath: string }; + +export interface GenerateAgentCodeRequest { usecase: string; - chatHistory: ChatEntry[]; - operationType: OperationType; + operationType?: OperationType; fileAttachmentContents: FileAttatchment[]; -} - -export interface RepairParams { - previousMessages: any[]; - assistantResponse?: string; // XML format with code blocks - sourceFiles?: SourceFile[]; // Optional: parsed from assistantResponse if not provided - updatedFileNames: string[]; - diagnostics: DiagnosticEntry[]; -} - -export interface RepairResponse { - sourceFiles: SourceFile[]; - updatedFileNames: string[]; - diagnostics: DiagnosticEntry[]; + threadId?: string; //TODO: Make this required once we support threads in UI + isPlanMode: boolean; + codeContext?: CodeContext; } export type LibraryMode = "CORE" | "HEALTHCARE"; @@ -438,3 +342,129 @@ export interface DocGenerationRequest { export const GENERATE_TEST_AGAINST_THE_REQUIREMENT = "Generate tests against the requirements"; export const GENERATE_CODE_AGAINST_THE_REQUIREMENT = "Generate code based on the requirements"; + +// ================================== +// Execution Context +// ================================== + +/** + * Execution context for AI code generation operations. + * + * Contains project path information needed for code generation without + * depending on global StateMachine state. This enables: + * - Parallel test execution with isolated contexts + * - Explicit path dependencies + * - Better testability and code clarity + * + * @property projectPath - Absolute path to the active Ballerina project/package + * @property workspacePath - Optional absolute path to workspace root (for multi-package workspaces) + */ +export interface ExecutionContext { + /** Absolute path to the current Ballerina project */ + readonly projectPath: string; + + /** Optional absolute path to workspace root (if multi-package workspace) */ + readonly workspacePath?: string; + + /** Temporary project path (set by AICommandExecutor.initialize()) */ + tempProjectPath?: string; +} + +export interface SemanticDiffRequest { + projectPath: string; +} + +// Numeric enum values from the API +export enum ChangeTypeEnum { + ADDITION = 0, + MODIFICATION = 1, + DELETION = 2 +} + +export type ChangeType = "ADDITION" | "MODIFICATION" | "DELETION"; + +export interface SemanticDiff { + changeType: number; // API returns numeric value + nodeKind: number; // API returns numeric value + uri: string; + lineRange: LineRange; +} + +export interface SemanticDiffResponse { + loadDesignDiagrams: boolean; + semanticDiffs: SemanticDiff[]; +} + +export interface RestoreCheckpointRequest { + checkpointId: string; +} + +export interface UpdateChatMessageRequest { + messageId: string; + content: string; +} + +export interface PlanApprovalRequest { + requestId: string; + comment?: string; +} + +export interface ApproveTaskRequest { + requestId: string; + approvedTaskDescription?: string; +} + +export interface TaskDeclineRequest { + requestId: string; + comment?: string; +} + +export interface ConnectorSpecRequest { + requestId: string; + spec: any; +} + +export interface ConnectorSpecCancelRequest { + requestId: string; + comment?: string; +} + +export type ErrorCode = { + code: number; + message: string; +} + +// ================================== +// Chat State Interfaces (for RPC) +// ================================== + +/** + * UI-formatted chat message for display + */ +export interface UIChatMessage { + role: "user" | "assistant"; + content: string; + checkpointId?: string; + messageId?: string; +} + +/** + * Checkpoint metadata for time-travel functionality + */ +export interface CheckpointInfo { + id: string; + messageId: string; + timestamp: number; + snapshotSize: number; +} + +/** + * Request to abort AI generation + * Optional params default to current workspace and 'default' thread + */ +export interface AbortAIGenerationRequest { + /** Workspace identifier (defaults to current workspace) */ + workspaceId?: string; + /** Thread identifier (defaults to 'default') */ + threadId?: string; +} diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-panel/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-panel/rpc-type.ts index 870f5bc095c..6742364ca36 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/ai-panel/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/ai-panel/rpc-type.ts @@ -18,61 +18,76 @@ * THIS FILE INCLUDES AUTO GENERATED CODE */ import { LoginMethod } from "../../state-machine-types"; -import { GetFromFileRequest, DeleteFromProjectRequest, ProjectSource, ProjectDiagnostics, PostProcessRequest, PostProcessResponse, FetchDataRequest, FetchDataResponse, TestGenerationRequest, TestGenerationResponse, TestGenerationMentions, AIChatSummary, DeveloperDocument, RequirementSpecification, LLMDiagnostics, AIPanelPrompt, AIMachineSnapshot, SubmitFeedbackRequest, RelevantLibrariesAndFunctionsRequest, GenerateOpenAPIRequest, GenerateCodeRequest, TestPlanGenerationRequest, TestGeneratorIntermediaryState, RepairParams, RelevantLibrariesAndFunctionsResponse, DocGenerationRequest, AddFilesToProjectRequest, MetadataWithAttachments, ProcessContextTypeCreationRequest, ProcessMappingParametersRequest } from "./interfaces"; +import { + TestGenerationMentions, + RequirementSpecification, + LLMDiagnostics, + AIPanelPrompt, + AIMachineSnapshot, + SubmitFeedbackRequest, + GenerateOpenAPIRequest, + GenerateAgentCodeRequest, + DocGenerationRequest, + AddFilesToProjectRequest, + MetadataWithAttachments, + ProcessContextTypeCreationRequest, + ProcessMappingParametersRequest, + SemanticDiffRequest, + SemanticDiffResponse, + RestoreCheckpointRequest, + UpdateChatMessageRequest, + PlanApprovalRequest, + ApproveTaskRequest, + TaskDeclineRequest, + ConnectorSpecRequest, + ConnectorSpecCancelRequest, + UIChatMessage, + CheckpointInfo, + AbortAIGenerationRequest, +} from "./interfaces"; import { RequestType, NotificationType } from "vscode-messenger-common"; const _preFix = "ai-panel"; -export const getBackendUrl: RequestType = { method: `${_preFix}/getBackendUrl` }; -export const getProjectUuid: RequestType = { method: `${_preFix}/getProjectUuid` }; export const getLoginMethod: RequestType = { method: `${_preFix}/getLoginMethod` }; -export const getAccessToken: RequestType = { method: `${_preFix}/getAccessToken` }; -export const getRefreshedAccessToken: RequestType = { method: `${_preFix}/getRefreshedAccessToken` }; export const getDefaultPrompt: RequestType = { method: `${_preFix}/getDefaultPrompt` }; export const getAIMachineSnapshot: RequestType = { method: `${_preFix}/getAIMachineSnapshot` }; -export const fetchData: RequestType = { method: `${_preFix}/fetchData` }; -export const getFromFile: RequestType = { method: `${_preFix}/getFromFile` }; -export const getFileExists: RequestType = { method: `${_preFix}/getFileExists` }; -export const deleteFromProject: NotificationType = { method: `${_preFix}/deleteFromProject` }; -export const getShadowDiagnostics: RequestType = { method: `${_preFix}/getShadowDiagnostics` }; -export const checkSyntaxError: RequestType = { method: `${_preFix}/checkSyntaxError` }; export const clearInitialPrompt: NotificationType = { method: `${_preFix}/clearInitialPrompt` }; export const openChatWindowWithCommand: NotificationType = { method: `${_preFix}/openChatWindowWithCommand` }; -export const generateContextTypes: RequestType = { method: `${_preFix}/generateContextTypes` }; -export const generateMappingCode: RequestType = { method: `${_preFix}/generateMappingCode` }; -export const generateInlineMappingCode: RequestType = { method: `${_preFix}/generateInlineMappingCode` }; -export const getGeneratedTests: RequestType = { method: `${_preFix}/getGeneratedTests` }; -export const getTestDiagnostics: RequestType = { method: `${_preFix}/getTestDiagnostics` }; -export const getServiceSourceForName: RequestType = { method: `${_preFix}/getServiceSourceForName` }; -export const getResourceSourceForMethodAndPath: RequestType = { method: `${_preFix}/getResourceSourceForMethodAndPath` }; +export const generateContextTypes: NotificationType = { method: `${_preFix}/generateContextTypes` }; +export const generateMappingCode: NotificationType = { method: `${_preFix}/generateMappingCode` }; +export const generateInlineMappingCode: NotificationType = { method: `${_preFix}/generateInlineMappingCode` }; export const getServiceNames: RequestType = { method: `${_preFix}/getServiceNames` }; -export const getResourceMethodAndPaths: RequestType = { method: `${_preFix}/getResourceMethodAndPaths` }; -export const abortTestGeneration: NotificationType = { method: `${_preFix}/abortTestGeneration` }; -export const applyDoOnFailBlocks: NotificationType = { method: `${_preFix}/applyDoOnFailBlocks` }; -export const postProcess: RequestType = { method: `${_preFix}/postProcess` }; export const promptGithubAuthorize: RequestType = { method: `${_preFix}/promptGithubAuthorize` }; -export const promptWSO2AILogout: RequestType = { method: `${_preFix}/promptWSO2AILogout` }; export const isCopilotSignedIn: RequestType = { method: `${_preFix}/isCopilotSignedIn` }; export const showSignInAlert: RequestType = { method: `${_preFix}/showSignInAlert` }; export const markAlertShown: NotificationType = { method: `${_preFix}/markAlertShown` }; export const getFromDocumentation: RequestType = { method: `${_preFix}/getFromDocumentation` }; -export const isRequirementsSpecificationFileExist: RequestType = { method: `${_preFix}/isRequirementsSpecificationFileExist` }; -export const getDriftDiagnosticContents: RequestType = { method: `${_preFix}/getDriftDiagnosticContents` }; -export const addChatSummary: RequestType = { method: `${_preFix}/addChatSummary` }; -export const handleChatSummaryError: NotificationType = { method: `${_preFix}/handleChatSummaryError` }; -export const isNaturalProgrammingDirectoryExists: RequestType = { method: `${_preFix}/isNaturalProgrammingDirectoryExists` }; -export const readDeveloperMdFile: RequestType = { method: `${_preFix}/readDeveloperMdFile` }; -export const updateDevelopmentDocument: NotificationType = { method: `${_preFix}/updateDevelopmentDocument` }; +export const getDriftDiagnosticContents: RequestType = { method: `${_preFix}/getDriftDiagnosticContents` }; export const updateRequirementSpecification: NotificationType = { method: `${_preFix}/updateRequirementSpecification` }; -export const createTestDirecoryIfNotExists: NotificationType = { method: `${_preFix}/createTestDirecoryIfNotExists` }; +export const createTestDirecoryIfNotExists: NotificationType = { method: `${_preFix}/createTestDirecoryIfNotExists` }; export const submitFeedback: RequestType = { method: `${_preFix}/submitFeedback` }; -export const getRelevantLibrariesAndFunctions: RequestType = { method: `${_preFix}/getRelevantLibrariesAndFunctions` }; export const generateOpenAPI: NotificationType = { method: `${_preFix}/generateOpenAPI` }; -export const generateCode: NotificationType = { method: `${_preFix}/generateCode` }; -export const repairGeneratedCode: NotificationType = { method: `${_preFix}/repairGeneratedCode` }; -export const generateTestPlan: NotificationType = { method: `${_preFix}/generateTestPlan` }; -export const generateFunctionTests: NotificationType = { method: `${_preFix}/generateFunctionTests` }; -export const generateHealthcareCode: NotificationType = { method: `${_preFix}/generateHealthcareCode` }; -export const abortAIGeneration: NotificationType = { method: `${_preFix}/abortAIGeneration` }; -export const getGeneratedDocumentation: NotificationType = { method: `${_preFix}/getGeneratedDocumentation` }; +export const generateAgent: RequestType = { method: `${_preFix}/generateAgent` }; +export const abortAIGeneration: NotificationType = { method: `${_preFix}/abortAIGeneration` }; +export const getGeneratedDocumentation: RequestType = { method: `${_preFix}/getGeneratedDocumentation` }; export const addFilesToProject: RequestType = { method: `${_preFix}/addFilesToProject` }; export const isUserAuthenticated: RequestType = { method: `${_preFix}/isUserAuthenticated` }; +export const openAIPanel: RequestType = { method: `${_preFix}/openAIPanel` }; +export const isPlanModeFeatureEnabled: RequestType = { method: `${_preFix}/isPlanModeFeatureEnabled` }; +export const getSemanticDiff: RequestType = { method: `${_preFix}/getSemanticDiff` }; +export const getAffectedPackages: RequestType = { method: `${_preFix}/getAffectedPackages` }; +export const isWorkspaceProject: RequestType = { method: `${_preFix}/isWorkspaceProject` }; +export const acceptChanges: RequestType = { method: `${_preFix}/acceptChanges` }; +export const declineChanges: RequestType = { method: `${_preFix}/declineChanges` }; +export const approvePlan: RequestType = { method: `${_preFix}/approvePlan` }; +export const declinePlan: RequestType = { method: `${_preFix}/declinePlan` }; +export const approveTask: RequestType = { method: `${_preFix}/approveTask` }; +export const declineTask: RequestType = { method: `${_preFix}/declineTask` }; +export const provideConnectorSpec: RequestType = { method: `${_preFix}/provideConnectorSpec` }; +export const cancelConnectorSpec: RequestType = { method: `${_preFix}/cancelConnectorSpec` }; +export const getChatMessages: NotificationType = { method: `${_preFix}/getChatMessages` }; +export const getCheckpoints: NotificationType = { method: `${_preFix}/getCheckpoints` }; +export const restoreCheckpoint: RequestType = { method: `${_preFix}/restoreCheckpoint` }; +export const clearChat: RequestType = { method: `${_preFix}/clearChat` }; +export const updateChatMessage: RequestType = { method: `${_preFix}/updateChatMessage` }; +export const getActiveTempDir: RequestType = { method: `${_preFix}/getActiveTempDir` }; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/index.ts index a10b6ab7e66..4e452c463ae 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/index.ts @@ -29,8 +29,6 @@ import { ExpressionCompletionsRequest, ExpressionCompletionsResponse, ConfigVariableResponse, - UpdateConfigVariableRequest, - UpdateConfigVariableResponse, SignatureHelpRequest, SignatureHelpResponse, BIGetVisibleVariableTypesRequest, @@ -97,7 +95,9 @@ import { FormDiagnosticsRequest, FormDiagnosticsResponse, BISearchNodesRequest, - BISearchNodesResponse + BISearchNodesResponse, + BIDesignModelRequest, + BIFlowModelRequest } from "../../interfaces/extended-lang-client"; import { ProjectRequest, @@ -125,7 +125,7 @@ import { } from "./interfaces"; export interface BIDiagramAPI { - getFlowModel: () => Promise; + getFlowModel: (params: BIFlowModelRequest) => Promise; getSourceCode: (params: BISourceCodeRequest) => Promise; deleteFlowNode: (params: BISourceCodeRequest) => Promise; deleteByComponentInfo: (params: BIDeleteByComponentInfoRequest) => Promise; @@ -150,8 +150,6 @@ export interface BIDiagramAPI { getVisibleVariableTypes: (params: BIGetVisibleVariableTypesRequest) => Promise; getExpressionCompletions: (params: ExpressionCompletionsRequest) => Promise; getDataMapperCompletions: (params: ExpressionCompletionsRequest) => Promise; - getConfigVariables: () => Promise; - updateConfigVariables: (params: UpdateConfigVariableRequest) => Promise; getConfigVariablesV2: (params: ConfigVariableRequest) => Promise; updateConfigVariablesV2: (params: UpdateConfigVariableRequestV2) => Promise; deleteConfigVariableV2: (params: DeleteConfigVariableRequestV2) => Promise; @@ -173,7 +171,7 @@ export interface BIDiagramAPI { getExpressionDiagnostics: (params: ExpressionDiagnosticsRequest) => Promise; formDidOpen: (params: FormDidOpenParams) => Promise; formDidClose: (params: FormDidCloseParams) => Promise; - getDesignModel: () => Promise; + getDesignModel: (params: BIDesignModelRequest) => Promise; getTypes: (params: GetTypesRequest) => Promise; getType: (params: GetTypeRequest) => Promise; updateType: (params: UpdateTypeRequest) => Promise; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/interfaces.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/interfaces.ts index c3952f0920e..104f7b71d08 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/interfaces.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/interfaces.ts @@ -31,6 +31,7 @@ export interface ProjectRequest { workspaceName?: string; orgName?: string; version?: string; + isLibrary?: boolean; } export interface AddProjectToWorkspaceRequest { @@ -41,6 +42,7 @@ export interface AddProjectToWorkspaceRequest { workspaceName?: string; orgName?: string; version?: string; + isLibrary?: boolean; } export interface WorkspacesResponse { @@ -159,8 +161,8 @@ export interface CurrentBreakpointsResponse { } export interface AIChatRequest { - scafold: boolean; readme: boolean; + planMode: boolean; } export interface ImportStatements { diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/rpc-type.ts index 48991978b42..1da53727308 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/bi-diagram/rpc-type.ts @@ -30,8 +30,6 @@ import { ExpressionCompletionsRequest, ExpressionCompletionsResponse, ConfigVariableResponse, - UpdateConfigVariableRequest, - UpdateConfigVariableResponse, SignatureHelpRequest, SignatureHelpResponse, BIGetVisibleVariableTypesRequest, @@ -97,9 +95,11 @@ import { VerifyTypeDeleteResponse, FormDiagnosticsRequest, FormDiagnosticsResponse, - ExpressionTokensRequest, BISearchNodesRequest, - BISearchNodesResponse + BISearchNodesResponse, + BIDesignModelRequest, + BIFlowModelRequest, + ExpressionTokensRequest } from "../../interfaces/extended-lang-client"; import { ProjectRequest, @@ -128,7 +128,7 @@ import { import { RequestType, NotificationType } from "vscode-messenger-common"; const _preFix = "bi-diagram"; -export const getFlowModel: RequestType = { method: `${_preFix}/getFlowModel` }; +export const getFlowModel: RequestType = { method: `${_preFix}/getFlowModel` }; export const getSourceCode: RequestType = { method: `${_preFix}/getSourceCode` }; export const deleteFlowNode: RequestType = { method: `${_preFix}/deleteFlowNode` }; export const deleteByComponentInfo: RequestType = { method: `${_preFix}/deleteByComponentInfo` }; @@ -153,8 +153,6 @@ export const handleReadmeContent: RequestType = { method: `${_preFix}/getVisibleVariableTypes` }; export const getExpressionCompletions: RequestType = { method: `${_preFix}/getExpressionCompletions` }; export const getDataMapperCompletions: RequestType = { method: `${_preFix}/getDataMapperCompletions` }; -export const getConfigVariables: RequestType = { method: `${_preFix}/getConfigVariables` }; -export const updateConfigVariables: RequestType = { method: `${_preFix}/updateConfigVariables` }; export const getConfigVariablesV2: RequestType = { method: `${_preFix}/getConfigVariablesV2` }; export const updateConfigVariablesV2: RequestType = { method: `${_preFix}/updateConfigVariablesV2` }; export const deleteConfigVariableV2: RequestType = { method: `${_preFix}/deleteConfigVariableV2` }; @@ -176,7 +174,7 @@ export const getFormDiagnostics: RequestType = { method: `${_preFix}/getExpressionDiagnostics` }; export const formDidOpen: RequestType = { method: `${_preFix}/formDidOpen` }; export const formDidClose: RequestType = { method: `${_preFix}/formDidClose` }; -export const getDesignModel: RequestType = { method: `${_preFix}/getDesignModel` }; +export const getDesignModel: RequestType = { method: `${_preFix}/getDesignModel` }; export const getTypes: RequestType = { method: `${_preFix}/getTypes` }; export const getType: RequestType = { method: `${_preFix}/getType` }; export const updateType: RequestType = { method: `${_preFix}/updateType` }; @@ -206,4 +204,4 @@ export const generateOpenApiClient: RequestType = { method: `${_preFix}/getOpenApiGeneratedModules` }; export const deleteOpenApiGeneratedModules: RequestType = { method: `${_preFix}/deleteOpenApiGeneratedModules` }; export const openConfigToml: RequestType = { method: `${_preFix}/openConfigToml` }; -export const getExpressionTokens: RequestType = { method: `${_preFix}/getExpressionTokens` }; \ No newline at end of file +export const getExpressionTokens: RequestType = { method: `${_preFix}/getExpressionTokens` }; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/common/interfaces.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/common/interfaces.ts index 26ffcf79e1d..680777cceaf 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/common/interfaces.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/common/interfaces.ts @@ -100,6 +100,7 @@ export interface TomlPackage { name: string; version: string; title: string; + library?: boolean; } export interface WorkspaceTomlValues { diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/index.ts index b117410c013..66b208400b1 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/index.ts @@ -45,7 +45,9 @@ import { ClearTypeCacheResponse, FieldPropertyRequest, ClausePositionRequest, - ClausePositionResponse + ClausePositionResponse, + ConvertExpressionRequest, + ConvertExpressionResponse } from "../../interfaces/extended-lang-client"; export interface DataMapperAPI { @@ -69,5 +71,6 @@ export interface DataMapperAPI { getClausePosition: (params: ClausePositionRequest) => Promise; getExpandedDMFromDMModel: (params: DMModelRequest) => Promise; getProcessTypeReference: (params: ProcessTypeReferenceRequest) => Promise; + getConvertedExpression: (params: ConvertExpressionRequest) => Promise; clearTypeCache: () => Promise; } diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/rpc-type.ts index 876b413a300..04643f0a2d0 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/data-mapper/rpc-type.ts @@ -47,7 +47,9 @@ import { ClearTypeCacheResponse, FieldPropertyRequest, ClausePositionRequest, - ClausePositionResponse + ClausePositionResponse, + ConvertExpressionRequest, + ConvertExpressionResponse } from "../../interfaces/extended-lang-client"; import { RequestType } from "vscode-messenger-common"; @@ -72,4 +74,5 @@ export const getFieldProperty: RequestType = { method: `${_preFix}/getClausePosition` }; export const getExpandedDMFromDMModel: RequestType = { method: `${_preFix}/getExpandedDMFromDMModel` }; export const getProcessTypeReference: RequestType = { method: `${_preFix}/getProcessTypeReference` }; +export const getConvertedExpression: RequestType = { method: `${_preFix}/getConvertedExpression` }; export const clearTypeCache: RequestType = { method: `${_preFix}/clearTypeCache` }; diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts index c95a2239683..cbfefe9d229 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/index.ts @@ -36,4 +36,5 @@ export interface VisualizerAPI { joinProjectPath: (params: JoinProjectPathRequest) => Promise; getThemeKind: () => Promise; updateCurrentArtifactLocation: (params: UpdatedArtifactsResponse) => Promise; + reviewAccepted: () => void; } diff --git a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts index 543b638c16e..ba0722f647e 100644 --- a/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts +++ b/workspaces/ballerina/ballerina-core/src/rpc-types/visualizer/rpc-type.ts @@ -38,3 +38,5 @@ export const resetUndoRedoStack: NotificationType = { method: `${_preFix}/ export const joinProjectPath: RequestType = { method: `${_preFix}/joinProjectPath` }; export const getThemeKind: RequestType = { method: `${_preFix}/getThemeKind` }; export const updateCurrentArtifactLocation: RequestType = { method: `${_preFix}/updateCurrentArtifactLocation` }; +export const reviewAccepted: NotificationType = { method: `${_preFix}/reviewAccepted` }; +export const refreshReviewMode: NotificationType = { method: `${_preFix}/refreshReviewMode` }; diff --git a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts index 1040cb0d65f..465de5ecf14 100644 --- a/workspaces/ballerina/ballerina-core/src/state-machine-types.ts +++ b/workspaces/ballerina/ballerina-core/src/state-machine-types.ts @@ -22,7 +22,7 @@ import { Command } from "./interfaces/ai-panel"; import { LinePosition } from "./interfaces/common"; import { ProjectInfo, ProjectMigrationResult, Type } from "./interfaces/extended-lang-client"; import { CodeData, DIRECTORY_MAP, ProjectStructureArtifactResponse, ProjectStructureResponse } from "./interfaces/bi"; -import { DiagnosticEntry, TestGeneratorIntermediaryState, DocumentationGeneratorIntermediaryState, SourceFile } from "./rpc-types/ai-panel/interfaces"; +import { DiagnosticEntry, DocumentationGeneratorIntermediaryState, SourceFile, CodeContext, FileAttatchment } from "./rpc-types/ai-panel/interfaces"; export type MachineStateValue = | 'initialize' @@ -100,7 +100,8 @@ export enum MACHINE_VIEW { AIChatAgentWizard = "AI Chat Agent Wizard", ResolveMissingDependencies = "Resolve Missing Dependencies", ServiceFunctionForm = "Service Function Form", - BISamplesView = "BI Samples View" + BISamplesView = "BI Samples View", + ReviewMode = "Review Mode SKIP" } export interface MachineEvent { @@ -148,6 +149,7 @@ export interface VisualizerLocation { version?: string; dataMapperMetadata?: DataMapperMetadata; artifactInfo?: ArtifactInfo; + reviewData?: ReviewModeData; } export interface ArtifactInfo { @@ -175,6 +177,21 @@ export interface DataMapperMetadata { codeData: CodeData; } +export interface ReviewViewItem { + type: 'component' | 'flow'; + filePath: string; + position: NodePosition; + projectPath: string; + label?: string; +} + +export interface ReviewModeData { + views: ReviewViewItem[]; + currentIndex: number; + onAccept?: string; + onReject?: string; +} + export interface PopupVisualizerLocation extends VisualizerLocation { recentIdentifier?: string; artifactType?: DIRECTORY_MAP; @@ -202,12 +219,18 @@ export type ChatNotify = | CodeDiagnostics | CodeMessages | ChatStop + | ChatAbort + | SaveChat | ChatError | ToolCall | ToolResult | EvalsToolResult | UsageMetricsEvent - | GeneratedSourcesEvent; + | TaskApprovalRequest + | GeneratedSourcesEvent + | ConnectorGenerationNotification + | CodeReviewActions + | PlanUpdated; export interface ChatStart { type: "start"; @@ -215,7 +238,7 @@ export interface ChatStart { export interface IntermidaryState { type: "intermediary_state"; - state: TestGeneratorIntermediaryState | DocumentationGeneratorIntermediaryState; + state: DocumentationGeneratorIntermediaryState; } //TODO: Maybe rename content_block to content_append? @@ -240,6 +263,17 @@ export interface ChatStop { command: Command | undefined; } +export interface ChatAbort { + type: "abort"; + command: Command | undefined; +} + +export interface SaveChat { + type: "save_chat"; + command: Command | undefined; + messageId: string; +} + export interface ChatError { type: "error"; content: string; @@ -248,12 +282,13 @@ export interface ChatError { export interface ToolCall { type: "tool_call"; toolName: string; + toolInput?: any; } export interface ToolResult { type: "tool_result"; toolName: string; - toolOutput: any; + toolOutput?: any; } export interface EvalsToolResult { @@ -273,18 +308,63 @@ export interface UsageMetricsEvent { }; } +export interface TaskApprovalRequest { + type: "task_approval_request"; + requestId: string; + approvalType: "plan" | "completion"; + tasks: Task[]; + taskDescription?: string; + message?: string; +} + export interface GeneratedSourcesEvent { type: "generated_sources"; fileArray: SourceFile[]; } +export interface ConnectorGenerationNotification { + type: "connector_generation_notification"; + requestId: string; + stage: "requesting_input" | "input_received" | "generating" | "generated" | "skipped" | "error"; + serviceName?: string; + serviceDescription?: string; + spec?: { + version: string; + title: string; + description?: string; + baseUrl?: string; + endpointCount: number; + methods: string[]; + }; + connector?: { + moduleName: string; + importStatement: string; + }; + error?: { + message: string; + code: string; + }; + message: string; +} + +export interface CodeReviewActions { + type: "review_actions"; +} + +export interface PlanUpdated { + type: "plan_updated"; + plan: Plan; +} + export const stateChanged: NotificationType = { method: 'stateChanged' }; export const onDownloadProgress: NotificationType = { method: 'onDownloadProgress' }; export const onChatNotify: NotificationType = { method: 'onChatNotify' }; +export const onHideReviewActions: NotificationType = { method: 'onHideReviewActions' }; export const onMigrationToolLogs: NotificationType = { method: 'onMigrationToolLogs' }; export const onMigrationToolStateChanged: NotificationType = { method: 'onMigrationToolStateChanged' }; export const onMigratedProject: NotificationType = { method: 'onMigratedProject' }; export const projectContentUpdated: NotificationType = { method: 'projectContentUpdated' }; +export const promptUpdated: NotificationType = { method: 'promptUpdated' }; export const getVisualizerLocation: RequestType = { method: 'getVisualizerLocation' }; export const webviewReady: NotificationType = { method: `webviewReady` }; export const dependencyPullProgress: NotificationType = { method: 'dependencyPullProgress' }; @@ -349,6 +429,168 @@ export type AIMachineSendableEvent = : { type: K; payload: AIMachineEventMap[K] } }[keyof AIMachineEventMap]; +export interface ChatMessage { + id: string; + content: string; + uiResponse: string; + modelMessages: any[]; + timestamp: number; + checkpointId?: string; +} + +export interface Checkpoint { + id: string; + messageId: string; + timestamp: number; + workspaceSnapshot: { [filePath: string]: string }; + fileList: string[]; + snapshotSize: number; +} + +// ================================== +// Thread-Based Chat State Types +// ================================== + +/** + * Review state for a generation + */ +export interface GenerationReviewState { + /** Status of the generation review */ + status: 'pending' | 'under_review' | 'accepted' | 'error'; + /** Temp project path while under review (shared across generations in same thread) */ + tempProjectPath?: string; + /** Files modified in this specific generation */ + modifiedFiles: string[]; + /** Packages that have changes (absolute package paths) */ + affectedPackagePaths?: string[]; + /** Error message if status is 'error' */ + errorMessage?: string; +} + +/** + * Metadata for a generation + */ +export interface GenerationMetadata { + /** Whether this was a plan mode generation */ + isPlanMode: boolean; + /** Operation type for the generation */ + operationType?: OperationType; + /** Generation type (agent or datamapper) */ + generationType?: 'agent' | 'datamapper'; + /** Command type if triggered by command */ + commandType?: string; +} + +/** + * Generation represents a single user prompt + complete AI response cycle + * Contains all data needed to render UI and pass to LLM + */ +export interface Generation { + /** Unique generation ID */ + id: string; + /** User prompt content */ + userPrompt: string; + /** Model messages from AI SDK (for LLM context) */ + modelMessages: any[]; + /** UI response formatted for display */ + uiResponse: string; + /** Timestamp when generation started */ + timestamp: number; + + /** Review state (embedded, not separate context) */ + reviewState: GenerationReviewState; + + /** Checkpoint linked to this generation (optional) */ + checkpoint?: Checkpoint; + /** Plan associated with this generation (optional) */ + plan?: Plan; + /** Current task index for plan execution */ + currentTaskIndex: number; + /** File attachments for this generation */ + fileAttachments?: FileAttatchment[]; + /** Code context for this generation */ + codeContext?: CodeContext; + /** Generation metadata */ + metadata: GenerationMetadata; +} + +/** + * Thread represents a conversation with multiple generations + */ +export interface ChatThread { + /** Unique thread ID */ + id: string; + /** Display name for thread */ + name: string; + /** Array of generations in chronological order */ + generations: Generation[]; + /** Session ID for backend correlation */ + sessionId?: string; + /** Thread creation timestamp */ + createdAt: number; + /** Last update timestamp */ + updatedAt: number; +} + +/** + * Workspace-level storage container + * One per workspace, contains multiple threads + */ +export interface WorkspaceChatState { + /** Workspace/project identifier (hash of workspace path) */ + workspaceId: string; + /** Map of thread ID to thread */ + threads: Map; + /** Currently active thread ID */ + activeThreadId: string; +} + +/** + * Task status enum + */ +export enum TaskStatus { + PENDING = "pending", + IN_PROGRESS = "in_progress", + COMPLETED = "completed", + REVIEW = "review" +} + +export enum TaskTypes { + SERVICE_DESIGN = "service_design", + CONNECTIONS_INIT = "connections_init", + IMPLEMENTATION = "implementation" +} + +/** + * Task interface representing a single implementation task + */ +export interface Task { + description: string; + status: TaskStatus; + type : TaskTypes; +} + +export interface Plan { + id: string; + tasks: Task[]; + createdAt: number; + updatedAt: number; +} + +export interface Question { + id: string; + question: string; + context?: string; + timestamp: number; +} + +export interface UserApproval { + comment?: string; +} + +export type OperationType = "CODE_FOR_USER_REQUIREMENT" | "TESTS_FOR_USER_REQUIREMENT"; + + export enum LoginMethod { BI_INTEL = 'biIntel', ANTHROPIC_KEY = 'anthropic_key', @@ -418,6 +660,26 @@ export enum ColorThemeKind { HighContrastLight = 4 } +// Type alias for backward compatibility - use UIChatMessage from rpc-types/ai-panel instead +export type { UIChatMessage as UIChatHistoryMessage } from "./rpc-types/ai-panel/interfaces"; + export const aiStateChanged: NotificationType = { method: 'aiStateChanged' }; export const sendAIStateEvent: RequestType = { method: 'sendAIStateEvent' }; export const currentThemeChanged: NotificationType = { method: 'currentThemeChanged' }; + +export interface CheckpointCapturedPayload { + messageId: string; + checkpointId: string; +} +export const checkpointCaptured: NotificationType = { method: 'checkpointCaptured' }; + +// Connector Generator RPC methods +export interface ConnectorGeneratorResponsePayload { + requestId: string; + action: 'provide' | 'skip'; + spec?: any; + inputMethod?: 'file' | 'paste' | 'url'; + sourceIdentifier?: string; + comment?: string; +} +export const sendConnectorGeneratorResponse: RequestType = { method: 'sendConnectorGeneratorResponse' }; diff --git a/workspaces/ballerina/ballerina-core/src/utils/form-property-utils.ts b/workspaces/ballerina/ballerina-core/src/utils/form-property-utils.ts new file mode 100644 index 00000000000..0da79006dd1 --- /dev/null +++ b/workspaces/ballerina/ballerina-core/src/utils/form-property-utils.ts @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { DropdownType, InputType, TemplateType } from "../interfaces/bi"; + +export const getPrimaryInputType = (types: InputType[]): InputType | undefined => { + if (!types || types.length === 0) return undefined; + return types[0]; +} + +export const isTemplateType = ( + value: InputType +): value is TemplateType => { + return value !== null && typeof value === "object" && "template" in value; +}; + +export const isDropDownType = ( + value: InputType +): value is DropdownType => { + return ( + value !== null && + "options" in value && + (value?.fieldType === "SINGLE_SELECT" || value?.fieldType === "MULTIPLE_SELECT") + ); +}; diff --git a/workspaces/ballerina/ballerina-core/src/utils/index.ts b/workspaces/ballerina/ballerina-core/src/utils/index.ts index 22cc413bcdc..0e41545af4c 100644 --- a/workspaces/ballerina/ballerina-core/src/utils/index.ts +++ b/workspaces/ballerina/ballerina-core/src/utils/index.ts @@ -21,4 +21,5 @@ export * from './keyboard-navigation-manager'; export * from "./diagram/identifier-util"; export * from "./diagram/template-utils"; export * from "./diagram/modification-util"; -export * from "./diagram/utils"; \ No newline at end of file +export * from "./diagram/utils"; +export * from './form-property-utils'; \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/.env.example b/workspaces/ballerina/ballerina-extension/.env.example index a216162b012..f50f4148a2b 100644 --- a/workspaces/ballerina/ballerina-extension/.env.example +++ b/workspaces/ballerina/ballerina-extension/.env.example @@ -11,5 +11,3 @@ BALLERINA_DEV_COPLIOT_ROOT_URL= BALLERINA_DEV_COPLIOT_AUTH_ORG= BALLERINA_DEV_COPLIOT_AUTH_CLIENT_ID= BALLERINA_DEV_COPLIOT_AUTH_REDIRECT_URL= -BALLERINA_DEV_COPLIOT_CODE_API_KEY= -BALLERINA_DEV_COPLIOT_ASK_API_KEY= \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/CHANGELOG.md b/workspaces/ballerina/ballerina-extension/CHANGELOG.md index ad3d4bd2e3b..4ceccac0d1f 100644 --- a/workspaces/ballerina/ballerina-extension/CHANGELOG.md +++ b/workspaces/ballerina/ballerina-extension/CHANGELOG.md @@ -4,6 +4,52 @@ All notable changes to the **Ballerina** extension will be documented in this fi The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project adheres to [Semantic Versioning](https://semver.org/). +## [5.7.3](https://github.com/wso2/vscode-extensions/compare/ballerina-5.7.2...ballerina-5.7.3) - 2026-01-23 + +### Fixed + +- **Expression Editor** — Fixed issue where text input with double quotes was not allowed. +- **Security** — Updated lodash to 4.17.23 to fix CVE-2025-13465 prototype pollution vulnerability. + + +## [5.7.2](https://github.com/wso2/vscode-extensions/compare/ballerina-5.7.1...ballerina-5.7.2) - 2026-01-22 + +### Fixed + +- **BI Copilot** — Enhanced workspace support and improved review mode functionality in Ballerina Workspace environments. + + +## [5.7.1](https://github.com/wso2/vscode-extensions/compare/ballerina-integrator-1.6.0...ballerina-5.7.1) - 2026-01-21 + +### Fixed + +- **Environment** — Fix comprehensive fallback JDK detection logic that checks JAVA_HOME environment variable. + + +## [5.7.0](https://github.com/wso2/vscode-extensions/compare/ballerina-integrator-1.5.4...ballerina-integrator-1.6.0) - 2026-01-20 + +### Added + +- **AI Agent Mode** — Introduced a comprehensive Agent Mode with design capabilities, automatic code integration, task approval workflows, and diagnostic tools. Added support for dynamic OpenAPI connector generation and chat checkpoints. +- **Connectors** — Revamped the Connectors view with support for Persist and WSDL connections. Improved connector generation workflows. +- **Expression Editor** — Expanded expression support with new editors for String Templates, SQL expressions, booleans, numbers, enums, and maps. +- **Data Mapper** — Enhanced mapping capabilities with a "Group by" option, visual icons for mapping options, and support for all primitive type conversions. +- **CDC for Microsoft SQL Server** - Introduced Change Data Capture for Microsoft SQL Server under the event integration section. + +### Changed + +- **AI & Copilot** — Migrated to Devant authentication and improved chat state management. Enhanced Design Mode with better user communication, history persistence, and review modes. +- **Workspace Support** — Updated core commands (including `Type Diagram`, `Add Construct`, `Debug Integration`, and `Run`) to fully support multi-project and workspace environments. +- **Data Mapper** — Improved error handling, type compatibility, and the switching experience for reusable mappers. +- **Editor & UI** — Refactored form properties for better performance and consistency. Improved the Samples view and Project Explorer rendering. + +### Fixed + +- **General** — Resolved issues with `Ballerina: Pack` on Windows, proxy renaming, and Cloud Editor organization selection. +- **Data Mapper** — Fixed bugs related to undo functionality, sub-mapping rendering, output port states, and variable visibility in let-clauses. +- **Expression Editor** — Corrected issues with interpolation wrapping, record editor visibility, and input validation. +- **Security** — Updated dependencies to address known vulnerabilities. + ## [5.6.4](https://github.com/wso2/vscode-extensions/compare/ballerina-integrator-1.5.3...ballerina-integrator-1.5.4) - 2025-12-05 ### Fixed diff --git a/workspaces/ballerina/ballerina-extension/grammar/ballerina-grammar b/workspaces/ballerina/ballerina-extension/grammar/ballerina-grammar index 10325fc5436..9c1bee1e9f4 160000 --- a/workspaces/ballerina/ballerina-extension/grammar/ballerina-grammar +++ b/workspaces/ballerina/ballerina-extension/grammar/ballerina-grammar @@ -1 +1 @@ -Subproject commit 10325fc5436a87606407ba68bf668bcd59dc180d +Subproject commit 9c1bee1e9f48c03a8ad8760b0053ca5687460354 diff --git a/workspaces/ballerina/ballerina-extension/package.json b/workspaces/ballerina/ballerina-extension/package.json index 62260afa485..71f58a8a02d 100644 --- a/workspaces/ballerina/ballerina-extension/package.json +++ b/workspaces/ballerina/ballerina-extension/package.json @@ -2,7 +2,7 @@ "name": "ballerina", "displayName": "Ballerina", "description": "Ballerina Language support, debugging, graphical visualization, AI-based data-mapping and many more.", - "version": "5.6.4", + "version": "5.7.4", "publisher": "wso2", "icon": "resources/images/ballerina.png", "homepage": "https://wso2.com/ballerina/vscode/docs", @@ -213,6 +213,11 @@ "default": true, "description": "Enable AI suggestions in the Flow Diagram View." }, + "ballerina.ai.planMode": { + "type": "boolean", + "default": false, + "description": "Enable the option for the Plan mode in Copilot." + }, "ballerina.showAdvancedAiNodes": { "type": "boolean", "default": false, @@ -232,6 +237,34 @@ "Trace request/response messages only", "Trace request/response messages with parameters and content" ] + }, + "ballerina.copilot.checkpoints.enabled": { + "type": "boolean", + "default": true, + "description": "Enable checkpoint mechanism for copilot chat to restore previous states." + }, + "ballerina.copilot.checkpoints.maxCount": { + "type": "number", + "default": 3, + "description": "Maximum number of checkpoints to keep." + }, + "ballerina.copilot.checkpoints.ignorePatterns": { + "type": "array", + "default": [ + ".git/**", + "target/**", + "build/**", + "dist/**", + ".vscode/**", + "*.log", + ".DS_Store" + ], + "description": "File patterns to ignore when creating checkpoints." + }, + "ballerina.copilot.checkpoints.maxSnapshotSize": { + "type": "number", + "default": 52428800, + "description": "Maximum snapshot size in bytes (default: 50MB)." } } }, @@ -362,11 +395,6 @@ "title": "Create Cloud.toml", "category": "Ballerina" }, - { - "command": "ballerina.login.copilot", - "title": "Authorize Github Copilot", - "category": "Ballerina" - }, { "command": "ballerina.reset.bi", "title": "Reset BI Auth", @@ -382,16 +410,6 @@ "title": "Add Module", "category": "Ballerina" }, - { - "command": "ballerina.refreshPackageTree", - "title": "Refresh", - "icon": "$(distro-refresh)" - }, - { - "command": "ballerina.refreshExplorerTree", - "title": "Refresh", - "icon": "$(distro-refresh)" - }, { "command": "ballerina.newFileExplorerTree", "title": "New File", @@ -402,11 +420,6 @@ "title": "New Folder", "icon": "$(distro-new-folder)" }, - { - "command": "ballerina.deleteFileExplorerTree", - "title": "Delete", - "icon": "$(distro-delete)" - }, { "command": "ballerina.showVisualizer", "title": "Show Visualizer", @@ -415,15 +428,10 @@ }, { "command": "ballerina.force.update.artifacts", - "title": "Refresh", + "title": "Refresh Artifacts", "icon": "$(distro-refresh)", - "category": "Ballerina" - }, - { - "command": "ballerina.test.edit.case", - "title": "Edit test case", - "icon": "$(distro-design-view)", - "category": "Ballerina" + "category": "Ballerina", + "enablement": "isSupportedProject" }, { "command": "ballerina.project.run", @@ -442,11 +450,6 @@ "light": "./resources/images/icons/start.svg" } }, - { - "command": "ballerina.project.stop", - "title": "Stop", - "category": "Ballerina" - }, { "command": "ballerina.source.debug", "title": "Debug", @@ -518,7 +521,7 @@ }, { "command": "ballerina.notebook.refreshVariableView", - "title": "Refresh", + "title": "Refresh Notebook Variables", "icon": "$(distro-refresh)", "category": "Ballerina", "enablement": "isNotebookVariableViewEnabled" @@ -578,6 +581,11 @@ }, "category": "BI" }, + { + "command": "BI.project-explorer.refresh", + "title": "Refresh Ballerina", + "category": "BI" + }, { "command": "BI.test.edit.function", "title": "View test flow", @@ -594,7 +602,8 @@ "command": "BI.test.add.function", "title": "Add test case", "icon": "$(add)", - "category": "BI" + "category": "BI", + "enablement": "isSupportedProject" }, { "command": "BI.view.typeDiagram", @@ -709,25 +718,29 @@ "command": "ballerina.showTraceWindow", "title": "Show Traces", "icon": "$(list-tree)", - "category": "Ballerina" + "category": "Ballerina", + "enablement": "isSupportedProject" }, { "command": "ballerina.enableTracing", "title": "Enable Tracing (Experimental)", - "category": "Ballerina" + "category": "Ballerina", + "enablement": "isSupportedProject" }, { "command": "ballerina.disableTracing", "title": "Disable Tracing (Experimental)", "category": "Ballerina", - "icon": "$(circle-slash)" + "icon": "$(circle-slash)", + "enablement": "isSupportedProject" }, { "command": "ballerina.clearTraces", "title": "Clear Traces (Experimental)", "category": "Ballerina", "icon": "$(clear-all)", - "hidden": true + "hidden": true, + "enablement": "isSupportedProject" } ], "views": { @@ -930,6 +943,18 @@ } ], "commandPalette": [ + { + "command": "BI.test.edit.function.def", + "when": "false" + }, + { + "command": "BI.test.edit.function", + "when": "false" + }, + { + "command": "BI.project-explorer.delete", + "when": "false" + }, { "command": "ballerina.show.source", "when": "editorLangId != ballerina && !isBallerinaDiagram" @@ -1011,25 +1036,25 @@ "fontCharacter": "\\f114" } }, - "distro-design-view": { - "description": "design-view", + "distro-agent-view": { + "description": "agent-view", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f16e" + "fontCharacter": "\\f175" } }, "distro-start": { "description": "start", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f11a" + "fontCharacter": "\\f21f" } }, "distro-debug": { "description": "debug", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f171" + "fontCharacter": "\\f17a" } }, "distro-source-view": { @@ -1043,7 +1068,7 @@ "description": "persist-diagram", "default": { "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", - "fontCharacter": "\\f133" + "fontCharacter": "\\f1f9" } }, "distro-cached-rounded": { @@ -1136,6 +1161,13 @@ "fontPath": "./resources/codicons/codicon.ttf", "fontCharacter": "\\ea77" } + }, + "distro-design-view": { + "description": "design-view", + "default": { + "fontPath": "./resources/font-wso2-vscode/dist/wso2-vscode.woff", + "fontCharacter": "\\f177" + } } }, "uriHandler": { @@ -1183,12 +1215,12 @@ "download-ls:prerelease": "node scripts/download-ls.js --prerelease --replace", "build": "pnpm run compile && pnpm run lint && pnpm run postbuild", "rebuild": "pnpm run clean && pnpm run compile && pnpm run postbuild", - "postbuild": "if [ \"$isPreRelease\" = \"true\" ]; then pnpm run download-ls --prerelease; else pnpm run download-ls; fi && pnpm run copyFonts && pnpm run copyJSLibs && pnpm run package && pnpm run copyVSIX", + "postbuild": "pnpm run download-ls && pnpm run copyFonts && pnpm run copyJSLibs && pnpm run package && pnpm run copyVSIX", "copyJSLibs": "copyfiles -f ../ballerina-visualizer/build/*.js resources/jslibs && copyfiles -f ../trace-visualizer/build/*.js resources/jslibs" }, "dependencies": { - "@ai-sdk/amazon-bedrock": "^3.0.25", - "@ai-sdk/anthropic": "^2.0.20", + "@ai-sdk/amazon-bedrock": "^4.0.4", + "@ai-sdk/anthropic": "^3.0.2", "@iarna/toml": "^2.2.5", "@types/lodash": "^4.14.200", "@vscode/test-electron": "^2.5.2", @@ -1199,7 +1231,7 @@ "@wso2/syntax-tree": "workspace:*", "@wso2/trace-visualizer": "workspace:*", "@wso2/wso2-platform-core": "workspace:*", - "ai": "^5.0.56", + "ai": "^6.0.7", "cors-anywhere": "^0.4.4", "del-cli": "^5.1.0", "dotenv": "~16.5.0", @@ -1207,7 +1239,7 @@ "glob": "^11.1.0", "handlebars": "~4.7.8", "jwt-decode": "^4.0.0", - "lodash": "^4.17.21", + "lodash": "4.17.23", "monaco-languageclient": "0.13.1-next.9", "node-fetch": "^3.3.2", "node-schedule": "^2.1.1", diff --git a/workspaces/ballerina/ballerina-extension/resources/images/icons/design-view-inverse.svg b/workspaces/ballerina/ballerina-extension/resources/images/icons/agent-view-inverse.svg similarity index 100% rename from workspaces/ballerina/ballerina-extension/resources/images/icons/design-view-inverse.svg rename to workspaces/ballerina/ballerina-extension/resources/images/icons/agent-view-inverse.svg diff --git a/workspaces/ballerina/ballerina-extension/resources/images/icons/design-view.svg b/workspaces/ballerina/ballerina-extension/resources/images/icons/agent-view.svg similarity index 100% rename from workspaces/ballerina/ballerina-extension/resources/images/icons/design-view.svg rename to workspaces/ballerina/ballerina-extension/resources/images/icons/agent-view.svg diff --git a/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts b/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts index f8c729538b4..a43b3b1cfeb 100644 --- a/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts +++ b/workspaces/ballerina/ballerina-extension/src/RPCLayer.ts @@ -19,7 +19,7 @@ import { WebviewView, WebviewPanel, window } from 'vscode'; import { Messenger } from 'vscode-messenger'; import { StateMachine } from './stateMachine'; -import { stateChanged, getVisualizerLocation, VisualizerLocation, projectContentUpdated, aiStateChanged, sendAIStateEvent, popupStateChanged, getPopupVisualizerState, PopupVisualizerLocation, breakpointChanged, AIMachineEventType, ArtifactData, onArtifactUpdatedNotification, onArtifactUpdatedRequest, currentThemeChanged, AIMachineSendableEvent } from '@wso2/ballerina-core'; +import { stateChanged, getVisualizerLocation, VisualizerLocation, projectContentUpdated, aiStateChanged, sendAIStateEvent, popupStateChanged, getPopupVisualizerState, PopupVisualizerLocation, breakpointChanged, AIMachineEventType, ArtifactData, onArtifactUpdatedNotification, onArtifactUpdatedRequest, currentThemeChanged, AIMachineSendableEvent, checkpointCaptured, CheckpointCapturedPayload, promptUpdated } from '@wso2/ballerina-core'; import { VisualizerWebview } from './views/visualizer/webview'; import { registerVisualizerRpcHandlers } from './rpc-managers/visualizer/rpc-handler'; import { registerLangClientRpcHandlers } from './rpc-managers/lang-client/rpc-handler'; @@ -149,7 +149,8 @@ async function getContext(): Promise { org: context.org, package: context.package, dataMapperMetadata: context.dataMapperMetadata, - artifactInfo: context.artifactInfo + artifactInfo: context.artifactInfo, + reviewData: context.reviewData }); }); } @@ -181,6 +182,14 @@ export function notifyAiWebview() { RPCLayer._messenger.sendNotification(projectContentUpdated, { type: 'webview', webviewType: AiPanelWebview.viewType }, true); } +export function notifyAiPromptUpdated() { + RPCLayer._messenger.sendNotification(promptUpdated, { type: 'webview', webviewType: AiPanelWebview.viewType }); +} + export function notifyBreakpointChange() { RPCLayer._messenger.sendNotification(breakpointChanged, { type: 'webview', webviewType: VisualizerWebview.viewType }, true); } + +export function notifyCheckpointCaptured(payload: CheckpointCapturedPayload) { + RPCLayer._messenger.sendNotification(checkpointCaptured, { type: 'webview', webviewType: AiPanelWebview.viewType }, payload); +} diff --git a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts index 1bfc17679c6..6838b76d00f 100644 --- a/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts +++ b/workspaces/ballerina/ballerina-extension/src/core/extended-language-client.ts @@ -108,8 +108,6 @@ import { VisibleVariableTypes, ConfigVariableResponse, ConfigVariableRequest, - UpdateConfigVariableRequest, - UpdateConfigVariableResponse, ProjectDiagnosticsRequest, ProjectDiagnosticsResponse, MainFunctionParamsRequest, @@ -276,6 +274,10 @@ import { FieldPropertyRequest, ClausePositionResponse, ClausePositionRequest, + SemanticDiffRequest, + SemanticDiffResponse, + ConvertExpressionRequest, + ConvertExpressionResponse, IntrospectDatabaseRequest, IntrospectDatabaseResponse, PersistClientGenerateRequest, @@ -383,8 +385,7 @@ enum EXTENDED_APIS { DATA_MAPPER_FIELD_PROPERTY = 'dataMapper/fieldPosition', DATA_MAPPER_CLAUSE_POSITION = 'dataMapper/clausePosition', DATA_MAPPER_CLEAR_TYPE_CACHE = 'dataMapper/clearTypeCache', - VIEW_CONFIG_VARIABLES = 'configEditor/getConfigVariables', - UPDATE_CONFIG_VARIABLES = 'configEditor/updateConfigVariables', + DATA_MAPPER_CONVERT_EXPRESSION = 'dataMapper/convertExpression', VIEW_CONFIG_VARIABLES_V2 = 'configEditorV2/getConfigVariables', UPDATE_CONFIG_VARIABLES_V2 = 'configEditorV2/updateConfigVariable', DELETE_CONFIG_VARIABLE_V2 = 'configEditorV2/deleteConfigVariable', @@ -457,6 +458,7 @@ enum EXTENDED_APIS { BI_AI_GET_TOOL = 'agentManager/getTool', BI_AI_GET_MCP_TOOLS = 'agentManager/getMcpTools', BI_AI_GEN_TOOLS = 'agentManager/genTool', + BI_GET_SEMANTIC_DIFF = 'copilotAgentService/getSemanticDiff', BI_IS_ICP_ENABLED = 'icpService/isIcpEnabled', BI_ADD_ICP = 'icpService/addICP', BI_DISABLE_ICP = 'icpService/disableICP', @@ -879,6 +881,10 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest(EXTENDED_APIS.DATA_MAPPER_CLAUSE_POSITION, params); } + async getConvertedExpression(params: ConvertExpressionRequest): Promise { + return this.sendRequest(EXTENDED_APIS.DATA_MAPPER_CONVERT_EXPRESSION, params); + } + async clearTypeCache(): Promise { return this.sendRequest(EXTENDED_APIS.DATA_MAPPER_CLEAR_TYPE_CACHE); } @@ -1119,14 +1125,6 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest(EXTENDED_APIS.BI_GEN_OPEN_API, params); } - async getConfigVariables(params: ConfigVariableRequest): Promise { - return this.sendRequest(EXTENDED_APIS.VIEW_CONFIG_VARIABLES, params); - } - - async updateConfigVariables(params: UpdateConfigVariableRequest): Promise { - return this.sendRequest(EXTENDED_APIS.UPDATE_CONFIG_VARIABLES, params); - } - async getConfigVariablesV2(params: ConfigVariableRequest): Promise { return this.sendRequest(EXTENDED_APIS.VIEW_CONFIG_VARIABLES_V2, params); } @@ -1446,6 +1444,10 @@ export class ExtendedLangClient extends LanguageClient implements ExtendedLangCl return this.sendRequest(EXTENDED_APIS.MULE_TO_BI, params); } + async getSemanticDiff(params: SemanticDiffRequest): Promise { + return this.sendRequest(EXTENDED_APIS.BI_GET_SEMANTIC_DIFF, params); + } + // <------------ BI APIS END ---------------> diff --git a/workspaces/ballerina/ballerina-extension/src/extension.ts b/workspaces/ballerina/ballerina-extension/src/extension.ts index e2e72faca83..83f73abb277 100644 --- a/workspaces/ballerina/ballerina-extension/src/extension.ts +++ b/workspaces/ballerina/ballerina-extension/src/extension.ts @@ -17,6 +17,7 @@ */ import { ExtensionContext, commands, window, Location, Uri, TextEditor, extensions, workspace } from 'vscode'; +import * as vscode from 'vscode'; import { BallerinaExtension } from './core'; import { activate as activateBBE } from './views/bbe'; import { @@ -39,6 +40,7 @@ import { debug, handleResolveMissingDependencies, log } from './utils'; import { activateUriHandlers } from './utils/uri-handlers'; import { StateMachine } from './stateMachine'; import { activateSubscriptions } from './views/visualizer/activate'; +import { VisualizerWebview } from './views/visualizer/webview'; import { extension } from './BalExtensionContext'; import { ExtendedClientCapabilities } from '@wso2/ballerina-core'; import { RPCLayer } from './RPCLayer'; @@ -51,6 +53,19 @@ import { activateTracing } from './features/tracing'; let langClient: ExtendedLangClient; export let isPluginStartup = true; +/** + * Utility class to expose Ballerina extension state to other extensions + */ +export class BallerinaExtensionState { + /** + * Check if a debug session is currently active + * @returns true if a debug session is active, false otherwise + */ + public static isDebugSessionActive(): boolean { + return vscode.debug.activeDebugSession !== undefined; + } +} + // TODO initializations should be contributions from each component function onBeforeInit(langClient: ExtendedLangClient) { class TraceLogsFeature implements StaticFeature { @@ -115,7 +130,12 @@ export async function activate(context: ExtensionContext) { await StateMachine.initialize(); // Then return the ballerina extension context - return { ballerinaExtInstance: extension.ballerinaExtInstance, projectPath: StateMachine.context().projectPath }; + return { + ballerinaExtInstance: extension.ballerinaExtInstance, + projectPath: StateMachine.context().projectPath, + VisualizerWebview, + BallerinaExtensionState + }; } export async function activateBallerina(): Promise { @@ -269,6 +289,7 @@ async function updateCodeServerConfig() { export function deactivate(): Thenable | undefined { debug('Deactive the Ballerina VS Code extension.'); + if (!langClient) { return; } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts index 50269512877..2f94ce15d58 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/activator.ts @@ -19,16 +19,44 @@ import { commands, window } from 'vscode'; import { BallerinaExtension, ExtendedLangClient } from '../../core'; import { activateCopilotLoginCommand, resetBIAuth } from './completions'; -import { generateCodeCore } from './service/code/code'; -import { GenerateCodeRequest, ProcessMappingParametersRequest } from '@wso2/ballerina-core'; -import { CopilotEventHandler } from './service/event'; +import { ProcessMappingParametersRequest } from '@wso2/ballerina-core'; +import { CopilotEventHandler } from './utils/events'; import { addConfigFile, getConfigFilePath } from './utils'; -import { StateMachine } from "../../stateMachine"; -import { CONFIGURE_DEFAULT_MODEL_COMMAND, DEFAULT_PROVIDER_ADDED, LOGIN_REQUIRED_WARNING_FOR_DEFAULT_MODEL, SIGN_IN_BI_COPILOT } from './constants'; -import { REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE, TOKEN_REFRESH_ONLY_SUPPORTED_FOR_BI_INTEL } from '../..//utils/ai/auth'; +import { + CONFIGURE_DEFAULT_MODEL_COMMAND, + DEFAULT_PROVIDER_ADDED, + LOGIN_REQUIRED_WARNING_FOR_DEFAULT_MODEL, + SIGN_IN_BI_COPILOT +} from './constants'; +import { + REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE, + TOKEN_REFRESH_ONLY_SUPPORTED_FOR_BI_INTEL +} from '../..//utils/ai/auth'; import { AIStateMachine } from '../../views/ai-panel/aiMachine'; -import { AIMachineEventType } from '@wso2/ballerina-core'; -import { generateMappingCodeCore } from './service/datamapper/datamapper'; +import { AIMachineEventType, GenerateAgentCodeRequest, ExecutionContext } from '@wso2/ballerina-core'; +import { generateMappingCodeCore } from './data-mapper'; +import { resolveProjectPath } from '../../utils/project-utils'; +import { MESSAGES } from '../project'; +import { AICommandConfig } from './executors/base/AICommandExecutor'; +import { AgentExecutor } from './agent/AgentExecutor'; + +/** + * Parameters for test-mode code generation + */ +export interface GenerateAgentForTestParams extends GenerateAgentCodeRequest { + /** Path to the isolated test project (created by eval from template) */ + projectPath: string; +} + +/** + * Result returned from test-mode code generation + */ +export interface GenerateAgentForTestResult { + /** Path to the temp project where code was generated (created by getTempProject) */ + tempProjectPath: string; + /** Path to the isolated test project (source) */ + isolatedProjectPath: string; +} export let langClient: ExtendedLangClient; @@ -40,8 +68,42 @@ export function activateAIFeatures(ballerinaExternalInstance: BallerinaExtension // Register commands in test environment to test the AI features if (process.env.AI_TEST_ENV) { - commands.registerCommand('ballerina.test.ai.generateCodeCore', async (params: GenerateCodeRequest, testEventHandler: CopilotEventHandler) => { - await generateCodeCore(params, testEventHandler); + commands.registerCommand('ballerina.test.ai.generateAgentForTest', async (params: GenerateAgentForTestParams, testEventHandler: CopilotEventHandler): Promise => { + + try { + // Create isolated ExecutionContext for this test + const ctx: ExecutionContext = { + projectPath: params.projectPath, + workspacePath: params.projectPath + }; + + // Create config using new AICommandConfig pattern + const config: AICommandConfig = { + executionContext: ctx, + eventHandler: testEventHandler, + generationId: `test-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`, + abortController: new AbortController(), + params, + // No chat storage in test mode + chatStorage: undefined, + // Immediate cleanup (AI_TEST_ENV prevents actual deletion) + lifecycle: { + cleanupStrategy: 'immediate' + } + }; + + // Execute using new run() method + const executor = new AgentExecutor(config); + const result = await executor.run(); + + return { + tempProjectPath: result.tempProjectPath, + isolatedProjectPath: params.projectPath + }; + } catch (error) { + console.error(`[Test Mode] Generation failed for project ${params.projectPath}:`, error); + throw error; + } }); commands.registerCommand('ballerina.test.ai.generatemappingCodecore', async (params: ProcessMappingParametersRequest, testEventHandler: CopilotEventHandler) => { @@ -54,12 +116,12 @@ export function activateAIFeatures(ballerinaExternalInstance: BallerinaExtension getSelectedLibraries, getRelevantLibrariesAndFunctions, GenerationType - } = require('./service/libs/libs'); + } = require('./utils/libraries'); const { selectRequiredFunctions, getMaximizedSelectedLibs, toMaximizedLibrariesFromLibJson - } = require('./service/libs/funcs'); + } = require('./utils/function-registry'); commands.registerCommand('ballerina.test.ai.getAllLibraries', async (generationType: typeof GenerationType) => { return await getAllLibraries(generationType); @@ -86,10 +148,14 @@ export function activateAIFeatures(ballerinaExternalInstance: BallerinaExtension }); } - const projectPath = StateMachine.context().projectPath; + commands.registerCommand(CONFIGURE_DEFAULT_MODEL_COMMAND, async () => { + const targetPath = await resolveProjectPath("Select an integration to configure default model"); + if (!targetPath) { + window.showErrorMessage(MESSAGES.NO_PROJECT_FOUND); + return; + } - commands.registerCommand(CONFIGURE_DEFAULT_MODEL_COMMAND, async (...args: any[]) => { - const configPath = await getConfigFilePath(ballerinaExternalInstance, projectPath); + const configPath = await getConfigFilePath(ballerinaExternalInstance, targetPath); if (configPath !== null) { try { const result = await addConfigFile(configPath); diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts new file mode 100644 index 00000000000..ce60265145b --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/AgentExecutor.ts @@ -0,0 +1,489 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { AICommandExecutor, AICommandConfig, AIExecutionResult } from '../executors/base/AICommandExecutor'; +import { Command, GenerateAgentCodeRequest, ProjectSource, EVENT_TYPE, MACHINE_VIEW, refreshReviewMode, ExecutionContext } from '@wso2/ballerina-core'; +import { ModelMessage, stepCountIs, streamText, TextStreamPart } from 'ai'; +import { getAnthropicClient, getProviderCacheControl, ANTHROPIC_SONNET_4 } from '../utils/ai-client'; +import { populateHistoryForAgent, getErrorMessage } from '../utils/ai-utils'; +import { sendAgentDidOpenForFreshProjects } from '../utils/project/ls-schema-notifications'; +import { getSystemPrompt, getUserPrompt } from './prompts'; +import { GenerationType, getAllLibraries } from '../utils/libs/libraries'; +import { createToolRegistry } from './tool-registry'; +import { getProjectSource, cleanupTempProject } from '../utils/project/temp-project'; +import { StreamContext } from './stream-handlers/stream-context'; +import { checkCompilationErrors } from './tools/diagnostics-utils'; +import { updateAndSaveChat } from '../utils/events'; +import { chatStateStorage } from '../../../views/ai-panel/chatStateStorage'; +import { openView } from '../../../stateMachine'; +import { RPCLayer } from '../../../RPCLayer'; +import { VisualizerWebview } from '../../../views/visualizer/webview'; +import * as path from 'path'; + +/** + * Determines which packages have been affected by analyzing modified files + * Returns temp directory package paths for use with Language Server semantic diff API + * @param modifiedFiles Array of relative file paths that were modified + * @param projects Array of project sources with package information + * @param ctx Execution context with project and workspace paths + * @param tempProjectPath Temp project root path + * @returns Array of temp package paths that have changes + */ +function determineAffectedPackages( + modifiedFiles: string[], + projects: ProjectSource[], + ctx: ExecutionContext, + tempProjectPath: string +): string[] { + const affectedPackages = new Set(); + + console.log(`[determineAffectedPackages] Analyzing ${modifiedFiles.length} modified files across ${projects.length} projects`); + console.log(`[determineAffectedPackages] Temp project path: ${tempProjectPath}`); + + // For non-workspace scenario (single package) + if (!ctx.workspacePath) { + console.log(`[determineAffectedPackages] Non-workspace scenario, using temp project path: ${tempProjectPath}`); + affectedPackages.add(tempProjectPath); + return Array.from(affectedPackages); + } + + // For workspace scenario with multiple packages + // We need to map modified files to their temp package paths + for (const modifiedFile of modifiedFiles) { + let matched = false; + + for (const project of projects) { + if (project.packagePath === "") { + // Root package in workspace (edge case) + if (!modifiedFile.includes('/') || + !projects.some(p => p.packagePath && modifiedFile.startsWith(p.packagePath + '/'))) { + // Root package is at the temp project path directly + affectedPackages.add(tempProjectPath); + matched = true; + console.log(`[determineAffectedPackages] File '${modifiedFile}' belongs to root package (temp): ${tempProjectPath}`); + break; + } + } else { + // Package with a specific path in workspace + if (modifiedFile.startsWith(project.packagePath + '/') || + modifiedFile === project.packagePath) { + // Map to temp package path: tempProjectPath + relative package path + const tempPackagePath = path.join(tempProjectPath, project.packagePath); + affectedPackages.add(tempPackagePath); + matched = true; + console.log(`[determineAffectedPackages] File '${modifiedFile}' belongs to package '${project.packagePath}' (temp): ${tempPackagePath}`); + break; + } + } + } + + if (!matched) { + // Fallback: if we can't determine the package, include the temp project root + console.warn(`[determineAffectedPackages] Could not determine package for file '${modifiedFile}', using temp project root`); + affectedPackages.add(tempProjectPath); + } + } + + const result = Array.from(affectedPackages); + console.log(`[determineAffectedPackages] Found ${result.length} affected temp package paths:`, result); + return result; +} + +/** + * AgentExecutor - Executes agent-based code generation with tools and streaming + * + * Features: + * - Multi-turn conversation with LLM using chat storage + * - Review mode (temp project persists until user accepts/declines) + * - Tool execution (TaskWrite, FileEdit, Diagnostics, etc.) + * - Stream event processing + * - Plan approval workflow (via ApprovalManager in TaskWrite tool) + */ +export class AgentExecutor extends AICommandExecutor { + constructor(config: AICommandConfig) { + super(config); + } + + /** + * Execute agent code generation + * + * Flow: + * 1. Get project sources from temp directory + * 2. Send didOpen notifications (skip if reusing temp) + * 3. Add generation to chat storage (if enabled) + * 4. Get chat history from storage (if enabled) + * 5. Build LLM messages (system + history + user) + * 6. Create tools (TaskWrite, FileEdit, Diagnostics, etc.) + * 7. Stream LLM response and process events + * 8. Return modified files + */ + async execute(): Promise { + const tempProjectPath = this.config.executionContext.tempProjectPath!; + const params = this.config.params; // Access params from config + const modifiedFiles: string[] = []; + + try { + // 1. Get project sources from temp directory + const projects: ProjectSource[] = await getProjectSource( + params.operationType, + this.config.executionContext + ); + + // 2. Send didOpen only if creating NEW temp (not reusing for review continuation) + if (!this.config.lifecycle?.existingTempPath) { + // Fresh project - Both schemas - correct + sendAgentDidOpenForFreshProjects(tempProjectPath, projects); + } else { + console.log(`[AgentExecutor] Skipping didOpen (reusing temp for review continuation)`); + } + + // 3. Add generation to chat storage (if enabled) + this.addGeneration(params.usecase, { + isPlanMode: params.isPlanMode, + operationType: params.operationType, + generationType: 'agent', + }); + + // 4. Get chat history from storage (if enabled) + const chatHistory = this.getChatHistory(); + console.log(`[AgentExecutor] Using ${chatHistory.length} chat history messages`); + + // 5. Build LLM messages with history + const historyMessages = populateHistoryForAgent(chatHistory); + const cacheOptions = await getProviderCacheControl(); + const userMessageContent = getUserPrompt(params, tempProjectPath, projects); + + const allMessages: ModelMessage[] = [ + { + role: "system", + content: getSystemPrompt(projects, params.operationType), + providerOptions: cacheOptions, + }, + ...historyMessages, + { + role: "user", + content: userMessageContent, + }, + ]; + + // Get libraries for library provider tool + const allLibraries = await getAllLibraries(GenerationType.CODE_GENERATION); + const libraryDescriptions = allLibraries.length > 0 + ? allLibraries.map((lib) => `- ${lib.name}: ${lib.description}`).join("\n") + : "- No libraries available"; + + // Create tools + const tools = createToolRegistry({ + eventHandler: this.config.eventHandler, + tempProjectPath, + modifiedFiles, + projects, + libraryDescriptions, + generationType: GenerationType.CODE_GENERATION, + workspaceId: this.config.executionContext.projectPath, + generationId: this.config.generationId, + threadId: 'default', + }); + + // Stream LLM response + const { fullStream, response } = streamText({ + model: await getAnthropicClient(ANTHROPIC_SONNET_4), + maxOutputTokens: 8192, + temperature: 0, + messages: allMessages, + stopWhen: stepCountIs(50), + tools, + abortSignal: this.config.abortController.signal, + }); + + // Send start event to frontend + this.config.eventHandler({ type: "start" }); + + // Create stream context for handlers + const streamContext: StreamContext = { + eventHandler: this.config.eventHandler, + modifiedFiles, + projects, + shouldCleanup: false, // Review mode - don't cleanup immediately + messageId: this.config.generationId, + userMessageContent, + response, + ctx: this.config.executionContext, + }; + + // Process stream events - NATIVE V6 PATTERN + try { + for await (const part of fullStream) { + await this.handleStreamPart(part, streamContext); + } + + // Check if abort was called after stream completed + // This handles the case where abort happens but doesn't throw an error + if (this.config.abortController.signal.aborted) { + console.log("[AgentExecutor] Detected abort after stream completion"); + const abortError = new Error('Aborted by user'); + abortError.name = 'AbortError'; + throw abortError; + } + } catch (error: any) { + // Handle abort specifically + if (error.name === 'AbortError' || this.config.abortController.signal.aborted) { + console.log("[AgentExecutor] Aborted by user."); + + // Get partial messages from SDK + let messagesToSave: any[] = []; + try { + const partialResponse = await response; + messagesToSave = partialResponse.messages || []; + } catch (e) { + console.warn("[AgentExecutor] Could not retrieve partial response messages:", e); + } + + // Add abort notification message + messagesToSave.push({ + role: "user", + content: ` +Generation stopped by user. The last in-progress task was not saved. Files have been reverted to the previous completed task state. Please redo the last task if needed. +`, + }); + + // Update generation with user message + partial messages + const workspaceId = this.config.executionContext.projectPath; + const threadId = 'default'; + chatStateStorage.updateGeneration(workspaceId, threadId, this.config.generationId, { + modelMessages: [ + { role: "user", content: streamContext.userMessageContent }, + ...messagesToSave, + ], + }); + + // Clear review state + const pendingReview = chatStateStorage.getPendingReviewGeneration(workspaceId, threadId); + if (pendingReview && pendingReview.id === this.config.generationId) { + console.log("[AgentExecutor] Clearing review state due to abort"); + chatStateStorage.declineAllReviews(workspaceId, threadId); + } + + // Note: Abort event is sent by base class handleExecutionError() + } + + // Re-throw for base class error handling + throw error; + } + + return { + tempProjectPath, + modifiedFiles, + }; + } catch (error) { + // For abort errors, re-throw so base class can handle them + if ((error as any).name === 'AbortError' || this.config.abortController.signal.aborted) { + throw error; + } + + this.config.eventHandler({ + type: "error", + content: "An error occurred during agent execution. Please check the logs for details." + }); + + // For other errors, return result with error + return { + tempProjectPath, + modifiedFiles, + error: error as Error, + }; + } + } + + /** + * Handles individual stream events from the AI SDK. + */ + private async handleStreamPart( + part: TextStreamPart, + context: StreamContext + ): Promise { + switch (part.type) { + case "text-delta": + context.eventHandler({ + type: "content_block", + content: part.text + }); + break; + + case "text-start": + context.eventHandler({ + type: "content_block", + content: " \n" + }); + break; + + case "error": + const error = part.error instanceof Error ? part.error : new Error(String(part.error)); + await this.handleStreamError(error, context); + throw error; + + case "finish": + await this.handleStreamFinish(context); + break; + + default: + // Tool calls/results handled automatically by SDK + break; + } + } + + /** + * Handles stream errors with cleanup. + * Clears review state to prevent stale data. + */ + private async handleStreamError(error: Error, context: StreamContext): Promise { + console.error("[Agent] Stream error:", error); + + const tempProjectPath = context.ctx.tempProjectPath!; + if (context.shouldCleanup) { + // Note: cleanupTempProject now handles sendAgentDidClose internally + await cleanupTempProject(tempProjectPath); + } + + // Clear review state for this generation + const workspaceId = context.ctx.projectPath; + const threadId = 'default'; + const pendingReview = chatStateStorage.getPendingReviewGeneration(workspaceId, threadId); + + if (pendingReview && pendingReview.id === context.messageId) { + console.log("[AgentExecutor] Clearing review state due to error"); + chatStateStorage.updateReviewState(workspaceId, threadId, context.messageId, { + status: 'error', + errorMessage: getErrorMessage(error), + }); + } + + context.eventHandler({ + type: "error", + content: getErrorMessage(error) + }); + } + + /** + * Handles stream completion - runs diagnostics and updates chat state. + */ + private async handleStreamFinish(context: StreamContext): Promise { + const finalResponse = await context.response; + const assistantMessages = finalResponse.messages || []; + const tempProjectPath = context.ctx.tempProjectPath!; + + // Run final diagnostics + const finalDiagnostics = await checkCompilationErrors(tempProjectPath); + context.eventHandler({ + type: "diagnostics", + diagnostics: finalDiagnostics.diagnostics + }); + + // Update chat state storage + await this.updateChatState(context, assistantMessages, tempProjectPath); + + // Emit UI events + await this.emitReviewActions(context); + } + + /** + * Updates chat state storage with generation results. + * Includes accumulated modified files tracking across review continuations. + */ + private async updateChatState( + context: StreamContext, + assistantMessages: any[], + tempProjectPath: string + ): Promise { + const workspaceId = context.ctx.projectPath; + const threadId = 'default'; + + // Check if we're updating an existing review context + const existingReview = chatStateStorage.getPendingReviewGeneration(workspaceId, threadId); + let accumulatedModifiedFiles = context.modifiedFiles; + + if (existingReview && existingReview.reviewState.tempProjectPath === tempProjectPath) { + // Accumulate modified files from previous prompts + const existingFiles = new Set(existingReview.reviewState.modifiedFiles || []); + const newFiles = new Set(context.modifiedFiles); + accumulatedModifiedFiles = Array.from(new Set([...existingFiles, ...newFiles])); + console.log(`[AgentExecutor] Accumulated modified files: ${accumulatedModifiedFiles.length} total (${existingReview.reviewState.modifiedFiles?.length || 0} existing + ${context.modifiedFiles.length} new)`); + } + + // Update chat state storage with user message + assistant messages + chatStateStorage.updateGeneration(workspaceId, threadId, context.messageId, { + modelMessages: [ + { role: "user", content: context.userMessageContent }, + ...assistantMessages, + ], + }); + + // Skip review mode if no files were modified + if (accumulatedModifiedFiles.length === 0) { + console.log("[AgentExecutor] No modified files - skipping review mode"); + return; + } + + // Determine which packages have been affected by the changes + // This returns temp package paths for use with Language Server APIs + const affectedPackagePaths = determineAffectedPackages( + accumulatedModifiedFiles, + context.projects, + context.ctx, + tempProjectPath + ); + + // Update review state and open review mode + chatStateStorage.updateReviewState(workspaceId, threadId, context.messageId, { + status: 'under_review', + tempProjectPath, + modifiedFiles: accumulatedModifiedFiles, + affectedPackagePaths: affectedPackagePaths, + }); + + // Automatically open review mode + openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.ReviewMode }); + console.log("[AgentExecutor] Automatically opened review mode"); + + // Notify ReviewMode component to refresh its data + setTimeout(() => { + RPCLayer._messenger.sendNotification(refreshReviewMode, { + type: 'webview', + webviewType: VisualizerWebview.viewType + }); + console.log("[AgentExecutor] Sent refresh notification to review mode"); + }, 100); + } + + /** + * Emits review actions and chat save events to UI. + */ + private async emitReviewActions(context: StreamContext): Promise { + // Emit review_actions only if there are modified files + if (context.modifiedFiles.length > 0) { + context.eventHandler({ type: "review_actions" }); + } + + updateAndSaveChat(context.messageId, Command.Agent, context.eventHandler); + context.eventHandler({ type: "stop", command: Command.Agent }); + } + + protected getCommandType(): Command { + return Command.Agent; + } +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts new file mode 100644 index 00000000000..a4178bce660 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/index.ts @@ -0,0 +1,112 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { Command, ExecutionContext, GenerateAgentCodeRequest } from "@wso2/ballerina-core"; +import { workspace } from 'vscode'; +import { StateMachine } from "../../../stateMachine"; +import { chatStateStorage } from '../../../views/ai-panel/chatStateStorage'; +import { AICommandConfig } from "../executors/base/AICommandExecutor"; +import { createWebviewEventHandler } from "../utils/events"; +import { AgentExecutor } from './AgentExecutor'; + +// ================================== +// Agent Generation Functions +// ================================== + +/** + * Factory function to create unified executor configuration + * Eliminates repetitive config creation in RPC methods + */ +export function createExecutorConfig( + params: TParams, + options: { + command: Command; + chatStorageEnabled?: boolean; // Always have? + cleanupStrategy: 'immediate' | 'review'; + existingTempPath?: string; //TODO: Maybe lazyily get this? not sure if needed here. + } +): AICommandConfig { + const ctx = StateMachine.context(); + return { + executionContext: createExecutionContextFromStateMachine(), + eventHandler: createWebviewEventHandler(options.command), + generationId: `msg-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`, + abortController: new AbortController(), + params, + chatStorage: options.chatStorageEnabled ? { + workspaceId: ctx.projectPath, + threadId: 'default', + enabled: true, + } : undefined, + lifecycle: { + cleanupStrategy: options.cleanupStrategy, + existingTempPath: options.existingTempPath, + } + }; +} + +/** + * Generates agent code based on user request + * Handles plan mode configuration and review state management + */ +export async function generateAgent(params: GenerateAgentCodeRequest): Promise { + try { + const isPlanModeEnabled = workspace.getConfiguration('ballerina.ai').get('planMode', false); + + if (!isPlanModeEnabled) { + params.isPlanMode = false; + } + + // Check for pending review to reuse temp project path + const workspaceId = StateMachine.context().projectPath; + const threadId = params.threadId || 'default'; + const pendingReview = chatStateStorage.getPendingReviewGeneration(workspaceId, threadId); + + // Create config using factory function + const config = createExecutorConfig(params, { + command: Command.Agent, + chatStorageEnabled: true, // Agent uses chat storage for multi-turn conversations + cleanupStrategy: 'review', // Review mode - temp persists until user accepts/declines + existingTempPath: pendingReview?.reviewState.tempProjectPath + }); + + await new AgentExecutor(config).run(); + + return true; + } catch (error) { + console.error('[Agent] Error in generateAgent:', error); + throw error; + } +} + + +// ================================== +// ExecutionContext Factory Functions +// ================================== + +/** + * Creates an ExecutionContext from StateMachine's current state. + * Used by tests to create context from current UI state. + * + * @returns ExecutionContext with paths from StateMachine + */ +export function createExecutionContextFromStateMachine(): ExecutionContext { + const context = StateMachine.context(); + return { + projectPath: context.projectPath, + workspacePath: context.workspacePath + }; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/np/prompts.ts similarity index 64% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/agent/np/prompts.ts index 2b55228fe1d..5a74ec2e419 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/code/np_prompts.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/np/prompts.ts @@ -40,71 +40,9 @@ Please add the proper API documentation for each function, service, resource, va - If the requirement specification is missing or empty, return the message as specified above. - If the requirement specification is valid, generate Ballerina code that reflects the requirements described in the document. ---- - -### Example Scenarios - -#### **Example 1: Requirement Specification Missing** -##### **Input:** -\`\`\`xml - - -\`\`\` - -##### **LibraryProviderTool Output:** -\`\`\`json -{ - "ballerina/io": { - "functions": { - "println": { - "description": "Prints a string to the console.", - "parameters": ["string"] - } - } - } -} -\`\`\` - -##### **Expected Output:** -\`\`\` -No requirement specification file found in the natural-programming directory. First, place your requirement specification file there to generate code based on the requirements. -\`\`\` - -#### **Example 2: Requirement Specification Present** -##### **Input:** -\`\`\`xml - -The system should print "Hello, World!" to the console when executed. - -\`\`\` - -##### **LibraryProviderTool Output:** -\`\`\`json -{ - "ballerina/io": { - "functions": { - "println": { - "description": "Prints a string to the console.", - "parameters": ["string"] - } - } - } -} -\`\`\` - -##### **Expected Output:** -\`\`\`ballerina -import ballerina/io; - -public function main() { - io:println("Hello, World!"); -} -\`\`\` `; } - - export function getRequirementAnalysisTestGenPrefix(requirementAnalysisDocument: string) { return `**Objective**: You are an expert test automation engineer specializing in generating test artifacts for Ballerina entities. Your task is to create comprehensive test implementations based on the provided requirement specification, service interfaces, and a test plan written in the console. @@ -191,9 +129,6 @@ You are an expert test automation engineer specializing in generating test artif - **Risk Areas**: [Key risk 1], [Key risk 2] # Test Implementation Files -\`\`\`toml -[Required configuration entries] -\`\`\` \`\`\`ballerina import ballerina/test; import ballerina/http; @@ -231,112 +166,6 @@ function testCreateResource() returns error? { - Check response headers when required. - Validate business rule compliance. -**Example**: - -### **Input: Test Plan Written in Console** -\`\`\`markdown -# Test Plan for Inventory Management Service - -## Key Features -- Create, retrieve, update, and delete inventory items. -- Validate stock adjustments to prevent negative quantities. - -## Test Scenarios -1. **Create Inventory Item**: Verify item creation with valid payload. -2. **Create Item with Invalid Data**: Test validation rules for missing/invalid fields. -3. **Retrieve Item Details**: Verify item retrieval by ID. -4. **Update Stock Quantity**: Test stock adjustment logic. -5. **Delete Item**: Validate item removal. - -## Risk Areas -- Data validation failures. -- Concurrency issues during stock updates. -\`\`\` - ---- - -### **Output: Test Implementation** -\`\`\`toml -# tests/Config.toml -host = "http://localhost:9090" -\`\`\` - -\`\`\`ballerina -// tests/inventory_test.bal -import ballerina/test; -import ballerina/http; - -configurable string host = "http://localhost:9090"; -final http:Client inventoryClient = check new (host); - -@test:Config {} -function testItemCreation() returns error? { - // Happy path - map newItem = { - name: "Premium Widget", - category: "Hardware", - quantity: 100, - price: 29.99 - }; - - http:Response response = check inventoryClient->post("/inventory", newItem); - test:assertEquals(response.statusCode, http:STATUS_CREATED); - - json createdItem = check response.getJsonPayload(); - test:assertTrue(createdItem.id?.length() > 0); -} - -@test:Config {} -function testInvalidItemCreation() returns error? { - // Negative test - map badItem = { - name: "Missing Fields", - quantity: -5 - }; - - http:Response response = check inventoryClient->post("/inventory", badItem); - test:assertEquals(response.statusCode, http:STATUS_BAD_REQUEST); - - json error = check response.getJsonPayload(); - test:assertEquals(error.message, "Invalid item data"); -} - -@test:Config {dependsOn: ["testItemCreation"]} -function testStockManagement() returns error? { - // Setup - string itemId = createTestItem().id; - - // Test valid adjustment - http:Response updateResp = check inventoryClient->patch( - "/inventory/\${itemId}/stock", - {adjustment: 10} - ); - test:assertEquals(updateResp.statusCode, http:STATUS_OK); - - json updatedItem = check updateResp.getJsonPayload(); - test:assertEquals(updatedItem.quantity, 110); - - // Test over-deduction - http:Response conflictResp = check inventoryClient->patch( - "/inventory/\${itemId}/stock", - {adjustment: -200} - ); - test:assertEquals(conflictResp.statusCode, http:STATUS_CONFLICT); -} - -@test:Config {dependsOn: ["testStockManagement"]} -function testItemDeletion() returns error? { - string itemId = createTestItem().id; - - // Delete item - http:Response deleteResp = check inventoryClient->delete("/inventory/\${itemId}"); - test:assertEquals(deleteResp.statusCode, http:STATUS_NO_CONTENT); - - // Verify deletion - http:Response getResp = check inventoryClient->get("/inventory/\${itemId}"); - test:assertEquals(getResp.statusCode, http:STATUS_NOT_FOUND); -} -\`\`\` **Validation Checks**: @@ -344,6 +173,7 @@ function testItemDeletion() returns error? { 2. Verify interface parameters are properly exercised. 3. Ensure error tests match documented error codes. 4. Validate test data matches interface types. -5. All code files should be inside the \`tests\` directory, e.g., \`tests/inventory_test.bal\`, \`tests/test_utils.bal\`, \`tests/Config.toml\`, etc. +5. All code files should be inside the \`tests\` directory, e.g., \`tests/inventory_test.bal\`, \`tests/test_utils.bal\`, etc. `; } + diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/prompts.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/prompts.ts new file mode 100644 index 00000000000..af8bb6f8bf0 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/prompts.ts @@ -0,0 +1,259 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { DIAGNOSTICS_TOOL_NAME } from "./tools/diagnostics"; +import { LIBRARY_PROVIDER_TOOL } from "../utils/libs/libraries"; +import { TASK_WRITE_TOOL_NAME } from "./tools/task-writer"; +import { FILE_BATCH_EDIT_TOOL_NAME, FILE_SINGLE_EDIT_TOOL_NAME, FILE_WRITE_TOOL_NAME } from "./tools/text-editor"; +import { CONNECTOR_GENERATOR_TOOL } from "./tools/connector-generator"; +import { getLanglibInstructions } from "../utils/libs/langlibs"; +import { formatCodebaseStructure, formatCodeContext } from "./utils"; +import { GenerateAgentCodeRequest, OperationType, ProjectSource } from "@wso2/ballerina-core"; +import { getRequirementAnalysisCodeGenPrefix, getRequirementAnalysisTestGenPrefix } from "./np/prompts"; +import { extractResourceDocumentContent, flattenProjectToFiles } from "../utils/ai-utils"; + +/** + * Generates the system prompt for the design agent + */ +export function getSystemPrompt(projects: ProjectSource[], op: OperationType): string { + return `You are an expert assistant to help with writing ballerina integrations. You will be helping with designing a solution for user query in a step-by-step manner. + +ONLY answer Ballerina-related queries. + + tags contain useful information and reminders. They are NOT part of the user's provided input or the tool result. therefore avoid responding using them. +# Generation Modes + +## Plan Mode +In the tags, you will see if Plan mode is enabled. When its enabled, you must follow the below instructions strictly. + +### Step 1: Create High-Level Design +Create a very high-level and concise design plan for the given user requirement. + +### Step 2: Break Down Into Tasks and Execute + +**REQUIRED: Use Task Management** +You have access to ${TASK_WRITE_TOOL_NAME} tool to create and manage tasks. +This plan will be visible to the user and the execution will be guided on the tasks you create. + +- Break down the implementation into specific, actionable tasks. +- Each task should have a type. This type will be used to guide the user through the generation proccess. +- Track each task as you work through them +- Mark tasks as you start and complete them +- This ensures you don't miss critical steps +- Each task should be concise and high level as they are visible to a very high level user. During the implementation, you will break them down further as needed and implement them. + +#### Task Types +1. 'service_design' +- Responsible for creating the http listener, service, and its resource function signatures. +- The signature should only have path, query, payload, header paramters and the return types. This step should contain types relevant to the service contract as well. +- Create resource function signatures with comprehensive return types covering all possible scenarios +- In this state, include http:NotImplemented as a union member in the return type of each resource function and return http:NOT_IMPLEMENTED in the body as a placeholder since this will be implemented in the next steps. +- Eg: resource function get hello() returns http:NotImplemented { + return http:NOT_IMPLEMENTED; + } + +2. 'connections_init' +- Responsible for initializing connections/clients +- This step should only contain the Client initialization. +3. 'implementation' +- for all the other implementations. Have resource function implementations in its own task. + +#### Task Breakdown Example +1. Create the HTTP service contract +2. Create the MYSQL Connection +3. Implement the resource functions + +**Critical Rules**: +- Task management is MANDATORY for all implementations +- When using ${TASK_WRITE_TOOL_NAME}, always send ALL tasks on every call +- Do NOT mention internal tool names to users + +**Execution Flow**: +1. Think about and explain your high-level design plan to the user +2. After explaining the plan, output: Planning... +3. Then immediately call ${TASK_WRITE_TOOL_NAME} with the broken down tasks (DO NOT write any text after the toolcall tag) +4. The tool will wait for PLAN APPROVAL from the user +5. Once plan is APPROVED (success: true in tool response), IMMEDIATELY start the execution cycle: + + **For each task:** + - Mark task as in_progress using ${TASK_WRITE_TOOL_NAME} and immediately start implementation in parallel (single message with multiple tool calls) + - Implement the task completely (write the Ballerina code) + - When implementing external API integrations: + - First check ${LIBRARY_PROVIDER_TOOL} for known services (Stripe, GitHub, etc.) + - If NOT available, call ${CONNECTOR_GENERATOR_TOOL} to generate connector from OpenAPI spec + - Before marking the task as completed, use the ${DIAGNOSTICS_TOOL_NAME} tool to check for compilation errors and fix them. Introduce a a new subtask if needed to fix errors. + - Mark task as completed using ${TASK_WRITE_TOOL_NAME} (send ALL tasks) + - The tool will wait for TASK COMPLETION APPROVAL from the user + - Once approved (success: true), immediately start the next task + - Repeat until ALL tasks are done + +6. **Critical**: After each approval (both plan and task completions), immediately proceed to the next step without any delay or additional prompting + +**User Communication**: +- Using the task_write tool will automatically show progress to the user via a task list +- Keep language simple and non-technical when responding +- No need to add manual progress indicators - the task list shows what you're working on + +## Edit Mode +In the tags, you will see if Edit mode is enabled. When its enabled, you must follow the below instructions strictly. + +### Step 1: Create High-Level Design +Create a very high-level and concise design plan for the given user requirement. Avoid using ${TASK_WRITE_TOOL_NAME} tool in this mode. + +### Step 2: Identify nescessary libraries +Identify the libraries required to implement the user requirement. Use the ${LIBRARY_PROVIDER_TOOL} tool to get the information about the libraries. + +### Step 3: Write the code +Write/modify the Ballerina code to implement the user requirement. Use the ${FILE_BATCH_EDIT_TOOL_NAME}, ${FILE_SINGLE_EDIT_TOOL_NAME}, ${FILE_WRITE_TOOL_NAME} tools to write/modify the code. + +### Step 4: Validate the code +Once the task is done, Always use ${DIAGNOSTICS_TOOL_NAME} tool to check for compilation errors and fix them. +You can use this tool multiple times after making changes to ensure there are no compilation errors. +If you think you can't fix the error after multiple attempts, make sure to keep bring the code into a good state and finish off the task. + +### Step 5: Provide a consise summary +Once the code is written and validated, provide a very concise summary of the overall changes made. Avoid adding detailed explanations and NEVER create documentations files via ${FILE_WRITE_TOOL_NAME}. + +# Code Generation Guidelines +When generating Ballerina code strictly follow these syntax and structure guidelines: + +## Library Usage and Importing libraries +- Only use the libraries received from user query or the ${LIBRARY_PROVIDER_TOOL} tool or langlibs. +- Examine the library API documentation provided by the ${LIBRARY_PROVIDER_TOOL} carefully. Strictly follow the type definitions, function signatures, and all the other details provided when writing the code. +- Each .bal file must include its own import statements for any external library references. +- Do not import default langlibs (lang.string, lang.boolean, lang.float, lang.decimal, lang.int, lang.map). +- For packages with dots in names, use aliases: \`import org/package.one as one;\` +- Treat generated connectors/clients inside the generated folder as submodules. +- A submodule MUST BE imported before being used. The import statement should only contain the package name and submodule name. For package my_pkg, folder structure generated/fooApi, the import should be \`import my_pkg.fooApi;\`. +- In the library API documentation, if the service type is specified as generic, adhere to the instructions specified there on writing the service. +- For GraphQL service related queries, if the user hasn't specified their own GraphQL Schema, write the proposed GraphQL schema for the user query right after the explanation before generating the Ballerina code. Use the same names as the GraphQL Schema when defining record types. +- Some libaries has instructions field in their API documentation. Follow those instructions strictly when using those libraries. +- You should only generate tests if the user explicitly asks for them in the query. You must use the 'ballerina/test' and whatever services associated when writing tests. Respect the instructions field in ballerina/test library and testGenerationInstruction field in whatever library associated with the service in the library API documentation when writing tests. + +${getLanglibInstructions()} + +### Local Connectors +- If the codebase structure shows connector modules in generated/moduleName, import using: import packageName.moduleName + +## Code Structure +- Define required configurables for the query. Use only string, int, decimal, boolean types in configurable variables. +- Initialize any necessary clients with the correct configuration based on the retrieved libraries at the module level (before any function or service declarations). +- Implement the main function OR service to address the query requirements. + +## Coding Rules +- Use records as canonical representations of data structures. Always define records for data structures instead of using maps or json and navigate using the record fields. +- Do not invoke methods on json access expressions. Always use separate statements. +- Use dot notation to access a normal function. Use -> to access a remote function or resource function. +- Do not use dynamic listener registrations. +- Do not write code in a way that requires updating/assigning values of function parameters. +- ALWAYS use two-word camel case all the identifiers (ex- variables, function parameter, resource function parameter, and field names). +- If the return parameter typedesc default value is marked as <> in the given API docs, define a custom record in the code that represents the data structure based on the use case and assign to it. +- Whenever you have a Json variable, NEVER access or manipulate Json variables. ALWAYS define a record and convert the Json to that record and use it. +- When invoking resource functions from a client, use the correct paths with accessor and parameters (e.g., exampleClient->/path1/["param"]/path2.get(key="value")). +- When accessing a field of a record, always assign it to a new variable and use that variable in the next statement. +- Avoid long comments in the code. Use // for single line comments. +- Always use named arguments when providing values to any parameter (e.g., .get(key="value")). +- Mention types EXPLICITLY in variable declarations and foreach statements. +- To narrow down a union type(or optional type), always declare a separate variable and then use that variable in the if condition. + +# File modifications +- You must apply changes to the existing source code using the provided ${[ + FILE_BATCH_EDIT_TOOL_NAME, + FILE_SINGLE_EDIT_TOOL_NAME, + FILE_WRITE_TOOL_NAME, + ].join( + ", " + )} tools. The complete existing source code will be provided in the section of the user prompt. +- When making replacements inside an existing file, provide the **exact old string** and the **exact new string** with all newlines, spaces, and indentation, being mindful to replace nearby occurrences together to minimize the number of tool calls. +- Do NOT create a new markdown file to document each change or summarize your work unless specifically requested by the user. +- Do not add/modify toml files (Config.toml/Ballerina.toml/Dependencies.toml) as you don't have access to those files. +- Prefer modifying existing bal files over creating new files unless explicitly asked to create a new file in the query. + +${getNPSuffix(projects, op)} +`; +} + +/** + * Generates user prompt content array with codebase structure for new threads + * @param params Generation request parameters containing usecase, plan mode, code context, and file attachments + * @param tempProjectPath Path to temp project + * @param projects Project source information + */ +export function getUserPrompt(params: GenerateAgentCodeRequest, tempProjectPath: string, projects: ProjectSource[]) { + const content = []; + + content.push({ + type: 'text' as const, + text: formatCodebaseStructure(projects) + }); + + // Add code context if available + if (params.codeContext) { + content.push({ + type: 'text' as const, + text: formatCodeContext(params.codeContext, tempProjectPath) + }); + } + + // Add file attachments if available + if (params.fileAttachmentContents && params.fileAttachmentContents.length > 0) { + const attachmentsText = params.fileAttachmentContents.map((attachment) => + `## File: ${attachment.fileName}\n\`\`\`\n${attachment.content}\n\`\`\`` + ).join('\n\n'); + + content.push({ + type: 'text' as const, + text: ` +${attachmentsText} +` + }); + } + + content.push({ + type: 'text' as const, + text: ` +${params.usecase} +` + }); + + + content.push({ + type: 'text' as const, + text: getGenerationType(params.isPlanMode) + }); + return content; +} + + +function getGenerationType(isPlanMode:boolean):string { + if (isPlanMode) { + return ` Plan Mode is enabled. Make sure to use task management using ${TASK_WRITE_TOOL_NAME} `; + } + return ` Edit Mode is enabled. Avoid using Task management and make the edits directly. `; +} + +function getNPSuffix(projects: ProjectSource[], op?: OperationType): string { + let basePrompt:string = "Note: You are in a special Natural Programming mode. Follow the NP guidelines strictly in addition to what you've given. \n"; + if (!op) { + return ""; + } else if (op === "CODE_FOR_USER_REQUIREMENT") { + basePrompt += getRequirementAnalysisCodeGenPrefix(extractResourceDocumentContent(flattenProjectToFiles(projects))); + } else if (op === "TESTS_FOR_USER_REQUIREMENT") { + basePrompt += getRequirementAnalysisTestGenPrefix(extractResourceDocumentContent(flattenProjectToFiles(projects))); + } + return basePrompt; +} + diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/stream-handlers/index.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/stream-handlers/index.ts new file mode 100644 index 00000000000..d7d192c6471 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/stream-handlers/index.ts @@ -0,0 +1,22 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +/** + * Main exports for stream context + */ + +// Core interfaces and types +export * from "./stream-context"; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/stream-handlers/stream-context.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/stream-handlers/stream-context.ts new file mode 100644 index 00000000000..d78bd5d737d --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/stream-handlers/stream-context.ts @@ -0,0 +1,43 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { ExecutionContext, ProjectSource } from "@wso2/ballerina-core"; +import { CopilotEventHandler } from "../../utils/events"; +import { StreamTextResult } from 'ai'; + +/** + * Context object containing all shared state for stream event handlers. + * Passed to every handler during stream processing. + */ +export interface StreamContext { + // Event emission + eventHandler: CopilotEventHandler; + + // Shared mutable state (accumulated during stream processing) + modifiedFiles: string[]; + + // Configuration (immutable during stream) + projects: ProjectSource[]; + shouldCleanup: boolean; + messageId: string; + userMessageContent: any; + + // Response promise (for message history and abort/finish handling) + response: StreamTextResult['response']; + + // Execution context (for workspace integration) + ctx: ExecutionContext; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tool-registry.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tool-registry.ts new file mode 100644 index 00000000000..9de1be76dd7 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tool-registry.ts @@ -0,0 +1,95 @@ +// Copyright (c) 2026, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +/** + * Tool registry factory extracted from AgentExecutor. + */ +import { ProjectSource } from '@wso2/ballerina-core'; +import { CopilotEventHandler } from '../utils/events'; +import { createTaskWriteTool, TASK_WRITE_TOOL_NAME } from './tools/task-writer'; +import { createDiagnosticsTool, DIAGNOSTICS_TOOL_NAME } from './tools/diagnostics'; +import { + createBatchEditTool, + createEditExecute, + createEditTool, + createMultiEditExecute, + createReadExecute, + createReadTool, + createWriteExecute, + createWriteTool, + FILE_BATCH_EDIT_TOOL_NAME, + FILE_READ_TOOL_NAME, + FILE_SINGLE_EDIT_TOOL_NAME, + FILE_WRITE_TOOL_NAME +} from './tools/text-editor'; +import { getLibraryProviderTool } from './tools/library-provider'; +import { LIBRARY_PROVIDER_TOOL, GenerationType } from '../utils/libs/libraries'; +import { getHealthcareLibraryProviderTool, HEALTHCARE_LIBRARY_PROVIDER_TOOL } from './tools/healthcare-library'; +import { createConnectorGeneratorTool, CONNECTOR_GENERATOR_TOOL } from './tools/connector-generator'; + +export interface ToolRegistryOptions { + eventHandler: CopilotEventHandler; + tempProjectPath: string; + modifiedFiles: string[]; + projects: ProjectSource[]; + libraryDescriptions: string; + generationType: GenerationType; + workspaceId: string; + generationId: string; + threadId?: string; +} + +export function createToolRegistry(opts: ToolRegistryOptions) { + const { eventHandler, tempProjectPath, modifiedFiles, projects, libraryDescriptions, generationType, workspaceId, generationId, threadId } = opts; + return { + [TASK_WRITE_TOOL_NAME]: createTaskWriteTool( + eventHandler, + tempProjectPath, + modifiedFiles, + workspaceId, + generationId, + threadId || 'default' + ), + [LIBRARY_PROVIDER_TOOL]: getLibraryProviderTool( + libraryDescriptions, + generationType, + eventHandler + ), + [HEALTHCARE_LIBRARY_PROVIDER_TOOL]: getHealthcareLibraryProviderTool( + libraryDescriptions, + eventHandler + ), + [CONNECTOR_GENERATOR_TOOL]: createConnectorGeneratorTool( + eventHandler, + tempProjectPath, + projects[0].projectName, + modifiedFiles + ), + [FILE_WRITE_TOOL_NAME]: createWriteTool( + createWriteExecute(eventHandler, tempProjectPath, modifiedFiles) + ), + [FILE_SINGLE_EDIT_TOOL_NAME]: createEditTool( + createEditExecute(eventHandler, tempProjectPath, modifiedFiles) + ), + [FILE_BATCH_EDIT_TOOL_NAME]: createBatchEditTool( + createMultiEditExecute(eventHandler, tempProjectPath, modifiedFiles) + ), + [FILE_READ_TOOL_NAME]: createReadTool( + createReadExecute(eventHandler, tempProjectPath) + ), + [DIAGNOSTICS_TOOL_NAME]: createDiagnosticsTool(tempProjectPath, eventHandler), + }; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/connector-generator.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/connector-generator.ts new file mode 100644 index 00000000000..c87a4f64a11 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/connector-generator.ts @@ -0,0 +1,554 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { tool } from "ai"; +import * as crypto from "crypto"; +import * as fs from "fs"; +import * as path from "path"; +import * as yaml from "js-yaml"; +import { z } from "zod"; +import { + SpecFetcherInput, + SpecFetcherResult, + ParsedSpec, + ParsedService, + ParsedEndpoint, + ParsedSchema, + HttpMethod, +} from "../../utils/libs/generator/openapi-types"; +import { CopilotEventHandler } from "../../utils/events"; +import { langClient } from "../../activator"; +import { applyTextEdits } from "../utils"; +import { LIBRARY_PROVIDER_TOOL } from "../../utils/libs/libraries"; +import { approvalManager } from '../../state/ApprovalManager'; +import { sendAiSchemaDidOpen } from "../../utils/project/ls-schema-notifications"; + +export const CONNECTOR_GENERATOR_TOOL = "ConnectorGeneratorTool"; + +const SpecFetcherInputSchema = z.object({ + serviceName: z.string().describe("Name of the service/API that needs specification"), + serviceDescription: z.string().optional().describe("Optional description of what the service is for"), +}); + +export function createConnectorGeneratorTool(eventHandler: CopilotEventHandler, tempProjectPath: string, projectName?: string, modifiedFiles?: string[]) { + return tool({ + description: ` +Generates a connector for an external service by deriving the service contract from user-provided specifications. Use this tool only when the service contract is unclear or missing, and the target service is not a well-established platform with an existing SDK or connector + +Use this tool when: +1. The target service is custom, internal, or niche, and unlikely to be covered by existing libraries. +2. When the ${LIBRARY_PROVIDER_TOOL} does not have a connector for the target service. + +The tool will: +1. Request OpenAPI spec from user (supports JSON and YAML formats) +2. Generate complete Ballerina connector module with client class, typed methods, record types, and authentication +3. Save the spec to resources/specs/ directory +4. Generate connector files in generated/moduleName submodule + +Returns complete connector information (DO NOT read files, use the returned content directly): +- moduleName: Name of the generated submodule +- importStatement: Import statement to use in your code (e.g., "import project.moduleName") +- generatedFiles: Array with path and COMPLETE CONTENT of each generated .bal file + * Each file object contains: { path: "relative/path/to/file.bal", content: "full file content" } + * The content field contains the entire generated code - use it directly without reading files + +# Example +**Query**: Write a passthrough service for Foo service. +**Tool Call**: Call with serviceName: "Foo API", serviceDescription: "Foo API" +**Result**: Returns importStatement and generatedFiles with complete content → Use importStatement in your code`, + inputSchema: SpecFetcherInputSchema, + execute: async (input: SpecFetcherInput): Promise => { + return await ConnectorGeneratorTool(input, eventHandler, tempProjectPath, projectName, modifiedFiles); + }, + }); +} + +export async function ConnectorGeneratorTool( + input: SpecFetcherInput, + eventHandler: CopilotEventHandler, + tempProjectPath: string, + projectName?: string, + modifiedFiles?: string[] +): Promise { + if (!eventHandler) { + return createErrorResult( + "INVALID_INPUT", + "Event handler is required for spec fetcher tool", + input.serviceName + ); + } + + if (!tempProjectPath) { + return createErrorResult( + "INVALID_INPUT", + "tempProjectPath is required for ConnectorGeneratorTool", + input.serviceName + ); + } + + // requestId must be defined before try block to ensure it's available in catch + const requestId = crypto.randomUUID(); + + try { + const userInput = await requestSpecFromUser(requestId, input, eventHandler); + + if (!userInput.provided) { + return handleUserSkip(requestId, input.serviceName, userInput.comment, eventHandler); + } + + const { rawSpec, parsedSpec, originalContent, format } = parseAndValidateSpec(userInput.spec); + + const { specFilePath, sanitizedServiceName } = await saveSpecToWorkspace( + originalContent, + format, + rawSpec, + input.serviceName, + tempProjectPath, + modifiedFiles + ); + + sendGeneratingNotification(requestId, input.serviceName, parsedSpec, eventHandler); + + const { moduleName, importStatement, generatedFiles } = await generateConnector( + specFilePath, + tempProjectPath, + sanitizedServiceName, + projectName, + modifiedFiles + ); + + return handleSuccess( + requestId, + input.serviceName, + parsedSpec, + moduleName, + importStatement, + generatedFiles, + eventHandler + ); + } catch (error: any) { + return handleError(error, input.serviceName, requestId, eventHandler); + } +} + +async function requestSpecFromUser( + requestId: string, + input: SpecFetcherInput, + eventHandler: CopilotEventHandler +): Promise<{ provided: boolean; spec?: any; comment?: string }> { + eventHandler({ + type: "connector_generation_notification", + requestId, + stage: "requesting_input", + serviceName: input.serviceName, + serviceDescription: input.serviceDescription, + message: `Please provide OpenAPI specification for ${input.serviceName}${ + input.serviceDescription ? ` (${input.serviceDescription})` : "" + }`, + }); + + return waitForUserResponse(requestId, eventHandler); +} + +function handleUserSkip( + requestId: string, + serviceName: string, + comment: string | undefined, + eventHandler: CopilotEventHandler +): SpecFetcherResult { + eventHandler({ + type: "connector_generation_notification", + requestId, + stage: "skipped", + serviceName, + message: `Skipped providing spec for ${serviceName}${comment ? ": " + comment : ""}`, + }); + + return { + success: false, + message: `User skipped providing OpenAPI specification for ${serviceName}. Proceed without generating connector or ask user to provide the spec later.`, + error: `User skipped providing spec for ${serviceName}${comment ? ": " + comment : ""}`, + errorCode: "USER_SKIPPED", + details: "User chose not to provide the OpenAPI specification", + }; +} + +function parseAndValidateSpec( + spec: any +): { rawSpec: any; parsedSpec: ParsedSpec; originalContent: string; format: "json" | "yaml" } { + const specContent = typeof spec === "string" ? spec : JSON.stringify(spec); + const { spec: rawSpec, format } = parseSpec(specContent); + const parsedSpec = parseOpenApiSpec(rawSpec); + return { rawSpec, parsedSpec, originalContent: specContent, format }; +} + +async function saveSpecToWorkspace( + originalContent: string, + format: "json" | "yaml", + rawSpec: any, + serviceName: string, + tempProjectPath: string, + modifiedFiles?: string[] +): Promise<{ specFilePath: string; sanitizedServiceName: string }> { + const sanitizedServiceName = serviceName.toLowerCase().replace(/[^a-z0-9]+/g, "_"); + const specsDir = path.join(tempProjectPath, "resources", "specs"); + const fileExtension = format === "yaml" ? "yaml" : "json"; + const specFilePath = path.join(specsDir, `${sanitizedServiceName}.${fileExtension}`); + + if (!fs.existsSync(specsDir)) { + fs.mkdirSync(specsDir, { recursive: true }); + } + + const contentToSave = format === "yaml" ? originalContent : JSON.stringify(rawSpec, null, 2); + fs.writeFileSync(specFilePath, contentToSave, "utf-8"); + + if (modifiedFiles) { + const relativeSpecPath = path.relative(tempProjectPath, specFilePath); + modifiedFiles.push(relativeSpecPath); + } + + return { specFilePath, sanitizedServiceName }; +} + +function sendGeneratingNotification( + requestId: string, + serviceName: string, + parsedSpec: ParsedSpec, + eventHandler: CopilotEventHandler +): void { + eventHandler({ + type: "connector_generation_notification", + requestId, + stage: "generating", + serviceName, + spec: { + version: parsedSpec.version, + title: parsedSpec.title, + description: parsedSpec.description, + baseUrl: parsedSpec.baseUrl, + endpointCount: parsedSpec.endpointCount, + methods: parsedSpec.methods, + }, + message: `Generating connector for "${parsedSpec.title}"...`, + }); +} + +async function generateConnector( + specFilePath: string, + tempProjectPath: string, + moduleName: string, + projectName?: string, + modifiedFiles?: string[] +): Promise<{ moduleName: string; importStatement: string; generatedFiles: Array<{ path: string; content: string }> }> { + const importStatement = `import ${projectName || "project"}.${moduleName}`; + const generatedFiles: Array<{ path: string; content: string }> = []; + + const response = await langClient.openApiGenerateClient({ + openApiContractPath: specFilePath, + projectPath: tempProjectPath, + module: moduleName, + }); + + if (!response.source || !response.source.textEditsMap) { + throw new Error("LS API returned empty textEditsMap"); + } + + const textEditsMap = new Map(Object.entries(response.source.textEditsMap)); + + for (const [filePath, edits] of textEditsMap.entries()) { + await applyTextEdits(filePath, edits); + + const relativePath = path.relative(tempProjectPath, filePath); + + // Send didOpen notification to Language Server for ai schema + sendAiSchemaDidOpen(tempProjectPath, relativePath); + + // Add .bal files to generatedFiles for agent visibility + if (filePath.endsWith(".bal") && edits.length > 0) { + generatedFiles.push({ + path: relativePath, + content: edits[0].newText, + }); + } + + // Track all generated files (including Ballerina.toml) for integration + if (modifiedFiles) { + modifiedFiles.push(relativePath); + } + } + + return { moduleName, importStatement, generatedFiles }; +} + +function handleSuccess( + requestId: string, + serviceName: string, + parsedSpec: ParsedSpec, + moduleName: string, + importStatement: string, + generatedFiles: Array<{ path: string; content: string }>, + eventHandler: CopilotEventHandler +): SpecFetcherResult { + eventHandler({ + type: "connector_generation_notification", + requestId, + stage: "generated", + serviceName, + spec: { + version: parsedSpec.version, + title: parsedSpec.title, + description: parsedSpec.description, + baseUrl: parsedSpec.baseUrl, + endpointCount: parsedSpec.endpointCount, + methods: parsedSpec.methods, + }, + connector: { + moduleName, + importStatement, + }, + message: `Generated connector module "${moduleName}" for "${parsedSpec.title}"`, + }); + + return { + success: true, + message: `Connector successfully generated for "${parsedSpec.title}". Use the import statement: ${importStatement}`, + connector: { + moduleName, + importStatement, + generatedFiles, + }, + }; +} + +function handleError( + error: any, + serviceName: string, + requestId: string, + eventHandler?: CopilotEventHandler +): SpecFetcherResult { + const errorMessage = error.message || "Unknown error"; + let errorCode: "USER_SKIPPED" | "INVALID_SPEC" | "PARSE_ERROR" | "UNSUPPORTED_VERSION" | "INVALID_INPUT"; + + if (errorMessage.includes("Unsupported OpenAPI version")) { + errorCode = "UNSUPPORTED_VERSION"; + } else if (errorMessage.includes("JSON") || errorMessage.includes("YAML")) { + errorCode = "PARSE_ERROR"; + } else if (errorMessage.includes("required")) { + errorCode = "INVALID_INPUT"; + } else { + errorCode = "INVALID_SPEC"; + } + + if (eventHandler) { + eventHandler({ + type: "connector_generation_notification", + requestId, + stage: "error", + serviceName, + error: { + message: errorMessage, + code: errorCode, + }, + message: `Failed to process spec for ${serviceName}: ${errorMessage}`, + }); + } + + return createErrorResult(errorCode, errorMessage, serviceName, error.stack); +} + +async function waitForUserResponse( + requestId: string, + eventHandler: CopilotEventHandler +): Promise<{ provided: boolean; spec?: any; comment?: string }> { + // Use ApprovalManager for connector spec approval (replaces state machine subscription) + return approvalManager.requestConnectorSpec(requestId, eventHandler); +} + +function createErrorResult( + errorCode: "USER_SKIPPED" | "INVALID_SPEC" | "PARSE_ERROR" | "UNSUPPORTED_VERSION" | "INVALID_INPUT", + errorMessage: string, + serviceName: string, + details?: string +): SpecFetcherResult { + const errorDescriptions = { + PARSE_ERROR: "The spec format is invalid.", + UNSUPPORTED_VERSION: "The OpenAPI version is not supported.", + INVALID_INPUT: "Invalid input provided.", + INVALID_SPEC: "The spec is invalid or malformed.", + USER_SKIPPED: "User skipped providing specification.", + }; + + return { + success: false, + message: `Failed to process OpenAPI specification for ${serviceName}. ${errorDescriptions[errorCode]} You may need to manually implement the integration or ask the user for a valid spec.`, + error: errorMessage, + errorCode, + details, + }; +} + +function parseSpec(content: string): { spec: any; format: "json" | "yaml" } { + try { + const result = JSON.parse(content); + return { spec: result, format: "json" }; + } catch (jsonError: any) { + try { + const result = yaml.load(content) as any; + return { spec: result, format: "yaml" }; + } catch (yamlError: any) { + throw new Error("Invalid spec format. Both JSON and YAML parsing failed."); + } + } +} + +function parseOpenApiSpec(spec: any): ParsedSpec { + const version = spec.openapi || spec.swagger || "unknown"; + + if (!version.startsWith("3.") && !version.startsWith("2.")) { + throw new Error(`Unsupported OpenAPI version: ${version}`); + } + + const info = spec.info || {}; + const title = info.title || "Untitled API"; + const description = info.description; + + const baseUrl = extractBaseUrl(spec); + const services = extractServices(spec); + const endpointCount = services.reduce((sum, service) => sum + service.endpoints.length, 0); + const methods = extractMethods(spec); + const schemas = extractSchemas(spec); + const securitySchemes = extractSecuritySchemes(spec); + + return { + version, + title, + description, + baseUrl, + endpointCount, + methods, + services, + schemas, + securitySchemes, + }; +} + +function extractBaseUrl(spec: any): string | undefined { + if (spec.servers && spec.servers.length > 0) { + return spec.servers[0].url; + } + if (spec.host) { + const scheme = spec.schemes?.[0] || "https"; + const basePath = spec.basePath || ""; + return `${scheme}://${spec.host}${basePath}`; + } + return undefined; +} + +function extractMethods(spec: any): HttpMethod[] { + const methods = new Set(); + const paths = spec.paths || {}; + + for (const path in paths) { + for (const method of Object.keys(paths[path])) { + const upperMethod = method.toUpperCase(); + if (["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"].includes(upperMethod)) { + methods.add(upperMethod as HttpMethod); + } + } + } + + return Array.from(methods); +} + +function extractServices(spec: any): ParsedService[] { + const paths = spec.paths || {}; + const serviceMap = new Map(); + + for (const path in paths) { + const pathItem = paths[path]; + + for (const method of Object.keys(pathItem)) { + const upperMethod = method.toUpperCase(); + if (!["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"].includes(upperMethod)) { + continue; + } + + const operation = pathItem[method]; + const tags = operation.tags || ["default"]; + + const endpoint: ParsedEndpoint = { + path, + method: upperMethod as HttpMethod, + operationId: operation.operationId, + summary: operation.summary, + parameters: operation.parameters?.map((p: any) => p.name) || [], + requestContentTypes: operation.requestBody?.content + ? Object.keys(operation.requestBody.content) + : undefined, + responseContentTypes: operation.responses?.["200"]?.content + ? Object.keys(operation.responses["200"].content) + : undefined, + responseType: operation.responses?.["200"]?.description, + }; + + for (const tag of tags) { + if (!serviceMap.has(tag)) { + serviceMap.set(tag, []); + } + serviceMap.get(tag)!.push(endpoint); + } + } + } + + const services: ParsedService[] = []; + for (const [name, endpoints] of serviceMap.entries()) { + const tagInfo = spec.tags?.find((t: any) => t.name === name); + services.push({ + name, + description: tagInfo?.description, + endpoints, + }); + } + + return services; +} + +function extractSchemas(spec: any): ParsedSchema[] { + const schemas: ParsedSchema[] = []; + const components = spec.components || spec.definitions || {}; + const schemaObjects = components.schemas || components; + + for (const schemaName in schemaObjects) { + const schema = schemaObjects[schemaName]; + schemas.push({ + name: schemaName, + type: schema.type || "object", + properties: schema.properties ? Object.keys(schema.properties) : undefined, + }); + } + + return schemas; +} + +function extractSecuritySchemes(spec: any): string[] | undefined { + if (spec.components?.securitySchemes) { + return Object.keys(spec.components.securitySchemes); + } + if (spec.securityDefinitions) { + return Object.keys(spec.securityDefinitions); + } + return undefined; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/diagnostics-utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/diagnostics-utils.ts new file mode 100644 index 00000000000..283a599c056 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/diagnostics-utils.ts @@ -0,0 +1,147 @@ +import { DiagnosticEntry, Diagnostics } from '@wso2/ballerina-core'; +import { checkProjectDiagnostics, isModuleNotFoundDiagsExist as resolveModuleNotFoundDiagnostics } from '../../../../rpc-managers/ai-panel/repair-utils'; +import { StateMachine } from '../../../../stateMachine'; +import * as path from 'path'; +import { Uri } from 'vscode'; + +/** + * Diagnostic entry enriched with resolving hints + */ +export interface EnrichedDiagnostic extends DiagnosticEntry { + hint?: string; +} + +/** + * Result of diagnostic checking + */ +export interface DiagnosticsCheckResult { + diagnostics: EnrichedDiagnostic[]; + message: string; +} + +/** + * Map of Ballerina diagnostic codes to resolving hints + * + * Each entry maps a diagnostic code (e.g., "BCE2000") to a helpful hint on how to resolve it. + * These hints are shown alongside the diagnostic message to help developers fix issues quickly. + * + * TODO: Populate this map with actual Ballerina diagnostic codes and their corresponding hints. + * Example structure: + * { + * "BCE2000": "Add missing import statement for the module", + * "BCE2001": "Check variable type compatibility", + * "BCE2002": "Ensure function return type matches declaration", + * } + */ +const DIAGNOSTIC_HINTS: Record = { + // Diagnostic code mappings to be populated + "BCE2000": "This usually indicates a missing import statement. Please ensure that all necessary modules are imported in each file where they are used.", +}; + +/** + * Converts language server Diagnostics to EnrichedDiagnostic entries with hints + * Filters for error-level diagnostics (severity === 1) only + */ +function transformDiagnosticsToEnriched(diagnostics: Diagnostics[]): EnrichedDiagnostic[] { + const enrichedDiags: EnrichedDiagnostic[] = []; + + for (const diagParam of diagnostics) { + for (const diag of diagParam.diagnostics) { + // Only include error-level diagnostics + if (diag.severity === 1) { + const fileName = path.basename(diagParam.uri); + const msgPrefix = `[${fileName}:${diag.range.start.line},${diag.range.start.character}:${diag.range.end.line},${diag.range.end.character}] `; + + const diagnosticEntry: EnrichedDiagnostic = { + code: diag.code.toString(), + message: msgPrefix + diag.message + }; + + // Add hint if available for this diagnostic code + const hint = DIAGNOSTIC_HINTS[diag.code.toString()]; + if (hint) { + diagnosticEntry.hint = hint; + } + + enrichedDiags.push(diagnosticEntry); + } + } + } + + return enrichedDiags; +} + +/** + * Checks the Ballerina package for compilation errors using the language server + * + * This function: + * 1. Gets the current project from the state machine + * 2. Calls the language server to get package-level diagnostics + * 3. Enriches diagnostics with resolving hints based on diagnostic codes + * + * Note: In Ballerina, diagnostics are generated at the package level, so this checks + * the entire package/project in the current workspace. + * + * @param updatedSourceFiles - Array of source files in the current session (not used, kept for compatibility) + * @param updatedFileNames - Array of file names in the current session (not used, kept for compatibility) + * @returns DiagnosticsCheckResult with enriched diagnostics + */ +export async function checkCompilationErrors( + tempProjectPath: string +): Promise { + try { + // Get language client from state machine + const langClient = StateMachine.langClient(); + + // Get diagnostics from language server for the current project + console.log(`[DiagnosticsUtils] Calling language server for diagnostics on ${tempProjectPath}`); + let diagnostics: Diagnostics[] = []; + try { + diagnostics = await checkProjectDiagnostics(langClient, tempProjectPath, true); + } catch (diagError) { + // Resolve module dependencies using ai scheme + const aiUri = Uri.file(tempProjectPath).with({ scheme: 'ai' }).toString(); + await langClient.resolveModuleDependencies({ + documentIdentifier: { + uri: aiUri + } + }); + diagnostics = await checkProjectDiagnostics(langClient, tempProjectPath, true); + } + // Check if there are module not found diagnostics and attempt to resolve them + const isDiagsChanged = await resolveModuleNotFoundDiagnostics(diagnostics, langClient); + if (isDiagsChanged) { + diagnostics = await checkProjectDiagnostics(langClient, tempProjectPath, true); + } + + // Transform and enrich diagnostics with hints + const enrichedDiagnostics = transformDiagnosticsToEnriched(diagnostics); + + const errorCount = enrichedDiagnostics.length; + console.log(`[DiagnosticsUtils] Found ${errorCount} compilation error(s).`); + + if (errorCount === 0) { + console.log(`[DiagnosticsUtils] No compilation errors found.`); + return { + diagnostics: [], + message: "No compilation errors found. Code compiles successfully.", + }; + } + + console.log(`[DiagnosticsUtils] Enriched Diagnostics:`, enrichedDiagnostics); + return { + diagnostics: enrichedDiagnostics, + message: `Found ${errorCount} compilation error(s). Review and fix the errors before proceeding.` + }; + } catch (error) { + console.error("[DiagnosticsUtils] Error checking compilation errors:", error); + return { + diagnostics: [{ + message: "Internal error occurred while checking compilation errors." + }], + message: ` Failed to check compilation errors due to an internal error. Avoid try to resolve this with code changes. Acknowledge the failure, consider the task is done. +Reason: ${error instanceof Error ? error.message : 'Unknown error'} +`, + }; + } +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/diagnostics.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/diagnostics.ts new file mode 100644 index 00000000000..9815d14c66a --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/diagnostics.ts @@ -0,0 +1,63 @@ +import { tool } from 'ai'; +import { z } from 'zod'; +import { checkCompilationErrors, DiagnosticsCheckResult } from './diagnostics-utils'; +import { CopilotEventHandler } from '../../utils/events'; + +export const DIAGNOSTICS_TOOL_NAME = "getCompilationErrors"; + +/** + * Input schema for the diagnostics tool + * No input parameters needed - tool operates on current code state + */ +const DiagnosticsInputSchema = z.object({}); + +/** + * Creates the compilation errors checking tool + * + * This tool checks the current Ballerina package for compilation errors using the language server. + * It operates on all files in the current project/package being modified. + * + * @param tempProjectPath - Path to the temporary project directory + * @param eventHandler - Event handler to emit tool execution events to the visualizer + * @returns Tool instance for checking compilation errors + */ +export function createDiagnosticsTool( + tempProjectPath: string, + eventHandler: CopilotEventHandler +) { + return tool({ + description: `Checks the compilation errors in the current Ballerina package. + +Use this tool when: +// before you mark a task as completed, use this tool to check diagnostics. +- You have completed a significant portion of a task and want to verify the code compiles +- You want to catch errors early before marking a task as complete +- You need detailed diagnostics with resolving hints for any compilation issues + +The tool analyzes the entire Ballerina package and returns: +- Compilation errors with file location, error message, and diagnostic code +- Resolving hints for common error codes to help fix issues quickly +- Empty list if no errors are found +`, + inputSchema: DiagnosticsInputSchema, + execute: async (): Promise => { + // Emit tool_call event to visualizer (shows "Checking for errors..." in UI) + eventHandler({ + type: "tool_call", + toolName: DIAGNOSTICS_TOOL_NAME, + }); + + // Use shared utility to check compilation errors + const result = await checkCompilationErrors(tempProjectPath); + + // Emit tool_result event to visualizer (shows result in UI) + eventHandler({ + type: "tool_result", + toolName: DIAGNOSTICS_TOOL_NAME, + toolOutput: result + }); + + return result; + } + }); +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/healthcare-library.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/healthcare-library.ts new file mode 100644 index 00000000000..1f6047caee3 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/healthcare-library.ts @@ -0,0 +1,217 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { generateObject, ModelMessage, tool } from "ai"; +import { GenerationType, getAllLibraries, LIBRARY_PROVIDER_TOOL } from "../../utils/libs/libraries"; +import { jsonSchema } from "ai"; +import { Library } from "../../utils/libs/library-types"; +import { selectRequiredFunctions } from "../../utils/libs/function-registry"; +import { MinifiedLibrary } from "@wso2/ballerina-core"; +import { ANTHROPIC_SONNET_4, getAnthropicClient, getProviderCacheControl } from "../../utils/ai-client"; +import { z } from "zod"; +import { CopilotEventHandler } from "../../utils/events"; + +export const HEALTHCARE_LIBRARY_PROVIDER_TOOL = "HealthcareLibraryProviderTool"; + +/** + * Emits tool_result event for healthcare library provider (no filtering) + */ +function emitHealthcareLibraryToolResult( + eventHandler: CopilotEventHandler, + libraries: Library[] +): void { + const libraryNames = libraries.map(lib => lib.name); + eventHandler({ + type: "tool_result", + toolName: HEALTHCARE_LIBRARY_PROVIDER_TOOL, + toolOutput: libraryNames + }); +} + +const HealthcareLibraryProviderToolSchema = jsonSchema<{ + userPrompt: string; +}>({ + type: "object", + properties: { + userPrompt: { + type: "string", + description: "User query to determine which functions and type definitions are needed from the libraries", + }, + }, + required: ["userPrompt"], +}); + +export async function HealthcareLibraryProviderTool( + params: { userPrompt: string }, + eventHandler: CopilotEventHandler +): Promise { + try { + // Emit tool_call event + eventHandler({ + type: "tool_call", + toolName: HEALTHCARE_LIBRARY_PROVIDER_TOOL, + }); + + const startTime = Date.now(); + + const libraries = await getRelevantLibrariesAndFunctions(params.userPrompt, GenerationType.HEALTHCARE_GENERATION); + + console.log( + `[HealthcareLibraryProviderTool] Fetched ${libraries.length} libraries: ${libraries + .map((lib) => lib.name) + .join(", ")}, took ${(Date.now() - startTime) / 1000}s` + ); + + // Emit tool_result event with all library names (no filtering) + emitHealthcareLibraryToolResult(eventHandler, libraries); + + return libraries; + } catch (error) { + console.error(`[HealthcareLibraryProviderTool] Error fetching libraries: ${error}`); + + // Emit error result + eventHandler({ + type: "tool_result", + toolName: HEALTHCARE_LIBRARY_PROVIDER_TOOL, + toolOutput: [] + }); + + return []; + } +} + +//TODO: Improve this description +export function getHealthcareLibraryProviderTool( + _libraryDescriptions: string, + eventHandler: CopilotEventHandler +) { + return tool({ + description: `Fetches detailed information about healthcare-specific Ballerina libraries along with their API documentation, including services, clients, functions, and filtered type definitions. + +** NOTE: +1. This Tool only has knowledge on healthcare libraries, you want general libraries, use ${LIBRARY_PROVIDER_TOOL} to retrieve those. + +This tool is specifically designed for healthcare integration use cases (FHIR, HL7v2, etc.) and provides: +1. **Automatically includes mandatory healthcare libraries** (FHIR R4, HL7v2 commons, etc.) even if not explicitly requested +2. Filters functions based on the user query to include only relevant APIs + +**When to use this tool:** +You should only use this tool if the user query mentions, +- healthcare standards (FHIR, HL7, CDA, clinical data) +- Query involves patient data, medical records, or clinical workflows +- Query requires healthcare interoperability between systems + +**Before calling this tool:** +- Analyze the user quer, identify healthcare-specific requirements, and call this tool using that question so this tool can provide all the relevant healthcare libraries and functions. + +** What this tool returns: ** +- Detailed information about healthcare Ballerina libraries including services, clients, functions, and filtered type definitions relevant to the user query. +`, + inputSchema: HealthcareLibraryProviderToolSchema, + execute: async (input: { + userPrompt: string; + }) => { + console.log( + `[HealthcareLibraryProviderTool] Called with prompt: ${input.userPrompt}` + ); + return await HealthcareLibraryProviderTool(input, eventHandler); + }, + }); +} + +export function ensureMandatoryHealthcareLibraries(libNames: string[]): string[] { + const librarySet = new Set(libNames); + MANDATORY_HEALTHCARE_LIBRARIES.forEach(lib => librarySet.add(lib)); + return Array.from(librarySet); +} + + +export const MANDATORY_HEALTHCARE_LIBRARIES = [ + 'ballerinax/health.fhir.r4.international401', + 'ballerinax/health.fhir.r4', + 'ballerinax/health.fhir.r4.parser', + 'ballerinax/health.fhir.r4utils', + 'ballerinax/health.hl7v2', + 'ballerinax/health.hl7v2commons', + 'ballerinax/health.base' +]; + +const LibraryListSchema = z.object({ + libraries: z.array(z.string()), +}); + +export async function getRelevantLibrariesAndFunctions( + query: string, + generationType: GenerationType +): Promise { + const selectedLibs: string[] = await getSelectedLibraries(query, generationType); + const allLibraries = ensureMandatoryHealthcareLibraries(selectedLibs); + const relevantTrimmedFuncs: Library[] = await selectRequiredFunctions(query, allLibraries, generationType); + return relevantTrimmedFuncs; +} + +export async function getSelectedLibraries(prompt: string, generationType: GenerationType): Promise { + const allLibraries = await getAllLibraries(generationType); + if (allLibraries.length === 0) { + return []; + } + const cacheOptions = await getProviderCacheControl(); + const messages: ModelMessage[] = [ + { + role: "system", + content: getSystemPrompt(allLibraries), + providerOptions: cacheOptions, + }, + { + role: "user", + content: getUserPrompt(prompt), + }, + ]; + + //TODO: Add thinking and test with claude haiku + const startTime = Date.now(); + const { object } = await generateObject({ + model: await getAnthropicClient(ANTHROPIC_SONNET_4), + maxOutputTokens: 4096, + temperature: 0, + messages: messages, + schema: LibraryListSchema, + abortSignal: new AbortController().signal, + }); + const endTime = Date.now(); + console.log(`Library selection took ${endTime - startTime}ms`); + + console.log("Selected libraries:", object.libraries); + return object.libraries; +} + +function getSystemPrompt(libraryList: MinifiedLibrary[]): string { + return `You are an assistant tasked with selecting all the Ballerina libraries needed to answer a healthcare specific question from a given set of libraries provided in the context as a JSON. RESPOND ONLY WITH A JSON. +# Library Context JSON +${JSON.stringify(libraryList)}`; +} + + +//TODO: Fill with examples +function getUserPrompt(prompt: string): string { + return ` +# QUESTION +${prompt} + +${ +" ALWAYS include `ballerinax/health.base`, `ballerinax/health.fhir.r4`, `ballerinax/health.fhir.r4.parser`, `ballerinax/health.fhir.r4utils`, `ballerinax/health.fhir.r4.international401`, `ballerinax/health.hl7v2commons` and `ballerinax/health.hl7v2` libraries in the selection in addition to what you selected." +}`; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/library-provider.ts similarity index 70% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/library-provider.ts index dcb5cd95c9c..49b85d1da8e 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libraryProviderTool.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/library-provider.ts @@ -15,10 +15,31 @@ // under the License. import { tool } from "ai"; -import { GenerationType } from "./libs"; +import { GenerationType } from "../../utils/libs/libraries"; import { jsonSchema } from "ai"; -import { Library } from "./libs_types"; -import { selectRequiredFunctions } from "./funcs"; +import { Library } from "../../utils/libs/library-types"; +import { selectRequiredFunctions } from "../../utils/libs/function-registry"; +import { CopilotEventHandler } from "../../utils/events"; +import { LIBRARY_PROVIDER_TOOL } from "../../utils/libs/libraries"; + +/** + * Emits tool_result event for library provider with filtering + */ +function emitLibraryToolResult( + eventHandler: CopilotEventHandler, + toolName: string, + libraries: Library[], + requestedLibraryNames: string[] +): void { + const libraryNames = libraries.map(lib => lib.name); + const filteredNames = libraryNames.filter(name => requestedLibraryNames.includes(name)); + + eventHandler({ + type: "tool_result", + toolName, + toolOutput: filteredNames + }); +} const LibraryProviderToolSchema = jsonSchema<{ libraryNames: string[]; @@ -41,9 +62,16 @@ const LibraryProviderToolSchema = jsonSchema<{ export async function LibraryProviderTool( params: { libraryNames: string[]; userPrompt: string }, - generationType: GenerationType + generationType: GenerationType, + eventHandler: CopilotEventHandler ): Promise { try { + // Emit tool_call event + eventHandler({ + type: "tool_call", + toolName: LIBRARY_PROVIDER_TOOL, + }); + const startTime = Date.now(); const libraries = await selectRequiredFunctions(params.userPrompt, params.libraryNames, generationType); console.log( @@ -51,14 +79,30 @@ export async function LibraryProviderTool( .map((lib) => lib.name) .join(", ")}, took ${(Date.now() - startTime) / 1000}s` ); + + // Emit tool_result event with filtered library names + emitLibraryToolResult(eventHandler, LIBRARY_PROVIDER_TOOL, libraries, params.libraryNames); + return libraries; } catch (error) { console.error(`[LibraryProviderTool] Error fetching libraries: ${error}`); + + // Emit error result + eventHandler({ + type: "tool_result", + toolName: LIBRARY_PROVIDER_TOOL, + toolOutput: [] + }); + return []; } } -export function getLibraryProviderTool(libraryDescriptions: string, generationType: GenerationType) { +export function getLibraryProviderTool( + libraryDescriptions: string, + generationType: GenerationType, + eventHandler: CopilotEventHandler +) { return tool({ description: `Fetches detailed information about Ballerina libraries along with their API documentation, including services, clients, functions, and types. This tool analyzes a user query and returns **only the relevant** services, clients, functions, and types from the selected Ballerina libraries based on the provided user prompt. @@ -90,7 +134,7 @@ name, description, type definitions (records, objects, enums, type aliases), cli ", " )} and prompt: ${input.userPrompt}` ); - return await LibraryProviderTool(input, generationType); + return await LibraryProviderTool(input, generationType, eventHandler); }, }); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/task-writer.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/task-writer.ts new file mode 100644 index 00000000000..904baf62023 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/task-writer.ts @@ -0,0 +1,396 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { tool } from 'ai'; +import { z } from 'zod'; +import { CopilotEventHandler } from '../../utils/events'; +import { Task, TaskStatus, TaskTypes, Plan } from '@wso2/ballerina-core'; +import { chatStateStorage } from '../../../../views/ai-panel/chatStateStorage'; +import { integrateCodeToWorkspace } from '../utils'; +import { checkCompilationErrors } from './diagnostics-utils'; +import { DIAGNOSTICS_TOOL_NAME } from './diagnostics'; +import { createExecutionContextFromStateMachine } from '..'; +import { approvalManager } from '../../state/ApprovalManager'; + +export const TASK_WRITE_TOOL_NAME = "TaskWrite"; + +export interface TaskWriteResult { + success: boolean; + message: string; + tasks: Task[]; +} + +export const TaskInputSchema = z.object({ + description: z.string().min(1).describe("Clear, actionable description of the task to be implemented"), + status: z.enum([TaskStatus.PENDING, TaskStatus.IN_PROGRESS, TaskStatus.COMPLETED]).describe("Current status of the task. Use 'pending' for tasks not started, 'in_progress' when actively working on it, 'completed' when work is finished."), + type: z.enum([TaskTypes.SERVICE_DESIGN, TaskTypes.CONNECTIONS_INIT, TaskTypes.IMPLEMENTATION]).describe("Type of the implementation task. service_design will only generate the http service contract. not the implementation. connections_init will only generate the connection initializations. All of the other tasks will be of type implementation.") +}); + +const TaskWriteInputSchema = z.object({ + tasks: z.array(TaskInputSchema).min(1).describe("ALL TASKS - EVERY SINGLE ONE. This tool is stateless. Always send the COMPLETE list of tasks with their current statuses.") +}); + +export type TaskWriteInput = z.infer; + +export function createTaskWriteTool( + eventHandler: CopilotEventHandler, + tempProjectPath: string, + modifiedFiles: string[] | undefined, + workspaceId: string, + generationId: string, + threadId: string = 'default' +) { + return tool({ + description: `Create and update implementation tasks for the design plan. +## Task Ordering: +- Tasks should be ordered sequentially as they need to be executed. +- Prioritize service design, then connection initializations, then implementation tasks. + +## CRITICAL RULE - ALWAYS SEND ALL TASKS: +This tool is STATELESS. Every call MUST include ALL tasks. + +**Why This Matters:** +The tool replaces the entire task list on each call. If you omit tasks, they will be permanently lost from the plan. + +**Rules:** +- Have 5 tasks? Send all 5 EVERY time +- Updating 1 task? Send ALL tasks with the update +- NEVER omit completed tasks when moving to next task +- Think: You're replacing the entire list, not editing one item +- Tasks are identified by their description - keep descriptions consistent + +**Validation:** +- Tool will ERROR if you're missing tasks from the previous plan +- Error message will list exactly which task descriptions are missing + +**Example - Correct Behavior:** +If you have 5 tasks and updating task 3: +- WRONG: Send only task 3 +- WRONG: Send only tasks 3, 4, 5 (missing completed tasks 1-2) +- CORRECT: Send all 5 tasks (tasks 1-2 as completed, task 3 as in_progress, tasks 4-5 as pending) + +## USER APPROVAL REQUIRED: +1. **Plan Approval**: User approves/rejects initial task list +2. **Task Completion Approval**: User approves/rejects each completed task before moving to the next + +## CREATING TASKS (First Call): +Send ALL tasks with status "pending". +Example: +[ + {"description": "Create the HTTP service contract", "status": "pending", "type": "service_design"}, + {"description": "Create the MYSQL Connection", "status": "pending", "type": "connections_init"}, + {"description": "Implement the resource functions", "status": "pending", "type": "implementation"} +] + +## UPDATING TASKS (Every Other Call): +Send ALL tasks with updated statuses. Tasks are identified by their description. + +Workflow per task (after plan approval): +1. Mark in_progress → Send ALL tasks +2. Do the work immediately +3. Mark completed → Send ALL tasks +4. Tool will request user approval (or auto-approve if enabled) +5. If approved → Tool returns tasks with 'completed' status, start next task (repeat from step 1) +6. If rejected → Tool returns task with 'completed' status and rejection comment, redo the task based on feedback + +Example (3 tasks total): +Start task 1 - Send ALL: +[ + {"description": "Create the HTTP service contract", "status": "in_progress", "type": "service_design"}, + {"description": "Create the MYSQL Connection", "status": "pending", "type": "connections_init"}, + {"description": "Implement the resource functions", "status": "pending", "type": "implementation"} +] + +Complete task 1 - Send ALL: +[ + {"description": "Create the HTTP service contract", "status": "completed", "type": "service_design"}, + {"description": "Create the MYSQL Connection", "status": "pending", "type": "connections_init"}, + {"description": "Implement the resource functions", "status": "pending", "type": "implementation"} +] + +After approval, start task 2 - Send ALL: +[ + {"description": "Create the HTTP service contract", "status": "completed", "type": "service_design"}, + {"description": "Create the MYSQL Connection", "status": "in_progress", "type": "connections_init"}, + {"description": "Implement the resource functions", "status": "pending", "type": "implementation"} +] + +Rules: +- Send ALL tasks every single call (tool will reject partial lists) +- Only ONE task "in_progress" at a time +- After plan approval, start first task immediately +- Wait for approval after each task completion before starting next +- Continue autonomously through all tasks with approval checkpoints`, + inputSchema: TaskWriteInputSchema, + execute: async (input: TaskWriteInput): Promise => { + try { + const generation = chatStateStorage.getGeneration(workspaceId, threadId, generationId); + const existingPlan = generation?.plan; + const allTasks = mapInputToTasks(input); + + console.log(`[TaskWrite Tool] Received ${allTasks.length} task(s)`); + + const taskCategories = categorizeTasks(allTasks); + + // TODO: Add tests for plan modification detection in the middle of execution + // Fixed: Plan state is now preserved in the state machine across chat continuations, + // preventing unnecessary approval requests when agent continues with existing plan. + // Still need comprehensive tests for: mid-execution plan modifications, task reordering, + // task additions/removals, and edge cases where plan changes should trigger re-approval. + const isNewPlan = !existingPlan || existingPlan.tasks.length === 0; + const isPlanRemodification = existingPlan && ( + allTasks.length !== existingPlan.tasks.length || + allTasks.some(task => !existingPlan.tasks.find(t => t.description === task.description)) + ); + + if (!isNewPlan && !isPlanRemodification) { + const missingTasksError = validateAllTasksIncluded(input, existingPlan); + if (missingTasksError) { return missingTasksError; } + } + + let approvalResult: { approved: boolean; comment?: string; approvedTaskDescription?: string } | undefined; + let approvalType: "plan" | "completion" | undefined; + + if (eventHandler) { + const needsPlanApproval = (isNewPlan || isPlanRemodification) && taskCategories.inProgress.length === 0; + if (needsPlanApproval) { + approvalType = "plan"; + approvalResult = await handlePlanApproval(allTasks, isPlanRemodification, eventHandler, workspaceId, generationId, threadId); + } else if (taskCategories.completed.length > 0 && taskCategories.inProgress.length === 0) { + const newlyCompletedTasks = detectNewlyCompletedTasks(taskCategories.completed, existingPlan); + + if (newlyCompletedTasks.length > 0) { + approvalType = "completion"; + approvalResult = await handleTaskCompletion( + allTasks, + newlyCompletedTasks, + eventHandler, + tempProjectPath, + modifiedFiles + ); + } + } else if (taskCategories.inProgress.length > 0) { + console.log(`[TaskWrite Tool] Task in progress: ${taskCategories.inProgress[0].description}`); + } + } + + const message = generateResultMessage( + approvalResult, + approvalType, + approvalResult?.approvedTaskDescription, + allTasks, + taskCategories + ); + + console.log(`[TaskWrite Tool] Returning ${allTasks.length} tasks (${taskCategories.completed.length} completed, ${taskCategories.inProgress.length} in progress, ${taskCategories.pending.length} pending)`); + + return { + success: approvalResult ? approvalResult.approved : true, + message, + tasks: allTasks + }; + } catch (error) { + console.error("Error in TaskWrite tool:", error); + return { + success: false, + message: `Failed to process tasks: ${error instanceof Error ? error.message : 'Unknown error'}`, + tasks: [] + }; + } + } + }); +} + +function mapInputToTasks(input: TaskWriteInput): Task[] { + return input.tasks.map(task => ({ + description: task.description, + status: task.status as TaskStatus, + type: task.type as TaskTypes + })); +} + +function validateAllTasksIncluded(input: TaskWriteInput, existingPlan: Plan | undefined): TaskWriteResult | null { + if (!existingPlan || existingPlan.tasks.length === 0) { + return null; + } + + const existingDescriptions = new Set(existingPlan.tasks.map(t => t.description)); + const receivedDescriptions = new Set(input.tasks.map(t => t.description)); + const missingDescriptions = [...existingDescriptions].filter(desc => !receivedDescriptions.has(desc)); + + if (missingDescriptions.length > 0) { + console.error(`[TaskWrite Tool] Missing ${missingDescriptions.length} task(s)`); + return { + success: false, + message: `ERROR: Missing ${missingDescriptions.length} task(s). Missing: ${missingDescriptions.map(d => `"${d}"`).join(', ')}`, + tasks: existingPlan.tasks + }; + } + //TOOD: Add diagnostics check + return null; +} + +function categorizeTasks(allTasks: Task[]) { + return { + completed: allTasks.filter(t => t.status === TaskStatus.COMPLETED), + inProgress: allTasks.filter(t => t.status === TaskStatus.IN_PROGRESS), + pending: allTasks.filter(t => t.status === TaskStatus.PENDING) + }; +} + +function detectNewlyCompletedTasks(completedTasks: Task[], existingPlan: Plan | undefined): Task[] { + if (!existingPlan) { + return completedTasks; + } + + return completedTasks.filter(task => { + const existingTask = existingPlan.tasks.find(t => t.description === task.description); + return existingTask && existingTask.status !== TaskStatus.COMPLETED; + }); +} + +function createPlan(allTasks: Task[]): Plan { + return { + id: `plan-${Date.now()}`, + tasks: allTasks, + createdAt: Date.now(), + updatedAt: Date.now(), + }; +} + +async function handlePlanApproval( + allTasks: Task[], + isPlanRemodification: boolean, + eventHandler: CopilotEventHandler, + workspaceId: string, + generationId: string, + threadId: string +): Promise<{ approved: boolean; comment?: string }> { + console.log(`[TaskWrite Tool] ${isPlanRemodification ? 'Plan remodified' : 'Plan created'}`); + + const plan = createPlan(allTasks); + + // Store plan in ChatStateStorage with the generation + chatStateStorage.updateGeneration(workspaceId, threadId, generationId, { plan }); + + // Notify visualizer of plan update + eventHandler({ type: 'plan_updated', plan }); + + // Use ApprovalManager for plan approval (replaces state machine subscription) + const requestId = `plan-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`; + + const approvalPromise = approvalManager.requestPlanApproval( + requestId, + allTasks, + eventHandler + ); + + return approvalPromise; +} + +async function handleTaskCompletion( + allTasks: Task[], + newlyCompletedTasks: Task[], + eventHandler: CopilotEventHandler, + tempProjectPath: string, + modifiedFiles?: string[] +): Promise<{ approved: boolean; comment?: string; approvedTaskDescription?: string }> { + const lastCompletedTask = newlyCompletedTasks[newlyCompletedTasks.length - 1]; + console.log(`[TaskWrite Tool] Detected ${newlyCompletedTasks.length} newly completed task(s)`); + + const diagnosticResult = await checkCompilationErrors(tempProjectPath); + + if (diagnosticResult.diagnostics.length > 0) { + const errorCount = diagnosticResult.diagnostics.length; + console.error(`[TaskWrite Tool] Found ${errorCount} compilation error(s), blocking task completion`); + + return { + approved: false, + comment: `Cannot complete task: ${errorCount} compilation error(s) detected. Use the ${DIAGNOSTICS_TOOL_NAME} tool to check the errors and fix them before marking the task as completed.`, + approvedTaskDescription: lastCompletedTask.description + }; + } + + if (tempProjectPath && modifiedFiles) { + const modifiedFilesSet = new Set(modifiedFiles); + console.log(`[TaskWrite Tool] Integrating ${modifiedFilesSet.size} modified file(s)`); + const ctx = createExecutionContextFromStateMachine(); + await integrateCodeToWorkspace(tempProjectPath, modifiedFilesSet, ctx); + } + + // Always request manual approval - visualizer will auto-respond if auto-approve is enabled + return handleManualTaskApproval(allTasks, newlyCompletedTasks, lastCompletedTask, eventHandler); +} + +async function handleManualTaskApproval( + allTasks: Task[], + newlyCompletedTasks: Task[], + lastCompletedTask: Task, + eventHandler: CopilotEventHandler +): Promise<{ approved: boolean; comment?: string; approvedTaskDescription?: string }> { + console.log(`[TaskWrite Tool] Manual approval mode`); + + const tasksForUI = allTasks.map(task => { + const isNewlyCompleted = newlyCompletedTasks.some(t => t.description === task.description); + return isNewlyCompleted ? { ...task, status: TaskStatus.REVIEW } : { ...task }; + }); + + // Use ApprovalManager for task approval (replaces state machine subscription) + // requestTaskApproval will emit the task_approval_request event with requestId + const requestId = `task-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`; + + const approvalPromise = approvalManager.requestTaskApproval( + requestId, + lastCompletedTask.description, + tasksForUI, + eventHandler + ); + + return approvalPromise; +} + +function generateResultMessage( + approvalResult: { approved: boolean; comment?: string } | undefined, + approvalType: "plan" | "completion" | undefined, + approvedTaskDescription: string | undefined, + allTasks: Task[], + taskCategories: ReturnType +): string { + if (approvalResult) { + if (approvalResult.approved) { + if (approvalType === "plan") { + return `Plan approved! Ready to start execution. ${allTasks.length} tasks created.`; + } + return `Work approved! Task completed successfully. ${approvedTaskDescription ? `Task: ${approvedTaskDescription}` : ''}`; + } else { + const feedback = approvalResult.comment ? ` User comment: "${approvalResult.comment}"` : ''; + return approvalType === "plan" + ? `Plan not approved. Please revise the plan based on feedback.${feedback}` + : `Work not approved. Please redo the task based on feedback.${feedback}`; + } + } + + if (taskCategories.inProgress.length > 0) { + return `Started working on: ${taskCategories.inProgress[0].description}`; + } + if (taskCategories.completed.length === allTasks.length) { + return `All tasks completed!`; + } + if (taskCategories.completed.length > 0) { + return `Completed: ${taskCategories.completed[taskCategories.completed.length - 1].description}`; + } + return `Successfully created ${allTasks.length} implementation tasks. Tasks are now ready for execution.`; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/text-editor.ts similarity index 68% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/text-editor.ts index 6c03012b853..1ed9c089ea6 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/text_editor_tool.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/tools/text-editor.ts @@ -17,6 +17,50 @@ import { SourceFile } from "@wso2/ballerina-core"; import { tool } from 'ai'; import { z } from 'zod'; +import * as fs from 'fs'; +import * as path from 'path'; +import { Uri } from 'vscode'; +import { StateMachine } from "../../../../stateMachine"; +import { sendAISchemaDidChange, sendAiSchemaDidOpen } from "../../utils/project/ls-schema-notifications"; +import { CopilotEventHandler } from "../../utils/events"; +import { normalizeInvisibleChars } from "../../utils/string-utils"; + +// ============================================================================ +// Display Helper Functions +// ============================================================================ + +/** + * Emits tool_call event for file editing tools + */ +function emitFileToolCall( + eventHandler: CopilotEventHandler, + toolName: string, + file_path: string +): void { + eventHandler({ + type: "tool_call", + toolName, + toolInput: { fileName: file_path } + }); +} + +/** + * Emits tool_result event for file editing tools + */ +function emitFileToolResult( + eventHandler: CopilotEventHandler, + toolName: string, + result: TextEditorResult +): void { + eventHandler({ + type: "tool_result", + toolName, + toolOutput: { + success: result.success, + action: result.action + } + }); +} // ============================================================================ // Types & Interfaces @@ -30,6 +74,7 @@ interface ValidationResult { interface TextEditorResult { success: boolean; message: string; + action?: 'created' | 'updated'; error?: string; } @@ -121,6 +166,36 @@ function validateLineRange( // Utility Functions // ============================================================================ +/** + * Sends didChange notification to Language Server for a modified file + * @param tempProjectPath The root path of the temporary project + * @param filePath The relative file path that was modified + */ +function notifyLanguageServer(tempProjectPath: string, filePath: string): void { + try { + const fullPath = path.join(tempProjectPath, filePath); + if (!fs.existsSync(fullPath)) { + console.warn(`[TextEditorTool] File does not exist, skipping didChange: ${fullPath}`); + return; + } + + const fileContent = fs.readFileSync(fullPath, 'utf-8'); + const fileUri = Uri.file(fullPath).toString(); + StateMachine.langClient().didOpen({ + textDocument: { + uri: fileUri, + languageId: 'ballerina', + version: 1, + text: fileContent + } + }); + + console.log(`[TextEditorTool] Sent didChange notification for: ${filePath}`); + } catch (error) { + console.error(`[TextEditorTool] Failed to send didChange notification for ${filePath}:`, error); + } +} + function findFileIndex(files: SourceFile[], filePath: string): number { return files.findIndex(f => f.filePath === filePath); } @@ -175,62 +250,101 @@ function truncateLongLines(content: string, maxLength: number = MAX_LINE_LENGTH) // Write Tool Execute Function // ============================================================================ -export function createWriteExecute(files: SourceFile[], updatedFileNames: string[]) { +export function createWriteExecute( + eventHandler: CopilotEventHandler, + tempProjectPath: string, + modifiedFiles?: string[] +) { return async (args: { file_path: string; content: string; }): Promise => { const { file_path, content } = args; + + // Emit tool_call event + emitFileToolCall(eventHandler, FILE_WRITE_TOOL_NAME, file_path); + console.log(`[FileWriteTool] Writing to ${file_path}, content: ${content.substring(0, 50)}${content.length > 100 ? '... [truncated]' : ''}`); // Validate file path const pathValidation = validateFilePath(file_path); if (!pathValidation.valid) { console.error(`[FileWriteTool] Invalid file path: ${file_path}`); - return { + const result = { success: false, message: pathValidation.error!, error: `Error: ${ErrorMessages.INVALID_FILE_PATH}` }; + emitFileToolResult(eventHandler, FILE_WRITE_TOOL_NAME, result); + return result; } // Validate content is not empty if (!content || content.trim().length === 0) { console.error(`[FileWriteTool] Empty content provided for file: ${file_path}`); - return { + const result = { success: false, message: 'Content cannot be empty when writing a file.', error: `Error: ${ErrorMessages.EMPTY_CONTENT}` }; + emitFileToolResult(eventHandler, FILE_WRITE_TOOL_NAME, result); + return result; } + const fullPath = path.join(tempProjectPath, file_path); + + // Check if file exists (track for message generation) + const fileExists = fs.existsSync(fullPath); + // Check if file exists with non-empty content - const existingContent = getFileContent(files, file_path); - if (existingContent !== null && existingContent.trim().length > 0) { - console.error(`[FileWriteTool] File already exists with content: ${file_path}`); - return { - success: false, - message: `File '${file_path}' already exists with content. Use file_edit or file_multi_edit to modify it instead.`, - error: `Error: ${ErrorMessages.FILE_ALREADY_EXISTS}` - }; + if (fileExists) { + const existingContent = fs.readFileSync(fullPath, 'utf-8'); + if (existingContent.trim().length > 0) { + console.error(`[FileWriteTool] File already exists with content: ${file_path}`); + const result = { + success: false, + message: `File '${file_path}' already exists with content. Use file_edit or file_multi_edit to modify it instead.`, + error: `Error: ${ErrorMessages.FILE_ALREADY_EXISTS}` + }; + emitFileToolResult(eventHandler, FILE_WRITE_TOOL_NAME, result); + return result; + } } - // Create or overwrite the file - updateOrCreateFile(files, file_path, content); + // Create parent directories if they don't exist + const dirPath = path.dirname(fullPath); + if (!fs.existsSync(dirPath)) { + fs.mkdirSync(dirPath, { recursive: true }); + } - const lineCount = content.split('\n').length; + // Write the file to temp directory + fs.writeFileSync(fullPath, content, 'utf-8'); - insertIntoUpdateFileNames(updatedFileNames, file_path); + if (modifiedFiles) { + insertIntoUpdateFileNames(modifiedFiles, file_path); + } - if (existingContent != undefined && existingContent != null && existingContent.trim().length === 0) { - console.warn(`[FileWriteTool] Warning: Created new file for empty file: ${file_path}`); + const lineCount = content.split('\n').length; + const action: 'created' | 'updated' = fileExists ? 'updated' : 'created'; + + // Notify Language Server + if (action === 'created') { + sendAiSchemaDidOpen(tempProjectPath, file_path); + } else { + sendAISchemaDidChange(tempProjectPath, file_path); } - console.log(`[FileWriteTool] Successfully wrote file: ${file_path} with ${lineCount} lines.`); - return { + console.log(`[FileWriteTool] Successfully ${action} file: ${file_path} with ${lineCount} lines to temp project.`); + const result = { success: true, - message: `Successfully created file '${file_path}' with ${lineCount} line(s).` + message: `Successfully ${action} file '${file_path}' with ${lineCount} line(s).`, + action }; + + // Emit tool_result event + emitFileToolResult(eventHandler, FILE_WRITE_TOOL_NAME, result); + + return result; }; } @@ -238,7 +352,11 @@ export function createWriteExecute(files: SourceFile[], updatedFileNames: string // Edit Tool Execute Function // ============================================================================ -export function createEditExecute(files: SourceFile[], updatedFileNames: string[]) { +export function createEditExecute( + eventHandler: CopilotEventHandler, + tempProjectPath: string, + modifiedFiles?: string[] +) { return async (args: { file_path: string; old_string: string; @@ -246,84 +364,137 @@ export function createEditExecute(files: SourceFile[], updatedFileNames: string[ replace_all?: boolean; }): Promise => { const { file_path, old_string, new_string, replace_all = false } = args; + + // Emit tool_call event + emitFileToolCall(eventHandler, FILE_SINGLE_EDIT_TOOL_NAME, file_path); + console.log(`[FileEditTool] Editing ${file_path}, replacing '${old_string.substring(0, 50)}' with '${new_string.substring(0,50)}', replace_all: ${replace_all}`); // Validate file path const pathValidation = validateFilePath(file_path); if (!pathValidation.valid) { console.error(`[FileEditTool] Invalid file path: ${file_path}`); - return { + const result = { success: false, message: pathValidation.error!, error: `Error: ${ErrorMessages.INVALID_FILE_PATH}` }; + emitFileToolResult(eventHandler, FILE_SINGLE_EDIT_TOOL_NAME, result); + return result; } - // Check if old_string and new_string are identical - if (old_string === new_string) { + // Pre-normalize strings to check if they're identical (handles invisible char differences) + const preNormalizedOld = normalizeInvisibleChars(old_string); + const preNormalizedNew = normalizeInvisibleChars(new_string); + + // Check if old_string and new_string are identical after normalization + if (preNormalizedOld === preNormalizedNew) { console.error(`[FileEditTool] old_string and new_string are identical for file: ${file_path}`); - return { + const result = { success: false, message: 'old_string and new_string are identical. No changes to make.', error: `Error: ${ErrorMessages.IDENTICAL_STRINGS}` }; + emitFileToolResult(eventHandler, FILE_SINGLE_EDIT_TOOL_NAME, result); + return result; } - // Get file content - const content = getFileContent(files, file_path); - if (content === null) { + const fullPath = path.join(tempProjectPath, file_path); + + // Check if file exists + if (!fs.existsSync(fullPath)) { console.error(`[FileEditTool] File not found: ${file_path}`); - return { + const result = { success: false, message: `File '${file_path}' not found. Use file_write to create new files.`, error: `Error: ${ErrorMessages.FILE_NOT_FOUND}` }; + emitFileToolResult(eventHandler, FILE_SINGLE_EDIT_TOOL_NAME, result); + return result; } - // Count occurrences - const occurrenceCount = countOccurrences(content, old_string); + // Read file content (keep original for exact matching) + const content = fs.readFileSync(fullPath, 'utf-8'); + + // Try exact match first (99% case - no normalization needed) + const exactOccurrenceCount = countOccurrences(content, old_string); + + // Determine if we need to use normalized matching (fallback for invisible char issues) + const useNormalizedMatching = exactOccurrenceCount === 0; + let workingContent = content; + let workingOldString = old_string; + let workingNewString = new_string; + + if (useNormalizedMatching) { + // Fallback: normalize both content and strings to handle invisible char mismatches + workingContent = normalizeInvisibleChars(content); + workingOldString = preNormalizedOld; + workingNewString = preNormalizedNew; + console.log(`[FileEditTool] Exact match failed, trying normalized matching for: ${file_path}`); + } + + // Count occurrences (using exact or normalized based on fallback) + const occurrenceCount = useNormalizedMatching + ? countOccurrences(workingContent, workingOldString) + : exactOccurrenceCount; if (occurrenceCount === 0) { const preview = content.substring(0, PREVIEW_LENGTH); console.error(`[FileEditTool] No occurrences of old_string found in file: ${file_path}`); - return { + const result = { success: false, message: `String to replace was not found in '${file_path}'. Please verify the exact text to replace, including whitespace and indentation. \n File Preview: \n${preview + (content.length > PREVIEW_LENGTH ? '...' : '')}`, error: `Error: ${ErrorMessages.NO_MATCH_FOUND}`, }; + emitFileToolResult(eventHandler, FILE_SINGLE_EDIT_TOOL_NAME, result); + return result; } // If not replace_all, ensure exactly one match if (!replace_all && occurrenceCount > 1) { console.error(`[FileEditTool] Multiple occurrences (${occurrenceCount}) found for old_string in file: ${file_path}`); - return { + const result = { success: false, message: `Found ${occurrenceCount} occurrences of the text in '${file_path}'. Either make old_string more specific to match exactly one occurrence, or set replace_all to true to replace all occurrences.`, error: `Error: ${ErrorMessages.MULTIPLE_MATCHES}`, }; + emitFileToolResult(eventHandler, FILE_SINGLE_EDIT_TOOL_NAME, result); + return result; } // Perform replacement let newContent: string; - if (content.trim() === "" && old_string.trim() === "") { - newContent = new_string; + if (workingContent.trim() === "" && workingOldString.trim() === "") { + newContent = workingNewString; } else { if (replace_all) { - newContent = content.replaceAll(old_string, new_string); + newContent = workingContent.replaceAll(workingOldString, workingNewString); } else { - newContent = content.replace(old_string, new_string); + newContent = workingContent.replace(workingOldString, workingNewString); } } - updateOrCreateFile(files, file_path, newContent); + // Write back to temp directory + fs.writeFileSync(fullPath, newContent, 'utf-8'); + + if (modifiedFiles) { + insertIntoUpdateFileNames(modifiedFiles, file_path); + } + + // Notify Language Server of the change + sendAISchemaDidChange(tempProjectPath, file_path); const replacedCount = replace_all ? occurrenceCount : 1; - insertIntoUpdateFileNames(updatedFileNames, file_path); console.log(`[FileEditTool] Successfully replaced ${replacedCount} occurrence(s) in file: ${file_path}`); - return { + const result = { success: true, message: `Successfully replaced ${replacedCount} occurrence(s) in '${file_path}'.` }; + + // Emit tool_result event + emitFileToolResult(eventHandler, FILE_SINGLE_EDIT_TOOL_NAME, result); + + return result; }; } @@ -331,7 +502,11 @@ export function createEditExecute(files: SourceFile[], updatedFileNames: string[ // Multi Edit Tool Execute Function // ============================================================================ -export function createMultiEditExecute(files: SourceFile[], updatedFileNames: string[]) { +export function createMultiEditExecute( + eventHandler: CopilotEventHandler, + tempProjectPath: string, + modifiedFiles?: string[] +) { return async (args: { file_path: string; edits: Array<{ @@ -341,42 +516,79 @@ export function createMultiEditExecute(files: SourceFile[], updatedFileNames: st }>; }): Promise => { const { file_path, edits } = args; + + // Emit tool_call event + emitFileToolCall(eventHandler, FILE_BATCH_EDIT_TOOL_NAME, file_path); + console.log(`[FileMultiEditTool] Editing ${file_path} with ${edits.length} edits.`); // Validate file path const pathValidation = validateFilePath(file_path); if (!pathValidation.valid) { console.error(`[FileMultiEditTool] Invalid file path: ${file_path}`); - return { + const result = { success: false, message: pathValidation.error!, error: `Error: ${ErrorMessages.INVALID_FILE_PATH}` }; + emitFileToolResult(eventHandler, FILE_BATCH_EDIT_TOOL_NAME, result); + return result; } // Validate edits array if (!edits || edits.length === 0) { console.error(`[FileMultiEditTool] No edits provided for file: ${file_path}`); - return { + const result = { success: false, message: 'No edits provided. At least one edit is required.', error: `Error: ${ErrorMessages.NO_EDITS}` }; + emitFileToolResult(eventHandler, FILE_BATCH_EDIT_TOOL_NAME, result); + return result; } - // Get file content - let content = getFileContent(files, file_path); - if (content === null) { + const fullPath = path.join(tempProjectPath, file_path); + + // Check if file exists + if (!fs.existsSync(fullPath)) { console.error(`[FileMultiEditTool] File not found: ${file_path}`); - return { + const result = { success: false, message: `File '${file_path}' not found. Use file_write to create new files.`, error: `Error: ${ErrorMessages.FILE_NOT_FOUND}` }; + emitFileToolResult(eventHandler, FILE_BATCH_EDIT_TOOL_NAME, result); + return result; } - // Store original content for rollback - const originalContent = content; + // Read file content (keep original for exact matching) + const originalContent = fs.readFileSync(fullPath, 'utf-8'); + + // First pass: check if all edits work with exact matching (99% case) + let useNormalizedMatching = false; + let testContent = originalContent; + + for (const edit of edits) { + const exactCount = countOccurrences(testContent, edit.old_string); + if (exactCount === 0) { + // Exact match failed, we'll need normalized matching + useNormalizedMatching = true; + break; + } + // Simulate the edit for subsequent checks + if (edit.replace_all) { + testContent = testContent.replaceAll(edit.old_string, edit.new_string); + } else { + testContent = testContent.replace(edit.old_string, edit.new_string); + } + } + + if (useNormalizedMatching) { + console.log(`[FileMultiEditTool] Exact match failed for some edits, using normalized matching for: ${file_path}`); + } + + // Use either original or normalized content based on the check above + let content = useNormalizedMatching ? normalizeInvisibleChars(originalContent) : originalContent; // Validate all edits before applying any const validationErrors: string[] = []; @@ -384,14 +596,18 @@ export function createMultiEditExecute(files: SourceFile[], updatedFileNames: st for (let i = 0; i < edits.length; i++) { const edit = edits[i]; + // Use normalized strings only if we're in normalized mode + const workingOldString = useNormalizedMatching ? normalizeInvisibleChars(edit.old_string) : edit.old_string; + const workingNewString = useNormalizedMatching ? normalizeInvisibleChars(edit.new_string) : edit.new_string; + // Check if old_string and new_string are identical - if (edit.old_string === edit.new_string) { + if (workingOldString === workingNewString) { validationErrors.push(`Edit ${i + 1}: old_string and new_string are identical`); continue; } // Count occurrences in current content state - const occurrenceCount = countOccurrences(content, edit.old_string); + const occurrenceCount = countOccurrences(content, workingOldString); if (occurrenceCount === 0) { validationErrors.push(`Edit ${i + 1}: old_string not found in file`); @@ -404,13 +620,13 @@ export function createMultiEditExecute(files: SourceFile[], updatedFileNames: st } // Apply the edit to simulate the sequence - if (content.trim() === "" && edit.old_string.trim() === "") { - content = edit.new_string; + if (content.trim() === "" && workingOldString.trim() === "") { + content = workingNewString; } else { if (edit.replace_all) { - content = content.replaceAll(edit.old_string, edit.new_string); + content = content.replaceAll(workingOldString, workingNewString); } else { - content = content.replace(edit.old_string, edit.new_string); + content = content.replace(workingOldString, workingNewString); } } } @@ -418,21 +634,36 @@ export function createMultiEditExecute(files: SourceFile[], updatedFileNames: st // If there were validation errors, return them without applying any edits if (validationErrors.length > 0) { console.error(`[FileMultiEditTool] Validation errors:\n${validationErrors.join('\n')}`); - return { + const result = { success: false, message: `Multi-edit validation failed:\n${validationErrors.join('\n')}`, error: `Error: ${ErrorMessages.EDIT_FAILED}`, }; + emitFileToolResult(eventHandler, FILE_BATCH_EDIT_TOOL_NAME, result); + return result; } // All validations passed, content already has all edits applied - updateOrCreateFile(files, file_path, content); - insertIntoUpdateFileNames(updatedFileNames, file_path); + // Write back to temp directory + fs.writeFileSync(fullPath, content, 'utf-8'); + + if (modifiedFiles) { + insertIntoUpdateFileNames(modifiedFiles, file_path); + } + + // Notify Language Server of the change + sendAISchemaDidChange(tempProjectPath, file_path); + console.log(`[FileMultiEditTool] Successfully applied ${edits.length} edits to file: ${file_path}`); - return { + const result = { success: true, message: `Successfully applied ${edits.length} edit(s) to '${file_path}'.` }; + + // Emit tool_result event + emitFileToolResult(eventHandler, FILE_BATCH_EDIT_TOOL_NAME, result); + + return result; }; } @@ -440,7 +671,10 @@ export function createMultiEditExecute(files: SourceFile[], updatedFileNames: st // Read Tool Execute Function // ============================================================================ -export function createReadExecute(files: SourceFile[], updatedFileNames: string[]) { +export function createReadExecute( + eventHandler: CopilotEventHandler, + tempProjectPath: string +) { return async (args: { file_path: string; offset?: number; @@ -459,9 +693,10 @@ export function createReadExecute(files: SourceFile[], updatedFileNames: string[ }; } - // Get file content - const content = getFileContent(files, file_path); - if (content === null) { + const fullPath = path.join(tempProjectPath, file_path); + + // Check if file exists + if (!fs.existsSync(fullPath)) { console.error(`[FileReadTool] File not found: ${file_path}`); return { success: false, @@ -470,6 +705,9 @@ export function createReadExecute(files: SourceFile[], updatedFileNames: string[ }; } + // Read file content + const content = fs.readFileSync(fullPath, 'utf-8'); + // Handle empty file if (content.trim().length === 0) { console.log(`[FileReadTool] File is empty: ${file_path}`); diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/agent/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/utils.ts new file mode 100644 index 00000000000..9b8c0b6ffcb --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/agent/utils.ts @@ -0,0 +1,390 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { SourceFile, FileChanges, CodeContext, ProjectSource, ExecutionContext, PROJECT_KIND } from "@wso2/ballerina-core"; +import { addToIntegration } from "../../../rpc-managers/ai-panel/utils"; +import * as fs from "fs"; +import * as path from "path"; +import type { TextEdit } from "vscode-languageserver-protocol"; +import { StateMachine } from "../../../stateMachine"; + +/** + * File extensions to include in codebase structure + */ +const CODEBASE_STRUCTURE_FILE_TYPES = [".bal"]; + +/** + * Directories to ignore in codebase structure + */ +const CODEBASE_STRUCTURE_IGNORE_FOLDERS = ["target", ".ballerina", ".vscode", ".git"]; + +/** + * Files to ignore in codebase structure + */ +const CODEBASE_STRUCTURE_IGNORE_FILES = ["Ballerina.toml", "Config.toml", "Dependencies.toml"]; + +/** + * Files that require path sanitization (temp paths replaced with workspace paths) + */ +const FILES_REQUIRING_PATH_SANITIZATION = ["Ballerina.toml"]; + +/** + * Sanitizes temp directory paths in file content by replacing them with workspace paths + * @param content File content that may contain temp directory paths + * @param tempPath Temporary project path to be replaced + * @param workspacePath Workspace path to replace with + * @returns Sanitized content with workspace paths + */ +function sanitizeTempPaths(content: string, tempPath: string, workspacePath: string): string { + // Normalize paths to forward slashes for consistent replacement + const normalizedTempPath = tempPath.replace(/\\/g, "/"); + const normalizedWorkspacePath = workspacePath.replace(/\\/g, "/"); + + // Replace all occurrences of temp path with workspace path + return content.replace(new RegExp(normalizedTempPath, "g"), normalizedWorkspacePath); +} + +/** + * Integrates code from temp directory to workspace + * @param tempProjectPath Path to the temporary project directory + * @param modifiedFiles Set of file paths that were actually modified during the sessionDependencies.toml + * @param ctx Execution context containing project paths + */ +export async function integrateCodeToWorkspace( + tempProjectPath: string, + modifiedFiles: Set | undefined, + ctx: ExecutionContext +): Promise { + if (!tempProjectPath) { + console.log("[Agent Integration] No temp project path provided"); + return; + } + + if (!fs.existsSync(tempProjectPath)) { + console.warn("[Agent Integration] Temp project path does not exist:", tempProjectPath); + return; + } + + let workspaceFolderPath = ctx.projectPath; + const workspacePath = ctx.workspacePath; + if (workspacePath) { + workspaceFolderPath = workspacePath; + } + + const fileChanges: FileChanges[] = []; + + if (modifiedFiles && modifiedFiles.size > 0) { + for (const relativePath of modifiedFiles) { + const fullPath = path.join(tempProjectPath, relativePath); + + if (fs.existsSync(fullPath)) { + let content = fs.readFileSync(fullPath, "utf-8"); + + // Check if this file requires path sanitization + const fileName = path.basename(relativePath); + if (FILES_REQUIRING_PATH_SANITIZATION.includes(fileName)) { + content = sanitizeTempPaths(content, tempProjectPath, workspaceFolderPath); + console.log(`[Agent Integration] Sanitized temp paths in: ${relativePath}`); + } + + fileChanges.push({ + filePath: relativePath, + content: content, + }); + console.log(`[Agent Integration] Prepared modified file: ${relativePath}`); + } else { + console.warn(`[Agent Integration] Modified file not found: ${relativePath}`); + } + } + } else { + console.log("[Agent Integration] No modified files to integrate"); + } + + if (fileChanges.length === 0) { + console.warn("[Agent Integration] No files found in temp project"); + return; + } + + try { + console.log(`[Agent Integration] Integrating ${fileChanges.length} file(s) from temp project...`); + await addToIntegration(workspaceFolderPath, fileChanges); + console.log("[Agent Integration] Successfully integrated code"); + } catch (error) { + const errorMessage = error instanceof Error ? error.message : "Unknown error"; + console.error("[Agent Integration] Failed:", errorMessage); + throw new Error(`Failed to integrate code to workspace: ${errorMessage}`); + } +} + +export function getCodeBlocks(updatedSourceFiles: SourceFile[], updatedFileNames: string[]): string { + const codeBlocks = updatedFileNames + .map((fileName) => { + const sourceFile = updatedSourceFiles.find((sf) => sf.filePath === fileName); + if (!sourceFile) { + return null; + } + + return ` +\`\`\`ballerina +${sourceFile.content} +\`\`\` +`; + }) + .filter((block): block is string => block !== null); + + return codeBlocks.join("\n\n"); +} + +/** + * Collects files with content from a ProjectSource + * @param project ProjectSource to collect files from + * @param includePackagePath Whether to prepend packagePath to file paths (for multi-project case) + * @returns Array of SourceFile objects with paths and content + */ +function collectFilesFromProject(project: ProjectSource, includePackagePath: boolean = false): SourceFile[] { + const files: SourceFile[] = []; + const prefix = includePackagePath && project.packagePath ? `${project.packagePath}/` : ""; + + // Collect source files + for (const sourceFile of project.sourceFiles) { + files.push({ + filePath: `${prefix}${sourceFile.filePath}`, + content: sourceFile.content, + }); + } + + // Collect module files + if (project.projectModules) { + for (const module of project.projectModules) { + for (const sourceFile of module.sourceFiles) { + files.push({ + filePath: `${prefix}${sourceFile.filePath}`, + content: sourceFile.content, + }); + } + } + } + + // Collect test files + if (project.projectTests) { + for (const testFile of project.projectTests) { + files.push({ + filePath: `${prefix}${testFile.filePath}`, + content: testFile.content, + }); + } + } + + return files; +} + +/** + * Formats a file with its content in XML format + * @param file SourceFile with path and content + * @returns Formatted XML string for the file + */ +function formatFileWithContent(file: SourceFile): string { + return ` +\`\`\`ballerina +${file.content} +\`\`\` +`; +} + +/** + * Formats complete codebase structure into XML for Claude + * Used when starting a new session without history + * @param projects Array of ProjectSource objects + * @returns Formatted XML string with codebase structure including file contents + */ +export function formatCodebaseStructure(projects: ProjectSource[]): string { + let text = "\n"; + text += "This is the complete structure of the codebase you are working with. "; + text += "You do not need to acknowledge or list these files in your response. "; + text += "This information is provided for your awareness only.\n\n"; + + const context = StateMachine.context(); + const isWorkspace = context.projectInfo?.projectKind === PROJECT_KIND.WORKSPACE_PROJECT; + for (const project of projects) { + const files = collectFilesFromProject(project, isWorkspace); + const activeStatus = project.isActive ? ' active="true"' : ""; + + text += `\n`; + text += "\n"; + text += files.map(formatFileWithContent).join("\n"); + text += "\n\n"; + text += "\n"; + } + + text += ""; + + if (isWorkspace) { + text += `Note: This is a Ballerina workspace with multiple packages. File paths are prefixed with their package paths (e.g., "mainpackage/main.bal"). +Files from external packages (not the active package) are marked with the externalPackageName attribute (e.g., ). +You can import these packages by just using the package name (e.g., import otherpackage;). +When creating or modifying files, you should always prefer making edits for the current active package. Make sure to include the package path as prefix for the file edits.`; + } + + return text; +} + +/** + * Converts a Position (line, character) to absolute character offset in content + * @param content File content as string + * @param line Zero-based line number + * @param character Zero-based character offset within the line + * @returns Absolute character offset in the content string + */ +function positionToOffset(content: string, line: number, character: number): number { + const lines = content.split('\n'); + let offset = 0; + + // Add lengths of all previous lines (including their \n) + for (let i = 0; i < line && i < lines.length; i++) { + offset += lines[i].length + 1; // +1 for the newline character + } + + // Add character offset within the target line + if (line < lines.length) { + offset += Math.min(character, lines[line].length); + } + + return offset; +} + +/** + * Applies LSP text edits to create or modify a file using Node.js fs operations + * Uses character offset-based approach for robust handling of all edge cases + * @param filePath Absolute path to the file + * @param textEdits Array of LSP TextEdit objects (positions are 0-based) + */ +export async function applyTextEdits(filePath: string, textEdits: TextEdit[]): Promise { + const dirPath = path.dirname(filePath); + + try { + // Create directory if it doesn't exist + if (!fs.existsSync(dirPath)) { + fs.mkdirSync(dirPath, { recursive: true }); + } + + // Read existing content or start with empty string + let content = ''; + if (fs.existsSync(filePath)) { + content = fs.readFileSync(filePath, 'utf-8'); + } + + // If file is new and empty, ensure at least empty content + // This handles edits at position (0,0) for new files + if (content === '' && textEdits.length > 0) { + const firstEdit = textEdits[0]; + // If editing beyond (0,0) in an empty file, pad with newlines + if (firstEdit.range.start.line > 0) { + content = '\n'.repeat(firstEdit.range.start.line); + } + } + + // Convert edits to offset-based edits and sort in reverse order + // Sorting in reverse ensures earlier edits don't affect offsets of later edits + const offsetEdits = textEdits.map(edit => ({ + start: positionToOffset(content, edit.range.start.line, edit.range.start.character), + end: positionToOffset(content, edit.range.end.line, edit.range.end.character), + newText: edit.newText + })).sort((a, b) => b.start - a.start); // Reverse order by start position + + // Apply edits from end to start (preserves offsets) + let result = content; + for (const edit of offsetEdits) { + result = result.substring(0, edit.start) + edit.newText + result.substring(edit.end); + } + + // Write the modified content back to the file + fs.writeFileSync(filePath, result, 'utf-8'); + } catch (error) { + console.error(`[applyTextEdits] Error applying edits to ${filePath}:`, error); + throw error; + } +} + +/** + * Formats code context with surrounding lines (3 before, 3 after) in XML format + * @param codeContext The code context (addition or selection type) with relative file path from workspace root + * @param tempProjectPath The temporary project directory path + * @returns Formatted XML string with file content and context + */ +export function formatCodeContext(codeContext: CodeContext, tempProjectPath: string): string { + const absolutePath = path.join(tempProjectPath, codeContext.filePath); + + const fileContent = fs.readFileSync(absolutePath, "utf-8"); + const lines = fileContent.split("\n"); + const totalLines = lines.length; + + let startLine: number; + let endLine: number; + let markerLine: number | undefined; + + if (codeContext.type === "addition") { + // For addition: show 3 lines before and after the insertion point + const insertLine = codeContext.position.line; + startLine = Math.max(0, insertLine - 3); + endLine = Math.min(totalLines - 1, insertLine + 3); + markerLine = insertLine; + } else { + // For selection: show 3 lines before start and 3 lines after end + const selectionStart = codeContext.startPosition.line; + const selectionEnd = codeContext.endPosition.line; + startLine = Math.max(0, selectionStart - 3); + endLine = Math.min(totalLines - 1, selectionEnd + 3); + } + + // Build the context snippet + const contextLines: string[] = []; + for (let i = startLine; i <= endLine; i++) { + const lineContent = lines[i] || ""; + + if (codeContext.type === "addition" && i === markerLine) { + contextLines.push(lineContent); + contextLines.push(`>>> Cursor Position <<<`); + } else if (codeContext.type === "selection") { + // Add selection start marker before the first selected line + if (i === codeContext.startPosition.line) { + contextLines.push(`>>> SELECTION START <<<`); + } + contextLines.push(lineContent); + // Add selection end marker after the last selected line + if (i === codeContext.endPosition.line) { + contextLines.push(`>>> SELECTION END <<<`); + } + } else { + contextLines.push(lineContent); + } + } + + return ` +** Note: ${getCodeContextInstruction(codeContext.type)} ** + + +${contextLines.join("\n")} + +`; +} + +function getCodeContextInstruction(type: "addition" | "selection"): string { + if (type === "addition") { + return "The user has indicated a cursor position where new code can be added. The cursor position is marked with >>> Cursor Position <<< in the code context below."; + } else { + return "The user has selected a block of code that is relevant to the current task. The selected code is enclosed between >>> SELECTION START <<< and >>> SELECTION END <<< markers in the code context below."; + } +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/ask/index.ts similarity index 95% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/ask/index.ts index 4e5f58413c0..1901e191edc 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/ask/ask.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/ask/index.ts @@ -15,14 +15,14 @@ // under the License. import { generateText, stepCountIs } from "ai"; -import { BACKEND_URL } from "../../utils"; -import { selectRequiredFunctions } from "../libs/funcs"; -import { GenerationType, getSelectedLibraries } from "../libs/libs"; -import { Library, LibraryWithUrl } from "../libs/libs_types"; -import { getAnthropicClient, ANTHROPIC_HAIKU, fetchWithAuth } from "../connection"; +import { BACKEND_URL } from "../utils"; +import { selectRequiredFunctions } from "../utils/libs/function-registry"; +import { GenerationType } from "../utils/libs/libraries"; +import { Library, LibraryWithUrl } from "../utils/libs/library-types"; +import { getAnthropicClient, ANTHROPIC_HAIKU, fetchWithAuth } from "../utils/ai-client"; import { z } from 'zod'; import { tool } from 'ai'; -import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; +import { getSelectedLibraries } from "../agent/tools/healthcare-library"; interface Document { document: string; @@ -102,7 +102,7 @@ async function fetchDocumentationFromVectorStore(query: string): Promise { } ], stopWhen: stepCountIs(1), // Limit to one step to get tool calls only - abortSignal: AIPanelAbortController.getInstance().signal + abortSignal: new AbortController().signal }); if (toolCalls && toolCalls.length > 0) { @@ -253,7 +253,7 @@ async function getFinalResponseFromClaude(systemMessage: string, question: strin content: question } ], - abortSignal: AIPanelAbortController.getInstance().signal + abortSignal: new AbortController().signal }); return text; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/completions.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/completions.ts index 79595fa7fb0..cf5183869be 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/completions.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/completions.ts @@ -24,10 +24,7 @@ import { } from "./../telemetry"; import { PALETTE_COMMANDS } from "./../project/cmds/cmd-runner"; import { clearAuthCredentials, loginGithubCopilot } from '../../utils/ai/auth'; -import { RPCLayer } from "../../RPCLayer"; -// import { VisualizerWebview } from "../../views/visualizer/webview"; -import { AiPanelWebview } from "../../views/ai-panel/webview"; -import { ChatNotify, onChatNotify } from "@wso2/ballerina-core"; +// import { clearAllChatStates } from "../../views/ai-panel/chatStatePersistence"; export function activateCopilotLoginCommand() { commands.registerCommand(PALETTE_COMMANDS.LOGIN_COPILOT, async () => { @@ -48,5 +45,6 @@ export function activateCopilotLoginCommand() { export function resetBIAuth() { commands.registerCommand(PALETTE_COMMANDS.RESET_BI, async () => { await clearAuthCredentials(); + // await clearAllChatStates(); }); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts index 6891aa98e77..b076633d1d6 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/constants.ts @@ -16,9 +16,11 @@ * under the License. */ +export const WI_EXTENSION_ID = 'wso2.wso2-integrator'; + export const CONFIG_FILE_NAME = "Config.toml"; export const CONFIGURE_DEFAULT_MODEL_COMMAND = "ballerina.configureWso2DefaultModelProvider"; -export const OPEN_AI_PANEL_COMMAND = "ballerina.open.ai.panel"; + export const CLOSE_AI_PANEL_COMMAND = "ballerina.close.ai.panel"; export const SIGN_IN_BI_COPILOT = "Sign in to BI Copilot"; export const PROGRESS_BAR_MESSAGE_FROM_WSO2_DEFAULT_MODEL = "Fetching and saving access token for WSO2 default model provider."; @@ -26,54 +28,3 @@ export const ERROR_NO_BALLERINA_SOURCES = "No Ballerina sources"; export const LOGIN_REQUIRED_WARNING = "Please sign in to BI Copilot to use this feature."; export const LOGIN_REQUIRED_WARNING_FOR_DEFAULT_MODEL = "Please sign in to BI Copilot to configure the WSO2 default model provider."; export const DEFAULT_PROVIDER_ADDED = "WSO2 default model provider configuration values were added to the Config.toml file."; - -// Datamapper Constants -// Primitive data types supported by the datamapper -export enum PrimitiveType { - STRING = "string", - INT = "int", - FLOAT = "float", - DECIMAL = "decimal", - BOOLEAN = "boolean" -} - -// Nullable primitive data types -export enum NullablePrimitiveType { - STRING = "string?", - INT = "int?", - FLOAT = "float?", - DECIMAL = "decimal?", - BOOLEAN = "boolean?" -} - -// Error type -export enum ErrorType { - ERROR = "error" -} - -// Array types for primitive data types -export enum PrimitiveArrayType { - // Basic array types - STRING_ARRAY = "string[]", - STRING_ARRAY_NULLABLE = "string[]?", - INT_ARRAY = "int[]", - INT_ARRAY_NULLABLE = "int[]?", - FLOAT_ARRAY = "float[]", - FLOAT_ARRAY_NULLABLE = "float[]?", - DECIMAL_ARRAY = "decimal[]", - DECIMAL_ARRAY_NULLABLE = "decimal[]?", - BOOLEAN_ARRAY = "boolean[]", - BOOLEAN_ARRAY_NULLABLE = "boolean[]?", - - // Arrays with nullable elements - STRING_OR_NULL_ARRAY = "string?[]", - STRING_OR_NULL_ARRAY_NULLABLE = "string?[]?", - INT_OR_NULL_ARRAY = "int?[]", - INT_OR_NULL_ARRAY_NULLABLE = "int?[]?", - FLOAT_OR_NULL_ARRAY = "float?[]", - FLOAT_OR_NULL_ARRAY_NULLABLE = "float?[]?", - DECIMAL_OR_NULL_ARRAY = "decimal?[]", - DECIMAL_OR_NULL_ARRAY_NULLABLE = "decimal?[]?", - BOOLEAN_OR_NULL_ARRAY = "boolean?[]", - BOOLEAN_OR_NULL_ARRAY_NULLABLE = "boolean?[]?" -} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/constants.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/constants.ts new file mode 100644 index 00000000000..c74676b40a7 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/constants.ts @@ -0,0 +1,67 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// Primitive data types supported by the datamapper +export enum PrimitiveType { + STRING = "string", + INT = "int", + FLOAT = "float", + DECIMAL = "decimal", + BOOLEAN = "boolean" +} + +// Nullable primitive data types +export enum NullablePrimitiveType { + STRING = "string?", + INT = "int?", + FLOAT = "float?", + DECIMAL = "decimal?", + BOOLEAN = "boolean?" +} + +// Array types for primitive data types +export enum PrimitiveArrayType { + // Basic array types + STRING_ARRAY = "string[]", + STRING_ARRAY_NULLABLE = "string[]?", + INT_ARRAY = "int[]", + INT_ARRAY_NULLABLE = "int[]?", + FLOAT_ARRAY = "float[]", + FLOAT_ARRAY_NULLABLE = "float[]?", + DECIMAL_ARRAY = "decimal[]", + DECIMAL_ARRAY_NULLABLE = "decimal[]?", + BOOLEAN_ARRAY = "boolean[]", + BOOLEAN_ARRAY_NULLABLE = "boolean[]?", + + // Arrays with nullable elements + STRING_OR_NULL_ARRAY = "string?[]", + STRING_OR_NULL_ARRAY_NULLABLE = "string?[]?", + INT_OR_NULL_ARRAY = "int?[]", + INT_OR_NULL_ARRAY_NULLABLE = "int?[]?", + FLOAT_OR_NULL_ARRAY = "float?[]", + FLOAT_OR_NULL_ARRAY_NULLABLE = "float?[]?", + DECIMAL_OR_NULL_ARRAY = "decimal?[]", + DECIMAL_OR_NULL_ARRAY_NULLABLE = "decimal?[]?", + BOOLEAN_OR_NULL_ARRAY = "boolean?[]", + BOOLEAN_OR_NULL_ARRAY_NULLABLE = "boolean?[]?" +} + +// Error type +export enum ErrorType { + ERROR = "error" +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/context-api.ts similarity index 98% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/context-api.ts index 14cf1183c78..5cf644a8eae 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/context_api.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/context-api.ts @@ -15,8 +15,7 @@ // under the License. import { generateText, ModelMessage } from "ai"; -import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; -import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; +import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../utils/ai-client"; import { ContentPart, DataMapperRequest, DataMapperResponse, FileData, FileTypeHandler, ProcessType } from "./types"; @@ -374,7 +373,7 @@ async function processFilesWithClaude(files: FileData[], processType: ProcessTyp maxOutputTokens: 8192, temperature: 0, messages: messages, - abortSignal: AIPanelAbortController.getInstance().signal + abortSignal: new AbortController().signal }); return text; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/index.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/index.ts new file mode 100644 index 00000000000..f86f915ada4 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/index.ts @@ -0,0 +1,34 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Main entry points for data-mapper +export * from './orchestrator'; +export * from './types'; +export * from './schema'; +export * from './context-api'; +export * from './constants'; + +// Export utilities from focused modules +export * from './utils/type-utils'; +export * from './utils/temp-project'; +export * from './utils/code-generation'; +export * from './utils/model'; +export * from './utils/model-optimization'; +export * from './utils/extraction'; +export * from './utils/repair'; +export * from './utils/inline-mappings'; +export * from './utils/types-generation'; +export * from './utils/mapping-context'; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/orchestrator.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/orchestrator.ts new file mode 100644 index 00000000000..33cf54131da --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/orchestrator.ts @@ -0,0 +1,1245 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { ModelMessage, generateObject } from "ai"; +import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../utils/ai-client"; +import { + DatamapperResponse, + DataModelStructure, + MappingFields, + RepairedMapping, + RepairedMappings, + DMModelDiagnosticsResult, +} from "./types"; +import { GeneratedMappingSchema, RepairedMappingsSchema } from "./schema"; +import { DataMapperModelResponse, DMModel, Mapping, repairCodeRequest, SourceFile, ImportInfo, ProcessMappingParametersRequest, Command, MetadataWithAttachments, InlineMappingsSourceResult, ProcessContextTypeCreationRequest, ProjectImports, ImportStatements, TemplateId, GetModuleDirParams, TextEdit, DataMapperSourceRequest, AllDataMapperSourceRequest, DataMapperModelRequest, DeleteMappingRequest, CodeData } from "@wso2/ballerina-core"; +import { getDataMappingPrompt } from "./prompts/mapping-prompt"; +import { getBallerinaCodeRepairPrompt } from "./prompts/repair-prompt"; +import { CopilotEventHandler, createWebviewEventHandler, updateAndSaveChat } from "../utils/events"; +import { getErrorMessage } from "../utils/ai-utils"; +import { buildMappingFileArray, buildRecordMap, collectExistingFunctions, collectModuleInfo, prepareMappingContext, determineCustomFunctionsPath, getUniqueFunctionFilePaths } from "./utils/mapping-context"; +import { getFunctionDefinitionFromSyntaxTree, extractImports } from "./utils/temp-project"; +import { generateInlineMappingsSource } from "./utils/inline-mappings"; +import { generateTypesFromContext } from "./utils/types-generation"; +import { repairAndCheckDiagnostics } from "./utils/repair"; +import { createTempFileAndGenerateMetadata, generateDataMapperModel, generateMappings } from "./utils/model"; +import { ensureUnionRefs, normalizeRefs } from "./utils/model-optimization"; +import { addCheckExpressionErrors } from "../../../rpc-managers/ai-panel/repair-utils"; +import { BiDiagramRpcManager, getBallerinaFiles } from "../../../rpc-managers/bi-diagram/rpc-manager"; +import { updateSourceCode } from "../../../utils/source-utils"; +import { StateMachine } from "../../../stateMachine"; +import { getHasStopped, setHasStopped } from "../../../rpc-managers/data-mapper/utils"; +import { commands, Uri, window } from "vscode"; +import { CLOSE_AI_PANEL_COMMAND } from "../constants"; +import { openAIPanelWithPrompt } from "../../../views/ai-panel/aiMachine"; +import path from "path"; +import { URI } from "vscode-uri"; +import fs from 'fs'; +import { writeBallerinaFileDidOpenTemp } from "../../../utils/modification"; +import { getTempProject, cleanupTempProject } from "../utils/project/temp-project"; +import { integrateCodeToWorkspace } from "../agent/utils"; +import { createExecutionContextFromStateMachine } from "../agent"; +import { ExpressionFunctionBody } from "@wso2/syntax-tree"; +import { repairSourceFilesWithAI } from "../../../../src/rpc-managers/ai-panel/utils"; + +// ============================================================================= +// ENHANCED MAIN ORCHESTRATOR FUNCTION +// ============================================================================= + +// Generates AI-powered data mappings with retry logic for handling failures +async function generateAIPoweredDataMappings(dataMapperModelResponse: DataMapperModelResponse): Promise { + if (!dataMapperModelResponse.mappingsModel) { + throw new Error("Mappings model is required in the data mapper response"); + } + + const maxRetries = 3; + let lastError: Error; + + for (let attempt = 0; attempt < maxRetries; attempt++) { + if (attempt > 0) { + console.debug("Retrying to generate mappings for the payload."); + } + + try { + const mappingsModel = dataMapperModelResponse.mappingsModel as DMModel; + const existingMappings = mappingsModel.mappings; + const userProvidedMappingHints = mappingsModel.mapping_fields || {}; + const existingSubMappings = mappingsModel.subMappings as Mapping[] || []; + + if (!mappingsModel.inputs || !mappingsModel.output) { + throw new Error("Mappings model must contain both inputs and output fields"); + } + + // Extract only inputs, output, and refs from mappingsModel + const dataModelStructure: DataModelStructure = { + inputs: mappingsModel.inputs, + output: mappingsModel.output, + refs: mappingsModel.refs + }; + + const aiGeneratedMappings = await generateAIMappings( + dataModelStructure, + existingMappings, + userProvidedMappingHints, + existingSubMappings + ); + + if (Object.keys(aiGeneratedMappings).length === 0) { + throw new Error("No valid fields were identified for mapping between the given input and output records."); + } + + return { mappings: aiGeneratedMappings }; + + } catch (error) { + console.error(`Error occurred while generating mappings: ${error}`); + lastError = error as Error; + } + } + + throw lastError!; +} + +// Calls Claude AI to generate mappings based on data model, user mappings, and mapping hints +async function generateAIMappings( + dataModelStructure: DataModelStructure, + existingUserMappings: Mapping[], + userProvidedMappingHints: { [key: string]: MappingFields }, + existingSubMappings: Mapping[] +): Promise { + if (!dataModelStructure.inputs || !dataModelStructure.output) { + throw new Error("Data model structure must contain inputs and output"); + } + + // Build prompt for AI + const aiPrompt = getDataMappingPrompt( + JSON.stringify(dataModelStructure), + JSON.stringify(existingUserMappings || []), + JSON.stringify(userProvidedMappingHints || {}), + JSON.stringify(existingSubMappings || []) + ); + + const chatMessages: ModelMessage[] = [ + { role: "user", content: aiPrompt } + ]; + + try { + const { object } = await generateObject({ + model: await getAnthropicClient(ANTHROPIC_SONNET_4), + maxOutputTokens: 8192, + temperature: 0, + messages: chatMessages, + schema: GeneratedMappingSchema, + abortSignal: new AbortController().signal, + }); + + const aiGeneratedMappings = object.generatedMappings as Mapping[]; + return aiGeneratedMappings; + } catch (error) { + console.error("Failed to parse response:", error); + throw new Error(`Failed to parse mapping response: ${error}`); + } +} + +// ============================================================================= +// DM MODEL-BASED CODE REPAIR +// ============================================================================= + +// Uses Claude AI to repair code based on DM model with diagnostics and import information +async function repairBallerinaCode( + dmModel: DMModel, + availableImports: ImportInfo[] +): Promise { + if (!dmModel) { + throw new Error("DM model is required for code repair"); + } + + // Build repair prompt + const codeRepairPrompt = getBallerinaCodeRepairPrompt( + JSON.stringify(dmModel), + JSON.stringify(availableImports || []) + ); + + const chatMessages: ModelMessage[] = [ + { role: "user", content: codeRepairPrompt } + ]; + + try { + const { object } = await generateObject({ + model: await getAnthropicClient(ANTHROPIC_SONNET_4), + maxOutputTokens: 8192, + temperature: 0, + messages: chatMessages, + schema: RepairedMappingsSchema, + abortSignal: new AbortController().signal, + }); + + return object.repairedMappings as RepairedMapping[]; + } catch (error) { + console.error("Failed to parse response:", error); + throw new Error(`Failed to parse repaired mappings response: ${error}`); + } +} + +// Generates repaired mappings by fixing diagnostics with retry logic +export async function generateRepairCode(codeRepairRequest?: repairCodeRequest): Promise { + if (!codeRepairRequest) { + throw new Error("Code repair request is required for generating repair code"); + } + + const maxRetries = 3; + let attemptCount = 0; + let lastError: Error; + + while (attemptCount < maxRetries) { + if (attemptCount > 0) { + console.debug("Retrying to generate repair code for the payload."); + } + + try { + // Generate AI-powered repaired mappings using Claude with DM model + const aiRepairedMappings = await repairBallerinaCode(codeRepairRequest.dmModel, codeRepairRequest.imports); + + if (!aiRepairedMappings || aiRepairedMappings.length === 0) { + console.warn("No mappings were repaired. The code may not have fixable errors."); + return { repairedMappings: [] }; + } + + return { repairedMappings: aiRepairedMappings }; + + } catch (error) { + console.error(`Error occurred while generating repaired code: ${error}`); + lastError = error as Error; + attemptCount += 1; + continue; + } + } + + throw lastError!; +} + +// Gets DM model for a function +async function getDMModel( + langClient: any, + mainFilePath: string, + functionName: string +): Promise { + // Get function definition to retrieve accurate position + const funcDefinitionNode = await getFunctionDefinitionFromSyntaxTree( + langClient, + mainFilePath, + functionName + ); + + // Build metadata with current function position + const dataMapperMetadata: DataMapperModelRequest = { + filePath: mainFilePath, + codedata: { + lineRange: { + fileName: mainFilePath, + startLine: { + line: funcDefinitionNode.position.startLine, + offset: funcDefinitionNode.position.startColumn, + }, + endLine: { + line: funcDefinitionNode.position.endLine, + offset: funcDefinitionNode.position.endColumn, + }, + }, + }, + targetField: functionName, + position: { + line: (funcDefinitionNode.functionBody as ExpressionFunctionBody).position.startLine, + offset: (funcDefinitionNode.functionBody as ExpressionFunctionBody).position.startColumn + } + }; + + // Get DM model with mapping-level diagnostics + const dataMapperModel = await langClient.getDataMapperMappings(dataMapperMetadata) as DataMapperModelResponse; + const dmModel = dataMapperModel.mappingsModel as DMModel; + + return { dataMapperMetadata, dmModel }; +} + +// Repairs mappings using LLM based on DM model diagnostics +async function repairMappingsWithLLM( + langClient: any, + dmModelResult: DMModelDiagnosticsResult, + imports: ImportInfo[] +): Promise { + const { dataMapperMetadata, dmModel } = dmModelResult; + + const hasDiagnostics = dmModel.mappings?.some( + (mapping: Mapping) => mapping.diagnostics && mapping.diagnostics.length > 0 + ); + + if (!hasDiagnostics) { + console.log('No diagnostics found in mappings, skipping LLM repair'); + return; + } + + // Call LLM repair with targeted diagnostics and DM model context + try { + let mappingsModel = ensureUnionRefs(dmModel); + mappingsModel = normalizeRefs(mappingsModel); + + const repairResult = await repairSourceFilesWithAI({ + dmModel: mappingsModel, + imports + }); + + // Apply repaired mappings to the DM model + if (repairResult.repairedMappings && repairResult.repairedMappings.length > 0) { + // Apply each repaired mapping individually using the language server + for (const repairedMapping of repairResult.repairedMappings) { + const targetMapping = dmModel.mappings.find(m => m.output === repairedMapping.output); + if (targetMapping) { + // Update the mapping with the repaired expression + targetMapping.expression = repairedMapping.expression; + targetMapping.diagnostics = []; + + // Generate source for this individual mapping + const singleMappingRequest: DataMapperSourceRequest = { + filePath: dataMapperMetadata.filePath, + codedata: dataMapperMetadata.codedata, + varName: dataMapperMetadata.targetField, + targetField: dataMapperMetadata.targetField, + mapping: targetMapping + }; + + try { + const mappingSourceResponse = await langClient.getDataMapperSource(singleMappingRequest); + if (mappingSourceResponse.textEdits && Object.keys(mappingSourceResponse.textEdits).length > 0) { + await updateSourceCode({ textEdits: mappingSourceResponse.textEdits, skipPayloadCheck: true }); + await new Promise((resolve) => setTimeout(resolve, 50)); + } + } catch (error) { + console.warn(`Failed to apply repaired mapping for ${repairedMapping.output}:`, error); + } + } + } + } + } catch (error) { + console.warn('LLM repair failed, continuing with other repairs:', error); + } +} + +// Repairs check expression errors (BCE3032) in DM model +async function repairCheckErrors( + langClient: any, + projectRoot: string, + mainFilePath: string, + allMappingsRequest: AllDataMapperSourceRequest, + tempDirectory: string, + isSameFile: boolean +): Promise { + // Apply programmatic fixes (imports, required fields, etc.) + const filePaths = [mainFilePath]; + if (allMappingsRequest.customFunctionsFilePath && !isSameFile) { + filePaths.push(allMappingsRequest.customFunctionsFilePath); + } + + let diags = await repairAndCheckDiagnostics(langClient, projectRoot, { + tempDir: tempDirectory, + filePaths + }); + + // Handle check expression errors (BCE3032) + const hasCheckError = diags.diagnosticsList.some(diagEntry => + diagEntry.diagnostics.some(d => d.code === "BCE3032") + ); + + if (hasCheckError) { + await addCheckExpressionErrors(diags.diagnosticsList, langClient); + } +} + +// Gets DM model with diagnostics for inline variable +async function getInlineDMModelWithDiagnostics( + langClient: any, + mainFilePath: string, + variableName: string, + codedata: CodeData +): Promise { + // Build metadata for inline variable + const dataMapperMetadata: DataMapperModelRequest = { + filePath: mainFilePath, + codedata: codedata, + targetField: variableName, + position: codedata.lineRange.startLine + }; + + // Get DM model with mapping-level diagnostics + const dataMapperModel = await langClient.getDataMapperMappings(dataMapperMetadata) as DataMapperModelResponse; + const dmModel = dataMapperModel.mappingsModel as DMModel; + + return { dataMapperMetadata, dmModel }; +} + +// Removes mappings with compilation errors +async function removeMappingsWithErrors( + langClient: any, + mainFilePath: string, + dmModelResult: DMModelDiagnosticsResult, + varName: string +): Promise { + const { dataMapperMetadata, dmModel } = dmModelResult; + + // Check if any mappings have diagnostics + if (dmModel && dmModel.mappings && dmModel.mappings.length > 0) { + const mappingsWithDiagnostics = dmModel.mappings.filter((mapping: Mapping) => + mapping.diagnostics && mapping.diagnostics.length > 0 + ); + + if (mappingsWithDiagnostics.length > 0) { + // Delete each mapping with diagnostics using the deleteMapping API + for (const mapping of mappingsWithDiagnostics) { + const deleteRequest: DeleteMappingRequest = { + filePath: mainFilePath, + codedata: dataMapperMetadata.codedata, + mapping: mapping, + varName: varName, + targetField: dataMapperMetadata.targetField, + }; + + const deleteResponse = await langClient.deleteMapping(deleteRequest); + + // Apply the text edits from the delete operation directly to temp files + if (Object.keys(deleteResponse.textEdits).length > 0) { + await applyTextEditsToTempFile(deleteResponse.textEdits, mainFilePath); + await new Promise((resolve) => setTimeout(resolve, 100)); + } + } + } + } +} + +// ============================================================================= +// MAIN EXPORT FUNCTION +// ============================================================================= + +// Main entry point for generating automatic data mappings from data mapper model +export async function generateAutoMappings(dataMapperModelResponse?: DataMapperModelResponse): Promise { + if (!dataMapperModelResponse) { + throw new Error("Data mapper model response is required for generating auto mappings"); + } + try { + const mappingResponse: DatamapperResponse = await generateAIPoweredDataMappings(dataMapperModelResponse); + return mappingResponse.mappings; + } catch (error) { + console.error(`Error generating auto mappings: ${error}`); + throw error; + } +} + +// ============================================================================= +// MAPPING CODE GENERATION WITH EVENT HANDLERS +// ============================================================================= + +// Core mapping code generation function that emits events +export async function generateMappingCodeCore( + mappingRequest: ProcessMappingParametersRequest, + eventHandler: CopilotEventHandler, + messageId?: string, + tempProjectPath?: string +): Promise<{ modifiedFiles: string[], sourceFiles: SourceFile[] }> { + if (!mappingRequest.parameters) { + throw new Error("Parameters are required in the mapping request"); + } + + if (!mappingRequest.parameters.functionName) { + throw new Error("Function name is required in the mapping parameters"); + } + + // Validate temp project path from base class + if (!tempProjectPath) { + throw new Error('Temp project path is required'); + } + + const ctx = createExecutionContextFromStateMachine(); + let projectName = path.basename(ctx.projectPath); + try { + // Initialize generation process + eventHandler({ type: "start" }); + eventHandler({ type: "content_block", content: "Building the transformation logic using your provided data structures and mapping hints\n\n" }); + eventHandler({ type: "content_block", content: "Reading project files and collecting imports..." }); + const biDiagramRpcManager = new BiDiagramRpcManager(); + const langClient = StateMachine.langClient(); + const context = StateMachine.context(); + let projectRoot = tempProjectPath; + if (ctx.workspacePath) { + projectRoot = path.join(projectRoot, projectName); + } + + const targetFunctionName = mappingRequest.parameters.functionName; + + const [projectImports, currentActiveFile, projectComponents] = await Promise.all([ + collectAllImportsFromProject(), + getCurrentActiveFileName(), + biDiagramRpcManager.getProjectComponents(), + langClient + ]); + + const allImportStatements = projectImports.imports.flatMap(file => file.statements || []); + + // Remove duplicates based on moduleName + const uniqueImportStatements = Array.from( + new Map(allImportStatements.map(imp => [imp.moduleName, imp])).values() + ); + + const moduleInfoList = collectModuleInfo(projectComponents); + const moduleDirectoryMap = new Map(); + + for (const moduleInfo of moduleInfoList) { + const moduleDirectoryType = getModuleDirectory({ + moduleName: moduleInfo.moduleName, + filePath: moduleInfo.packageFilePath + }); + moduleDirectoryMap.set(moduleInfo.moduleName, moduleDirectoryType); + } + + const recordTypeMap = buildRecordMap(projectComponents, moduleDirectoryMap); + const existingFunctionsInProject = collectExistingFunctions(projectComponents, moduleDirectoryMap); + + const functionFileContents = new Map(); + if (existingFunctionsInProject.length > 0) { + const uniqueFunctionFilePaths = getUniqueFunctionFilePaths(existingFunctionsInProject); + const fileContentResults = await Promise.all( + uniqueFunctionFilePaths.map(async (filePath) => { + const projectFsPath = URI.parse(filePath).fsPath; + const fileContent = await fs.promises.readFile(projectFsPath, "utf-8"); + return { filePath, content: fileContent }; + }) + ); + fileContentResults.forEach(({ filePath, content }) => { + functionFileContents.set(filePath, content); + }); + } + + //TODO: Refactor LS calls to only rely on Temp directory + const mappingContext = await prepareMappingContext( + mappingRequest.parameters, + recordTypeMap, + existingFunctionsInProject, + uniqueImportStatements, + functionFileContents, + currentActiveFile, + langClient, + projectRoot + ); + + // Use temp directory provided by state machine (no double temp creation) + const doesFunctionAlreadyExist = existingFunctionsInProject.some(func => func.name === targetFunctionName); + let tempDirectory = tempProjectPath; + let projectFilePath = mappingContext.filePath; + if (ctx.workspacePath) { + projectFilePath = path.join(projectName, projectFilePath); + } + + const tempFileMetadata = await createTempFileAndGenerateMetadata({ + tempDir: tempDirectory, + filePath: projectFilePath, + metadata: mappingRequest.metadata, + inputs: mappingContext.mappingDetails.inputs, + output: mappingContext.mappingDetails.output, + functionName: targetFunctionName, + inputNames: mappingContext.mappingDetails.inputNames, + imports: mappingContext.mappingDetails.imports, + hasMatchingFunction: doesFunctionAlreadyExist, + }, langClient, context); + + const allMappingsRequest = await generateMappings({ + metadata: tempFileMetadata, + attachments: mappingRequest.attachments + }, context, eventHandler); + + await getAllDataMapperSource(allMappingsRequest); + + let customFunctionsTargetPath: string; + let customFunctionsFileName: string; + + if (allMappingsRequest.customFunctionsFilePath) { + const absoluteCustomFunctionsPath = determineCustomFunctionsPath(projectRoot, currentActiveFile); + customFunctionsFileName = path.basename(absoluteCustomFunctionsPath); + + customFunctionsTargetPath = customFunctionsFileName; + // For multi workspace projects + if (ctx.workspacePath) { + customFunctionsTargetPath = path.join(projectName, customFunctionsFileName); + } + } + + // Check if mappings file and custom functions file are the same + const mainFilePath = tempFileMetadata.codeData.lineRange.fileName; + const isSameFile = customFunctionsTargetPath && + path.resolve(mainFilePath) === path.resolve(path.join(tempDirectory, customFunctionsFileName)); + + eventHandler({ type: "content_block", content: "\nRepairing generated code..." }); + + // Repair check expression errors (BCE3032) + await repairCheckErrors( + langClient, + projectRoot, + mainFilePath, + allMappingsRequest, + tempDirectory, + isSameFile + ); + + // Get DM model with diagnostics + const dmModelResult = await getDMModel( + langClient, + mainFilePath, + targetFunctionName + ); + + // Repair mappings using LLM based on DM model diagnostics + await repairMappingsWithLLM( + langClient, + dmModelResult, + uniqueImportStatements + ); + + // Remove compilation error mappings + await removeCompilationErrorMappingFields( + langClient, + mainFilePath, + targetFunctionName, + allMappingsRequest, + ); + + // Read updated content after removing compilation errors + const updatedMainContent = fs.readFileSync(mainFilePath, 'utf8'); + let updatedCustomContent = ''; + if (allMappingsRequest.customFunctionsFilePath && !isSameFile) { + updatedCustomContent = fs.readFileSync(allMappingsRequest.customFunctionsFilePath, 'utf8'); + } + + const generatedSourceFiles = buildMappingFileArray( + projectFilePath, + updatedMainContent, + customFunctionsTargetPath, + updatedCustomContent, + ); + + const modifiedFiles = generatedSourceFiles.map(file => file.filePath); + + // Integrate code to workspace automatically + if (modifiedFiles.length > 0) { + eventHandler({ type: "content_block", content: "Integrating code to workspace..." }); + const modifiedFilesSet = new Set(modifiedFiles); + await integrateCodeToWorkspace(tempProjectPath, modifiedFilesSet, ctx); + console.log(`[DataMapper] Integrated ${modifiedFiles.length} file(s) to workspace`); + eventHandler({ type: "content_block", content: "\n\nData mapping is complete! You can now review the generated mappings in your workspace." }); + } + + // Save chat history before stopping (similar to agent finish handler) + if (messageId) { + updateAndSaveChat(messageId, Command.DataMap, eventHandler); + } + eventHandler({ type: "stop", command: Command.DataMap }); + + return { + modifiedFiles, + sourceFiles: generatedSourceFiles + }; + } catch (error) { + console.error("Error during mapping code generation:", error); + + // Enhanced error message for integration failures + const errorMsg = error instanceof Error ? error.message : String(error); + if (errorMsg.includes('Failed to integrate code')) { + eventHandler({ + type: "error", + content: `Integration failed: ${getErrorMessage(error)}\n\nPlease check file permissions and try again.` + }); + } else { + eventHandler({ type: "error", content: getErrorMessage(error) }); + } + throw error; + } +} + +// Main public function that uses the default event handler for mapping generation +export async function generateMappingCode(mappingRequest: ProcessMappingParametersRequest, messageId?: string): Promise { + const eventHandler = createWebviewEventHandler(Command.DataMap); + + // Create temp project for backward compatibility + const ctx = createExecutionContextFromStateMachine(); + const { path: tempProjectPath } = await getTempProject(ctx); + + try { + await generateMappingCodeCore(mappingRequest, eventHandler, messageId, tempProjectPath); + } catch (error) { + console.error("Error during mapping code generation:", error); + throw error; + } finally { + // Cleanup for backward compatibility + await cleanupTempProject(tempProjectPath); + } +} + +async function collectAllImportsFromProject(): Promise { + const projectPath = StateMachine.context().projectPath; + + const ballerinaSourceFiles = await getBallerinaFiles(Uri.file(projectPath).fsPath); + + const importStatements: ImportStatements[] = []; + + for (const ballerinaFile of ballerinaSourceFiles) { + const sourceFileContent = fs.readFileSync(ballerinaFile, "utf8"); + const extractedImports = extractImports(sourceFileContent, ballerinaFile); + importStatements.push(extractedImports); + } + + return { + projectPath: projectPath, + imports: importStatements, + }; +} + +function getCurrentActiveFileName(): string { + const activeTabGroup = window.tabGroups.all.find(group => { + return group.activeTab.isActive && group.activeTab?.input; + }); + + if (activeTabGroup && activeTabGroup.activeTab && activeTabGroup.activeTab.input) { + const activeTabInput = activeTabGroup.activeTab.input as { uri: { fsPath: string } }; + + if (activeTabInput.uri) { + const activeFileUri = activeTabInput.uri; + const activeFileName = activeFileUri.fsPath.split('/').pop(); + return activeFileName || ''; + } + } +} + +function getModuleDirectory(params: GetModuleDirParams): string { + const { filePath, moduleName } = params; + const generatedPath = path.join(filePath, "generated", moduleName); + if (fs.existsSync(generatedPath) && fs.statSync(generatedPath).isDirectory()) { + return "generated"; + } else { + return "modules"; + } +} + +// Updates code data after text edits by fetching fresh function definition +async function updateCodeDataAfterEdit( + langClient: any, + filePath: string, + varName: string, + targetField: string +): Promise { + try { + const funcDefinitionNode = await getFunctionDefinitionFromSyntaxTree( + langClient, + filePath, + varName + ); + + return { + lineRange: { + fileName: filePath, + startLine: { + line: funcDefinitionNode.position.startLine, + offset: funcDefinitionNode.position.startColumn, + }, + endLine: { + line: funcDefinitionNode.position.endLine, + offset: funcDefinitionNode.position.endColumn, + }, + }, + }; + } catch (error) { + console.warn(`Could not update code data for ${targetField}, continuing with existing data:`, error); + return null; + } +} + +// Processes a single mapping and returns updated code data +async function processSingleMapping( + request: DataMapperSourceRequest, + langClient: any, + index: number, + total: number +): Promise { + const response = await langClient.getDataMapperSource(request); + console.log(`>>> Completed mapping ${index + 1}/${total}`); + + if (response.textEdits && Object.keys(response.textEdits).length > 0) { + await updateSourceCode({ textEdits: response.textEdits, skipPayloadCheck: true }); + await new Promise((resolve) => setTimeout(resolve, 100)); + + return await updateCodeDataAfterEdit( + langClient, + request.filePath, + request.varName, + request.targetField + ); + } + + return null; +} + +// Main function to process all data mapper source requests sequentially +export async function getAllDataMapperSource( + mappingSourceRequest: AllDataMapperSourceRequest +): Promise { + setHasStopped(false); + let currentCodeData = mappingSourceRequest.codedata; + const langClient = StateMachine.langClient(); + const totalMappings = mappingSourceRequest.mappings.length; + + for (let i = 0; i < totalMappings; i++) { + if (getHasStopped()) { + throw new Error("Operation was stopped"); + } + + const singleSourceRequest: DataMapperSourceRequest = { + filePath: mappingSourceRequest.filePath, + codedata: currentCodeData, + varName: mappingSourceRequest.varName, + targetField: mappingSourceRequest.targetField, + mapping: mappingSourceRequest.mappings[i] + }; + + try { + const updatedCodeData = await processSingleMapping( + singleSourceRequest, + langClient, + i, + totalMappings + ); + + // Update code data if we got fresh data + if (updatedCodeData) { + currentCodeData = updatedCodeData; + } + } catch (error) { + console.error(`>>> Failed mapping ${i + 1}:`, error); + } + } +} + +// ============================================================================= +// INLINE MAPPING CODE GENERATION WITH EVENT HANDLERS +// ============================================================================= + +// Core inline mapping code generation function that emits events and generates mappings inline +export async function generateInlineMappingCodeCore( + inlineMappingRequest: MetadataWithAttachments, + eventHandler: CopilotEventHandler, + messageId?: string, + tempProjectPath?: string +): Promise<{ modifiedFiles: string[], sourceFiles: SourceFile[] }> { + if (!inlineMappingRequest.metadata) { + throw new Error("Metadata is required in the inline mapping request"); + } + + if (!inlineMappingRequest.metadata.codeData) { + throw new Error("Code data is required in the metadata"); + } + + // Validate temp project path from base class + if (!tempProjectPath) { + throw new Error('Temp project path is required'); + } + + const ctx = createExecutionContextFromStateMachine(); + let projectName = path.basename(ctx.projectPath); + try { + // Initialize generation process + eventHandler({ type: "start" }); + eventHandler({ type: "content_block", content: "Building the transformation logic using your provided data structures and mapping hints\n\n" }); + eventHandler({ type: "content_block", content: "Reading project files and collecting imports..." }); + const projectImports = await collectAllImportsFromProject(); + const allImportStatements = projectImports.imports.flatMap(file => file.statements || []); + + // Remove duplicates based on moduleName + const uniqueImportStatements = Array.from( + new Map(allImportStatements.map(imp => [imp.moduleName, imp])).values() + ); + + const langClient = StateMachine.langClient(); + const context = StateMachine.context(); + let projectRoot = tempProjectPath; + let targetFileName = inlineMappingRequest.metadata.codeData.lineRange.fileName; + if (ctx.workspacePath) { + projectRoot = path.join(projectRoot, projectName); + targetFileName = path.join(projectName, targetFileName); + } + + const currentActiveFile = getCurrentActiveFileName(); + + const inlineMappingsResult: InlineMappingsSourceResult = + await generateInlineMappingsSource(inlineMappingRequest, langClient, context, eventHandler, tempProjectPath, targetFileName); + + let customFunctionsTargetPath: string; + let customFunctionsFileName: string; + + if (inlineMappingsResult.allMappingsRequest.customFunctionsFilePath) { + const absoluteCustomFunctionsPath = determineCustomFunctionsPath(projectRoot, currentActiveFile); + customFunctionsFileName = path.basename(absoluteCustomFunctionsPath); + + customFunctionsTargetPath = customFunctionsFileName; + // For multi workspace projects + if (ctx.workspacePath) { + customFunctionsTargetPath = path.join(projectName, customFunctionsFileName); + } + } + + // Check if mappings file and custom functions file are the same + const mainFilePath = inlineMappingsResult.tempFileMetadata.codeData.lineRange.fileName; + const isSameFile = customFunctionsTargetPath && + path.resolve(mainFilePath) === path.resolve(path.join(inlineMappingsResult.tempDir, customFunctionsFileName)); + + eventHandler({ type: "content_block", content: "\nRepairing generated code..." }); + + const variableName = inlineMappingRequest.metadata.name || inlineMappingsResult.tempFileMetadata.name; + + // Repair check expression errors (BCE3032) + await repairCheckErrors( + langClient, + projectRoot, + mainFilePath, + inlineMappingsResult.allMappingsRequest, + inlineMappingsResult.tempDir, + isSameFile + ); + + // Get DM model with diagnostics for inline variable + const dmModelResult = await getInlineDMModelWithDiagnostics( + langClient, + mainFilePath, + variableName, + inlineMappingsResult.allMappingsRequest.codedata + ); + + // Repair mappings using LLM based on DM model diagnostics + await repairMappingsWithLLM( + langClient, + dmModelResult, + uniqueImportStatements + ); + + // Remove compilation error mappings for inline mappings + await removeInlineCompilationErrorMappingFields( + langClient, + mainFilePath, + variableName, + inlineMappingsResult, + ); + + // Read updated content after removing compilation errors + const updatedMainContent = fs.readFileSync(mainFilePath, 'utf8'); + let updatedCustomContent = ''; + if (inlineMappingsResult.allMappingsRequest.customFunctionsFilePath && !isSameFile) { + updatedCustomContent = fs.readFileSync(inlineMappingsResult.allMappingsRequest.customFunctionsFilePath, 'utf8'); + } + + const generatedSourceFiles: SourceFile[] = buildMappingFileArray( + targetFileName, + updatedMainContent, + customFunctionsTargetPath, + updatedCustomContent, + ); + + // Extract modified file paths + const modifiedFiles = generatedSourceFiles.map(file => file.filePath); + + // Integrate code to workspace automatically + if (modifiedFiles.length > 0) { + eventHandler({ type: "content_block", content: "Integrating code to workspace..." }); + const modifiedFilesSet = new Set(modifiedFiles); + await integrateCodeToWorkspace(tempProjectPath, modifiedFilesSet, ctx); + console.log(`[DataMapper] Integrated ${modifiedFiles.length} file(s) to workspace`); + eventHandler({ type: "content_block", content: "\n\nData mapping is complete! You can now review the generated mappings in your workspace." }); + } + + // Save chat history before stopping (similar to agent finish handler) + if (messageId) { + updateAndSaveChat(messageId, Command.DataMap, eventHandler); + } + eventHandler({ type: "stop", command: Command.DataMap }); + + return { + modifiedFiles, + sourceFiles: generatedSourceFiles + }; + } catch (error) { + console.error("Error during inline mapping code generation:", error); + + // Enhanced error message for integration failures + const errorMsg = error instanceof Error ? error.message : String(error); + if (errorMsg.includes('Failed to integrate code')) { + eventHandler({ + type: "error", + content: `Integration failed: ${getErrorMessage(error)}\n\nPlease check file permissions and try again.` + }); + } else { + eventHandler({ type: "error", content: getErrorMessage(error) }); + } + throw error; + } +} + +// Main public function that uses the default event handler for inline mapping generation +export async function generateInlineMappingCode(inlineMappingRequest: MetadataWithAttachments, messageId?: string): Promise { + const eventHandler = createWebviewEventHandler(Command.DataMap); + + // Create temp project for backward compatibility + const ctx = createExecutionContextFromStateMachine(); + const { path: tempProjectPath } = await getTempProject(ctx); + + try { + await generateInlineMappingCodeCore(inlineMappingRequest, eventHandler, messageId, tempProjectPath); + } catch (error) { + console.error("Error during inline mapping code generation:", error); + throw error; + } finally { + // Cleanup for backward compatibility + await cleanupTempProject(tempProjectPath); + } +} + +// ============================================================================= +// CONTEXT TYPE CREATION WITH EVENT HANDLERS +// ============================================================================= + +// Core context type creation function that emits events and generates Ballerina record types +export async function generateContextTypesCore( + typeCreationRequest: ProcessContextTypeCreationRequest, + eventHandler: CopilotEventHandler, + messageId?: string, + tempProjectPath?: string +): Promise<{ modifiedFiles: string[], sourceFiles: SourceFile[] }> { + if (typeCreationRequest.attachments.length === 0) { + throw new Error("Attachments are required for type creation"); + } + + // Validate temp project path from base class + if (!tempProjectPath) { + throw new Error('Temp project path is required'); + } + + const ctx = createExecutionContextFromStateMachine(); + let projectName = path.basename(ctx.projectPath); + + try { + // Initialize generation process + eventHandler({ type: "start" }); + + const biDiagramRpcManager = new BiDiagramRpcManager(); + const projectComponents = await biDiagramRpcManager.getProjectComponents(); + eventHandler({ type: "content_block", content: "\n\nAnalyzing your provided data to generate Ballerina record types.\n\n" }); + eventHandler({ type: "content_block", content: "\n\nGenerating types..." }); + + let projectRoot = tempProjectPath; + if (ctx.workspacePath) { + projectRoot = path.join(projectRoot, projectName); + } + + // Generate types from context with validation + const { typesCode, filePath } = await generateTypesFromContext( + typeCreationRequest.attachments, + projectComponents, + projectRoot + ); + + // Adjust file path for workspace projects + let targetFilePath = filePath; + if (ctx.workspacePath) { + targetFilePath = path.join(projectName, filePath); + } + + // Create source files array + const sourceFiles: SourceFile[] = [{ + filePath: targetFilePath, + content: typesCode + }]; + const modifiedFiles = [targetFilePath]; + + // Integrate code to workspace automatically + if (modifiedFiles.length > 0) { + eventHandler({ type: "content_block", content: "Integrating code to workspace..." }); + const modifiedFilesSet = new Set(modifiedFiles); + await integrateCodeToWorkspace(tempProjectPath, modifiedFilesSet, ctx); + console.log(`[DataMapper] Integrated ${modifiedFiles.length} file(s) to workspace`); + eventHandler({ type: "content_block", content: "\n\nType generation is complete! The generated types have been added to your workspace." }); + } + + // Save chat history before stopping (similar to agent finish handler) + if (messageId) { + updateAndSaveChat(messageId, Command.TypeCreator, eventHandler); + } + eventHandler({ type: "stop", command: Command.TypeCreator }); + + return { + modifiedFiles, + sourceFiles + }; + } catch (error) { + console.error("Error during context type creation:", error); + + // Enhanced error message for integration failures + const errorMsg = error instanceof Error ? error.message : String(error); + if (errorMsg.includes('Failed to integrate code')) { + eventHandler({ + type: "error", + content: `Integration failed: ${getErrorMessage(error)}\n\nPlease check file permissions and try again.` + }); + } else { + eventHandler({ type: "error", content: getErrorMessage(error) }); + } + throw error; + } +} + +// Main public function that uses the default event handler for context type creation +export async function generateContextTypes(typeCreationRequest: ProcessContextTypeCreationRequest, messageId?: string): Promise { + const eventHandler = createWebviewEventHandler(Command.TypeCreator); + + // Create temp project for backward compatibility + const ctx = createExecutionContextFromStateMachine(); + const { path: tempProjectPath } = await getTempProject(ctx); + + try { + await generateContextTypesCore(typeCreationRequest, eventHandler, messageId, tempProjectPath); + } catch (error) { + console.error("Error during context type creation:", error); + throw error; + } finally { + // Cleanup for backward compatibility + await cleanupTempProject(tempProjectPath); + } +} + +// Opens the AI panel with data mapper chat interface +export async function openChatWindowWithCommand(): Promise { + const langClient = StateMachine.langClient(); + const context = StateMachine.context(); + const model = await generateDataMapperModel({}, langClient, context); + + const { identifier, dataMapperMetadata } = context; + + // Automatically close and open AI mapping chat window with the generated model + commands.executeCommand(CLOSE_AI_PANEL_COMMAND); + openAIPanelWithPrompt({ + type: 'command-template', + command: Command.DataMap, + templateId: identifier ? TemplateId.MappingsForFunction : TemplateId.InlineMappings, + ...(identifier && { params: { functionName: identifier } }), + metadata: { + ...dataMapperMetadata, + mappingsModel: model.mappingsModel as DMModel + } + }); +} + +// Removes mapping fields with compilation errors for inline mappings +async function removeInlineCompilationErrorMappingFields( + langClient: any, + mainFilePath: string, + variableName: string, + inlineMappingsResult: InlineMappingsSourceResult, +): Promise { + // Get DM model with diagnostics for inline variable + const dmModelResult = await getInlineDMModelWithDiagnostics( + langClient, + mainFilePath, + variableName, + inlineMappingsResult.allMappingsRequest.codedata + ); + + // Use function to remove mappings with compilation errors + await removeMappingsWithErrors( + langClient, + mainFilePath, + dmModelResult, + inlineMappingsResult.allMappingsRequest.varName + ); +} + +// Removes mapping fields with compilation errors to avoid syntax errors in generated code +async function removeCompilationErrorMappingFields( + langClient: any, + mainFilePath: string, + targetFunctionName: string, + allMappingsRequest: AllDataMapperSourceRequest, +): Promise { + // Get DM model with diagnostics + const dmModelResult = await getDMModel( + langClient, + mainFilePath, + targetFunctionName + ); + + // Use function to remove mappings with compilation errors + await removeMappingsWithErrors( + langClient, + mainFilePath, + dmModelResult, + allMappingsRequest.varName + ); +} + +// Applies text edits to a temporary file without using VS Code workspace APIs +async function applyTextEditsToTempFile(textEdits: { [key: string]: TextEdit[] }, targetFilePath: string): Promise { + // Read current file content + let fileContent = fs.readFileSync(targetFilePath, 'utf8'); + const lines = fileContent.split('\n'); + + // Get edits for this file + const editsForFile = textEdits[targetFilePath] || textEdits[Uri.file(targetFilePath).toString()]; + + if (!editsForFile || editsForFile.length === 0) { + return; + } + + // Sort edits in reverse order (bottom to top) to maintain line positions + const sortedEdits = [...editsForFile].sort((a, b) => { + if (b.range.start.line !== a.range.start.line) { + return b.range.start.line - a.range.start.line; + } + return b.range.start.character - a.range.start.character; + }); + + // Apply each edit + for (const edit of sortedEdits) { + const startLine = edit.range.start.line; + const startChar = edit.range.start.character; + const endLine = edit.range.end.line; + const endChar = edit.range.end.character; + + // Handle single line edit + if (startLine === endLine) { + const line = lines[startLine]; + lines[startLine] = line.substring(0, startChar) + edit.newText + line.substring(endChar); + } else { + // Handle multi-line edit + const firstLine = lines[startLine].substring(0, startChar); + const lastLine = lines[endLine].substring(endChar); + const newContent = firstLine + edit.newText + lastLine; + + // Remove the lines in the range and replace with new content + lines.splice(startLine, endLine - startLine + 1, newContent); + } + } + + // Write updated content back to file + const updatedContent = lines.join('\n'); + writeBallerinaFileDidOpenTemp(targetFilePath, updatedContent); +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/dataMappingPrompt.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/prompts/mapping-prompt.ts similarity index 100% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/dataMappingPrompt.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/prompts/mapping-prompt.ts diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/codeRepairPrompt.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/prompts/repair-prompt.ts similarity index 100% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/codeRepairPrompt.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/prompts/repair-prompt.ts diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/schema.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/schema.ts similarity index 100% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/schema.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/schema.ts diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/types.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/types.ts similarity index 97% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/types.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/types.ts index fe43c7c6718..48a06c66f0c 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/types.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/types.ts @@ -63,6 +63,11 @@ export interface DMModelDiagnosticsResult { dmModel: DMModel; } +export interface CodeRepairResult { + finalContent: string; + customFunctionsContent: string; +} + // ============================================================================= // MAPPING HINTS // ============================================================================= diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/code-generation.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/code-generation.ts new file mode 100644 index 00000000000..91ab7fd5c5b --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/code-generation.ts @@ -0,0 +1,103 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { DataMappingRecord, createFunctionSignature, getSource } from "@wso2/ballerina-core"; +import { camelCase } from "lodash"; +import { PrimitiveType } from "../constants"; + +/** + * Code generation utilities for data mapping functions + */ + +export function createDataMappingFunctionSource( + inputParams: DataMappingRecord[], + outputParam: DataMappingRecord, + functionName: string, + inputNames: string[] +): string { + const parametersStr = buildParametersString(inputParams, inputNames); + const returnTypeStr = buildReturnTypeString(outputParam); + + const modification = createFunctionSignature( + "", + functionName, + parametersStr, + returnTypeStr, + { startLine: 0, startColumn: 0 }, + false, + true, + "{}" + ); + + return getSource(modification); +} + +function buildParametersString( + inputParams: DataMappingRecord[], + inputNames: string[] +): string { + return inputParams + .map((item, index) => { + const paramName = + inputNames[index] || getDefaultParamName(item.type, item.isArray); + return formatParameter(item, paramName); + }) + .join(", "); +} + +function getDefaultParamName(type: string, isArray: boolean): string { + const processedType = processType(type); + + switch (processedType) { + case PrimitiveType.STRING: + return isArray ? "strArr" : "str"; + case PrimitiveType.INT: + return isArray ? "numArr" : "num"; + case PrimitiveType.FLOAT: + return isArray ? "fltArr" : "flt"; + case PrimitiveType.DECIMAL: + return isArray ? "decArr" : "dec"; + case PrimitiveType.BOOLEAN: + return isArray ? "flagArr" : "flag"; + default: + return camelCase(processedType); + } +} + +function processType(type: string): string { + let typeName = type.includes("/") ? type.split("/").pop()! : type; + + if (typeName.includes(":")) { + const [modulePart, typePart] = typeName.split(":"); + typeName = `${modulePart.split(".").pop()}:${typePart}`; + } + + return typeName; +} + +function formatParameter( + item: DataMappingRecord, + paramName: string +): string { + return `${processType(item.type)}${item.isArray ? "[]" : ""} ${paramName}`; +} + +function buildReturnTypeString(outputParam: DataMappingRecord): string { + return `returns ${processType(outputParam.type)}${outputParam.isArray ? "[]" : "" + }`; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/extraction.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/extraction.ts new file mode 100644 index 00000000000..047b24214d1 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/extraction.ts @@ -0,0 +1,272 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + ComponentInfo, + DataMappingRecord, + ExistingFunctionMatchResult, + ExtractMappingDetailsRequest, + ExtractMappingDetailsResponse, + ImportInfo, +} from "@wso2/ballerina-core"; +import { ExtendedLangClient } from "../../../../core"; +import { DefaultableParam, IncludedRecordParam, RequiredParam, RestParam } from "@wso2/syntax-tree"; +import { INVALID_RECORD_REFERENCE } from "../../../../views/ai-panel/errorCodes"; +import { isAnyPrimitiveType, isPrimitiveArrayType } from "./type-utils"; +import { getFunctionDefinitionFromSyntaxTree } from "./temp-project"; + +/** + * Functions for extracting and validating mapping parameters + */ + +export async function extractMappingDetails( + params: ExtractMappingDetailsRequest, + langClient: ExtendedLangClient +): Promise { + const { parameters, recordMap, allImports, existingFunctions } = params; + const importsMap: Record = {}; + let inputParams: string[]; + let outputParam: string; + let inputNames: string[] = []; + + const existingFunctionMatch = await processExistingFunctions( + existingFunctions, + parameters.functionName, + langClient + ); + + const hasProvidedRecords = parameters.inputRecord.length > 0 || parameters.outputRecord !== ""; + + if (hasProvidedRecords) { + if (existingFunctionMatch.match) { + throw new Error( + `${parameters.functionName} function already exists. Please provide a valid function name.` + ); + } + inputParams = parameters.inputRecord; + outputParam = parameters.outputRecord; + } else { + if (!existingFunctionMatch.match || !existingFunctionMatch.functionDefNode) { + throw new Error( + `${parameters.functionName} function was not found. Please provide a valid function name.` + ); + } + + const funcNode = existingFunctionMatch.functionDefNode; + const params = funcNode.functionSignature.parameters?.filter( + (param): param is RequiredParam | DefaultableParam | RestParam | IncludedRecordParam => + param.kind !== 'CommaToken' + ) ?? []; + + inputParams = params.map(param => (param.typeName.source || "").trim()); + inputNames = params.map(param => (param.paramName.value || "").trim()); + outputParam = (funcNode.functionSignature.returnTypeDesc.type.source || "").trim(); + } + + const inputs = processInputs(inputParams, recordMap, allImports, importsMap); + const output = processOutput(outputParam, recordMap, allImports, importsMap); + + return { + inputs, + output, + inputParams, + outputParam, + imports: Object.values(importsMap), + inputNames, + existingFunctionMatch, + }; +} + +// Processes existing functions to find a matching function by name +export async function processExistingFunctions( + existingFunctions: ComponentInfo[], + functionName: string, + langClient: ExtendedLangClient +): Promise { + for (const func of existingFunctions) { + const filePath = func.filePath; + const fileName = filePath.split("/").pop(); + + const funcDefNode = await getFunctionDefinitionFromSyntaxTree(langClient, filePath, functionName); + if (funcDefNode) { + return { + match: true, + matchingFunctionFile: fileName, + functionDefNode: funcDefNode, + }; + } else { + continue; + } + } + + return { + match: false, + matchingFunctionFile: null, + functionDefNode: null, + }; +} + +// Process input parameters +export function processInputs( + inputParams: string[], + recordMap: Record, + allImports: ImportInfo[], + importsMap: Record +) { + let results = inputParams.map((param: string) => + processRecordReference(param, recordMap, allImports, importsMap) + ); + return results.filter((result): result is DataMappingRecord => { + if (result instanceof Error) { + throw INVALID_RECORD_REFERENCE; + } + return true; + }); +} + +// Process Output parameters +export function processOutput( + outputParam: string, + recordMap: Record, + allImports: ImportInfo[], + importsMap: Record +) { + const outputResult = processRecordReference(outputParam, recordMap, allImports, importsMap); + if (outputResult instanceof Error) { + throw INVALID_RECORD_REFERENCE; + } + return outputResult; +} + +// Validate and register an imported type in the imports map +function registerImportedType( + typeName: string, + allImports: ImportInfo[], + importsMap: Record +): void { + if (!typeName.includes("/")) { + const [moduleName, recName] = typeName.split(":"); + const matchedImport = allImports.find((imp) => { + if (imp.alias) { + return typeName.startsWith(imp.alias); + } + const moduleNameParts = imp.moduleName.split(/[./]/); + const inferredAlias = moduleNameParts[moduleNameParts.length - 1]; + return typeName.startsWith(inferredAlias); + }); + + if (!matchedImport) { + throw new Error(`Import not found for: ${typeName}`); + } + importsMap[typeName] = { + moduleName: matchedImport.moduleName, + alias: matchedImport.alias, + recordName: recName, + }; + } else { + const [moduleName, recName] = typeName.split(":"); + importsMap[typeName] = { + moduleName: moduleName, + recordName: recName, + }; + } +} + +// Validate that a type exists as either a primitive, local record, or imported type +function validateTypeExists( + typeName: string, + recordMap: Record, + allImports: ImportInfo[], + importsMap: Record +): void { + if (isAnyPrimitiveType(typeName)) { + return; + } + + const cleanedType = typeName.replace(/\[\]$/, ""); + if (recordMap[cleanedType]) { + return; + } + + if (cleanedType.includes(":")) { + registerImportedType(cleanedType, allImports, importsMap); + return; + } + + throw new Error(`${cleanedType} is not defined.`); +} + +// Process and validate a union type, returning its data mapping record +function processUnionType( + unionTypeString: string, + recordMap: Record, + allImports: ImportInfo[], + importsMap: Record +): DataMappingRecord { + const unionTypes = unionTypeString.split("|").map(t => t.trim()); + + for (const unionType of unionTypes) { + validateTypeExists(unionType, recordMap, allImports, importsMap); + } + + return { type: unionTypeString, isArray: false, filePath: null }; +} + +// Process and validate a single type reference, returning its data mapping record +function processSingleType( + typeName: string, + recordMap: Record, + allImports: ImportInfo[], + importsMap: Record +): DataMappingRecord { + if (isAnyPrimitiveType(typeName)) { + return { type: typeName, isArray: false, filePath: null }; + } + + const isArray = typeName.endsWith("[]") && !isPrimitiveArrayType(typeName); + const cleanedRecordName = isArray ? typeName.replace(/\[\]$/, "") : typeName; + + const rec = recordMap[cleanedRecordName]; + + if (rec) { + return { ...rec, isArray }; + } + + if (cleanedRecordName.includes(":")) { + registerImportedType(cleanedRecordName, allImports, importsMap); + return { type: typeName, isArray, filePath: null }; + } + + throw new Error(`${cleanedRecordName} is not defined.`); +} + +// Process a record type reference and validate it exists, handling both union and single types +export function processRecordReference( + recordName: string, + recordMap: Record, + allImports: ImportInfo[], + importsMap: Record +): DataMappingRecord { + const trimmedRecordName = recordName.trim(); + + if (trimmedRecordName.includes("|")) { + return processUnionType(trimmedRecordName, recordMap, allImports, importsMap); + } + + return processSingleType(trimmedRecordName, recordMap, allImports, importsMap); +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/inline-mappings.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/inline-mappings.ts new file mode 100644 index 00000000000..ed46d55d02d --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/inline-mappings.ts @@ -0,0 +1,85 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { InlineMappingsSourceResult, MetadataWithAttachments } from "@wso2/ballerina-core"; +import { ExtendedLangClient } from "../../../../core"; +import { CopilotEventHandler } from "../../utils/events"; +import { getAllDataMapperSource } from "../orchestrator"; +import { createTempFileAndGenerateMetadata, generateMappings } from "./model"; + +/** + * Inline mapping generation utilities + */ +export async function generateInlineMappingsSource( + inlineMappingRequest: MetadataWithAttachments, + langClient: ExtendedLangClient, + context: any, + eventHandler: CopilotEventHandler, + tempDirectory: string, + targetFileName: string +): Promise { + if (!inlineMappingRequest) { + throw new Error("Inline mapping request is required"); + } + + if (!inlineMappingRequest.metadata) { + throw new Error("Metadata is required for inline mapping generation"); + } + + if (!inlineMappingRequest.metadata.codeData) { + throw new Error("Code data is required for inline mapping generation"); + } + + if (!langClient) { + throw new Error("Language client is required for inline mapping generation"); + } + + const tempFileMetadata = await createTempFileAndGenerateMetadata( + { + tempDir: tempDirectory, + filePath: targetFileName, + metadata: inlineMappingRequest.metadata + }, + langClient, + context + ); + + // Prepare mapping request payload + const mappingRequestPayload: MetadataWithAttachments = { + metadata: tempFileMetadata, + attachments: [] + }; + if (inlineMappingRequest.attachments.length > 0) { + mappingRequestPayload.attachments = inlineMappingRequest.attachments; + } + + // Generate mappings and source code + const allMappingsRequest = await generateMappings( + mappingRequestPayload, + context, + eventHandler + ); + + await getAllDataMapperSource(allMappingsRequest); + + return { + allMappingsRequest, + tempFileMetadata, + tempDir: tempDirectory + }; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/mapping-context.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/mapping-context.ts new file mode 100644 index 00000000000..110a85736c8 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/mapping-context.ts @@ -0,0 +1,229 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + ComponentInfo, + DataMappingRecord, + ExistingFunctionMatchResult, + ImportInfo, + MappingParameters, + ProjectComponentsResponse, + SourceFile, +} from "@wso2/ballerina-core"; +import path from "path"; +import * as fs from 'fs'; +import { ExtendedLangClient } from "../../../../core"; +import { URI } from "vscode-uri"; +import { PackageInfo } from "../types"; +import { findBalFilesInDirectory } from "./temp-project"; +import { extractMappingDetails } from "./extraction"; + +/** + * Mapping context preparation and utilities + */ + +// Build record map from project components +export function buildRecordMap( + projectComponents: ProjectComponentsResponse, + moduleDirs: Map +): Map { + const recordMap = new Map(); + + for (const pkg of projectComponents.components.packages || []) { + for (const mod of pkg.modules || []) { + let filepath = URI.parse(pkg.filePath).fsPath; + if (mod.name !== undefined && moduleDirs.has(mod.name)) { + const modDir = moduleDirs.get(mod.name); + filepath += `${modDir}/${mod.name}/`; + } + + mod.records.forEach((rec: ComponentInfo) => { + const recFilePath = filepath + rec.filePath; + recordMap.set(rec.name, { type: rec.name, isArray: false, filePath: recFilePath }); + }); + } + } + + return recordMap; +} + +// Collect existing functions from project components +export function collectExistingFunctions( + projectComponents: ProjectComponentsResponse, + moduleDirs: Map +): ComponentInfo[] { + const existingFunctions: ComponentInfo[] = []; + + for (const pkg of projectComponents.components.packages || []) { + for (const mod of pkg.modules || []) { + let filepath = URI.parse(pkg.filePath).fsPath; + if (mod.name !== undefined && moduleDirs.has(mod.name)) { + const modDir = moduleDirs.get(mod.name); + filepath += `${modDir}/${mod.name}/`; + } + + mod.functions?.forEach((func: ComponentInfo) => { + existingFunctions.push({ + name: func.name, + filePath: filepath + func.filePath, + startLine: func.startLine, + startColumn: func.startColumn, + endLine: func.endLine, + endColumn: func.endColumn + }); + }); + } + } + + return existingFunctions; +} + +// Get unique file paths from existing functions +export function getUniqueFunctionFilePaths(existingFunctions: ComponentInfo[]): string[] { + return [...new Set(existingFunctions.map(func => func.filePath))]; +} + +// Collect module information that needs directory resolution +export function collectModuleInfo(projectComponents: ProjectComponentsResponse): PackageInfo[] { + const moduleInfo: Array<{ moduleName: string; packageFilePath: string }> = []; + + for (const pkg of projectComponents.components.packages || []) { + for (const mod of pkg.modules || []) { + if (mod.name !== undefined) { + moduleInfo.push({ + moduleName: mod.name, + packageFilePath: pkg.filePath + }); + } + } + } + + return moduleInfo; +} + +// Determine file path for mapping function +export function determineMappingFilePath( + existingFunctionMatch: ExistingFunctionMatchResult, + activeFile: string, + projectRoot?: string +): string { + if (existingFunctionMatch.match) { + return existingFunctionMatch.matchingFunctionFile; + } else if (activeFile && activeFile.endsWith(".bal")) { + return activeFile; + } else { + if (projectRoot) { + const allBalFiles = findBalFilesInDirectory(projectRoot); + if (allBalFiles.length > 0) { + return path.basename(allBalFiles[allBalFiles.length - 1]); + } + } + + return null; + } +} + +// Determine the file path for custom functions +export function determineCustomFunctionsPath( + projectRoot: string, + activeFilePath?: string +): string | null { + const functionsBalPath = path.join(projectRoot, "functions.bal"); + + if (fs.existsSync(functionsBalPath)) { + return functionsBalPath; + } + + const allBalFiles = findBalFilesInDirectory(projectRoot); + + if (activeFilePath) { + const normalizedActiveFilePath = path.join(projectRoot, activeFilePath); + const otherBalFiles = allBalFiles.filter(file => file !== normalizedActiveFilePath); + + if (otherBalFiles.length > 0) { + return otherBalFiles[0]; + } + if (otherBalFiles.length === 0) { + return allBalFiles[0]; + } + } else { + if (allBalFiles.length > 0) { + return allBalFiles[0]; + } + } + + return null; +} + +// Build file array for mapping results +export function buildMappingFileArray( + filePath: string, + finalContent: string, + customFunctionsTargetPath?: string, + customFunctionsContent?: string +): SourceFile[] { + const fileArray: SourceFile[] = [ + { + filePath: filePath, + content: finalContent + } + ]; + + if (customFunctionsContent) { + fileArray.push({ + filePath: customFunctionsTargetPath, + content: customFunctionsContent + }); + } + + return fileArray; +} + +// Prepare mapping context with record map, functions, and mapping details for code generation +export async function prepareMappingContext( + mappingParameters: MappingParameters, + availableRecordTypes: Map, + existingProjectFunctions: ComponentInfo[], + projectImports: ImportInfo[], + functionSourceContents: Map, + currentActiveFileName: string, + langClient: ExtendedLangClient, + projectRoot?: string +): Promise<{ + recordMap: Map; + existingFunctions: ComponentInfo[]; + mappingDetails: any; + filePath: string; +}> { + const extractedMappingDetails = await extractMappingDetails({ + parameters: mappingParameters, + recordMap: Object.fromEntries(availableRecordTypes), + allImports: projectImports, + existingFunctions: existingProjectFunctions, + functionContents: Object.fromEntries(functionSourceContents) + }, langClient); + + const targetFilePath = determineMappingFilePath(extractedMappingDetails.existingFunctionMatch, currentActiveFileName, projectRoot); + + return { + recordMap: availableRecordTypes, + existingFunctions: existingProjectFunctions, + mappingDetails: extractedMappingDetails, + filePath: targetFilePath + }; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/model-optimization.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/model-optimization.ts new file mode 100644 index 00000000000..bd39cbfb128 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/model-optimization.ts @@ -0,0 +1,264 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { DMModel, EnumType, IOTypeField, Mapping, RecordType } from "@wso2/ballerina-core"; + +/** + * DMModel optimization functions for processing and optimizing data mapper models + */ + +export function ensureUnionRefs(model: DMModel): DMModel { + const processedModel = JSON.parse(JSON.stringify(model)); + const unionRefs = new Map(); + + interface FieldVisitor { + visitUnion(field: IOTypeField): void; + visitRecord(field: IOTypeField): void; + visitArray(field: IOTypeField): void; + visitField(field: IOTypeField): void; + } + + class UnionRefCollector implements FieldVisitor { + visitUnion(field: IOTypeField): void { + if (field.ref) { + const refId = field.ref; + + if (!processedModel.refs[refId] && !unionRefs.has(refId)) { + unionRefs.set(refId, { + members: field.members || [], + typeName: field.typeName, + kind: 'union' + }); + } + + field.members = []; + } + } + + visitRecord(field: IOTypeField): void { + if (field.fields) { + this.visitFields(field.fields); + } + } + + visitArray(field: IOTypeField): void { + if (field.member) { + this.visitField(field.member); + } + } + + visitField(field: IOTypeField): void { + if (!field) { return; } + + switch (field.kind) { + case 'union': + this.visitUnion(field); + break; + case 'record': + this.visitRecord(field); + break; + case 'array': + this.visitArray(field); + break; + } + + if (field.members && Array.isArray(field.members)) { + field.members.forEach(member => this.visitField(member)); + } + + if (field.member && field.kind !== 'array') { + this.visitField(field.member); + } + } + + visitFields(fields: IOTypeField[]): void { + if (!fields || !Array.isArray(fields)) { return; } + + for (const field of fields) { + this.visitField(field); + } + } + } + + class UnionMemberClearer implements FieldVisitor { + visitUnion(field: IOTypeField): void { + if (field.ref && field.members) { + field.members = []; + } + } + + visitRecord(field: IOTypeField): void { + if (field.fields) { + this.visitFields(field.fields); + } + } + + visitArray(field: IOTypeField): void { + if (field.member) { + this.visitField(field.member); + } + } + + visitField(field: IOTypeField): void { + if (!field || typeof field !== 'object') { return; } + + if (Array.isArray(field)) { + field.forEach(item => this.visitField(item)); + return; + } + + switch (field.kind) { + case 'union': + this.visitUnion(field); + break; + case 'record': + this.visitRecord(field); + break; + case 'array': + this.visitArray(field); + break; + } + + for (const key of Object.keys(field)) { + if (typeof field[key] === 'object') { + this.visitField(field[key]); + } + } + } + + visitFields(fields: IOTypeField[]): void { + if (!fields || !Array.isArray(fields)) { return; } + + for (const field of fields) { + this.visitField(field); + } + } + } + + const collector = new UnionRefCollector(); + + if (processedModel.inputs) { + collector.visitFields(processedModel.inputs); + } + + if (processedModel.output) { + if (processedModel.output.fields) { + collector.visitFields(processedModel.output.fields); + } else { + collector.visitField(processedModel.output); + } + } + + if (processedModel.subMappings) { + collector.visitFields(processedModel.subMappings); + } + + if (processedModel.refs) { + for (const refKey of Object.keys(processedModel.refs)) { + const refObj = processedModel.refs[refKey]; + if (refObj.fields) { + collector.visitFields(refObj.fields); + } else if (refObj.members) { + refObj.members.forEach((member: IOTypeField) => collector.visitField(member)); + } + } + } + + unionRefs.forEach((unionRef, refId) => { + if (!processedModel.refs[refId]) { + processedModel.refs[refId] = unionRef; + } + }); + + const clearer = new UnionMemberClearer(); + + clearer.visitField(processedModel.inputs); + clearer.visitField(processedModel.output); + if (processedModel.subMappings) { + clearer.visitField(processedModel.subMappings); + } + + if (processedModel.refs) { + for (const refKey of Object.keys(processedModel.refs)) { + const refObj = processedModel.refs[refKey]; + if (refObj.kind === 'record' && refObj.fields) { + clearer.visitField(refObj.fields); + } + } + } + + return processedModel; +} + +export function normalizeRefs(model: DMModel): DMModel { + const processedModel: DMModel = JSON.parse(JSON.stringify(model)); + + function removeRef(field: IOTypeField) { + if (!field || typeof field !== 'object') { return; } + + delete field.ref; + + if (field.member) { removeRef(field.member); } + if (Array.isArray(field.members)) { field.members.forEach(removeRef); } + if ((field as IOTypeField).fields && Array.isArray((field as IOTypeField).fields)) { + (field as IOTypeField).fields.forEach(removeRef); + } + } + + if (processedModel.inputs) { processedModel.inputs.forEach(removeRef); } + + if (processedModel.output) { removeRef(processedModel.output); } + + if (processedModel.subMappings) { + processedModel.subMappings.forEach((sub) => removeRef(sub as IOTypeField)); + } + + const newRefs: Record = {}; + if (processedModel.refs) { + for (const refObj of Object.values(processedModel.refs)) { + const typeName = (refObj as RecordType).typeName; + if (typeName) { + if ((refObj as RecordType).fields) { + (refObj as RecordType).fields.forEach(removeRef); + } + newRefs[typeName] = refObj as RecordType | EnumType; + } + } + } + + processedModel.refs = newRefs; + + return processedModel; +} + +export function omitDefaultMappings(model: DMModel, enabled: boolean = true): DMModel { + if (!enabled || !model.mappings || !Array.isArray(model.mappings)) { + return model; + } + + const processedModel: DMModel = JSON.parse(JSON.stringify(model)); + + processedModel.mappings = processedModel.mappings.filter((mapping: Mapping) => { + if (!mapping.inputs || !Array.isArray(mapping.inputs)) { + return true; + } + return mapping.inputs.length > 0; + }); + + return processedModel; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/model.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/model.ts new file mode 100644 index 00000000000..cb31504c3de --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/model.ts @@ -0,0 +1,268 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + AllDataMapperSourceRequest, + CodeData, + CreateTempFileRequest, + DataMapperMetadata, + DatamapperModelContext, + DataMapperModelResponse, + DMModel, + ExtendedDataMapperMetadata, + IORoot, + LinePosition, + Mapping, + MetadataWithAttachments, + SyntaxTree, +} from "@wso2/ballerina-core"; +import { Uri } from "vscode"; +import { generateMappingExpressionsFromModel } from "../../../../rpc-managers/ai-panel/utils"; +import { ExtendedLangClient, NOT_SUPPORTED } from "../../../../core"; +import { STKindChecker, STNode } from "@wso2/syntax-tree"; +import path from "path"; +import { CopilotEventHandler } from "../../utils/events"; +import { ensureUnionRefs, normalizeRefs, omitDefaultMappings } from "./model-optimization"; +import { createCustomFunctionsFile, createTempDataMappingFile, getFunctionDefinitionFromSyntaxTree } from "./temp-project"; + +/** + * Data mapper model generation and processing + */ + +// Set to false to include mappings with default values +const OMIT_DEFAULT_MAPPINGS_ENABLED = true; + +export async function generateDataMapperModel( + params: DatamapperModelContext, + langClient: ExtendedLangClient, + context: any +): Promise { + let filePath: string; + let identifier: string; + let dataMapperMetadata: DataMapperMetadata; + + if (params && params.documentUri && params.identifier) { + filePath = params.documentUri; + identifier = params.identifier; + dataMapperMetadata = params.dataMapperMetadata; + } else { + filePath = context.documentUri; + identifier = context.identifier || context.dataMapperMetadata.name; + dataMapperMetadata = context.dataMapperMetadata; + } + + let position: LinePosition = { + line: dataMapperMetadata.codeData.lineRange.startLine.line, + offset: dataMapperMetadata.codeData.lineRange.startLine.offset + }; + + if (!dataMapperMetadata.codeData.hasOwnProperty('node') || + dataMapperMetadata.codeData.node !== "VARIABLE") { + const fileUri = Uri.file(filePath).toString(); + const fnSTByRange = await langClient.getSTByRange({ + lineRange: { + start: { + line: dataMapperMetadata.codeData.lineRange.startLine.line, + character: dataMapperMetadata.codeData.lineRange.startLine.offset + }, + end: { + line: dataMapperMetadata.codeData.lineRange.endLine.line, + character: dataMapperMetadata.codeData.lineRange.endLine.offset + } + }, + documentIdentifier: { uri: fileUri } + }); + + if (fnSTByRange === NOT_SUPPORTED) { + throw new Error("Syntax tree retrieval not supported"); + } + + const fnSt = (fnSTByRange as SyntaxTree).syntaxTree as STNode; + + if (STKindChecker.isFunctionDefinition(fnSt) && + STKindChecker.isExpressionFunctionBody(fnSt.functionBody)) { + position = { + line: fnSt.functionBody.expression.position.startLine, + offset: fnSt.functionBody.expression.position.startColumn + }; + } + } + + let dataMapperModel = await langClient + .getDataMapperMappings({ + filePath, + codedata: dataMapperMetadata.codeData, + targetField: identifier, + position: position + }) as DataMapperModelResponse; + + if (!dataMapperModel) { + console.error('DataMapperModel is undefined', dataMapperModel); + throw new Error('Failed to retrieve DataMapperModel from language client'); + } + + let mappingsModel = ensureUnionRefs(dataMapperModel.mappingsModel as DMModel); + mappingsModel = normalizeRefs(mappingsModel); + mappingsModel = omitDefaultMappings(mappingsModel, OMIT_DEFAULT_MAPPINGS_ENABLED); + + if (mappingsModel.subMappings && mappingsModel.subMappings.length > 0) { + mappingsModel.subMappings = await processSubMappings( + mappingsModel.subMappings as IORoot[], + filePath, + dataMapperMetadata.codeData, + langClient, + position + ); + } + + return { mappingsModel }; +} + +export async function createTempFileAndGenerateMetadata(params: CreateTempFileRequest, langClient: ExtendedLangClient, context: any): Promise { + let filePath = await createTempDataMappingFile(params); + + if (!params.metadata || Object.keys(params.metadata).length === 0) { + const funcDefinitionNode = await getFunctionDefinitionFromSyntaxTree( + langClient, + filePath, + params.functionName + ); + + const dataMapperMetadata = { + name: params.functionName, + codeData: { + lineRange: { + fileName: filePath, + startLine: { + line: funcDefinitionNode.position.startLine, + offset: funcDefinitionNode.position.startColumn, + }, + endLine: { + line: funcDefinitionNode.position.endLine, + offset: funcDefinitionNode.position.endColumn, + }, + }, + } + }; + + const dataMapperModel = await generateDataMapperModel( + { + documentUri: filePath, + identifier: params.functionName, + dataMapperMetadata: dataMapperMetadata + }, + langClient, + context + ); + + return { + mappingsModel: dataMapperModel.mappingsModel as DMModel, + name: params.functionName, + codeData: dataMapperMetadata.codeData + }; + } + + const updatedMetadata = { + ...params.metadata, + codeData: { + ...params.metadata.codeData, + lineRange: { + ...params.metadata.codeData.lineRange, + fileName: filePath + } + } + }; + + return { + mappingsModel: updatedMetadata.mappingsModel, + name: params.functionName || updatedMetadata.name, + codeData: updatedMetadata.codeData + }; +} + +export async function generateMappings( + metadataWithAttachments: MetadataWithAttachments, + context: any, + eventHandler: CopilotEventHandler +): Promise { + const targetFilePath = metadataWithAttachments.metadata.codeData.lineRange.fileName || context.documentUri; + + const generatedMappings = await generateMappingExpressionsFromModel( + metadataWithAttachments.metadata.mappingsModel as DMModel, + metadataWithAttachments.attachments || [], + eventHandler + ); + + const customFunctionMappings = generatedMappings.filter(mapping => mapping.isFunctionCall); + let customFunctionsFilePath: string | undefined; + + if (customFunctionMappings.length > 0) { + let tempDirectory = path.dirname(metadataWithAttachments.metadata.codeData.lineRange.fileName); + customFunctionsFilePath = await createCustomFunctionsFile( + tempDirectory, + customFunctionMappings + ); + } + + const allMappingsRequest: AllDataMapperSourceRequest = { + filePath: targetFilePath, + codedata: metadataWithAttachments.metadata.codeData, + varName: metadataWithAttachments.metadata.name, + position: { + line: metadataWithAttachments.metadata.codeData.lineRange.startLine.line, + offset: metadataWithAttachments.metadata.codeData.lineRange.startLine.offset + }, + mappings: generatedMappings, + customFunctionsFilePath + }; + + return allMappingsRequest; +} + +async function processSubMappings( + subMappings: IORoot[], + filePath: string, + codeData: CodeData, + langClient: ExtendedLangClient, + position?: LinePosition +): Promise { + const allSubMappings: Mapping[] = []; + + for (const subMapping of subMappings) { + const subMappingCodeData = await langClient.getSubMappingCodedata({ + filePath, + codedata: codeData, + view: (subMapping as IORoot).name + }); + + const subMappingModel = await langClient.getDataMapperMappings({ + filePath, + codedata: subMappingCodeData.codedata, + targetField: (subMapping as IORoot).name, + position: position + }) as DataMapperModelResponse; + + if (subMappingModel.mappingsModel && + 'mappings' in subMappingModel.mappingsModel && + subMappingModel.mappingsModel.mappings) { + allSubMappings.push(...subMappingModel.mappingsModel.mappings); + } + } + + return allSubMappings; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/repair.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/repair.ts new file mode 100644 index 00000000000..84562edddd4 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/repair.ts @@ -0,0 +1,52 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + DiagnosticList, + TempDirectoryPath, +} from "@wso2/ballerina-core"; +import { ExtendedLangClient } from "../../../../core"; +import { addMissingRequiredFields, attemptRepairProject, checkProjectDiagnostics } from "../../../../rpc-managers/ai-panel/repair-utils"; + +/** + * Code repair and diagnostics checking utilities + */ + +export async function repairAndCheckDiagnostics( + langClient: ExtendedLangClient, + projectRoot: string, + params: TempDirectoryPath +): Promise { + let diagnostics = await attemptRepairProject(langClient, projectRoot); + + // Add missing required fields and recheck diagnostics + let isDiagsChanged = await addMissingRequiredFields(diagnostics, langClient); + if (isDiagsChanged) { + diagnostics = await checkProjectDiagnostics(langClient, projectRoot); + } + + const filteredDiagnostics = diagnostics.filter(diag => + params.filePaths.some(filePath => diag.uri.includes(filePath)) + ); + + return { diagnosticsList: filteredDiagnostics }; +} + +// NOTE: Old file-based repair functions have been removed. +// The new DM Model-based repair workflow is implemented in orchestrator.ts +// using getDMModel(), repairMappingsWithLLM(), repairCheckErrors(), etc. diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/temp-project.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/temp-project.ts new file mode 100644 index 00000000000..6fab0604037 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/temp-project.ts @@ -0,0 +1,195 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { CreateTempFileRequest, DataMappingRecord, ImportInfo, Mapping, SyntaxTree } from "@wso2/ballerina-core"; +import path from "path"; +import * as fs from 'fs'; +import * as os from 'os'; +import { Uri } from "vscode"; +import { writeBallerinaFileDidOpenTemp } from "../../../../utils/modification"; +import { ExtendedLangClient } from "../../../../core"; +import { FunctionDefinition, ModulePart, STKindChecker } from "@wso2/syntax-tree"; +import { StateMachine } from "../../../../stateMachine"; +import { createDataMappingFunctionSource } from "./code-generation"; + +/** + * Temporary file and directory management for data mapping + */ + +export async function createTempDataMappingFile(params: CreateTempFileRequest): Promise { + let funcSource: string; + + if (!params.hasMatchingFunction) { + if (params.inputs && params.output && params.functionName && params.inputNames) { + funcSource = createDataMappingFunctionSource( + params.inputs, + params.output, + params.functionName, + params.inputNames + ); + } + } + + const tempFilePath = await createTempBallerinaFile( + params.tempDir, + params.filePath, + funcSource, + params.imports, + params.hasMatchingFunction + ); + + return tempFilePath; +} + +export async function createCustomFunctionsFile( + tempDir: string, + customFunctions: Mapping[] +): Promise { + let functionsSource = customFunctions + .map(f => f.functionContent) + .filter(Boolean) + .join('\n\n'); + + const customFunctionsFilePath = path.join(tempDir, "functions.bal"); + let existingContent = ""; + if (fs.existsSync(customFunctionsFilePath)) { + existingContent = fs.readFileSync(customFunctionsFilePath, 'utf8'); + } + + functionsSource = existingContent + "\n\n" + functionsSource; + + writeBallerinaFileDidOpenTemp(customFunctionsFilePath, functionsSource); + return customFunctionsFilePath; +} + +// Helper function to recursively find all .bal files in a directory +export function findBalFilesInDirectory(dir: string): string[] { + let balFiles: string[] = []; + + try { + const entries = fs.readdirSync(dir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + + // Skip node_modules, target, and hidden directories + if (entry.isDirectory() && !entry.name.startsWith('.') && + entry.name !== 'node_modules' && entry.name !== 'target') { + balFiles = balFiles.concat(findBalFilesInDirectory(fullPath)); + } else if (entry.isFile() && entry.name.endsWith('.bal')) { + balFiles.push(fullPath); + } + } + } catch (error) { + // If directory cannot be read, return empty array + console.error(`Error reading directory ${dir}:`, error); + } + + return balFiles; +} + +export async function getFunctionDefinitionFromSyntaxTree( + langClient: ExtendedLangClient, + filePath: string, + functionName: string +): Promise { + const st = (await langClient.getSyntaxTree({ + documentIdentifier: { + uri: Uri.file(filePath).toString(), + }, + })) as SyntaxTree; + + const modulePart = st.syntaxTree as ModulePart; + + for (const member of modulePart.members) { + if (STKindChecker.isFunctionDefinition(member)) { + const funcDef = member as FunctionDefinition; + if (funcDef.functionName?.value === functionName) { + return funcDef; + } + } + } + + return null; +} + +async function createTempBallerinaFile( + tempDir: string, + filePath: string, + funcSource?: string, + imports?: ImportInfo[], + functionExists?: boolean +): Promise { + let fullSource = funcSource; + + if (imports && imports.length > 0) { + const importsString = imports + .map(({ moduleName, alias }) => + alias ? `import ${moduleName} as ${alias};` : `import ${moduleName};` + ) + .join("\n"); + fullSource = `${importsString}\n\n${funcSource}`; + } + + const tempTestFilePath = path.join(tempDir, filePath); + + let existingContent = ""; + if (fs.existsSync(tempTestFilePath)) { + existingContent = fs.readFileSync(tempTestFilePath, 'utf8'); + } + + if (!functionExists) { + if (!funcSource) { + fullSource = existingContent; + } else { + fullSource = existingContent + fullSource; + } + } else { + fullSource = existingContent; + } + writeBallerinaFileDidOpenTemp(tempTestFilePath, fullSource); + return tempTestFilePath; +} + +export function extractImports(content: string, filePath: string): { filePath: string; statements: ImportInfo[] } { + const withoutSingleLineComments = content.replace(/\/\/.*$/gm, ""); + const withoutComments = withoutSingleLineComments.replace(/\/\*[\s\S]*?\*\//g, ""); + + const importRegex = /import\s+([\w\.\/]+)(?:\s+as\s+([\w]+))?;/g; + const imports: ImportInfo[] = []; + let match; + + while ((match = importRegex.exec(withoutComments)) !== null) { + const importStatement: ImportInfo = { moduleName: match[1] }; + if (match[2]) { + importStatement.alias = match[2]; + } + imports.push(importStatement); + } + + return { filePath, statements: imports }; +} + +export async function getCustomFunctionsContent( + customFunctionsFilePath: string | undefined, +): Promise { + if (!customFunctionsFilePath) { + return ""; + } + return fs.readFileSync(customFunctionsFilePath, 'utf8'); +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/type-utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/type-utils.ts new file mode 100644 index 00000000000..f37126d8d95 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/type-utils.ts @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ErrorType, NullablePrimitiveType, PrimitiveArrayType, PrimitiveType } from "../constants"; + +/** + * Type checking utilities for Ballerina types + */ + +export const isPrimitiveType = (type: string): boolean => { + return Object.values(PrimitiveType).includes(type as PrimitiveType); +}; + +export const isNullablePrimitiveType = (type: string): boolean => { + return Object.values(NullablePrimitiveType).includes(type as NullablePrimitiveType); +}; + +export const isPrimitiveArrayType = (type: string): boolean => { + if (Object.values(PrimitiveArrayType).includes(type as PrimitiveArrayType)) { + return true; + } + + const unionArrayPattern = /^\(([^)]+)\)\[\](\?)?$/; + const match = type.match(unionArrayPattern); + + if (match) { + const unionTypes = match[1].split('|').map(t => t.trim()); + return unionTypes.every(unionType => + isPrimitiveType(unionType) || isNullablePrimitiveType(unionType) + ); + } + return false; +}; + +const isErrorType = (type: string): boolean => { + return Object.values(ErrorType).includes(type as ErrorType); +}; + +export const isAnyPrimitiveType = (type: string): boolean => { + return isPrimitiveType(type) || isNullablePrimitiveType(type) || isPrimitiveArrayType(type) || isErrorType(type); +}; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/types-generation.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/types-generation.ts new file mode 100644 index 00000000000..746c30efa58 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/data-mapper/utils/types-generation.ts @@ -0,0 +1,160 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + Attachment, + ComponentInfo, + DataMappingRecord, + GenerateTypesFromRecordRequest, + GenerateTypesFromRecordResponse, + ModuleSummary, + PackageSummary, + ProjectComponentsResponse, + SyntaxTree, +} from "@wso2/ballerina-core"; +import path from "path"; +import { Uri } from "vscode"; +import { writeBallerinaFileDidOpen } from "../../../../utils/modification"; +import { ExtendedLangClient } from "../../../../core"; +import { ModulePart, STKindChecker } from "@wso2/syntax-tree"; +import { extractRecordTypeDefinitionsFromFile } from "../../../../rpc-managers/ai-panel/utils"; +import { TypesGenerationResult } from "../types"; +import { existsSync, readFileSync } from "fs"; + +/** + * Type extraction and generation from context + */ + +// Extract record and enum types from syntax tree +export async function extractRecordTypesFromSyntaxTree( + langClient: ExtendedLangClient, + filePath: string +): Promise<{ records: string[]; enums: string[] }> { + const st = (await langClient.getSyntaxTree({ + documentIdentifier: { + uri: Uri.file(filePath).toString(), + }, + })) as SyntaxTree; + + if (!st.syntaxTree) { + throw new Error("Failed to retrieve syntax tree for file: " + filePath); + } + + const modulePart = st.syntaxTree as ModulePart; + const records: string[] = []; + const enums: string[] = []; + + for (const member of modulePart.members) { + if (STKindChecker.isTypeDefinition(member)) { + const typeName = member.typeName?.value; + if (typeName) { + records.push(typeName); + } + } else if (STKindChecker.isEnumDeclaration(member)) { + const enumName = member.identifier?.value; + if (enumName) { + enums.push(enumName); + } + } + } + + return { records, enums }; +} + +// Generate Ballerina record types from context attachments and validate against existing records +// TODO: Refactor this. We need to generate types, get diagnostics, and validate in a better way. +export async function generateTypesFromContext( + sourceAttachments: Attachment[], + projectComponents: ProjectComponentsResponse, + tempDirectory: string +): Promise { + if (!sourceAttachments || sourceAttachments.length === 0) { + throw new Error("Source attachments are required for type generation"); + } + + if (!projectComponents) { + throw new Error("Project components are required for type generation"); + } + + const outputFileName = "types.bal"; + const existingRecordTypesMap = new Map(); + + projectComponents.components.packages?.forEach((packageSummary: PackageSummary) => { + packageSummary.modules?.forEach((moduleSummary: ModuleSummary) => { + let baseFilePath = packageSummary.filePath; + if (moduleSummary.name !== undefined) { + baseFilePath += `modules/${moduleSummary.name}/`; + } + moduleSummary.records.forEach((recordComponent: ComponentInfo) => { + const recordFilePath = baseFilePath + recordComponent.filePath; + existingRecordTypesMap.set(recordComponent.name, { type: recordComponent.name, isArray: false, filePath: recordFilePath }); + }); + moduleSummary.types.forEach((typeComponent: ComponentInfo) => { + const typeFilePath = baseFilePath + typeComponent.filePath; + existingRecordTypesMap.set(typeComponent.name, { type: typeComponent.name, isArray: false, filePath: typeFilePath }); + }); + moduleSummary.enums.forEach((enumComponent: ComponentInfo) => { + const enumFilePath = baseFilePath + enumComponent.filePath; + existingRecordTypesMap.set(enumComponent.name, { type: enumComponent.name, isArray: false, filePath: enumFilePath }); + }); + }); + }); + + // Generate type definitions from all attachments together + const typeGenerationRequest: GenerateTypesFromRecordRequest = { + attachment: sourceAttachments + }; + + const typeGenerationResponse = await generateTypeCreation(typeGenerationRequest); + const generatedTypesCode = typeGenerationResponse.typesCode; + + // Use provided temp directory + const tempTypesFilePath = path.join(tempDirectory, outputFileName); + + // Check if types.bal already exists and append new types + let finalTypesCode = generatedTypesCode; + if (existsSync(tempTypesFilePath)) { + const existingContent = readFileSync(tempTypesFilePath, 'utf-8'); + finalTypesCode = existingContent.trim() + '\n\n' + generatedTypesCode.trim(); + } + + writeBallerinaFileDidOpen(tempTypesFilePath, finalTypesCode); + + return { + typesCode: finalTypesCode, + filePath: outputFileName, + recordMap: existingRecordTypesMap + }; +} + +// Generate Ballerina record type definitions from attachment files +export async function generateTypeCreation( + typeGenerationRequest: GenerateTypesFromRecordRequest +): Promise { + if (typeGenerationRequest.attachment.length === 0) { + throw new Error('No attachments provided for type generation'); + } + + // Process all attachments together to understand correlations + const generatedTypeDefinitions = await extractRecordTypeDefinitionsFromFile(typeGenerationRequest.attachment); + if (typeof generatedTypeDefinitions !== 'string') { + throw new Error(`Failed to generate types: ${JSON.stringify(generatedTypeDefinitions)}`); + } + + return { typesCode: generatedTypeDefinitions }; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/dataMapping.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/dataMapping.ts deleted file mode 100644 index b9f8e46cd88..00000000000 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/dataMapping.ts +++ /dev/null @@ -1,1524 +0,0 @@ -/** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. - * - * WSO2 LLC. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { AllDataMapperSourceRequest, Attachment, CodeData, ComponentInfo, createFunctionSignature, CreateTempFileRequest, DataMapperMetadata, DatamapperModelContext, DataMapperModelResponse, DataMappingRecord, DiagnosticList, DMModel, EnumType, ExistingFunctionMatchResult, ExtendedDataMapperMetadata, ExtractMappingDetailsRequest, ExtractMappingDetailsResponse, GenerateTypesFromRecordRequest, GenerateTypesFromRecordResponse, getSource, ImportInfo, ImportStatements, InlineMappingsSourceResult, IORoot, IOTypeField, keywords, LinePosition, Mapping, MappingParameters, MetadataWithAttachments, ModuleSummary, PackageSummary, ProjectComponentsResponse, RecordType, RepairCodeParams, SourceFile, SyntaxTree, TempDirectoryPath } from "@wso2/ballerina-core"; -import { camelCase } from "lodash"; -import path from "path"; -import * as fs from 'fs'; -import * as os from 'os'; -import { Uri } from "vscode"; -import { extractRecordTypeDefinitionsFromFile, generateMappingExpressionsFromModel } from "../../rpc-managers/ai-panel/utils"; -import { writeBallerinaFileDidOpenTemp } from "../../utils/modification"; -import { ExtendedLangClient, NOT_SUPPORTED } from "../../core"; -import { DefaultableParam, FunctionDefinition, IncludedRecordParam, ModulePart, RequiredParam, RestParam, STKindChecker, STNode } from "@wso2/syntax-tree"; -import { addMissingRequiredFields, attemptRepairProject, checkProjectDiagnostics } from "../../../src/rpc-managers/ai-panel/repair-utils"; -import { ErrorType, NullablePrimitiveType, PrimitiveArrayType, PrimitiveType } from "./constants"; -import { INVALID_RECORD_REFERENCE } from "../../../src/views/ai-panel/errorCodes"; -import { PackageInfo, TypesGenerationResult } from "./service/datamapper/types"; -import { URI } from "vscode-uri"; -import { getAllDataMapperSource } from "./service/datamapper/datamapper"; -import { StateMachine } from "../../stateMachine"; -import { CopilotEventHandler } from "./service/event"; - -// Set to false to include mappings with default values -const OMIT_DEFAULT_MAPPINGS_ENABLED = true; - -// ================================================================================================ -// Utility Functions - Type checking and validation helpers -// ================================================================================================ - -const isPrimitiveType = (type: string): boolean => { - return Object.values(PrimitiveType).includes(type as PrimitiveType); -}; - -const isNullablePrimitiveType = (type: string): boolean => { - return Object.values(NullablePrimitiveType).includes(type as NullablePrimitiveType); -}; - -const isPrimitiveArrayType = (type: string): boolean => { - if (Object.values(PrimitiveArrayType).includes(type as PrimitiveArrayType)) { - return true; - } - - const unionArrayPattern = /^\(([^)]+)\)\[\](\?)?$/; - const match = type.match(unionArrayPattern); - - if (match) { - const unionTypes = match[1].split('|').map(t => t.trim()); - return unionTypes.every(unionType => - isPrimitiveType(unionType) || isNullablePrimitiveType(unionType) - ); - } - return false; -}; - -const isErrorType = (type: string): boolean => { - return Object.values(ErrorType).includes(type as ErrorType); -}; - -const isAnyPrimitiveType = (type: string): boolean => { - return isPrimitiveType(type) || isNullablePrimitiveType(type) || isPrimitiveArrayType(type) || isErrorType(type); -}; - -// ================================================================================================ -// Common Data Mapper Functions - Shared utilities for all mapping processes -// ================================================================================================ - -export async function createTempDataMappingFile(params: CreateTempFileRequest): Promise { - let funcSource: string; - - if (!params.hasMatchingFunction) { - if (params.inputs && params.output && params.functionName && params.inputNames) { - funcSource = createDataMappingFunctionSource( - params.inputs, - params.output, - params.functionName, - params.inputNames - ); - } - } - - const tempFilePath = await createTempBallerinaFile( - params.tempDir, - params.filePath, - funcSource, - params.imports, - params.hasMatchingFunction - ); - - return tempFilePath; -} - -export async function createCustomFunctionsFile( - tempDir: string, - customFunctions: Mapping[] -): Promise { - let functionsSource = customFunctions - .map(f => f.functionContent) - .filter(Boolean) - .join('\n\n'); - - const customFunctionsFilePath = path.join(tempDir, "functions.bal"); - let existingContent = ""; - if (fs.existsSync(customFunctionsFilePath)) { - existingContent = fs.readFileSync(customFunctionsFilePath, 'utf8'); - } - - functionsSource = existingContent + "\n\n" + functionsSource; - - writeBallerinaFileDidOpenTemp(customFunctionsFilePath, functionsSource); - return customFunctionsFilePath; -} - -// Helper function to recursively find all .bal files in a directory -function findBalFilesInDirectory(dir: string): string[] { - let balFiles: string[] = []; - - try { - const entries = fs.readdirSync(dir, { withFileTypes: true }); - - for (const entry of entries) { - const fullPath = path.join(dir, entry.name); - - // Skip node_modules, target, and hidden directories - if (entry.isDirectory() && !entry.name.startsWith('.') && - entry.name !== 'node_modules' && entry.name !== 'target') { - balFiles = balFiles.concat(findBalFilesInDirectory(fullPath)); - } else if (entry.isFile() && entry.name.endsWith('.bal')) { - balFiles.push(fullPath); - } - } - } catch (error) { - // If directory cannot be read, return empty array - console.error(`Error reading directory ${dir}:`, error); - } - - return balFiles; -} - -export async function getFunctionDefinitionFromSyntaxTree( - langClient: ExtendedLangClient, - filePath: string, - functionName: string -): Promise { - const st = (await langClient.getSyntaxTree({ - documentIdentifier: { - uri: Uri.file(filePath).toString(), - }, - })) as SyntaxTree; - - const modulePart = st.syntaxTree as ModulePart; - - for (const member of modulePart.members) { - if (STKindChecker.isFunctionDefinition(member)) { - const funcDef = member as FunctionDefinition; - if (funcDef.functionName?.value === functionName) { - return funcDef; - } - } - } - - return null; -} - -async function createTempBallerinaFile( - tempDir: string, - filePath: string, - funcSource?: string, - imports?: ImportInfo[], - functionExists?: boolean -): Promise { - let fullSource = funcSource; - - if (imports && imports.length > 0) { - const importsString = imports - .map(({ moduleName, alias }) => - alias ? `import ${moduleName} as ${alias};` : `import ${moduleName};` - ) - .join("\n"); - fullSource = `${importsString}\n\n${funcSource}`; - } - - const tempTestFilePath = path.join(tempDir, filePath); - - let existingContent = ""; - if (fs.existsSync(tempTestFilePath)) { - existingContent = fs.readFileSync(tempTestFilePath, 'utf8'); - } - - if (!functionExists) { - if (!funcSource) { - fullSource = existingContent; - } else { - fullSource = existingContent + "\n\n" + fullSource; - } - } else { - fullSource = existingContent; - } - writeBallerinaFileDidOpenTemp(tempTestFilePath, fullSource); - return tempTestFilePath; -} - -export async function createTempBallerinaDir(): Promise { - const projectRoot = StateMachine.context().projectPath; - const randomNum = Math.floor(Math.random() * 90000) + 10000; - const tempDir = fs.mkdtempSync( - path.join(os.tmpdir(), `ballerina-data-mapping-${randomNum}-`) - ); - fs.cpSync(projectRoot, tempDir, { recursive: true }); - return tempDir; -} - -export function createDataMappingFunctionSource( - inputParams: DataMappingRecord[], - outputParam: DataMappingRecord, - functionName: string, - inputNames: string[] -): string { - const parametersStr = buildParametersString(inputParams, inputNames); - const returnTypeStr = buildReturnTypeString(outputParam); - - const modification = createFunctionSignature( - "", - functionName, - parametersStr, - returnTypeStr, - { startLine: 0, startColumn: 0 }, - false, - true, - "{}" - ); - - return getSource(modification); -} - -function buildParametersString( - inputParams: DataMappingRecord[], - inputNames: string[] -): string { - return inputParams - .map((item, index) => { - const paramName = - inputNames[index] || getDefaultParamName(item.type, item.isArray); - return formatParameter(item, paramName); - }) - .join(", "); -} - -function getDefaultParamName(type: string, isArray: boolean): string { - const processedType = processType(type); - - switch (processedType) { - case PrimitiveType.STRING: - return isArray ? "strArr" : "str"; - case PrimitiveType.INT: - return isArray ? "numArr" : "num"; - case PrimitiveType.FLOAT: - return isArray ? "fltArr" : "flt"; - case PrimitiveType.DECIMAL: - return isArray ? "decArr" : "dec"; - case PrimitiveType.BOOLEAN: - return isArray ? "flagArr" : "flag"; - default: - const camelCaseName = camelCase(processedType); - // Check if the camelCase name is a reserved keyword - return keywords.includes(camelCaseName) ? `'${camelCaseName}` : camelCaseName; - } -} - -function processType(type: string): string { - let typeName = type.includes("/") ? type.split("/").pop()! : type; - - if (typeName.includes(":")) { - const [modulePart, typePart] = typeName.split(":"); - typeName = `${modulePart.split(".").pop()}:${typePart}`; - } - - return typeName; -} - -function formatParameter( - item: DataMappingRecord, - paramName: string -): string { - return `${processType(item.type)}${item.isArray ? "[]" : ""} ${paramName}`; -} - -function buildReturnTypeString(outputParam: DataMappingRecord): string { - return `returns ${processType(outputParam.type)}${outputParam.isArray ? "[]" : "" - }`; -} - -export async function generateDataMapperModel( - params: DatamapperModelContext, - langClient: ExtendedLangClient, - context: any -): Promise { - let filePath: string; - let identifier: string; - let dataMapperMetadata: DataMapperMetadata; - - if (params && params.documentUri && params.identifier) { - filePath = params.documentUri; - identifier = params.identifier; - dataMapperMetadata = params.dataMapperMetadata; - } else { - filePath = context.documentUri; - identifier = context.identifier || context.dataMapperMetadata.name; - dataMapperMetadata = context.dataMapperMetadata; - } - - let position: LinePosition = { - line: dataMapperMetadata.codeData.lineRange.startLine.line, - offset: dataMapperMetadata.codeData.lineRange.startLine.offset - }; - - if (!dataMapperMetadata.codeData.hasOwnProperty('node') || - dataMapperMetadata.codeData.node !== "VARIABLE") { - const fileUri = Uri.file(filePath).toString(); - const fnSTByRange = await langClient.getSTByRange({ - lineRange: { - start: { - line: dataMapperMetadata.codeData.lineRange.startLine.line, - character: dataMapperMetadata.codeData.lineRange.startLine.offset - }, - end: { - line: dataMapperMetadata.codeData.lineRange.endLine.line, - character: dataMapperMetadata.codeData.lineRange.endLine.offset - } - }, - documentIdentifier: { uri: fileUri } - }); - - if (fnSTByRange === NOT_SUPPORTED) { - throw new Error("Syntax tree retrieval not supported"); - } - - const fnSt = (fnSTByRange as SyntaxTree).syntaxTree as STNode; - - if (STKindChecker.isFunctionDefinition(fnSt) && - STKindChecker.isExpressionFunctionBody(fnSt.functionBody)) { - position = { - line: fnSt.functionBody.expression.position.startLine, - offset: fnSt.functionBody.expression.position.startColumn - }; - } - } - - let dataMapperModel = await langClient - .getDataMapperMappings({ - filePath, - codedata: dataMapperMetadata.codeData, - targetField: identifier, - position: position - }) as DataMapperModelResponse; - - if (!dataMapperModel) { - console.error('DataMapperModel is undefined', dataMapperModel); - throw new Error('Failed to retrieve DataMapperModel from language client'); - } - - let mappingsModel = ensureUnionRefs(dataMapperModel.mappingsModel as DMModel); - mappingsModel = normalizeRefs(mappingsModel); - mappingsModel = omitDefaultMappings(mappingsModel, OMIT_DEFAULT_MAPPINGS_ENABLED); - - if (mappingsModel.subMappings && mappingsModel.subMappings.length > 0) { - mappingsModel.subMappings = await processSubMappings( - mappingsModel.subMappings as IORoot[], - filePath, - dataMapperMetadata.codeData, - langClient, - position - ); - } - - return { mappingsModel }; -} - -export async function createTempFileAndGenerateMetadata(params: CreateTempFileRequest, langClient: ExtendedLangClient, context: any): Promise { - let filePath = await createTempDataMappingFile(params); - - if (!params.metadata || Object.keys(params.metadata).length === 0) { - const funcDefinitionNode = await getFunctionDefinitionFromSyntaxTree( - langClient, - filePath, - params.functionName - ); - - const dataMapperMetadata = { - name: params.functionName, - codeData: { - lineRange: { - fileName: filePath, - startLine: { - line: funcDefinitionNode.position.startLine, - offset: funcDefinitionNode.position.startColumn, - }, - endLine: { - line: funcDefinitionNode.position.endLine, - offset: funcDefinitionNode.position.endColumn, - }, - }, - } - }; - - const dataMapperModel = await generateDataMapperModel( - { - documentUri: filePath, - identifier: params.functionName, - dataMapperMetadata: dataMapperMetadata - }, - langClient, - context - ); - - return { - mappingsModel: dataMapperModel.mappingsModel as DMModel, - name: params.functionName, - codeData: dataMapperMetadata.codeData - }; - } - - const updatedMetadata = { - ...params.metadata, - codeData: { - ...params.metadata.codeData, - lineRange: { - ...params.metadata.codeData.lineRange, - fileName: filePath - } - } - }; - - return { - mappingsModel: updatedMetadata.mappingsModel, - name: params.functionName || updatedMetadata.name, - codeData: updatedMetadata.codeData - }; -} - -export async function generateMappings( - metadataWithAttachments: MetadataWithAttachments, - context: any, - eventHandler: CopilotEventHandler -): Promise { - const targetFilePath = metadataWithAttachments.metadata.codeData.lineRange.fileName || context.documentUri; - - const generatedMappings = await generateMappingExpressionsFromModel( - metadataWithAttachments.metadata.mappingsModel as DMModel, - metadataWithAttachments.attachments || [], - eventHandler - ); - - const customFunctionMappings = generatedMappings.filter(mapping => mapping.isFunctionCall); - let customFunctionsFilePath: string | undefined; - - if (customFunctionMappings.length > 0) { - let tempDirectory = path.dirname(metadataWithAttachments.metadata.codeData.lineRange.fileName); - customFunctionsFilePath = await createCustomFunctionsFile( - tempDirectory, - customFunctionMappings - ); - } - - const allMappingsRequest: AllDataMapperSourceRequest = { - filePath: targetFilePath, - codedata: metadataWithAttachments.metadata.codeData, - varName: metadataWithAttachments.metadata.name, - position: { - line: metadataWithAttachments.metadata.codeData.lineRange.startLine.line, - offset: metadataWithAttachments.metadata.codeData.lineRange.startLine.offset - }, - mappings: generatedMappings, - customFunctionsFilePath - }; - - return allMappingsRequest; -} - -// ================================================================================================ -// DMModel Optimization - Functions for processing and optimizing data mapper models -// ================================================================================================ -export function ensureUnionRefs(model: DMModel): DMModel { - const processedModel = JSON.parse(JSON.stringify(model)); - const unionRefs = new Map(); - - interface FieldVisitor { - visitUnion(field: IOTypeField): void; - visitRecord(field: IOTypeField): void; - visitArray(field: IOTypeField): void; - visitField(field: IOTypeField): void; - } - - class UnionRefCollector implements FieldVisitor { - visitUnion(field: IOTypeField): void { - if (field.ref) { - const refId = field.ref; - - if (!processedModel.refs[refId] && !unionRefs.has(refId)) { - unionRefs.set(refId, { - members: field.members || [], - typeName: field.typeName, - kind: 'union' - }); - } - - field.members = []; - } - } - - visitRecord(field: IOTypeField): void { - if (field.fields) { - this.visitFields(field.fields); - } - } - - visitArray(field: IOTypeField): void { - if (field.member) { - this.visitField(field.member); - } - } - - visitField(field: IOTypeField): void { - if (!field) { return; } - - switch (field.kind) { - case 'union': - this.visitUnion(field); - break; - case 'record': - this.visitRecord(field); - break; - case 'array': - this.visitArray(field); - break; - } - - if (field.members && Array.isArray(field.members)) { - field.members.forEach(member => this.visitField(member)); - } - - if (field.member && field.kind !== 'array') { - this.visitField(field.member); - } - } - - visitFields(fields: IOTypeField[]): void { - if (!fields || !Array.isArray(fields)) { return; } - - for (const field of fields) { - this.visitField(field); - } - } - } - - class UnionMemberClearer implements FieldVisitor { - visitUnion(field: IOTypeField): void { - if (field.ref && field.members) { - field.members = []; - } - } - - visitRecord(field: IOTypeField): void { - if (field.fields) { - this.visitFields(field.fields); - } - } - - visitArray(field: IOTypeField): void { - if (field.member) { - this.visitField(field.member); - } - } - - visitField(field: IOTypeField): void { - if (!field || typeof field !== 'object') { return; } - - if (Array.isArray(field)) { - field.forEach(item => this.visitField(item)); - return; - } - - switch (field.kind) { - case 'union': - this.visitUnion(field); - break; - case 'record': - this.visitRecord(field); - break; - case 'array': - this.visitArray(field); - break; - } - - for (const key of Object.keys(field)) { - if (typeof field[key] === 'object') { - this.visitField(field[key]); - } - } - } - - visitFields(fields: IOTypeField[]): void { - if (!fields || !Array.isArray(fields)) { return; } - - for (const field of fields) { - this.visitField(field); - } - } - } - - const collector = new UnionRefCollector(); - - if (processedModel.inputs) { - collector.visitFields(processedModel.inputs); - } - - if (processedModel.output) { - if (processedModel.output.fields) { - collector.visitFields(processedModel.output.fields); - } else { - collector.visitField(processedModel.output); - } - } - - if (processedModel.subMappings) { - collector.visitFields(processedModel.subMappings); - } - - if (processedModel.refs) { - for (const refKey of Object.keys(processedModel.refs)) { - const refObj = processedModel.refs[refKey]; - if (refObj.fields) { - collector.visitFields(refObj.fields); - } else if (refObj.members) { - refObj.members.forEach((member: IOTypeField) => collector.visitField(member)); - } - } - } - - unionRefs.forEach((unionRef, refId) => { - if (!processedModel.refs[refId]) { - processedModel.refs[refId] = unionRef; - } - }); - - const clearer = new UnionMemberClearer(); - - clearer.visitField(processedModel.inputs); - clearer.visitField(processedModel.output); - if (processedModel.subMappings) { - clearer.visitField(processedModel.subMappings); - } - - if (processedModel.refs) { - for (const refKey of Object.keys(processedModel.refs)) { - const refObj = processedModel.refs[refKey]; - if (refObj.kind === 'record' && refObj.fields) { - clearer.visitField(refObj.fields); - } - } - } - - return processedModel; -} - -export function normalizeRefs(model: DMModel): DMModel { - const processedModel: DMModel = JSON.parse(JSON.stringify(model)); - - function removeRef(field: IOTypeField) { - if (!field || typeof field !== 'object') { return; } - - delete field.ref; - - if (field.member) { removeRef(field.member); } - if (Array.isArray(field.members)) { field.members.forEach(removeRef); } - if ((field as IOTypeField).fields && Array.isArray((field as IOTypeField).fields)) { - (field as IOTypeField).fields.forEach(removeRef); - } - } - - if (processedModel.inputs) { processedModel.inputs.forEach(removeRef); } - - if (processedModel.output) { removeRef(processedModel.output); } - - if (processedModel.subMappings) { - processedModel.subMappings.forEach((sub) => removeRef(sub as IOTypeField)); - } - - const newRefs: Record = {}; - if (processedModel.refs) { - for (const refObj of Object.values(processedModel.refs)) { - const typeName = (refObj as RecordType).typeName; - if (typeName) { - if ((refObj as RecordType).fields) { - (refObj as RecordType).fields.forEach(removeRef); - } - newRefs[typeName] = refObj as RecordType | EnumType; - } - } - } - - processedModel.refs = newRefs; - - return processedModel; -} - -export function omitDefaultMappings(model: DMModel, enabled: boolean = true): DMModel { - if (!enabled || !model.mappings || !Array.isArray(model.mappings)) { - return model; - } - - const processedModel: DMModel = JSON.parse(JSON.stringify(model)); - - processedModel.mappings = processedModel.mappings.filter((mapping: Mapping) => { - if (!mapping.inputs || !Array.isArray(mapping.inputs)) { - return true; - } - return mapping.inputs.length > 0; - }); - - return processedModel; -} - -async function processSubMappings( - subMappings: IORoot[], - filePath: string, - codeData: CodeData, - langClient: ExtendedLangClient, - position?: LinePosition -): Promise { - const allSubMappings: Mapping[] = []; - - for (const subMapping of subMappings) { - const subMappingCodeData = await langClient.getSubMappingCodedata({ - filePath, - codedata: codeData, - view: (subMapping as IORoot).name - }); - - const subMappingModel = await langClient.getDataMapperMappings({ - filePath, - codedata: subMappingCodeData.codedata, - targetField: (subMapping as IORoot).name, - position: position - }) as DataMapperModelResponse; - - if (subMappingModel.mappingsModel && - 'mappings' in subMappingModel.mappingsModel && - subMappingModel.mappingsModel.mappings) { - allSubMappings.push(...subMappingModel.mappingsModel.mappings); - } - } - - return allSubMappings; -} - -// ================================================================================================ -// Mapping Details Extraction - Functions for extracting and validating mapping parameters -// ================================================================================================ - -export async function extractMappingDetails( - params: ExtractMappingDetailsRequest, - langClient: ExtendedLangClient -): Promise { - const { parameters, recordMap, allImports, existingFunctions } = params; - const importsMap: Record = {}; - let inputParams: string[]; - let outputParam: string; - let inputNames: string[] = []; - - const existingFunctionMatch = await processExistingFunctions( - existingFunctions, - parameters.functionName, - langClient - ); - - const hasProvidedRecords = parameters.inputRecord.length > 0 || parameters.outputRecord !== ""; - - if (hasProvidedRecords) { - if (existingFunctionMatch.match) { - throw new Error( - `"${parameters.functionName}" function already exists. Please provide a valid function name.` - ); - } - inputParams = parameters.inputRecord; - outputParam = parameters.outputRecord; - } else { - if (!existingFunctionMatch.match || !existingFunctionMatch.functionDefNode) { - throw new Error( - `"${parameters.functionName}" function was not found. Please provide a valid function name.` - ); - } - - const funcNode = existingFunctionMatch.functionDefNode; - const params = funcNode.functionSignature.parameters?.filter( - (param): param is RequiredParam | DefaultableParam | RestParam | IncludedRecordParam => - param.kind !== 'CommaToken' - ) ?? []; - - inputParams = params.map(param => (param.typeName.source || "").trim()); - inputNames = params.map(param => (param.paramName.value || "").trim()); - outputParam = (funcNode.functionSignature.returnTypeDesc.type.source || "").trim(); - } - - const inputs = processInputs(inputParams, recordMap, allImports, importsMap); - const output = processOutput(outputParam, recordMap, allImports, importsMap); - - return { - inputs, - output, - inputParams, - outputParam, - imports: Object.values(importsMap), - inputNames, - existingFunctionMatch, - }; -} - -// Processes existing functions to find a matching function by name -export async function processExistingFunctions( - existingFunctions: ComponentInfo[], - functionName: string, - langClient: ExtendedLangClient -): Promise { - for (const func of existingFunctions) { - const filePath = func.filePath; - const fileName = filePath.split("/").pop(); - - const funcDefNode = await getFunctionDefinitionFromSyntaxTree(langClient, filePath, functionName); - if (funcDefNode) { - return { - match: true, - matchingFunctionFile: fileName, - functionDefNode: funcDefNode, - }; - } else { - continue; - } - } - - return { - match: false, - matchingFunctionFile: null, - functionDefNode: null, - }; -} - -// Process input parameters -export function processInputs( - inputParams: string[], - recordMap: Record, - allImports: ImportInfo[], - importsMap: Record -) { - let results = inputParams.map((param: string) => - processRecordReference(param, recordMap, allImports, importsMap) - ); - return results.filter((result): result is DataMappingRecord => { - if (result instanceof Error) { - throw INVALID_RECORD_REFERENCE; - } - return true; - }); -} - -// Process Output parameters -export function processOutput( - outputParam: string, - recordMap: Record, - allImports: ImportInfo[], - importsMap: Record -) { - const outputResult = processRecordReference(outputParam, recordMap, allImports, importsMap); - if (outputResult instanceof Error) { - throw INVALID_RECORD_REFERENCE; - } - return outputResult; -} - -// Validate and register an imported type in the imports map -function registerImportedType( - typeName: string, - allImports: ImportInfo[], - importsMap: Record -): void { - if (!typeName.includes("/")) { - const [moduleName, recName] = typeName.split(":"); - const matchedImport = allImports.find((imp) => { - if (imp.alias) { - return typeName.startsWith(imp.alias); - } - const moduleNameParts = imp.moduleName.split(/[./]/); - const inferredAlias = moduleNameParts[moduleNameParts.length - 1]; - return typeName.startsWith(inferredAlias); - }); - - if (!matchedImport) { - throw new Error(`Import not found for: ${typeName}`); - } - importsMap[typeName] = { - moduleName: matchedImport.moduleName, - alias: matchedImport.alias, - recordName: recName, - }; - } else { - const [moduleName, recName] = typeName.split(":"); - importsMap[typeName] = { - moduleName: moduleName, - recordName: recName, - }; - } -} - -// Validate that a type exists as either a primitive, local record, or imported type -function validateTypeExists( - typeName: string, - recordMap: Record, - allImports: ImportInfo[], - importsMap: Record -): void { - if (isAnyPrimitiveType(typeName)) { - return; - } - - const cleanedType = typeName.replace(/\[\]$/, ""); - if (recordMap[cleanedType]) { - return; - } - - if (cleanedType.includes(":")) { - registerImportedType(cleanedType, allImports, importsMap); - return; - } - - throw new Error(`${cleanedType} is not defined.`); -} - -// Process and validate a union type, returning its data mapping record -function processUnionType( - unionTypeString: string, - recordMap: Record, - allImports: ImportInfo[], - importsMap: Record -): DataMappingRecord { - const unionTypes = unionTypeString.split("|").map(t => t.trim()); - - for (const unionType of unionTypes) { - validateTypeExists(unionType, recordMap, allImports, importsMap); - } - - return { type: unionTypeString, isArray: false, filePath: null }; -} - -// Process and validate a single type reference, returning its data mapping record -function processSingleType( - typeName: string, - recordMap: Record, - allImports: ImportInfo[], - importsMap: Record -): DataMappingRecord { - if (isAnyPrimitiveType(typeName)) { - return { type: typeName, isArray: false, filePath: null }; - } - - const isArray = typeName.endsWith("[]") && !isPrimitiveArrayType(typeName); - const cleanedRecordName = isArray ? typeName.replace(/\[\]$/, "") : typeName; - - const rec = recordMap[cleanedRecordName]; - - if (rec) { - return { ...rec, isArray }; - } - - if (cleanedRecordName.includes(":")) { - registerImportedType(cleanedRecordName, allImports, importsMap); - return { type: typeName, isArray, filePath: null }; - } - - throw new Error(`${cleanedRecordName} is not defined.`); -} - -// Process a record type reference and validate it exists, handling both union and single types -export function processRecordReference( - recordName: string, - recordMap: Record, - allImports: ImportInfo[], - importsMap: Record -): DataMappingRecord { - const trimmedRecordName = recordName.trim(); - - if (trimmedRecordName.includes("|")) { - return processUnionType(trimmedRecordName, recordMap, allImports, importsMap); - } - - return processSingleType(trimmedRecordName, recordMap, allImports, importsMap); -} - -// ================================================================================================ -// Code Repair, Diagnostics, and Mapping Generation -// ================================================================================================ - -export async function repairAndCheckDiagnostics( - langClient: ExtendedLangClient, - projectRoot: string, - params: TempDirectoryPath -): Promise { - const targetDir = params.tempDir && params.tempDir.trim() !== "" ? params.tempDir : projectRoot; - - let diagnostics = await attemptRepairProject(langClient, targetDir); - - // Add missing required fields and recheck diagnostics - let isDiagsChanged = await addMissingRequiredFields(diagnostics, langClient); - if (isDiagsChanged) { - diagnostics = await checkProjectDiagnostics(langClient, targetDir); - } - - const filteredDiagnostics = diagnostics.filter(diag => - params.filePaths.some(filePath => diag.uri.includes(filePath)) - ); - - return { diagnosticsList: filteredDiagnostics }; -} - -// ================================================================================================ -// processInlineMappings - Functions for processing inline mapping parameters -// ================================================================================================ - -export async function generateInlineMappingsSource( - inlineMappingRequest: MetadataWithAttachments, - langClient: ExtendedLangClient, - context: any, - eventHandler: CopilotEventHandler -): Promise { - if (!inlineMappingRequest) { - throw new Error("Inline mapping request is required"); - } - - if (!inlineMappingRequest.metadata) { - throw new Error("Metadata is required for inline mapping generation"); - } - - if (!inlineMappingRequest.metadata.codeData) { - throw new Error("Code data is required for inline mapping generation"); - } - - if (!langClient) { - throw new Error("Language client is required for inline mapping generation"); - } - - const targetFileName = inlineMappingRequest.metadata.codeData.lineRange.fileName; - - if (!targetFileName) { - throw new Error("Target file name could not be determined from code data"); - } - - const tempDirectory = await createTempBallerinaDir(); - const tempFileMetadata = await createTempFileAndGenerateMetadata( - { - tempDir: tempDirectory, - filePath: targetFileName, - metadata: inlineMappingRequest.metadata - }, - langClient, - context - ); - - // Prepare mapping request payload - const mappingRequestPayload: MetadataWithAttachments = { - metadata: tempFileMetadata, - attachments: [] - }; - if (inlineMappingRequest.attachments.length > 0) { - mappingRequestPayload.attachments = inlineMappingRequest.attachments; - } - - // Generate mappings and source code - const allMappingsRequest = await generateMappings( - mappingRequestPayload, - context, - eventHandler - ); - - const generatedSourceResponse = await getAllDataMapperSource(allMappingsRequest); - - return { - sourceResponse: generatedSourceResponse, - allMappingsRequest, - tempFileMetadata, - tempDir: tempDirectory - }; -} - -// ================================================================================================ -// processContextTypeCreation - Functions for processing context type creation -// ================================================================================================ - -// Extract record and enum types from syntax tree -export async function extractRecordTypesFromSyntaxTree( - langClient: ExtendedLangClient, - filePath: string -): Promise<{ records: string[]; enums: string[] }> { - const st = (await langClient.getSyntaxTree({ - documentIdentifier: { - uri: Uri.file(filePath).toString(), - }, - })) as SyntaxTree; - - if (!st.syntaxTree) { - throw new Error("Failed to retrieve syntax tree for file: " + filePath); - } - - const modulePart = st.syntaxTree as ModulePart; - const records: string[] = []; - const enums: string[] = []; - - for (const member of modulePart.members) { - if (STKindChecker.isTypeDefinition(member)) { - const typeName = member.typeName?.value; - if (typeName) { - records.push(typeName); - } - } else if (STKindChecker.isEnumDeclaration(member)) { - const enumName = member.identifier?.value; - if (enumName) { - enums.push(enumName); - } - } - } - - return { records, enums }; -} - -// Generate Ballerina record types from context attachments and validate against existing records -export async function generateTypesFromContext( - sourceAttachments: Attachment[], - projectComponents: ProjectComponentsResponse, - langClient: ExtendedLangClient -): Promise { - if (!sourceAttachments || sourceAttachments.length === 0) { - throw new Error("Source attachments are required for type generation"); - } - - if (!projectComponents) { - throw new Error("Project components are required for type generation"); - } - - const outputFileName = "types.bal"; - const existingRecordTypesMap = new Map(); - - projectComponents.components.packages?.forEach((packageSummary: PackageSummary) => { - packageSummary.modules?.forEach((moduleSummary: ModuleSummary) => { - let baseFilePath = packageSummary.filePath; - if (moduleSummary.name !== undefined) { - baseFilePath += `modules/${moduleSummary.name}/`; - } - moduleSummary.records.forEach((recordComponent: ComponentInfo) => { - const recordFilePath = baseFilePath + recordComponent.filePath; - existingRecordTypesMap.set(recordComponent.name, { type: recordComponent.name, isArray: false, filePath: recordFilePath }); - }); - moduleSummary.types.forEach((typeComponent: ComponentInfo) => { - const typeFilePath = baseFilePath + typeComponent.filePath; - existingRecordTypesMap.set(typeComponent.name, { type: typeComponent.name, isArray: false, filePath: typeFilePath }); - }); - moduleSummary.enums.forEach((enumComponent: ComponentInfo) => { - const enumFilePath = baseFilePath + enumComponent.filePath; - existingRecordTypesMap.set(enumComponent.name, { type: enumComponent.name, isArray: false, filePath: enumFilePath }); - }); - }); - }); - - // Generate type definitions from all attachments together - const typeGenerationRequest: GenerateTypesFromRecordRequest = { - attachment: sourceAttachments - }; - - const typeGenerationResponse = await generateTypeCreation(typeGenerationRequest); - const generatedTypesCode = typeGenerationResponse.typesCode; - - // Create temp directory and file to validate generated types - const tempDirectory = await createTempBallerinaDir(); - const tempTypesFilePath = path.join(tempDirectory, outputFileName); - - writeBallerinaFileDidOpenTemp(tempTypesFilePath, generatedTypesCode); - - // Extract record and enum names from syntax tree - const { records: generatedRecords, enums: generatedEnums } = await extractRecordTypesFromSyntaxTree(langClient, tempTypesFilePath); - - // Check for duplicate record names - for (const recordName of generatedRecords) { - if (existingRecordTypesMap.has(recordName)) { - throw new Error(`Record "${recordName}" already exists in the workspace`); - } - } - - // Check for duplicate enum names - for (const enumName of generatedEnums) { - if (existingRecordTypesMap.has(enumName)) { - throw new Error(`Enum "${enumName}" already exists in the workspace`); - } - } - - return { - typesCode: generatedTypesCode, - filePath: outputFileName, - recordMap: existingRecordTypesMap - }; -} - -// Generate Ballerina record type definitions from attachment files -export async function generateTypeCreation( - typeGenerationRequest: GenerateTypesFromRecordRequest -): Promise { - if (typeGenerationRequest.attachment.length === 0) { - throw new Error('No attachments provided for type generation'); - } - - // Process all attachments together to understand correlations - const generatedTypeDefinitions = await extractRecordTypeDefinitionsFromFile(typeGenerationRequest.attachment); - if (typeof generatedTypeDefinitions !== 'string') { - throw new Error(`Failed to generate types: ${JSON.stringify(generatedTypeDefinitions)}`); - } - - return { typesCode: generatedTypeDefinitions }; -} - -export function extractImports(content: string, filePath: string): ImportStatements { - const withoutSingleLineComments = content.replace(/\/\/.*$/gm, ""); - const withoutComments = withoutSingleLineComments.replace(/\/\*[\s\S]*?\*\//g, ""); - - const importRegex = /import\s+([\w\.\/]+)(?:\s+as\s+([\w]+))?;/g; - const imports: ImportInfo[] = []; - let match; - - while ((match = importRegex.exec(withoutComments)) !== null) { - const importStatement: ImportInfo = { moduleName: match[1] }; - if (match[2]) { - importStatement.alias = match[2]; - } - imports.push(importStatement); - } - - return { filePath, statements: imports }; -} - -// ================================================================================================ -// Code Repair and Content Update - Functions for repairing code and getting updated content -// ================================================================================================ - -// Collect file paths for diagnostics checking -function collectDiagnosticFilePaths( - tempFileMetadata: ExtendedDataMapperMetadata, - customFunctionsFilePath?: string -): string[] { - const filePaths = [tempFileMetadata.codeData.lineRange.fileName]; - if (customFunctionsFilePath) { - filePaths.push(customFunctionsFilePath); - } - return filePaths; -} - -// Prepare source files for LLM repair -function prepareSourceFilesForRepair( - mainFilePath: string, - mainContent: string, - customFunctionsFilePath: string | undefined, - customFunctionsContent: string -): SourceFile[] { - const sourceFiles: SourceFile[] = [ - { - filePath: mainFilePath, - content: mainContent, - } - ]; - - if (customFunctionsFilePath) { - sourceFiles.push({ - filePath: customFunctionsFilePath, - content: customFunctionsContent, - }); - } - - return sourceFiles; -} - -// Get custom functions content if file exists -export async function getCustomFunctionsContent( - customFunctionsFilePath: string | undefined, -): Promise { - if (!customFunctionsFilePath) { - return ""; - } - return fs.readFileSync(customFunctionsFilePath, 'utf8'); -} - -// Check diagnostics and attempt repair -async function checkAndRepairDiagnostics( - params: RepairCodeParams, - langClient: ExtendedLangClient, - projectRoot: string -): Promise { - const diagnosticsParams: TempDirectoryPath = { - filePaths: collectDiagnosticFilePaths(params.tempFileMetadata, params.customFunctionsFilePath) - }; - - if (params.tempDir) { - diagnosticsParams.tempDir = params.tempDir; - } - - return await repairAndCheckDiagnostics(langClient, projectRoot, diagnosticsParams); -} - -// ================================================================================================ -// processMappingParameters - Functions for processing mapping parameters -// ================================================================================================ - -// Build record map from project components -export function buildRecordMap( - projectComponents: ProjectComponentsResponse, - moduleDirs: Map -): Map { - const recordMap = new Map(); - - for (const pkg of projectComponents.components.packages || []) { - for (const mod of pkg.modules || []) { - let filepath = URI.parse(pkg.filePath).fsPath; - if (mod.name !== undefined && moduleDirs.has(mod.name)) { - const modDir = moduleDirs.get(mod.name); - filepath += `${modDir}/${mod.name}/`; - } - - mod.records.forEach((rec: ComponentInfo) => { - const recFilePath = filepath + rec.filePath; - recordMap.set(rec.name, { type: rec.name, isArray: false, filePath: recFilePath }); - }); - - mod.types.forEach((type: ComponentInfo) => { - const typeFilePath = filepath + type.filePath; - recordMap.set(type.name, { type: type.name, isArray: false, filePath: typeFilePath }); - }); - } - } - - return recordMap; -} - -// Collect existing functions from project components -export function collectExistingFunctions( - projectComponents: ProjectComponentsResponse, - moduleDirs: Map -): ComponentInfo[] { - const existingFunctions: ComponentInfo[] = []; - - for (const pkg of projectComponents.components.packages || []) { - for (const mod of pkg.modules || []) { - let filepath = URI.parse(pkg.filePath).fsPath; - if (mod.name !== undefined && moduleDirs.has(mod.name)) { - const modDir = moduleDirs.get(mod.name); - filepath += `${modDir}/${mod.name}/`; - } - - mod.functions?.forEach((func: ComponentInfo) => { - existingFunctions.push({ - name: func.name, - filePath: filepath + func.filePath, - startLine: func.startLine, - startColumn: func.startColumn, - endLine: func.endLine, - endColumn: func.endColumn - }); - }); - } - } - - return existingFunctions; -} - -// Get unique file paths from existing functions -export function getUniqueFunctionFilePaths(existingFunctions: ComponentInfo[]): string[] { - return [...new Set(existingFunctions.map(func => func.filePath))]; -} - -// Collect module information that needs directory resolution -export function collectModuleInfo(projectComponents: ProjectComponentsResponse): PackageInfo[] { - const moduleInfo: Array<{ moduleName: string; packageFilePath: string }> = []; - - for (const pkg of projectComponents.components.packages || []) { - for (const mod of pkg.modules || []) { - if (mod.name !== undefined) { - moduleInfo.push({ - moduleName: mod.name, - packageFilePath: pkg.filePath - }); - } - } - } - - return moduleInfo; -} - -// Determine file path for mapping function -export function determineMappingFilePath( - existingFunctionMatch: ExistingFunctionMatchResult, - activeFile: string, - projectRoot?: string -): string { - if (existingFunctionMatch.match) { - return existingFunctionMatch.matchingFunctionFile; - } else if (activeFile && activeFile.endsWith(".bal")) { - return activeFile; - } else { - if (projectRoot) { - const allBalFiles = findBalFilesInDirectory(projectRoot); - if (allBalFiles.length > 0) { - return path.basename(allBalFiles[allBalFiles.length - 1]); - } - } - - return null; - } -} - -// Determine the file path for custom functions -export function determineCustomFunctionsPath( - projectRoot: string, - activeFilePath?: string -): string | null { - const functionsBalPath = path.join(projectRoot, "functions.bal"); - - if (fs.existsSync(functionsBalPath)) { - return functionsBalPath; - } - - const allBalFiles = findBalFilesInDirectory(projectRoot); - - if (activeFilePath) { - const normalizedActiveFilePath = path.join(projectRoot, activeFilePath); - const otherBalFiles = allBalFiles.filter(file => file !== normalizedActiveFilePath); - - if (otherBalFiles.length > 0) { - return otherBalFiles[0]; - } - if (otherBalFiles.length === 0) { - return allBalFiles[0]; - } - } else { - if (allBalFiles.length > 0) { - return allBalFiles[0]; - } - } - - return null; -} - -// Build file array for mapping results -export function buildMappingFileArray( - filePath: string, - finalContent: string, - customFunctionsTargetPath?: string, - customFunctionsContent?: string -): SourceFile[] { - const fileArray: SourceFile[] = [ - { - filePath: filePath, - content: finalContent - } - ]; - - if (customFunctionsContent) { - fileArray.push({ - filePath: customFunctionsTargetPath, - content: customFunctionsContent - }); - } - - return fileArray; -} - -// Prepare mapping context with record map, functions, and mapping details for code generation -export async function prepareMappingContext( - mappingParameters: MappingParameters, - availableRecordTypes: Map, - existingProjectFunctions: ComponentInfo[], - projectImports: ImportInfo[], - functionSourceContents: Map, - currentActiveFileName: string, - langClient: ExtendedLangClient, - projectRoot?: string -): Promise<{ - recordMap: Map; - existingFunctions: ComponentInfo[]; - mappingDetails: ExtractMappingDetailsResponse; - filePath: string; -}> { - const extractedMappingDetails = await extractMappingDetails({ - parameters: mappingParameters, - recordMap: Object.fromEntries(availableRecordTypes), - allImports: projectImports, - existingFunctions: existingProjectFunctions, - functionContents: Object.fromEntries(functionSourceContents) - }, langClient); - - const targetFilePath = determineMappingFilePath(extractedMappingDetails.existingFunctionMatch, currentActiveFileName, projectRoot); - - return { - recordMap: availableRecordTypes, - existingFunctions: existingProjectFunctions, - mappingDetails: extractedMappingDetails, - filePath: targetFilePath - }; -} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/doc_generator.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/documentation/generator.ts similarity index 90% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/doc_generator.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/documentation/generator.ts index 6e4c132b016..994e4a1eb69 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/doc_generator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/documentation/generator.ts @@ -17,10 +17,10 @@ */ import { DocGenerationRequest } from '@wso2/ballerina-core'; -import { getServiceDeclaration } from '../../testGenerator'; -import { generateDocumentation, DocumentationGenerationRequest } from './documentation'; -import { getProjectSource, getOpenAPISpecification } from '../../utils'; -import { getCurrentProjectRoot } from '../../../../utils/project-utils'; +import { generateDocumentation, DocumentationGenerationRequest } from './index'; +import { getOpenAPISpecification, getProjectSource } from '../utils'; +import { getCurrentProjectRoot } from '../../../utils/project-utils'; +import { getServiceDeclaration } from './utils'; // Main documentation generator function that handles all the logic export async function generateDocumentationForService(params: DocGenerationRequest): Promise { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/documentation.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/documentation/index.ts similarity index 68% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/documentation.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/documentation/index.ts index 01c917fb644..5425b38a5ff 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/documentation.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/documentation/index.ts @@ -16,14 +16,16 @@ import { Command, ProjectSource } from "@wso2/ballerina-core"; import { streamText, ModelMessage } from "ai"; -import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; +import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../utils/ai-client"; import { getDocumentationGenerationSystemPrompt, createDocumentationGenMessages } from "./prompts"; -import { CopilotEventHandler, createWebviewEventHandler } from "../event"; -import { getErrorMessage } from "../utils"; -import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; +import { CopilotEventHandler, createWebviewEventHandler } from "../utils/events"; +import { getErrorMessage } from "../utils/ai-utils"; +import { chatStateStorage } from "../../../views/ai-panel/chatStateStorage"; +import { StateMachine } from "../../../stateMachine"; +import { createExecutorConfig } from "../agent/index"; export type DocumentationGenerationRequest = { serviceName: string; @@ -34,7 +36,8 @@ export type DocumentationGenerationRequest = { // Core documentation generation function that emits events export async function generateDocumentationCore( params: DocumentationGenerationRequest, - eventHandler: CopilotEventHandler + eventHandler: CopilotEventHandler, + abortController: AbortController ): Promise { const systemPrompt = getDocumentationGenerationSystemPrompt(); const userMessages: ModelMessage[] = createDocumentationGenMessages(params); @@ -52,7 +55,7 @@ export async function generateDocumentationCore( maxOutputTokens: 16384, temperature: 0, messages: allMessages, - abortSignal: AIPanelAbortController.getInstance().signal, + abortSignal: abortController.signal, }); eventHandler({ type: "start" }); @@ -96,10 +99,35 @@ export async function generateDocumentationCore( // Main public function that uses the default event handler export async function generateDocumentation(params: DocumentationGenerationRequest): Promise { const eventHandler = createWebviewEventHandler(Command.Doc); + + // Create config for abort support + const config = createExecutorConfig(params, { + command: Command.Doc, + chatStorageEnabled: false, + cleanupStrategy: 'immediate' + }); + + const workspaceId = StateMachine.context().projectPath; + const threadId = 'default'; + try { - await generateDocumentationCore(params, eventHandler); + // Register execution for abort support + chatStateStorage.setActiveExecution(workspaceId, threadId, { + generationId: config.generationId, + abortController: config.abortController + }); + + await generateDocumentationCore(params, eventHandler, config.abortController); } catch (error) { - console.error("Error during documentation generation:", error); - eventHandler({ type: "error", content: getErrorMessage(error) }); + if ((error as any).name === 'AbortError' || config.abortController.signal.aborted) { + console.log("[Documentation] Aborted by user."); + eventHandler({ type: "abort", command: Command.Doc }); + } else { + console.error("Error during documentation generation:", error); + eventHandler({ type: "error", content: getErrorMessage(error) }); + } + } finally { + // Clear active execution + chatStateStorage.clearActiveExecution(workspaceId, threadId); } } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/prompts.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/documentation/prompts.ts similarity index 99% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/prompts.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/documentation/prompts.ts index 467cb7fdcb0..aa4cabcef54 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/prompts.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/documentation/prompts.ts @@ -14,7 +14,7 @@ // specific language governing permissions and limitations // under the License. -import { DocumentationGenerationRequest } from "./documentation"; +import { DocumentationGenerationRequest } from "./index"; import { ModelMessage } from "ai"; import { flattenProjectToText, getExternalTypesAsJsonSchema } from "./utils"; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/documentation/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/documentation/utils.ts new file mode 100644 index 00000000000..2be9b0fabeb --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/documentation/utils.ts @@ -0,0 +1,183 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { ProjectSource, SyntaxTree } from "@wso2/ballerina-core"; +import { getProjectSource } from "../utils"; +import { ModulePart, ServiceDeclaration, STKindChecker } from "@wso2/syntax-tree"; +import { Uri } from "vscode"; +import { StateMachine } from "../../../../src/stateMachine"; + +// ============================================== +// UTILITY FUNCTIONS +// ============================================== + +export function extractDocumentationFromResponse(response: string): string { + // For now, return the full response as documentation + // In the future, we might want to extract specific sections or format it + return response.trim(); +} + +export function flattenProjectToText(projectSource: ProjectSource): string { + let flattenedProject = ""; + + const modules = projectSource.projectModules; + if (modules) { + for (const module of modules) { + let moduleSource = ""; + for (const sourceFile of module.sourceFiles) { + moduleSource += `\`\`\`ballerina +# modules/${module.moduleName}/${sourceFile.filePath} + +${sourceFile.content} +\`\`\` + +`; + } + flattenedProject += moduleSource; + } + } + + for (const sourceFile of projectSource.sourceFiles) { + flattenedProject += `\`\`\`ballerina +# ${sourceFile.filePath} + +${sourceFile.content} +\`\`\` + +`; + } + + return flattenedProject; +} + +export function getExternalTypesAsJsonSchema(openApiSpec: string): string { + try { + const externalTypes: Record = {}; + + const openApiSpecObj = JSON.parse(openApiSpec); + const components = openApiSpecObj.components; + + if (components && components.schemas) { + for (const componentName in components.schemas) { + const componentSchema = components.schemas[componentName]; + if (componentSchema && componentSchema['x-ballerina-type'] !== undefined) { + externalTypes[componentName] = componentSchema; + } + } + } + + return JSON.stringify(externalTypes, null, 2); + } catch (error) { + // Return empty object if parsing fails + return "{}"; + } +} + +export function getTypesAsJsonSchema(openApiSpec: string): string { + try { + const openApiSpecObj = JSON.parse(openApiSpec); + const components = openApiSpecObj.components; + + if (components) { + return JSON.stringify(components, null, 2); + } + + return "{}"; + } catch (error) { + // Return empty object if parsing fails + return "{}"; + } +} + +export async function getServiceDeclaration(projectRoot: string, serviceName: string): Promise<{ serviceDeclaration: ServiceDeclaration | null, serviceDocFilePath: string }> { + const projectSource = await getProjectSource(projectRoot); + if (!projectSource) { + throw new Error("The current project is not recognized as a valid Ballerina project. Please ensure you have opened a Ballerina project."); + } + + let serviceDeclaration: ServiceDeclaration | null = null; + let serviceDocFilePath = ""; + + for (const sourceFile of projectSource.sourceFiles) { + serviceDocFilePath = sourceFile.filePath; + const fileUri = Uri.file(serviceDocFilePath).toString(); + const syntaxTree = await StateMachine.langClient().getSyntaxTree({ + documentIdentifier: { + uri: fileUri + } + }) as SyntaxTree; + const matchedService = findMatchingServiceDeclaration(syntaxTree, serviceName); + if (matchedService) { + serviceDeclaration = matchedService; + break; + } + } + + if (!serviceDeclaration) { + throw new Error(`Couldn't find any services matching the service name provided, which is "${serviceName}". Please recheck if the provided service name is correct.`); + } + + return { serviceDeclaration, serviceDocFilePath }; +} + +const findMatchingServiceDeclaration = (syntaxTree: SyntaxTree, targetServiceName: string): ServiceDeclaration | null => { + const serviceDeclarations = findServiceDeclarations(syntaxTree); + + for (const serviceDecl of serviceDeclarations) { + const serviceName = constructServiceName(serviceDecl); + if (serviceName === targetServiceName) { + return serviceDecl; + } + } + + return null; +}; + +const findServiceDeclarations = (syntaxTree: SyntaxTree): ServiceDeclaration[] => { + const serviceDeclarations: ServiceDeclaration[] = []; + + const modulePartNode = syntaxTree.syntaxTree as ModulePart; + for (const member of modulePartNode.members) { + if (STKindChecker.isServiceDeclaration(member)) { + serviceDeclarations.push(member); + } + } + return serviceDeclarations; +}; + +function constructServiceName(targetNode: ServiceDeclaration): string { + return targetNode.absoluteResourcePath.map(item => { + if ('value' in item) { return item.value; } + if ('literalToken' in item) { return item.literalToken.value; } + return ''; + }).join(''); +} + +export async function getServiceDeclarationNames(projectRoot: string): Promise { + const projectSource = await getProjectSource(projectRoot); + if (!projectSource) { + throw new Error("Invalid Ballerina project. Please open a valid Ballerina project."); + } + + return (await Promise.all( + projectSource.sourceFiles.map(async ({ filePath }) => { + const syntaxTree = await StateMachine.langClient().getSyntaxTree({ + documentIdentifier: { uri: Uri.file(filePath).toString() } + }) as SyntaxTree; + return findServiceDeclarations(syntaxTree).map(constructServiceName); + }) + )).flat(); +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/executors/base/AICommandExecutor.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/executors/base/AICommandExecutor.ts new file mode 100644 index 00000000000..3aaa5d108a8 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/executors/base/AICommandExecutor.ts @@ -0,0 +1,315 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ExecutionContext, Command } from '@wso2/ballerina-core'; +import { CopilotEventHandler } from '../../utils/events'; +import { chatStateStorage, ChatStateStorage } from '../../../../views/ai-panel/chatStateStorage'; +import { getTempProject, cleanupTempProject } from '../../utils/project/temp-project'; +import { getErrorMessage } from '../../utils/ai-utils'; + +/** + * Unified configuration for all AI command executors + * Consolidates execution config and command-specific parameters into single object + */ +export interface AICommandConfig { + /** Execution context with original workspace paths */ + executionContext: ExecutionContext; + /** Event handler for communicating with frontend */ + eventHandler: CopilotEventHandler; + /** Unique message ID for this execution */ + generationId: string; + /** Abort controller for cancellation */ + abortController: AbortController; + /** Command-specific parameters */ + params: TParams; + + /** Optional chat storage configuration */ + chatStorage?: { + workspaceId: string; + threadId: string; + enabled: boolean; + }; + + /** Optional lifecycle configuration */ + lifecycle?: { + /** Existing temp path to reuse (for review continuation) */ + existingTempPath?: string; + /** Cleanup strategy: 'immediate' (DataMapper) or 'review' (Agent) */ + cleanupStrategy: 'immediate' | 'review'; + }; +} + +/** + * Result returned from command execution + */ +export interface AIExecutionResult { + /** Path to the temporary project */ + tempProjectPath: string; + /** Array of modified file paths (relative to temp project) */ + modifiedFiles: string[]; + /** Optional source files (for datamapper) */ + sourceFiles?: any[]; + /** Optional error */ + error?: Error; +} + +/** + * Base executor class for all AI commands + * + * Provides unified lifecycle management with template method pattern: + * - run(): Single method that handles full lifecycle (init, execute, cleanup) + * - Template stages: chat storage → temp project → execute → cleanup + * - Optional chat storage integration for multi-turn conversations + * - Configurable cleanup strategies (immediate vs review mode) + */ +export abstract class AICommandExecutor { + protected config: AICommandConfig; + + constructor(config: AICommandConfig) { + this.config = config; + } + + /** + * Main execution method - handles full lifecycle with template pattern + * + * Stages: + * 1. Register active execution for abort support + * 2. Initialize chat storage (if enabled) + * 3. Initialize temp project (create or reuse) + * 4. Execute command logic (abstract method) + * 5. Perform cleanup (strategy-dependent) + * 6. Clear active execution + * + * @returns Execution result with temp path and modified files + */ + async run(): Promise { + const { workspaceId, threadId } = this.config.chatStorage || { + workspaceId: this.config.executionContext.projectPath, + threadId: 'default' + }; + + try { + console.log(`[AICommandExecutor] Starting ${this.getCommandType()} execution: ${this.config.generationId}`); + + // Stage 1: Register active execution for abort support + chatStateStorage.setActiveExecution(workspaceId, threadId, { + generationId: this.config.generationId, + abortController: this.config.abortController + }); + + // Stage 2: Initialize workspace/thread in chat storage + await this.initializeWorkspaceThread(); + + // Stage 3: Temp project initialization + await this.initializeTempProject(); + + // Stage 4: Command execution + const result = await this.execute(); + + // Stage 5: Cleanup + await this.performCleanup(result); + + console.log(`[AICommandExecutor] Completed ${this.getCommandType()} execution: ${this.config.generationId}`); + return result; + + } catch (error) { + await this.handleExecutionError(error); + throw error; + } finally { + // Stage 6: Always clear active execution on completion (success or error) + chatStateStorage.clearActiveExecution(workspaceId, threadId); + } + } + + /** + * Stage 1: Initialize workspace/thread in chat storage (if enabled) + */ + protected async initializeWorkspaceThread(): Promise { + try { + const { workspaceId, threadId } = this.config.chatStorage; + + // Initialize workspace and thread + chatStateStorage.getOrCreateThread(workspaceId, threadId); + + console.log(`[AICommandExecutor] Chat storage initialized: workspace=${workspaceId}, thread=${threadId}`); + } catch (error) { + console.error('[AICommandExecutor] Failed to initialize chat storage:', error); + // Don't throw - chat storage is optional + } + } + + /** + * Stage 2: Initialize temp project (create new or reuse existing) + * Sets tempProjectPath and updates execution context + */ + protected async initializeTempProject(): Promise { + const lifecycle = this.config.lifecycle; + + // Check if we should reuse existing temp project + if (lifecycle?.existingTempPath) { + this.config.executionContext.tempProjectPath = lifecycle.existingTempPath; + console.log(`[AICommandExecutor] Reusing temp project: ${lifecycle.existingTempPath}`); + return; + } + + // Create new temp project + try { + const { path: tempPath } = await getTempProject(this.config.executionContext); + this.config.executionContext.tempProjectPath = tempPath; + console.log(`[AICommandExecutor] Created temp project: ${tempPath}`); + } catch (error) { + console.error('[AICommandExecutor] Failed to create temp project:', error); + throw error; + } + } + + /** + * Abstract execute method - each command implements its own logic + * Should use config.executionContext.tempProjectPath for operations + * + * @returns Execution result with modified files + */ + abstract execute(): Promise; + + /** + * Get the command type for this executor + * Used for event notifications + */ + protected abstract getCommandType(): Command; + + /** + * Stage 4: Perform cleanup based on strategy + */ + protected async performCleanup(result: AIExecutionResult): Promise { + const strategy = this.config.lifecycle?.cleanupStrategy || 'immediate'; + + if (strategy === 'immediate') { + await this.cleanupImmediate(); + } else if (strategy === 'review') { + await this.cleanupForReview(); + } + } + + /** + * Immediate cleanup - removes temp project right away + * Used by DataMapper executors + */ + protected async cleanupImmediate(): Promise { + const tempProjectPath = this.config.executionContext.tempProjectPath; + if (!tempProjectPath) { + console.log(`[AICommandExecutor] No temp project to cleanup`); + return; + } + + // Skip in test environment + if (process.env.AI_TEST_ENV) { + console.log(`[AICommandExecutor] Skipping cleanup (test mode): ${tempProjectPath}`); + return; + } + + try { + console.log(`[AICommandExecutor] Immediate cleanup: ${tempProjectPath}`); + // Note: cleanupTempProject now handles LS didClose notifications internally + await cleanupTempProject(tempProjectPath); + console.log(`[AICommandExecutor] Cleanup completed`); + } catch (error) { + console.error('[AICommandExecutor] Cleanup failed:', error); + // Don't throw - cleanup failure shouldn't break flow + } + } + + /** + * Review mode cleanup - persists temp project for user review + * Used by AgentExecutor. Subclasses can override for custom behavior. + */ + protected async cleanupForReview(): Promise { + console.log(`[AICommandExecutor] Review mode - temp project persisted: ${this.config.executionContext.tempProjectPath}`); + // No immediate cleanup - temp persists for review + // Actual cleanup happens when user accepts/declines via RPC + } + + /** + * Handle execution errors + * Emits error or abort event and attempts cleanup + */ + protected async handleExecutionError(error: any): Promise { + // Check if this was an abort + if (error.name === 'AbortError' || this.config.abortController.signal.aborted) { + console.log(`[AICommandExecutor] Execution aborted by user for ${this.getCommandType()}`); + + // Emit abort event to frontend + this.config.eventHandler({ + type: "abort", + command: this.getCommandType() + }); + } else { + // Regular error - emit error event + const errorMsg = getErrorMessage(error); + console.error(`[AICommandExecutor] Error in ${this.getCommandType()}:`, errorMsg, error); + + this.config.eventHandler({ + type: "error", + content: errorMsg + }); + } + + // Attempt cleanup on error + const tempProjectPath = this.config.executionContext.tempProjectPath; + if (tempProjectPath && !process.env.AI_TEST_ENV) { + try { + await cleanupTempProject(tempProjectPath); + } catch (cleanupError) { + console.warn(`[AICommandExecutor] Failed to cleanup after error:`, cleanupError); + } + } + } + + /** + * Get chat history from storage (helper for executors) + * @returns Array of chat messages, or empty array if storage disabled + */ + protected getChatHistory(): any[] { + const { workspaceId, threadId } = this.config.chatStorage; + return chatStateStorage.getChatHistoryForLLM(workspaceId, threadId); + } + + /** + * Add generation to chat storage (helper for executors) + * @param userPrompt - User's prompt/request + * @param metadata - Generation metadata (operation type, etc.) + */ + protected addGeneration(userPrompt: string, metadata: any): any { + const { workspaceId, threadId } = this.config.chatStorage; + return chatStateStorage.addGeneration( + workspaceId, + threadId, + userPrompt, + metadata, + this.config.generationId + ); + } + + /** + * Check if execution was aborted + * + * @returns true if aborted, false otherwise + */ + protected isAborted(): boolean { + return this.config.abortController.signal.aborted; + } +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/executors/datamapper/ContextTypesExecutor.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/executors/datamapper/ContextTypesExecutor.ts new file mode 100644 index 00000000000..3517ac65be6 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/executors/datamapper/ContextTypesExecutor.ts @@ -0,0 +1,86 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { AICommandExecutor, AICommandConfig, AIExecutionResult } from '../base/AICommandExecutor'; +import { Command, ProcessContextTypeCreationRequest } from '@wso2/ballerina-core'; +import { generateContextTypesCore } from '../../data-mapper/orchestrator'; + +/** + * ContextTypesExecutor - Executes context type generation from attachments + * + * Features: + * - Generates Ballerina types from JSON/XML/CSV attachments + * - Used for creating type definitions + * - AI-powered type inference + * - Immediate cleanup (no review mode) + */ +export class ContextTypesExecutor extends AICommandExecutor { + constructor(config: AICommandConfig) { + super(config); + } + + /** + * Execute context type generation + * + * Flow: + * 1. Temp project created by base class + * 2. Call existing generateContextTypesCore with event handler + * 3. Return modified files + * 4. Base class handles immediate cleanup + */ + async execute(): Promise { + const tempProjectPath = this.config.executionContext.tempProjectPath!; + + try { + // Capture checkpoint BEFORE execution + this.addGeneration( + 'Generate context types from attachments', + { + operationType: 'context_types', + generationType: 'datamapper', + commandType: Command.TypeCreator, + } + ); + + // Call existing core function with params from config and temp path + const result = await generateContextTypesCore( + this.config.params, + this.config.eventHandler, + this.config.generationId, + tempProjectPath // Pass temp project path from base class + ); + + return { + tempProjectPath, + modifiedFiles: result.modifiedFiles, + sourceFiles: result.sourceFiles, + }; + } catch (error) { + // Error handling done by base class in run() + return { + tempProjectPath, + modifiedFiles: [], + error: error as Error, + }; + } + } + + protected getCommandType(): Command { + return Command.TypeCreator; + } +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/executors/datamapper/FunctionMappingExecutor.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/executors/datamapper/FunctionMappingExecutor.ts new file mode 100644 index 00000000000..8a05961d767 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/executors/datamapper/FunctionMappingExecutor.ts @@ -0,0 +1,86 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { AICommandExecutor, AICommandConfig, AIExecutionResult } from '../base/AICommandExecutor'; +import { Command, ProcessMappingParametersRequest } from '@wso2/ballerina-core'; +import { generateMappingCodeCore } from '../../data-mapper/orchestrator'; + +/** + * FunctionMappingExecutor - Executes function-level data mapping generation + * + * Features: + * - Generates Ballerina function for data transformation + * - Uses DM Model for input/output analysis + * - AI-powered mapping generation with repair + * - Immediate cleanup (no review mode) + */ +export class FunctionMappingExecutor extends AICommandExecutor { + constructor(config: AICommandConfig) { + super(config); + } + + /** + * Execute function mapping generation + * + * Flow: + * 1. Temp project created by base class + * 2. Call existing generateMappingCodeCore with event handler + * 3. Return modified files + * 4. Base class handles immediate cleanup + */ + async execute(): Promise { + const tempProjectPath = this.config.executionContext.tempProjectPath!; + + try { + // Capture checkpoint BEFORE execution + this.addGeneration( + `Automap the function : ${this.config.params.parameters?.functionName}`, + { + operationType: 'function_mapping', + generationType: 'datamapper', + commandType: Command.DataMap, + } + ); + + // Call existing core function with params from config and temp path + const result = await generateMappingCodeCore( + this.config.params, + this.config.eventHandler, + this.config.generationId, + tempProjectPath // Pass temp project path from base class + ); + + return { + tempProjectPath, + modifiedFiles: result.modifiedFiles, + sourceFiles: result.sourceFiles, + }; + } catch (error) { + // Error handling done by base class in run() + return { + tempProjectPath, + modifiedFiles: [], + error: error as Error, + }; + } + } + + protected getCommandType(): Command { + return Command.DataMap; + } +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/executors/datamapper/InlineMappingExecutor.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/executors/datamapper/InlineMappingExecutor.ts new file mode 100644 index 00000000000..ceeeefb9d12 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/executors/datamapper/InlineMappingExecutor.ts @@ -0,0 +1,86 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { AICommandExecutor, AICommandConfig, AIExecutionResult } from '../base/AICommandExecutor'; +import { Command, MetadataWithAttachments } from '@wso2/ballerina-core'; +import { generateInlineMappingCodeCore } from '../../data-mapper/orchestrator'; + +/** + * InlineMappingExecutor - Executes inline data mapping expression generation + * + * Features: + * - Generates inline mapping expression (no function wrapper) + * - Used for variable assignments + * - AI-powered with repair + * - Immediate cleanup (no review mode) + */ +export class InlineMappingExecutor extends AICommandExecutor { + constructor(config: AICommandConfig) { + super(config); + } + + /** + * Execute inline mapping generation + * + * Flow: + * 1. Temp project created by base class + * 2. Call existing generateInlineMappingCodeCore with event handler + * 3. Return modified files + * 4. Base class handles immediate cleanup + */ + async execute(): Promise { + const tempProjectPath = this.config.executionContext.tempProjectPath!; + + try { + // Capture checkpoint BEFORE execution + this.addGeneration( + 'Generate inline mapping expression', + { + operationType: 'inline_mapping', + generationType: 'datamapper', + commandType: Command.DataMap, + } + ); + + // Call existing core function with params from config and temp path + const result = await generateInlineMappingCodeCore( + this.config.params, + this.config.eventHandler, + this.config.generationId, + tempProjectPath // Pass temp project path from base class + ); + + return { + tempProjectPath, + modifiedFiles: result.modifiedFiles, + sourceFiles: result.sourceFiles, + }; + } catch (error) { + // Error handling done by base class in run() + return { + tempProjectPath, + modifiedFiles: [], + error: error as Error, + }; + } + } + + protected getCommandType(): Command { + return Command.DataMap; + } +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/openapi/index.ts similarity index 70% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/openapi/index.ts index 51b7605f29e..b82dc184725 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/openapi/openapi.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/openapi/index.ts @@ -16,15 +16,18 @@ import { GenerateOpenAPIRequest, Command } from "@wso2/ballerina-core"; import { streamText } from "ai"; -import { getAnthropicClient, ANTHROPIC_HAIKU, getProviderCacheControl } from "../connection"; -import { getErrorMessage, populateHistory } from "../utils"; -import { CopilotEventHandler, createWebviewEventHandler } from "../event"; -import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; +import { getAnthropicClient, ANTHROPIC_HAIKU, getProviderCacheControl } from "../utils/ai-client"; +import { getErrorMessage, populateHistory } from "../utils/ai-utils"; +import { CopilotEventHandler, createWebviewEventHandler } from "../utils/events"; +import { chatStateStorage } from "../../../views/ai-panel/chatStateStorage"; +import { StateMachine } from "../../../stateMachine"; +import { createExecutorConfig } from "../agent/index"; // Core OpenAPI generation function that emits events export async function generateOpenAPISpecCore( params: GenerateOpenAPIRequest, - eventHandler: CopilotEventHandler + eventHandler: CopilotEventHandler, + abortController: AbortController ): Promise { // Populate chat history and add user message const historyMessages = populateHistory(params.chatHistory); @@ -45,7 +48,7 @@ export async function generateOpenAPISpecCore( content: getUserPrompt(params.query) }, ], - abortSignal: AIPanelAbortController.getInstance().signal, + abortSignal: abortController.signal, }); eventHandler({ type: "start" }); @@ -75,11 +78,36 @@ export async function generateOpenAPISpecCore( // Main public function that uses the default event handler export async function generateOpenAPISpec(params: GenerateOpenAPIRequest): Promise { const eventHandler = createWebviewEventHandler(Command.OpenAPI); + + // Create config for abort support + const config = createExecutorConfig(params, { + command: Command.OpenAPI, + chatStorageEnabled: false, + cleanupStrategy: 'immediate' + }); + + const workspaceId = StateMachine.context().projectPath; + const threadId = 'default'; + try { - await generateOpenAPISpecCore(params, eventHandler); + // Register execution for abort support + chatStateStorage.setActiveExecution(workspaceId, threadId, { + generationId: config.generationId, + abortController: config.abortController + }); + + await generateOpenAPISpecCore(params, eventHandler, config.abortController); } catch (error) { - console.error("Error during openapi generation:", error); - eventHandler({ type: "error", content: getErrorMessage(error) }); + if ((error as any).name === 'AbortError' || config.abortController.signal.aborted) { + console.log("[OpenAPI] Aborted by user."); + eventHandler({ type: "abort", command: Command.OpenAPI }); + } else { + console.error("Error during openapi generation:", error); + eventHandler({ type: "error", content: getErrorMessage(error) }); + } + } finally { + // Clear active execution + chatStateStorage.clearActiveExecution(workspaceId, threadId); } } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/editor/payload-json/payload_json.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/payload-generator/payload_json.ts similarity index 89% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/editor/payload-json/payload_json.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/payload-generator/payload_json.ts index 5f0d06ed3fe..56d4f370edf 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/editor/payload-json/payload_json.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/payload-generator/payload_json.ts @@ -16,8 +16,7 @@ import { generateObject } from "ai"; import { PayloadContext } from "@wso2/ballerina-core"; -import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../../connection"; -import { AIPanelAbortController } from "../../../../../../src/rpc-managers/ai-panel/utils"; +import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../utils/ai-client"; import { ExamplePayloadSchema, ExamplePayload } from "./schema"; import { getPayloadGenerationSystemPrompt, getPayloadGenerationUserPrompt } from "./prompts"; @@ -40,7 +39,7 @@ export async function generateExamplePayload(context: PayloadContext): Promise { - const projects: ProjectSource[] = await getProjectSource(params.operationType); - const activeProject = projects.find(p => p.isActive) || projects[0]; - const packageName = activeProject.projectName; - const sourceFiles: SourceFile[] = flattenProjectToFiles(projects); - let updatedSourceFiles: SourceFile[] = [...sourceFiles]; - let updatedFileNames: string[] = []; - const prompt = getRewrittenPrompt(params, projects); - const historyMessages = populateHistory(params.chatHistory); - const cacheOptions = await getProviderCacheControl(); - - // Fetch all libraries for tool description - const allLibraries = await getAllLibraries(GenerationType.CODE_GENERATION); - const libraryDescriptions = - allLibraries.length > 0 - ? allLibraries.map((lib) => `- ${lib.name}: ${lib.description}`).join("\n") - : "- No libraries available"; - - const allMessages: ModelMessage[] = [ - { - role: "system", - content: getSystemPromptPrefix(projects, params.operationType), - }, - { - role: "system", - content: getSystemPromptSuffix(LANGLIBS), - providerOptions: cacheOptions, - }, - ...historyMessages, - { - role: "user", - content: getUserPrompt( - prompt, - projects, - params.fileAttachmentContents, - packageName, - params.operationType - ), - providerOptions: cacheOptions, - // Note: This cache control block can be removed if needed, as we use 3 out of 4 allowed cache blocks. - }, - ]; - - const tools = { - LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), - [FILE_WRITE_TOOL_NAME]: createWriteTool(createWriteExecute(updatedSourceFiles, updatedFileNames)), - [FILE_SINGLE_EDIT_TOOL_NAME]: createEditTool(createEditExecute(updatedSourceFiles, updatedFileNames)), - [FILE_BATCH_EDIT_TOOL_NAME]: createBatchEditTool(createMultiEditExecute(updatedSourceFiles, updatedFileNames)), - [FILE_READ_TOOL_NAME]: createReadTool(createReadExecute(updatedSourceFiles, updatedFileNames)), - }; - - const { fullStream, response, providerMetadata } = streamText({ - model: await getAnthropicClient(ANTHROPIC_SONNET_4), - maxOutputTokens: 4096 * 4, - temperature: 0, - messages: allMessages, - stopWhen: stepCountIs(50), - tools, - abortSignal: AIPanelAbortController.getInstance().signal, - }); - - eventHandler({ type: "start" }); - let assistantResponse: string = ""; - let selectedLibraries: string[] = []; - let codeGenStart = false; - const tempCodeSegment = '\n```ballerina\n// Code Generation\n```\n'; - for await (const part of fullStream) { - switch (part.type) { - case "tool-call": { - const toolName = part.toolName; - console.log(`[Tool Call] Tool call started: ${toolName}`); - if (toolName == "LibraryProviderTool") { - selectedLibraries = (part.input as any)?.libraryNames ? (part.input as any).libraryNames : []; - assistantResponse += `\n\nAnalyzing request & selecting libraries...`; - } - else if ([FILE_WRITE_TOOL_NAME, FILE_SINGLE_EDIT_TOOL_NAME, FILE_BATCH_EDIT_TOOL_NAME, FILE_READ_TOOL_NAME].includes(toolName)) { - if(!codeGenStart) { - codeGenStart = true; - // TODO: temporary solution until this get refactored properly - // send this pattern \s*```(\w+)\s*([\s\S]*?)```\s*<\/code> - // to temprorily indicate the start of code generation in the webview - assistantResponse += `\n${tempCodeSegment}`; - eventHandler({ type: "content_block", content: `\n${tempCodeSegment}` }); - } - } - eventHandler({ type: "tool_call", toolName }); - break; - } - case "tool-result": { - const toolName = part.toolName; - console.log(`[Tool Call] Tool call finished: ${toolName}`); - if (toolName == "LibraryProviderTool") { - const libraryNames = (part.output as Library[]).map((lib) => lib.name); - const fetchedLibraries = libraryNames.filter((name) => selectedLibraries.includes(name)); - console.log( - "[LibraryProviderTool] Library Relevant trimmed functions By LibraryProviderTool Result: ", - part.output as Library[] - ); - if (fetchedLibraries.length === 0) { - assistantResponse = assistantResponse.replace( - `Analyzing request & selecting libraries...`, - `No relevant libraries found.` - ); - } else { - assistantResponse = assistantResponse.replace( - `Analyzing request & selecting libraries...`, - `Fetched libraries: [${fetchedLibraries.join(", ")}]` - ); - } - eventHandler({ type: "tool_result", toolName, toolOutput: fetchedLibraries }); - } - eventHandler({ type: "evals_tool_result", toolName, output: part.output }); - break; - } - case "text-delta": { - assistantResponse += part.text; - eventHandler({ type: "content_block", content: part.text }); - break; - } - case "error": { - const error = part.error; - console.error("Error during Code generation:", error); - eventHandler({ type: "error", content: getErrorMessage(error) }); - break; - } - case "text-start": { - if (assistantResponse !== "") { - eventHandler({ type: "content_block", content: " \n" }); - assistantResponse += " \n"; - } - break; - } - case "finish": { - const finishReason = part.finishReason; - console.log("Finish reason: ", finishReason); - if (finishReason === "error") { - // Already handled in error case. - break; - } - - const finalProviderMetadata = await providerMetadata; - // Emit usage metrics event for test tracking - if (finalProviderMetadata?.anthropic?.usage) { - const anthropicUsage = finalProviderMetadata.anthropic.usage as any; - eventHandler({ - type: "usage_metrics", - isRepair: false, - usage: { - inputTokens: anthropicUsage.input_tokens || 0, - cacheCreationInputTokens: anthropicUsage.cache_creation_input_tokens || 0, - cacheReadInputTokens: anthropicUsage.cache_read_input_tokens || 0, - outputTokens: anthropicUsage.output_tokens || 0, - }, - }); - } - - const { messages: finalMessages } = await response; - appendFinalMessages(allMessages, finalMessages, cacheOptions); - const postProcessedResp: PostProcessResponse = await postProcess({ - sourceFiles: updatedSourceFiles, - updatedFileNames: updatedFileNames, - }); - - updatedSourceFiles = postProcessedResp.sourceFiles; - let diagnostics: DiagnosticEntry[] = postProcessedResp.diagnostics.diagnostics; - - const MAX_REPAIR_ATTEMPTS = 3; - let repair_attempt = 0; - while ( - diagnostics.length > 0 && - repair_attempt < MAX_REPAIR_ATTEMPTS - ) { - console.log("Repair iteration: ", repair_attempt); - console.log("Diagnostics trying to fix: ", diagnostics); - - const repairedResponse: RepairResponse = await repairCode( - { - previousMessages: allMessages, - sourceFiles: updatedSourceFiles, - updatedFileNames: updatedFileNames, - diagnostics: diagnostics, - }, - libraryDescriptions, - eventHandler - ); - updatedSourceFiles = repairedResponse.sourceFiles; - updatedFileNames = repairedResponse.updatedFileNames; - diagnostics = repairedResponse.diagnostics; - repair_attempt++; - } - - // Generate final code blocks from repaired source files - const finalCodeSegment = getCodeBlocks(updatedSourceFiles, updatedFileNames); - - // Update the final assistant response with the final code blocks - assistantResponse = assistantResponse.replace(tempCodeSegment, finalCodeSegment); - - console.log("Final Diagnostics ", diagnostics); - codeGenStart = false; - eventHandler({ type: "content_replace", content: assistantResponse }); - eventHandler({ type: "diagnostics", diagnostics: diagnostics }); - eventHandler({ type: "messages", messages: allMessages }); - eventHandler({ type: "stop", command: Command.Code }); - break; - } - } - } -} - -function getCodeBlocks(updatedSourceFiles: SourceFile[], updatedFileNames: string[]) { - const codeBlocks: string[] = []; - - for (const fileName of updatedFileNames) { - const sourceFile = updatedSourceFiles.find((sf) => sf.filePath === fileName); - - if (sourceFile) { - const formattedBlock = ` -\`\`\`ballerina -${sourceFile.content} -\`\`\` -`; - codeBlocks.push(formattedBlock); - } - } - - return codeBlocks.join("\n\n"); -} - -// Main public function that uses the default event handler -export async function generateCode(params: GenerateCodeRequest): Promise { - const eventHandler = createWebviewEventHandler(Command.Code); - try { - await generateCodeCore(params, eventHandler); - } catch (error) { - console.error("Error during code generation:", error); - eventHandler({ type: "error", content: getErrorMessage(error) }); - } -} - -function getSystemPromptPrefix(projects: ProjectSource[], op: OperationType): string { - const basePrompt = `You are an expert assistant specializing in Ballerina code generation. Your should ONLY answer Ballerina related queries.`; - - if (op === "CODE_FOR_USER_REQUIREMENT") { - const sourceFiles = flattenProjectToFiles(projects); - return getRequirementAnalysisCodeGenPrefix(extractResourceDocumentContent(sourceFiles)); - } else if (op === "TESTS_FOR_USER_REQUIREMENT") { - const sourceFiles = flattenProjectToFiles(projects); - return getRequirementAnalysisTestGenPrefix(extractResourceDocumentContent(sourceFiles)); - } - return basePrompt; -} - -function getSystemPromptSuffix(langlibs: Library[]) { - return `If the query requires code, Follow these steps to generate the Ballerina code: -## Langlibs - -${JSON.stringify(langlibs, null, 2)} - - -## Steps to generate Ballerina Code - -1. Thoroughly read and understand the given query: - - Identify the main requirements and objectives of the integration. - - Determine the trigger (main or service), connector usage, control flow, and expected outcomes for the query. - -2. Figure the necessary libraries and functions required: - - Determine which libraries are required to fulfill the query and use the ${SEARCH_LIBRARY_TOOL_NAME} tool to get the libraries. - - Plan the control flow of the application based on input and output parameters of each function of the connector according the received API documentation from the tool. - -3. Write the Ballerina Code: - - First thoroughly read and understand the Ballerina code constraints. - - Then do the file modifications by strictly adhering to file modifications section mentioned in below. - -## Ballerina Code Constraints - -### Library Usage and Importing libraries -- Only use the libraries received from user query or the ${SEARCH_LIBRARY_TOOL_NAME} tool or langlibs. -- Examine the library API documentation provided by the ${SEARCH_LIBRARY_TOOL_NAME} carefully. Strictly follow the type definitions, function signatures, and all the other details provided when writing the code. -- Each .bal file must include its own import statements for any external library references. -- Do not import default langlibs (lang.string, lang.boolean, lang.float, lang.decimal, lang.int, lang.map). -- For packages with dots in names, use aliases: \`import org/package.one as one;\` -- Treat generated connectors/clients inside the generated folder as submodules. -- A submodule MUST BE imported before being used. The import statement should only contain the package name and submodule name. For package my_pkg, folder structure generated/fooApi, the import should be \`import my_pkg.fooApi;\`. -- In the library API documentation, if the service type is specified as generic, adhere to the instructions specified there on writing the service. -- For GraphQL service related queries, if the user hasn't specified their own GraphQL Schema, write the proposed GraphQL schema for the user query right after the explanation before generating the Ballerina code. Use the same names as the GraphQL Schema when defining record types. - -### Code Structure -- Define required configurables for the query. Use only string, int, decimal, boolean types in configurable variables. -- Initialize any necessary clients with the correct configuration based on the retrieved libraries at the module level (before any function or service declarations). -- Implement the main function OR service to address the query requirements. - -### Coding Rules -- Use records as canonical representations of data structures. Always define records for data structures instead of using maps or json and navigate using the record fields. -- Do not invoke methods on json access expressions. Always use separate statements. -- Use dot notation to access a normal function. Use -> to access a remote function or resource function. -- Do not use dynamic listener registrations. -- Do not write code in a way that requires updating/assigning values of function parameters. -- ALWAYS use two-word camel case all the identifiers (ex- variables, function parameter, resource function parameter, and field names). -- If the return parameter typedesc default value is marked as <> in the given API docs, define a custom record in the code that represents the data structure based on the use case and assign to it. -- Whenever you have a Json variable, NEVER access or manipulate Json variables. ALWAYS define a record and convert the Json to that record and use it. -- When invoking resource functions from a client, use the correct paths with accessor and parameters (e.g., exampleClient->/path1/["param"]/path2.get(key="value")). -- When accessing a field of a record, always assign it to a new variable and use that variable in the next statement. -- Avoid long comments in the code. Use // for single line comments. -- Always use named arguments when providing values to any parameter (e.g., .get(key="value")). -- Mention types EXPLICITLY in variable declarations and foreach statements. -- To narrow down a union type(or optional type), always declare a separate variable and then use that variable in the if condition. - -### File modifications -- You must apply changes to the existing source code using the provided ${[FILE_BATCH_EDIT_TOOL_NAME, FILE_SINGLE_EDIT_TOOL_NAME, FILE_WRITE_TOOL_NAME].join(", ")} tools. The complete existing source code will be provided in the section of the user prompt. -- When making replacements inside an existing file, provide the **exact old string** and the **exact new string** with all newlines, spaces, and indentation, being mindful to replace nearby occurrences together to minimize the number of tool calls. -- Do not modify documentation such as .md files unless explicitly asked to be modified in the query. -- Do not add/modify toml files (Config.toml/Ballerina.toml/Dependencies.toml). -- Prefer modifying existing bal files over creating new files unless explicitly asked to create a new file in the query. - -Begin your response with the very consice explanation in the same language as the user query. The explanation should contain a very high level the control flow decided in step 1 along with the how libraries are utilized. -Once the explanation is finished, make the necessary File modifications. Avoid any usage guides or explanations after the file modifications. -`; -} - -function getUserPrompt( - usecase: string, - projects: ProjectSource[], - fileUploadContents: FileAttatchment[], - packageName: string, - op: OperationType -): string { - const fileInstructions = formatFileUploadContents(fileUploadContents); - const packageContext = buildPackageContext(projects, packageName); - - return `QUERY: The query you need to answer. - -${usecase} - - -Existing Code: Users existing code. - -${stringifyExistingCode(projects, op)} - - -${packageContext} - -${fileInstructions} - -`; -} - -export async function triggerGeneratedCodeRepair(params: RepairParams): Promise { - // add null as the command since this is a repair operation is not a command - const eventHandler = createWebviewEventHandler(undefined); - try { - // Parse sourceFiles from assistantResponse XML if provided - if (params.assistantResponse && !params.sourceFiles) { - params.sourceFiles = parseSourceFilesFromXML(params.assistantResponse); - params.updatedFileNames = params.sourceFiles.map(file => file.filePath); - } - - // Fetch all libraries for tool description - const allLibraries = await getAllLibraries(GenerationType.CODE_GENERATION); - const libraryDescriptions = - allLibraries.length > 0 - ? allLibraries.map((lib) => `- ${lib.name}: ${lib.description}`).join("\n") - : "- No libraries available"; - - return await repairCodeCore(params, libraryDescriptions, eventHandler); - } catch (error) { - console.error("Error during code repair:", error); - eventHandler({ type: "error", content: getErrorMessage(error) }); - } -} - -// Core repair function that emits events -export async function repairCodeCore( - params: RepairParams, - libraryDescriptions: string, - eventHandler: CopilotEventHandler -): Promise { - eventHandler({ type: "start" }); - const resp = await repairCode(params, libraryDescriptions, eventHandler); - // Convert repaired sourceFiles to XML format for display - const repairedCodeBlocks = getCodeBlocks(resp.sourceFiles, resp.updatedFileNames); - eventHandler({ type: "content_replace", content: repairedCodeBlocks }); - console.log("Manual Repair Diagnostics left: ", resp.diagnostics); - eventHandler({ type: "diagnostics", diagnostics: resp.diagnostics }); - eventHandler({ type: "stop", command: undefined }); - return resp; -} - -export async function repairCode( - params: RepairParams, - libraryDescriptions: string, - eventHandler?: CopilotEventHandler -): Promise { - // Convert current sourceFiles to XML format for assistant message - const assistantResponse = getCodeBlocks(params.sourceFiles, params.updatedFileNames); - - const allMessages: ModelMessage[] = [ - ...params.previousMessages, - { - role: "assistant", - content: assistantResponse, - }, - { - role: "user", - content: - "Generated code returns the following compiler errors that uses the library details from the `LibraryProviderTool` results in previous messages. First check the context and API documentation already provided in the conversation history before making new tool calls. Only use the `LibraryProviderTool` if additional library information is needed that wasn't covered in previous tool responses. Double-check all functions, types, and record field access for accuracy." + - "And also do not create any new files. Just carefully analyze the error descriptions and update the existing code to fix the errors. \n Errors: \n " + - params.diagnostics.map((d) => d.message).join("\n"), - }, - ]; - - let updatedSourceFiles: SourceFile[] = [...params.sourceFiles]; - let updatedFileNames: string[] = [...params.updatedFileNames]; - - const tools = { - LibraryProviderTool: getLibraryProviderTool(libraryDescriptions, GenerationType.CODE_GENERATION), - [FILE_WRITE_TOOL_NAME]: createWriteTool(createWriteExecute(updatedSourceFiles, updatedFileNames)), - [FILE_SINGLE_EDIT_TOOL_NAME]: createEditTool(createEditExecute(updatedSourceFiles, updatedFileNames)), - [FILE_BATCH_EDIT_TOOL_NAME]: createBatchEditTool(createMultiEditExecute(updatedSourceFiles, updatedFileNames)), - [FILE_READ_TOOL_NAME]: createReadTool(createReadExecute(updatedSourceFiles, updatedFileNames)), - }; - - const { text, providerMetadata } = await generateText({ - model: await getAnthropicClient(ANTHROPIC_SONNET_4), - maxOutputTokens: 4096 * 4, - temperature: 0, - tools, - messages: allMessages, - stopWhen: stepCountIs(50), - abortSignal: AIPanelAbortController.getInstance().signal, - }); - const repairProviderMetadata = await providerMetadata; - // Emit repair usage metrics event if event handler is provided - if (eventHandler && repairProviderMetadata?.anthropic?.usage) { - const anthropicUsage = repairProviderMetadata.anthropic.usage as any; - eventHandler({ - type: "usage_metrics", - isRepair: true, - usage: { - inputTokens: anthropicUsage.input_tokens || 0, - cacheCreationInputTokens: anthropicUsage.cache_creation_input_tokens || 0, - cacheReadInputTokens: anthropicUsage.cache_read_input_tokens || 0, - outputTokens: anthropicUsage.output_tokens || 0, - }, - }); - } - - const postProcessResp: PostProcessResponse = await postProcess({ - sourceFiles: updatedSourceFiles, - updatedFileNames: updatedFileNames, - }); - console.log("After auto repair, Diagnostics : ", postProcessResp.diagnostics.diagnostics); - - return { - sourceFiles: postProcessResp.sourceFiles, - updatedFileNames: updatedFileNames, - diagnostics: postProcessResp.diagnostics.diagnostics - }; -} - -/** - * Formats a file as XML with filename and optional external package attribute. - */ -function formatFileAsXml(filePath: string, content: string, externalAttr: string): string { - return ` - -${content} - -`; -} - -export function stringifyExistingCode(projects: ProjectSource[], op: OperationType): string { - const usePackagePrefix = projects.length > 1; - const fileFilter = (filePath: string) => - op === "CODE_GENERATION" || filePath.endsWith(".bal"); - - const files = buildFilePaths(projects, fileFilter); - - return files.map(({ filePath, content, packageName, isActive }) => { - const externalAttr = (usePackagePrefix && packageName && !isActive) - ? ` externalPackageName="${packageName}"` - : ""; - - return formatFileAsXml(filePath, content, externalAttr); - }).join("\n"); -} - -export function hasCodeBlocks(text: string) { - const codeBlockRegex = /]*>[\s\S]*?<\/code>/i; - return codeBlockRegex.test(text); -} - -export function replaceCodeBlocks(originalResp: string, newResp: string): string { - // Create a map to store new code blocks by filename - const newCodeBlocks = new Map(); - - // Extract code blocks from newResp - const newCodeRegex = /\s*```ballerina\s*([\s\S]*?)```\s*<\/code>/g; - let match; - while ((match = newCodeRegex.exec(newResp)) !== null) { - newCodeBlocks.set(match[1], match[2].trim()); - } - - // Replace code blocks in originalResp - const updatedResp = originalResp.replace( - /\s*```ballerina\s*([\s\S]*?)```\s*<\/code>/g, - (match, filename, content) => { - const newContent = newCodeBlocks.get(filename); - if (newContent !== undefined) { - return `\n\`\`\`ballerina\n${newContent}\n\`\`\`\n`; - } - return match; // If no new content, keep the original - } - ); - - // Remove replaced code blocks from newCodeBlocks - const originalCodeRegex = //g; - while ((match = originalCodeRegex.exec(originalResp)) !== null) { - newCodeBlocks.delete(match[1]); - } - - // Append any remaining new code blocks - let finalResp = updatedResp; - newCodeBlocks.forEach((content, filename) => { - finalResp += `\n\n\n\`\`\`ballerina\n${content}\n\`\`\`\n`; - }); - - return finalResp; -} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts deleted file mode 100644 index 6cadac8def5..00000000000 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/datamapper/datamapper.ts +++ /dev/null @@ -1,1203 +0,0 @@ -// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. - -// WSO2 LLC. licenses this file to you under the Apache License, -// Version 2.0 (the "License"); you may not use this file except -// in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 - -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -import { CoreMessage, ModelMessage, generateObject } from "ai"; -import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; -import { - DatamapperResponse, - DataModelStructure, - MappingFields, - RepairedMapping, - RepairedMappings, - DMModelDiagnosticsResult -} from "./types"; -import { GeneratedMappingSchema, RepairedMappingsSchema } from "./schema"; -import { AIPanelAbortController, repairSourceFilesWithAI } from "../../../../../src/rpc-managers/ai-panel/utils"; -import { DataMapperModelResponse, DMModel, Mapping, repairCodeRequest, DiagnosticList, ImportInfo, ProcessMappingParametersRequest, Command, MetadataWithAttachments, InlineMappingsSourceResult, ProcessContextTypeCreationRequest, ProjectImports, ImportStatements, TemplateId, GetModuleDirParams, TextEdit, DataMapperSourceResponse, DataMapperSourceRequest, AllDataMapperSourceRequest, DataMapperModelRequest, DeleteMappingRequest, CodeData } from "@wso2/ballerina-core"; -import { getDataMappingPrompt } from "./dataMappingPrompt"; -import { getBallerinaCodeRepairPrompt } from "./codeRepairPrompt"; -import { CopilotEventHandler, createWebviewEventHandler } from "../event"; -import { getErrorMessage } from "../utils"; -import { buildMappingFileArray, buildRecordMap, collectExistingFunctions, collectModuleInfo, createTempBallerinaDir, createTempFileAndGenerateMetadata, getFunctionDefinitionFromSyntaxTree, getUniqueFunctionFilePaths, prepareMappingContext, generateInlineMappingsSource, generateTypesFromContext, extractImports, generateDataMapperModel, determineCustomFunctionsPath, generateMappings, repairAndCheckDiagnostics, ensureUnionRefs, normalizeRefs } from "../../dataMapping"; -import { addCheckExpressionErrors } from "../../../../../src/rpc-managers/ai-panel/repair-utils"; -import { BiDiagramRpcManager, getBallerinaFiles } from "../../../../../src/rpc-managers/bi-diagram/rpc-manager"; -import { updateSourceCode } from "../../../../../src/utils/source-utils"; -import { StateMachine } from "../../../../stateMachine"; -import { extractVariableDefinitionSource, getHasStopped, setHasStopped } from "../../../../../src/rpc-managers/data-mapper/utils"; -import { commands, Uri, window } from "vscode"; -import { CLOSE_AI_PANEL_COMMAND, OPEN_AI_PANEL_COMMAND } from "../../constants"; -import path from "path"; -import { URI } from "vscode-uri"; -import fs from 'fs'; -import { writeBallerinaFileDidOpenTemp } from "../../../../../src/utils/modification"; - -const NO_MAPPINGS_GENERATED_WARNING = `**No Relevant Mappings Generated**\n\n` + - `The AI was unable to identify compatible field mappings between the input and output structures.\n\n` + - `**Suggestions:**\n` + - `- Check if input and output record structures are correct\n` + - `- Try providing mapping hints or examples\n`; - -// ============================================================================= -// ENHANCED MAIN ORCHESTRATOR FUNCTION -// ============================================================================= - -// Generates AI-powered data mappings with retry logic for handling failures -async function generateAIPoweredDataMappings(dataMapperModelResponse: DataMapperModelResponse): Promise { - if (!dataMapperModelResponse.mappingsModel) { - throw new Error("Mappings model is required in the data mapper response"); - } - - const maxRetries = 3; - let lastError: Error; - - for (let attempt = 0; attempt < maxRetries; attempt++) { - if (attempt > 0) { - console.debug("Retrying to generate mappings for the payload."); - } - - try { - const mappingsModel = dataMapperModelResponse.mappingsModel as DMModel; - const existingMappings = mappingsModel.mappings; - const userProvidedMappingHints = mappingsModel.mapping_fields || {}; - const existingSubMappings = mappingsModel.subMappings as Mapping[] || []; - - if (!mappingsModel.inputs || !mappingsModel.output) { - throw new Error("Mappings model must contain both inputs and output fields"); - } - - // Extract only inputs, output, and refs from mappingsModel - const dataModelStructure: DataModelStructure = { - inputs: mappingsModel.inputs, - output: mappingsModel.output, - refs: mappingsModel.refs - }; - - const aiGeneratedMappings = await generateAIMappings( - dataModelStructure, - existingMappings, - userProvidedMappingHints, - existingSubMappings - ); - - if (Object.keys(aiGeneratedMappings).length === 0) { - throw new Error("No valid fields were identified for mapping between the given input and output records."); - } - - return { mappings: aiGeneratedMappings }; - - } catch (error) { - console.error(`Error occurred while generating mappings: ${error}`); - lastError = error as Error; - } - } - - throw lastError!; -} - -// Calls Claude AI to generate mappings based on data model, user mappings, and mapping hints -async function generateAIMappings( - dataModelStructure: DataModelStructure, - existingUserMappings: Mapping[], - userProvidedMappingHints: { [key: string]: MappingFields }, - existingSubMappings: Mapping[] -): Promise { - if (!dataModelStructure.inputs || !dataModelStructure.output) { - throw new Error("Data model structure must contain inputs and output"); - } - - // Build prompt for AI - const aiPrompt = getDataMappingPrompt( - JSON.stringify(dataModelStructure), - JSON.stringify(existingUserMappings || []), - JSON.stringify(userProvidedMappingHints || {}), - JSON.stringify(existingSubMappings || []) - ); - - const chatMessages: ModelMessage[] = [ - { role: "user", content: aiPrompt } - ]; - - try { - const { object } = await generateObject({ - model: await getAnthropicClient(ANTHROPIC_SONNET_4), - maxOutputTokens: 8192, - temperature: 0, - messages: chatMessages, - schema: GeneratedMappingSchema, - abortSignal: AIPanelAbortController.getInstance().signal, - }); - - const aiGeneratedMappings = object.generatedMappings as Mapping[]; - return aiGeneratedMappings; - } catch (error) { - console.error("Failed to parse response:", error); - throw new Error(`Failed to parse mapping response: ${error}`); - } -} - -// Uses Claude AI to repair code based on DM model with diagnostics and import information -async function repairBallerinaCode( - dmModel: DMModel, - availableImports: ImportInfo[] -): Promise { - if (!dmModel) { - throw new Error("DM model is required for code repair"); - } - - // Build repair prompt - const codeRepairPrompt = getBallerinaCodeRepairPrompt( - JSON.stringify(dmModel), - JSON.stringify(availableImports || []) - ); - - const chatMessages: CoreMessage[] = [ - { role: "user", content: codeRepairPrompt } - ]; - - try { - const { object } = await generateObject({ - model: await getAnthropicClient(ANTHROPIC_SONNET_4), - maxOutputTokens: 8192, - temperature: 0, - messages: chatMessages, - schema: RepairedMappingsSchema, - abortSignal: AIPanelAbortController.getInstance().signal, - }); - - return object.repairedMappings as RepairedMapping[]; - } catch (error) { - console.error("Failed to parse response:", error); - throw new Error(`Failed to parse repaired mappings response: ${error}`); - } -} - -// ============================================================================= -// MAIN EXPORT FUNCTION -// ============================================================================= - -// Main entry point for generating automatic data mappings from data mapper model -export async function generateAutoMappings(dataMapperModelResponse?: DataMapperModelResponse): Promise { - if (!dataMapperModelResponse) { - throw new Error("Data mapper model response is required for generating auto mappings"); - } - try { - const mappingResponse: DatamapperResponse = await generateAIPoweredDataMappings(dataMapperModelResponse); - return mappingResponse.mappings; - } catch (error) { - console.error(`Error generating auto mappings: ${error}`); - throw error; - } -} - -// Generates repaired mappings by fixing diagnostics with retry logic -export async function generateRepairCode(codeRepairRequest?: repairCodeRequest): Promise { - if (!codeRepairRequest) { - throw new Error("Code repair request is required for generating repair code"); - } - - const maxRetries = 3; - let attemptCount = 0; - let lastError: Error; - - while (attemptCount < maxRetries) { - if (attemptCount > 0) { - console.debug("Retrying to generate repair code for the payload."); - } - - try { - // Generate AI-powered repaired mappings using Claude with DM model - const aiRepairedMappings = await repairBallerinaCode(codeRepairRequest.dmModel, codeRepairRequest.imports); - - if (!aiRepairedMappings || aiRepairedMappings.length === 0) { - console.warn("No mappings were repaired. The code may not have fixable errors."); - return { repairedMappings: [] }; - } - - return { repairedMappings: aiRepairedMappings }; - - } catch (error) { - console.error(`Error occurred while generating repaired code: ${error}`); - lastError = error as Error; - attemptCount += 1; - continue; - } - } - - throw lastError!; -} - -// Gets DM model for a function -async function getDMModel( - langClient: any, - mainFilePath: string, - functionName: string -): Promise { - // Get function definition to retrieve accurate position - const funcDefinitionNode = await getFunctionDefinitionFromSyntaxTree( - langClient, - mainFilePath, - functionName - ); - - // Build metadata with current function position - const dataMapperMetadata: DataMapperModelRequest = { - filePath: mainFilePath, - codedata: { - lineRange: { - fileName: mainFilePath, - startLine: { - line: funcDefinitionNode.position.startLine, - offset: funcDefinitionNode.position.startColumn, - }, - endLine: { - line: funcDefinitionNode.position.endLine, - offset: funcDefinitionNode.position.endColumn, - }, - }, - }, - targetField: functionName, - position: { - line: funcDefinitionNode.position.startLine, - offset: funcDefinitionNode.position.startColumn - } - }; - - // Get DM model with mapping-level diagnostics - const dataMapperModel = await langClient.getDataMapperMappings(dataMapperMetadata) as DataMapperModelResponse; - const dmModel = dataMapperModel.mappingsModel as DMModel; - - return { dataMapperMetadata, dmModel }; -} - -// Repairs mappings using LLM based on DM model diagnostics -async function repairMappingsWithLLM( - langClient: any, - dmModelResult: DMModelDiagnosticsResult, - imports: ImportInfo[] -): Promise { - const { dataMapperMetadata, dmModel } = dmModelResult; - - // Call LLM repair with targeted diagnostics and DM model context - try { - let mappingsModel = ensureUnionRefs(dmModel); - mappingsModel = normalizeRefs(mappingsModel); - - const repairResult = await repairSourceFilesWithAI({ - dmModel: mappingsModel, - imports - }); - - // Apply repaired mappings to the DM model - if (repairResult.repairedMappings && repairResult.repairedMappings.length > 0) { - // Apply each repaired mapping individually using the language server - for (const repairedMapping of repairResult.repairedMappings) { - const targetMapping = dmModel.mappings.find(m => m.output === repairedMapping.output); - if (targetMapping) { - // Update the mapping with the repaired expression - targetMapping.expression = repairedMapping.expression; - targetMapping.diagnostics = []; - - // Generate source for this individual mapping - const singleMappingRequest: DataMapperSourceRequest = { - filePath: dataMapperMetadata.filePath, - codedata: dataMapperMetadata.codedata, - varName: dataMapperMetadata.targetField, - targetField: dataMapperMetadata.targetField, - mapping: targetMapping - }; - - try { - const mappingSourceResponse = await langClient.getDataMapperSource(singleMappingRequest); - if (mappingSourceResponse.textEdits && Object.keys(mappingSourceResponse.textEdits).length > 0) { - await updateSourceCode({ textEdits: mappingSourceResponse.textEdits, skipPayloadCheck: true }); - await new Promise((resolve) => setTimeout(resolve, 50)); - } - } catch (error) { - console.warn(`Failed to apply repaired mapping for ${repairedMapping.output}:`, error); - } - } - } - } - } catch (error) { - console.warn('LLM repair failed, continuing with other repairs:', error); - } -} - -// Repairs check expression errors (BCE3032) in DM model -async function repairCheckErrors( - langClient: any, - projectRoot: string, - mainFilePath: string, - allMappingsRequest: AllDataMapperSourceRequest, - tempDirectory: string, - isSameFile: boolean -): Promise { - // Apply programmatic fixes (imports, required fields, etc.) - const filePaths = [mainFilePath]; - if (allMappingsRequest.customFunctionsFilePath && !isSameFile) { - filePaths.push(allMappingsRequest.customFunctionsFilePath); - } - - let diags = await repairAndCheckDiagnostics(langClient, projectRoot, { - tempDir: tempDirectory, - filePaths - }); - - // Handle check expression errors (BCE3032) - const hasCheckError = diags.diagnosticsList.some(diagEntry => - diagEntry.diagnostics.some(d => d.code === "BCE3032") - ); - - if (hasCheckError) { - await addCheckExpressionErrors(diags.diagnosticsList, langClient); - } -} - -// ============================================================================= -// MAPPING CODE GENERATION WITH EVENT HANDLERS -// ============================================================================= - -// Core mapping code generation function that emits events -export async function generateMappingCodeCore(mappingRequest: ProcessMappingParametersRequest, eventHandler: CopilotEventHandler): Promise { - if (!mappingRequest.parameters) { - throw new Error("Parameters are required in the mapping request"); - } - - if (!mappingRequest.parameters.functionName) { - throw new Error("Function name is required in the mapping parameters"); - } - - // Initialize generation process - eventHandler({ type: "start" }); - eventHandler({ type: "content_block", content: "Building the transformation logic using your provided data structures and mapping hints\n\n" }); - eventHandler({ type: "content_block", content: "Reading project files and collecting imports..." }); - let assistantResponse: string = ""; - const biDiagramRpcManager = new BiDiagramRpcManager(); - const langClient = StateMachine.langClient(); - const context = StateMachine.context(); - const projectRoot = context.projectPath; - - const targetFunctionName = mappingRequest.parameters.functionName; - - const [projectImports, currentActiveFile, projectComponents] = await Promise.all([ - collectAllImportsFromProject(), - getCurrentActiveFileName(), - biDiagramRpcManager.getProjectComponents(), - langClient - ]); - - const allImportStatements = projectImports.imports.flatMap(file => file.statements || []); - - // Remove duplicates based on moduleName - const uniqueImportStatements = Array.from( - new Map(allImportStatements.map(imp => [imp.moduleName, imp])).values() - ); - - const moduleInfoList = collectModuleInfo(projectComponents); - const moduleDirectoryMap = new Map(); - - for (const moduleInfo of moduleInfoList) { - const moduleDirectoryType = getModuleDirectory({ - moduleName: moduleInfo.moduleName, - filePath: moduleInfo.packageFilePath - }); - moduleDirectoryMap.set(moduleInfo.moduleName, moduleDirectoryType); - } - - const recordTypeMap = buildRecordMap(projectComponents, moduleDirectoryMap); - const existingFunctionsInProject = collectExistingFunctions(projectComponents, moduleDirectoryMap); - - const functionFileContents = new Map(); - if (existingFunctionsInProject.length > 0) { - const uniqueFunctionFilePaths = getUniqueFunctionFilePaths(existingFunctionsInProject); - const fileContentResults = await Promise.all( - uniqueFunctionFilePaths.map(async (filePath) => { - const projectFsPath = URI.parse(filePath).fsPath; - const fileContent = await fs.promises.readFile(projectFsPath, "utf-8"); - return { filePath, content: fileContent }; - }) - ); - fileContentResults.forEach(({ filePath, content }) => { - functionFileContents.set(filePath, content); - }); - } - - const mappingContext = await prepareMappingContext( - mappingRequest.parameters, - recordTypeMap, - existingFunctionsInProject, - uniqueImportStatements, - functionFileContents, - currentActiveFile, - langClient, - projectRoot - ); - - const tempDirectory = await createTempBallerinaDir(); - const doesFunctionAlreadyExist = existingFunctionsInProject.some(func => func.name === targetFunctionName); - - const tempFileMetadata = await createTempFileAndGenerateMetadata({ - tempDir: tempDirectory, - filePath: mappingContext.filePath, - metadata: mappingRequest.metadata, - inputs: mappingContext.mappingDetails.inputs, - output: mappingContext.mappingDetails.output, - functionName: targetFunctionName, - inputNames: mappingContext.mappingDetails.inputNames, - imports: mappingContext.mappingDetails.imports, - hasMatchingFunction: doesFunctionAlreadyExist, - }, langClient, context); - - const allMappingsRequest = await generateMappings({ - metadata: tempFileMetadata, - attachments: mappingRequest.attachments - }, context, eventHandler); - - // Check if no mappings were generated - if (!allMappingsRequest.mappings || allMappingsRequest.mappings.length === 0) { - eventHandler({ type: "content_block", content: NO_MAPPINGS_GENERATED_WARNING }); - eventHandler({ type: "stop", command: Command.DataMap }); - return; - } - - const sourceCodeResponse = await getAllDataMapperSource(allMappingsRequest); - - await updateSourceCode({ textEdits: sourceCodeResponse.textEdits, skipPayloadCheck: true }); - await new Promise((resolve) => setTimeout(resolve, 100)); - - let customFunctionsTargetPath: string; - let customFunctionsFileName: string; - - if (allMappingsRequest.customFunctionsFilePath) { - const absoluteCustomFunctionsPath = determineCustomFunctionsPath(projectRoot, currentActiveFile); - customFunctionsFileName = path.basename(absoluteCustomFunctionsPath); - - // For workspace projects, make path relative to workspace root - const workspacePath = context.workspacePath; - if (workspacePath) { - customFunctionsTargetPath = path.relative(workspacePath, absoluteCustomFunctionsPath); - } else { - // Normal project: use relative path from project root - customFunctionsTargetPath = path.relative(projectRoot, absoluteCustomFunctionsPath); - } - } - - // Check if mappings file and custom functions file are the same - const mainFilePath = tempFileMetadata.codeData.lineRange.fileName; - const isSameFile = customFunctionsTargetPath && - path.resolve(mainFilePath) === path.resolve(path.join(tempDirectory, customFunctionsFileName)); - - eventHandler({ type: "content_block", content: "\nRepairing generated code..." }); - - // Get DM model with diagnostics - const dmModelResult = await getDMModel( - langClient, - mainFilePath, - targetFunctionName - ); - - // Repair mappings using LLM based on DM model diagnostics - await repairMappingsWithLLM( - langClient, - dmModelResult, - uniqueImportStatements - ); - - // Repair check expression errors (BCE3032) - await repairCheckErrors( - langClient, - projectRoot, - mainFilePath, - allMappingsRequest, - tempDirectory, - isSameFile - ); - - // Remove compilation error mappings - await removeCompilationErrorMappingFields( - langClient, - mainFilePath, - targetFunctionName, - allMappingsRequest, - ); - - // Read updated content after removing compilation errors - const finalContent = fs.readFileSync(mainFilePath, 'utf8'); - let customFunctionsContent = ''; - if (allMappingsRequest.customFunctionsFilePath && !isSameFile) { - customFunctionsContent = fs.readFileSync(allMappingsRequest.customFunctionsFilePath, 'utf8'); - } - - let generatedFunctionDefinition = await getFunctionDefinitionFromSyntaxTree( - langClient, - tempFileMetadata.codeData.lineRange.fileName, - targetFunctionName - ); - await new Promise((resolve) => setTimeout(resolve, 100)); - - // For workspace projects, compute relative file path from workspace root - const workspacePath = context.workspacePath; - let targetFilePath = mappingContext.filePath; - - if (workspacePath) { - // Workspace project: need to include package path prefix (e.g., "foo/mappings.bal") - const absoluteFilePath = path.join(projectRoot, mappingContext.filePath); - targetFilePath = path.relative(workspacePath, absoluteFilePath); - } - - const generatedSourceFiles = buildMappingFileArray( - targetFilePath, - finalContent, - customFunctionsTargetPath, - customFunctionsContent, - ); - - // Build assistant response - assistantResponse = `The generated data mapping details are as follows:\n`; - if (mappingRequest.parameters.inputRecord.length === 1) { - assistantResponse += `- **Input Record**: ${mappingContext.mappingDetails.inputParams[0]}\n`; - } else { - assistantResponse += `- **Input Records**: ${mappingContext.mappingDetails.inputParams.join(", ")}\n`; - } - assistantResponse += `- **Output Record**: ${mappingContext.mappingDetails.outputParam}\n`; - assistantResponse += `- **Function Name**: ${targetFunctionName}\n`; - - if (mappingRequest.attachments.length > 0) { - const attachmentNames = []; - for (const att of (mappingRequest.attachments)) { - attachmentNames.push(att.name); - } - assistantResponse += `- **Attachments**: ${attachmentNames.join(", ")}\n`; - } - - if (tempFileMetadata.mappingsModel.mappings.length > 0) { - assistantResponse += `\n**Note**: When you click **Add to Integration**, it will override your existing mappings.\n`; - } - - if (isSameFile) { - // For same file, custom content is already merged in the main content - assistantResponse += `\n\`\`\`ballerina\n${generatedFunctionDefinition.source}\n\`\`\`\n`; - } else { - assistantResponse += `\n\`\`\`ballerina\n${generatedFunctionDefinition.source}\n\`\`\`\n`; - - if (customFunctionsContent) { - assistantResponse += `\n\`\`\`ballerina\n${customFunctionsContent}\n\`\`\`\n`; - } - } - - eventHandler({ type: "generated_sources", fileArray: generatedSourceFiles }); - eventHandler({ type: "content_block", content: assistantResponse }); - eventHandler({ type: "stop", command: Command.DataMap }); -} - -// Main public function that uses the default event handler for mapping generation -export async function generateMappingCode(mappingRequest: ProcessMappingParametersRequest): Promise { - const eventHandler = createWebviewEventHandler(Command.DataMap); - try { - await generateMappingCodeCore(mappingRequest, eventHandler); - } catch (error) { - console.error("Error during mapping code generation:", error); - eventHandler({ type: "error", content: getErrorMessage(error) }); - throw error; - } -} - -async function collectAllImportsFromProject(): Promise { - const projectPath = StateMachine.context().projectPath; - - const ballerinaSourceFiles = await getBallerinaFiles(Uri.file(projectPath).fsPath); - - const importStatements: ImportStatements[] = []; - - for (const ballerinaFile of ballerinaSourceFiles) { - const sourceFileContent = fs.readFileSync(ballerinaFile, "utf8"); - const extractedImports = extractImports(sourceFileContent, ballerinaFile); - importStatements.push(extractedImports); - } - - return { - projectPath: projectPath, - imports: importStatements, - }; -} - -function getCurrentActiveFileName(): string { - const activeTabGroup = window.tabGroups.all.find(group => { - return group.activeTab.isActive && group.activeTab?.input; - }); - - if (activeTabGroup && activeTabGroup.activeTab && activeTabGroup.activeTab.input) { - const activeTabInput = activeTabGroup.activeTab.input as { uri: { fsPath: string } }; - - if (activeTabInput.uri) { - const activeFileUri = activeTabInput.uri; - const activeFileName = activeFileUri.fsPath.split('/').pop(); - return activeFileName || ''; - } - } -} - -function getModuleDirectory(params: GetModuleDirParams): string { - const { filePath, moduleName } = params; - const generatedPath = path.join(filePath, "generated", moduleName); - if (fs.existsSync(generatedPath) && fs.statSync(generatedPath).isDirectory()) { - return "generated"; - } else { - return "modules"; - } -} - -export async function getAllDataMapperSource( - mappingSourceRequest: AllDataMapperSourceRequest -): Promise { - setHasStopped(false); - - const individualSourceRequests = buildSourceRequests(mappingSourceRequest); - const sourceResponses = await processSourceRequests(individualSourceRequests); - const consolidatedTextEdits = consolidateTextEdits(sourceResponses, mappingSourceRequest.mappings.length); - - return { textEdits: consolidatedTextEdits }; -} - - -// Builds individual source requests from the provided parameters by creating a request for each mapping -export function buildSourceRequests(allMappingsRequest: AllDataMapperSourceRequest): DataMapperSourceRequest[] { - return allMappingsRequest.mappings.map(singleMapping => ({ - filePath: allMappingsRequest.filePath, - codedata: allMappingsRequest.codedata, - varName: allMappingsRequest.varName, - targetField: allMappingsRequest.targetField, - mapping: singleMapping - })); -} - -// Processes source requests with cancellation support and error handling for each request -export async function processSourceRequests(sourceRequests: DataMapperSourceRequest[]): Promise[]> { - return Promise.allSettled( - sourceRequests.map(async (singleRequest) => { - if (getHasStopped()) { - throw new Error("Operation was stopped"); - } - try { - return await StateMachine.langClient().getDataMapperSource(singleRequest); - } catch (error) { - console.error("Error in getDataMapperSource:", error); - throw error; - } - }) - ); -} - -// Consolidates text edits from multiple source responses into a single optimized collection -export function consolidateTextEdits( - sourceResponses: PromiseSettledResult[], - totalMappingCount: number -): { [key: string]: TextEdit[] } { - const allTextEditsByFile: { [key: string]: TextEdit[] } = {}; - - sourceResponses.forEach((result, index) => { - if (result.status === 'fulfilled') { - console.log(`>>> Completed mapping ${index + 1}/${totalMappingCount}`); - mergeTextEdits(allTextEditsByFile, result.value.textEdits); - } else { - console.error(`>>> Failed mapping ${index + 1}:`, result.reason); - } - }); - - return optimizeTextEdits(allTextEditsByFile); -} - -// Merges new text edits into the existing collection, grouping by file path -export function mergeTextEdits( - existingTextEdits: { [key: string]: TextEdit[] }, - newTextEditsToMerge?: { [key: string]: TextEdit[] } -): void { - if (!newTextEditsToMerge) { return; } - - Object.entries(newTextEditsToMerge).forEach(([filePath, editsForFile]) => { - if (!existingTextEdits[filePath]) { - existingTextEdits[filePath] = []; - } - existingTextEdits[filePath].push(...editsForFile); - }); -} - -// Optimizes text edits by sorting and combining them into single edits per file -export function optimizeTextEdits(allTextEditsByFile: { [key: string]: TextEdit[] }): { [key: string]: TextEdit[] } { - const optimizedEditsByFile: { [key: string]: TextEdit[] } = {}; - - Object.entries(allTextEditsByFile).forEach(([filePath, editsForFile]) => { - if (editsForFile.length === 0) { return; } - - const sortedEditsForFile = sortTextEdits(editsForFile); - const combinedEditForFile = combineTextEdits(sortedEditsForFile); - - optimizedEditsByFile[filePath] = [combinedEditForFile]; - }); - - return optimizedEditsByFile; -} - -// Sorts text edits by line number and character position to ensure proper ordering -export function sortTextEdits(textEdits: TextEdit[]): TextEdit[] { - return textEdits.sort((editA, editB) => { - if (editA.range.start.line !== editB.range.start.line) { - return editA.range.start.line - editB.range.start.line; - } - return editA.range.start.character - editB.range.start.character; - }); -} - -// Combines multiple text edits into a single edit with comma-separated content -export function combineTextEdits(sortedTextEdits: TextEdit[]): TextEdit { - const formattedTextArray = sortedTextEdits.map((singleEdit, editIndex) => { - const editContent = singleEdit.newText.trim(); - return editIndex < sortedTextEdits.length - 1 ? `${editContent},` : editContent; - }); - - return { - range: sortedTextEdits[0].range, - newText: formattedTextArray.join('\n').trimStart() - }; -} - -// Gets DM model with diagnostics for inline variable -async function getInlineDMModelWithDiagnostics( - langClient: any, - mainFilePath: string, - variableName: string, - codedata: CodeData -): Promise { - // Build metadata for inline variable - const dataMapperMetadata = { - filePath: mainFilePath, - codedata: codedata, - targetField: variableName, - position: codedata.lineRange.startLine - }; - - // Get DM model with mapping-level diagnostics - const dataMapperModel = await langClient.getDataMapperMappings(dataMapperMetadata) as DataMapperModelResponse; - const dmModel = dataMapperModel.mappingsModel as DMModel; - - return { dataMapperMetadata, dmModel }; -} - -// Removes mappings with compilation errors -async function removeMappingsWithErrors( - langClient: any, - mainFilePath: string, - dmModelResult: DMModelDiagnosticsResult, - varName: string -): Promise { - const { dataMapperMetadata, dmModel } = dmModelResult; - - // Check if any mappings have diagnostics and delete them - if (dmModel && dmModel.mappings && dmModel.mappings.length > 0) { - // Extract mappings with diagnostics - const mappingsWithDiagnostics = dmModel.mappings?.filter((mapping: Mapping) => - mapping.diagnostics && mapping.diagnostics.length > 0 - ) || []; - - // Delete each mapping with diagnostics using the deleteMapping API - for (const mapping of mappingsWithDiagnostics) { - const deleteRequest: DeleteMappingRequest = { - filePath: mainFilePath, - codedata: dataMapperMetadata.codedata, - mapping: mapping, - varName: varName, - targetField: dataMapperMetadata.targetField, - }; - - const deleteResponse = await langClient.deleteMapping(deleteRequest); - - // Apply the text edits from the delete operation directly to temp files - if (Object.keys(deleteResponse.textEdits).length > 0) { - await applyTextEditsToTempFile(deleteResponse.textEdits, mainFilePath); - await new Promise((resolve) => setTimeout(resolve, 100)); - } - } - } -} - -// ============================================================================= -// INLINE MAPPING CODE GENERATION WITH EVENT HANDLERS -// ============================================================================= - -// Core inline mapping code generation function that emits events and generates mappings inline -export async function generateInlineMappingCodeCore(inlineMappingRequest: MetadataWithAttachments, eventHandler: CopilotEventHandler): Promise { - if (!inlineMappingRequest.metadata) { - throw new Error("Metadata is required in the inline mapping request"); - } - - if (!inlineMappingRequest.metadata.codeData) { - throw new Error("Code data is required in the metadata"); - } - - // Initialize generation process - eventHandler({ type: "start" }); - eventHandler({ type: "content_block", content: "Building the transformation logic using your provided data structures and mapping hints\n\n" }); - eventHandler({ type: "content_block", content: "Reading project files and collecting imports..." }); - let assistantResponse: string = ""; - const projectImports = await collectAllImportsFromProject(); - const allImportStatements = projectImports.imports.flatMap(file => file.statements || []); - - // Remove duplicates based on moduleName - const uniqueImportStatements = Array.from( - new Map(allImportStatements.map(imp => [imp.moduleName, imp])).values() - ); - - let targetFileName = inlineMappingRequest.metadata.codeData.lineRange.fileName; - - if (!targetFileName) { - throw new Error("Target file name could not be determined from code data"); - } - - const langClient = StateMachine.langClient(); - const context = StateMachine.context(); - const projectRoot = context.projectPath; - - const inlineMappingsResult: InlineMappingsSourceResult = - await generateInlineMappingsSource(inlineMappingRequest, langClient, context, eventHandler); - - // Check if no mappings were generated - if (!inlineMappingsResult.allMappingsRequest.mappings || inlineMappingsResult.allMappingsRequest.mappings.length === 0) { - eventHandler({ type: "content_block", content: NO_MAPPINGS_GENERATED_WARNING }); - eventHandler({ type: "stop", command: Command.DataMap }); - return; - } - - await updateSourceCode({ textEdits: inlineMappingsResult.sourceResponse.textEdits, skipPayloadCheck: true }); - await new Promise((resolve) => setTimeout(resolve, 100)); - - let customFunctionsTargetPath: string | undefined; - let customFunctionsFileName: string | undefined; - let codeToDisplay: string; - - if (inlineMappingsResult.allMappingsRequest.customFunctionsFilePath) { - const absoluteCustomFunctionsPath = determineCustomFunctionsPath(projectRoot, targetFileName); - customFunctionsFileName = path.basename(absoluteCustomFunctionsPath); - - // For workspace projects, make path relative to workspace root - const workspacePath = context.workspacePath; - if (workspacePath) { - customFunctionsTargetPath = path.relative(workspacePath, absoluteCustomFunctionsPath); - } else { - // Normal project: use relative path from project root - customFunctionsTargetPath = path.relative(projectRoot, absoluteCustomFunctionsPath); - } - } - - // Check if mappings file and custom functions file are the same - const mainFilePath = inlineMappingsResult.tempFileMetadata.codeData.lineRange.fileName; - const isSameFile = customFunctionsTargetPath && - path.resolve(mainFilePath) === path.resolve(path.join(inlineMappingsResult.tempDir, customFunctionsFileName)); - - eventHandler({ type: "content_block", content: "\nRepairing generated code..." }); - - const variableName = inlineMappingRequest.metadata.name || inlineMappingsResult.tempFileMetadata.name; - - // Get DM model with diagnostics - const dmModelResult = await getInlineDMModelWithDiagnostics( - langClient, - mainFilePath, - variableName, - inlineMappingsResult.allMappingsRequest.codedata - ); - - // Repair inline mappings using LLM based on DM model diagnostics - await repairMappingsWithLLM( - langClient, - dmModelResult, - uniqueImportStatements - ); - - // Repair check expression errors (BCE3032) - await repairCheckErrors( - langClient, - projectRoot, - mainFilePath, - inlineMappingsResult.allMappingsRequest, - inlineMappingsResult.tempDir, - isSameFile - ); - - // For workspace projects, compute relative file path from workspace root - let targetFilePath = path.relative(projectRoot, context.documentUri); - const workspacePath = context.workspacePath; - - if (workspacePath) { - // Workspace project: make path relative to workspace root (e.g., "foo/mappings.bal") - targetFilePath = path.relative(workspacePath, context.documentUri); - } - - // Remove compilation error mappings for inline mappings FIRST - await removeInlineCompilationErrorMappingFields( - langClient, - mainFilePath, - variableName, - inlineMappingsResult, - ); - - // Read updated content after removing compilation errors - const finalContent = fs.readFileSync(mainFilePath, 'utf8'); - - // Extract code to display - if (variableName) { - const extractedVariableDefinition = await extractVariableDefinitionSource( - mainFilePath, - inlineMappingsResult.tempFileMetadata.codeData, - variableName - ); - if (extractedVariableDefinition) { - codeToDisplay = extractedVariableDefinition; - } - } - let customFunctionsContent = ''; - if (inlineMappingsResult.allMappingsRequest.customFunctionsFilePath && !isSameFile) { - customFunctionsContent = fs.readFileSync(inlineMappingsResult.allMappingsRequest.customFunctionsFilePath, 'utf8'); - } - - const generatedSourceFiles = buildMappingFileArray( - context.documentUri, - finalContent, - customFunctionsTargetPath, - customFunctionsContent, - ); - - // Build assistant response - assistantResponse = `Here are the data mappings:\n\n`; - if (inlineMappingRequest.attachments.length > 0) { - const attachmentNames = []; - for (const att of (inlineMappingRequest.attachments)) { - attachmentNames.push(att.name); - } - assistantResponse += `- **Attachments**: ${attachmentNames.join(", ")}\n`; - } - - if (inlineMappingRequest.metadata.mappingsModel.mappings.length > 0) { - assistantResponse += `\n**Note**: When you click **Add to Integration**, it will override your existing mappings.\n`; - } - - if (isSameFile) { - // For same file, custom content is already merged in the code to display - assistantResponse += `\n\`\`\`ballerina\n${codeToDisplay}\n\`\`\`\n`; - } else { - assistantResponse += `\n\`\`\`ballerina\n${codeToDisplay}\n\`\`\`\n`; - - if (customFunctionsContent) { - assistantResponse += `\n\`\`\`ballerina\n${customFunctionsContent}\n\`\`\`\n`; - } - } - - eventHandler({ type: "generated_sources", fileArray: generatedSourceFiles }); - eventHandler({ type: "content_block", content: assistantResponse }); - eventHandler({ type: "stop", command: Command.DataMap }); -} - -// Removes mapping fields with compilation errors for inline mappings -async function removeInlineCompilationErrorMappingFields( - langClient: any, - mainFilePath: string, - variableName: string, - inlineMappingsResult: InlineMappingsSourceResult -): Promise { - // Get DM model with diagnostics for inline variable - const dmModelResult = await getInlineDMModelWithDiagnostics( - langClient, - mainFilePath, - variableName, - inlineMappingsResult.allMappingsRequest.codedata - ); - - // Use the to remove mappings with errors - await removeMappingsWithErrors( - langClient, - mainFilePath, - dmModelResult, - inlineMappingsResult.allMappingsRequest.varName - ); -} - -// Main public function that uses the default event handler for inline mapping generation -export async function generateInlineMappingCode(inlineMappingRequest: MetadataWithAttachments): Promise { - const eventHandler = createWebviewEventHandler(Command.DataMap); - try { - await generateInlineMappingCodeCore(inlineMappingRequest, eventHandler); - } catch (error) { - console.error("Error during inline mapping code generation:", error); - eventHandler({ type: "error", content: getErrorMessage(error) }); - throw error; - } -} - -// ============================================================================= -// CONTEXT TYPE CREATION WITH EVENT HANDLERS -// ============================================================================= - -// Core context type creation function that emits events and generates Ballerina record types -export async function generateContextTypesCore(typeCreationRequest: ProcessContextTypeCreationRequest, eventHandler: CopilotEventHandler): Promise { - if (typeCreationRequest.attachments.length === 0) { - throw new Error("Attachments are required for type creation"); - } - - // Initialize generation process - eventHandler({ type: "start" }); - let assistantResponse: string = ""; - - try { - const biDiagramRpcManager = new BiDiagramRpcManager(); - const langClient = StateMachine.langClient(); - const context = StateMachine.context(); - const projectComponents = await biDiagramRpcManager.getProjectComponents(); - - // Generate types from context with validation - const { typesCode, filePath } = await generateTypesFromContext( - typeCreationRequest.attachments, - projectComponents, - langClient - ); - - // For workspace projects, compute relative file path from workspace root - const workspacePath = context.workspacePath; - const projectRoot = context.projectPath; - let targetFilePath = filePath; - - if (workspacePath && projectRoot) { - // Workspace project: need to include package path prefix (e.g., "foo/types.bal") - const absoluteFilePath = path.isAbsolute(filePath) ? filePath : path.join(projectRoot, filePath); - targetFilePath = path.relative(workspacePath, absoluteFilePath); - } - - // Build assistant response - const sourceAttachmentNames = typeCreationRequest.attachments.map(a => a.name).join(", "); - const fileText = typeCreationRequest.attachments.length === 1 ? "file" : "files"; - assistantResponse = `Types generated from the ${sourceAttachmentNames} ${fileText} shown below.\n`; - assistantResponse += `\n\`\`\`ballerina\n${typesCode}\n\`\`\`\n`; - - // Send assistant response through event handler - eventHandler({ type: "content_block", content: assistantResponse }); - eventHandler({ type: "stop", command: Command.TypeCreator }); - } catch (error) { - console.error("Error during context type creation:", error); - throw error; - } -} - -// Main public function that uses the default event handler for context type creation -export async function generateContextTypes(typeCreationRequest: ProcessContextTypeCreationRequest): Promise { - const eventHandler = createWebviewEventHandler(Command.TypeCreator); - try { - await generateContextTypesCore(typeCreationRequest, eventHandler); - } catch (error) { - console.error("Error during context type creation:", error); - eventHandler({ type: "error", content: getErrorMessage(error) }); - throw error; - } -} - -// Opens the AI panel with data mapper chat interface -export async function openChatWindowWithCommand(): Promise { - const langClient = StateMachine.langClient(); - const context = StateMachine.context(); - const model = await generateDataMapperModel({}, langClient, context); - - const { identifier, dataMapperMetadata } = context; - - // Automatically close and open AI mapping chat window with the generated model - commands.executeCommand(CLOSE_AI_PANEL_COMMAND); - commands.executeCommand(OPEN_AI_PANEL_COMMAND, { - type: 'command-template', - command: Command.DataMap, - templateId: identifier ? TemplateId.MappingsForFunction : TemplateId.InlineMappings, - ...(identifier && { params: { functionName: identifier } }), - metadata: { - ...dataMapperMetadata, - mappingsModel: model.mappingsModel as DMModel - } - }); -} - -// Removes mapping fields with compilation errors to avoid syntax errors in generated code -async function removeCompilationErrorMappingFields( - langClient: any, - mainFilePath: string, - targetFunctionName: string, - allMappingsRequest: AllDataMapperSourceRequest, -): Promise { - // Get DM model with diagnostics - const dmModelResult = await getDMModel( - langClient, - mainFilePath, - targetFunctionName - ); - - // Use function to remove mappings with compilation errors - await removeMappingsWithErrors( - langClient, - mainFilePath, - dmModelResult, - allMappingsRequest.varName - ); -} - -// Applies text edits to a temporary file without using VS Code workspace APIs -async function applyTextEditsToTempFile(textEdits: { [key: string]: TextEdit[] }, targetFilePath: string): Promise { - // Read current file content - let fileContent = fs.readFileSync(targetFilePath, 'utf8'); - const lines = fileContent.split('\n'); - - // Get edits for this file - const editsForFile = textEdits[targetFilePath] || textEdits[Uri.file(targetFilePath).toString()]; - - if (!editsForFile || editsForFile.length === 0) { - return; - } - - // Sort edits in reverse order (bottom to top) to maintain line positions - const sortedEdits = [...editsForFile].sort((a, b) => { - if (b.range.start.line !== a.range.start.line) { - return b.range.start.line - a.range.start.line; - } - return b.range.start.character - a.range.start.character; - }); - - // Apply each edit - for (const edit of sortedEdits) { - const startLine = edit.range.start.line; - const startChar = edit.range.start.character; - const endLine = edit.range.end.line; - const endChar = edit.range.end.character; - - // Handle single line edit - if (startLine === endLine) { - const line = lines[startLine]; - lines[startLine] = line.substring(0, startChar) + edit.newText + line.substring(endChar); - } else { - // Handle multi-line edit - const firstLine = lines[startLine].substring(0, startChar); - const lastLine = lines[endLine].substring(endChar); - const newContent = firstLine + edit.newText + lastLine; - - // Remove the lines in the range and replace with new content - lines.splice(startLine, endLine - startLine + 1, newContent); - } - } - - // Write updated content back to file - const updatedContent = lines.join('\n'); - writeBallerinaFileDidOpenTemp(targetFilePath, updatedContent); -} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/utils.ts deleted file mode 100644 index 58a757cb95a..00000000000 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/documentation/utils.ts +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. - -// WSO2 LLC. licenses this file to you under the Apache License, -// Version 2.0 (the "License"); you may not use this file except -// in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 - -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -import { ProjectSource } from "@wso2/ballerina-core"; - -// ============================================== -// UTILITY FUNCTIONS -// ============================================== - -export function extractDocumentationFromResponse(response: string): string { - // For now, return the full response as documentation - // In the future, we might want to extract specific sections or format it - return response.trim(); -} - -export function flattenProjectToText(projectSource: ProjectSource): string { - let flattenedProject = ""; - - const modules = projectSource.projectModules; - if (modules) { - for (const module of modules) { - let moduleSource = ""; - for (const sourceFile of module.sourceFiles) { - moduleSource += `\`\`\`ballerina -# modules/${module.moduleName}/${sourceFile.filePath} - -${sourceFile.content} -\`\`\` - -`; - } - flattenedProject += moduleSource; - } - } - - for (const sourceFile of projectSource.sourceFiles) { - flattenedProject += `\`\`\`ballerina -# ${sourceFile.filePath} - -${sourceFile.content} -\`\`\` - -`; - } - - return flattenedProject; -} - -export function getExternalTypesAsJsonSchema(openApiSpec: string): string { - try { - const externalTypes: Record = {}; - - const openApiSpecObj = JSON.parse(openApiSpec); - const components = openApiSpecObj.components; - - if (components && components.schemas) { - for (const componentName in components.schemas) { - const componentSchema = components.schemas[componentName]; - if (componentSchema && componentSchema['x-ballerina-type'] !== undefined) { - externalTypes[componentName] = componentSchema; - } - } - } - - return JSON.stringify(externalTypes, null, 2); - } catch (error) { - // Return empty object if parsing fails - return "{}"; - } -} - -export function getTypesAsJsonSchema(openApiSpec: string): string { - try { - const openApiSpecObj = JSON.parse(openApiSpec); - const components = openApiSpecObj.components; - - if (components) { - return JSON.stringify(components, null, 2); - } - - return "{}"; - } catch (error) { - // Return empty object if parsing fails - return "{}"; - } -} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts deleted file mode 100644 index 94a4e6b0afa..00000000000 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/healthcare/healthcare.ts +++ /dev/null @@ -1,368 +0,0 @@ -// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. - -// WSO2 LLC. licenses this file to you under the Apache License, -// Version 2.0 (the "License"); you may not use this file except -// in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 - -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -import { ModelMessage, generateObject, streamText } from "ai"; -import { getAnthropicClient, ANTHROPIC_HAIKU, ANTHROPIC_SONNET_4, getProviderCacheControl } from "../connection"; -import { GenerationType, getRelevantLibrariesAndFunctions } from "../libs/libs"; -import { getRewrittenPrompt, populateHistory, flattenProjectToFiles, getErrorMessage, buildPackageContext, formatFileUploadContents } from "../utils"; -import { libraryContains } from "../libs/funcs"; -import { LANGLIBS } from "../libs/langlibs"; -import { - GetTypeResponse, - GetTypesRequest, - GetTypesResponse, - getTypesResponseSchema, - Library, - MiniType, - TypeDefinition, -} from "../libs/libs_types"; -import { - FileAttatchment, - GenerateCodeRequest, - ProjectSource, - SourceFile, - OperationType, - Command -} from "@wso2/ballerina-core"; -import { getProjectSource } from "../../../../rpc-managers/ai-panel/rpc-manager"; -import { CopilotEventHandler, createWebviewEventHandler } from "../event"; -import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; -import { stringifyExistingCode } from "../code/code"; - - -// Core healthcare code generation function that emits events -export async function generateHealthcareCodeCore( - params: GenerateCodeRequest, - eventHandler: CopilotEventHandler -): Promise { - const projects: ProjectSource[] = await getProjectSource(params.operationType); - const activeProject = projects.find(p => p.isActive) || projects[0]; - const packageName = activeProject.projectName; - const prompt = getRewrittenPrompt(params, projects); - const relevantTrimmedFuncs: Library[] = ( - await getRelevantLibrariesAndFunctions({ query: prompt }, GenerationType.HEALTHCARE_GENERATION) - ).libraries; - - const historyMessages = populateHistory(params.chatHistory); - const cacheOptions = await getProviderCacheControl(); - - const allMessages: ModelMessage[] = [ - { - role: "system", - content: getSystemPromptPrefix(relevantTrimmedFuncs), - }, - { - role: "system", - content: getSystemPromptSuffix(LANGLIBS), - providerOptions: cacheOptions, - }, - ...historyMessages, - { - role: "user", - content: getUserPrompt(prompt, projects, params.fileAttachmentContents, packageName, params.operationType), - providerOptions: cacheOptions, - }, - ]; - - const { fullStream } = streamText({ - model: await getAnthropicClient(ANTHROPIC_SONNET_4), - maxOutputTokens: 4096 * 2, - temperature: 0, - messages: allMessages, - abortSignal: AIPanelAbortController.getInstance().signal, - }); - - eventHandler({ type: "start" }); - let assistantResponse: string = ""; - for await (const part of fullStream) { - switch (part.type) { - case "text-delta": { - const textPart = part.text; - assistantResponse += textPart; - eventHandler({ type: "content_block", content: textPart }); - break; - } - case "error": { - const error = part.error; - console.error("Error during Code generation:", error); - eventHandler({ type: "error", content: getErrorMessage(error) }); - break; - } - case "finish": { - const finishReason = part.finishReason; - console.log("Finish reason: ", finishReason); - if (finishReason === "error") { - // Already handled in error case. - break; - } - eventHandler({ type: "stop", command: Command.Healthcare }); - break; - } - } - } -} - -// Main public function that uses the default event handler -export async function generateHealthcareCode(params: GenerateCodeRequest): Promise { - const eventHandler = createWebviewEventHandler(Command.Healthcare); - try { - await generateHealthcareCodeCore(params, eventHandler); - } catch (error) { - console.error("Error during healthcare generation:", error); - eventHandler({ type: "error", content: getErrorMessage(error) }); - } -} - -export function getSystemPromptPrefix(apidocs: Library[]): string { - return `You are an expert assistant who specializes in writing Ballerina code for healthcare integrations. Your goal is to ONLY answer Ballerina related queries. You should always answer with accurate and functional Ballerina code that addresses the specified query while adhering to the constraints of the given API documentation. - -You will be provided with following inputs: - -1. API_DOCS: A JSON string containing the API documentation for various Ballerina libraries and their functions, types, and clients. - -${JSON.stringify(apidocs)} - -`; -} - -function getSystemPromptSuffix(langlibs: Library[]) { - return `2. Langlibs - -${JSON.stringify(langlibs)} - - -If the query doesn't require code examples, answer the code by utilzing the api documentation. -If the query requires code, Follow these steps to generate the Ballerina code: - -1. Carefully analyze the provided API documentation: - - Identify the available libraries, clients, their functions and their relavant types. - -2. Thoroughly read and understand the given query: - - Identify the main requirements and objectives of the integration. - - Determine which libraries, functions and their relavant records and types from the API documentation which are needed to achieve the query and forget about unused API docs. - - Note the libraries needed to achieve the query and plan the control flow of the applicaiton based input and output parameters of each function of the connector according to the API documentation. - -3. Plan your code structure: - - Decide which libraries need to be imported (Avoid importing lang.string, lang.boolean, lang.float, lang.decimal, lang.int, lang.map langlibs as they are already imported by default). - - Determine the necessary client initialization. - - Define Types needed for the query in the types.bal file. - - Outline the service OR main function for the query. - - Outline the required function usages as noted in Step 2. - - Based on the types of identified functions, plan the data flow. Transform data as necessary. - - Note the special Ballerina libraries that you ALWAYS have to import into your code: - - import ballerinax/health.fhir.r4.international401 as international401; - import ballerinax/health.fhir.r4 as r4; - import ballerinax/health.fhir.r4.parser as parser; - import ballerina/io as io; - import ballerinax/health.hl7v2 as hl7v2; - import ballerinax/health.hl7v2commons as hl7v2commons; - - -4. Generate the Ballerina code: - - Start with the required import statements. - - Define required configurables for the query. Use only string, int, boolean types in configurable variables. - - Initialize any necessary clients with the correct configuration at the module level(before any function or service declarations). - - Implement the main function OR service to address the query requirements. - - Use defined connectors based on the query by following the API documentation. - - Use only the functions, types, and clients specified in the API documentation. - - Use dot donation to access a normal function. Use -> to access a remote function or resource function. - - Ensure proper error handling and type checking. - - Do not invoke methods on json access expressions. Always Use seperate statements. - - Use langlibs ONLY IF REQUIRED. - -5. Review and refine your code: - - Check that all query requirements are met. - - Verify that you're only using elements from the provided API documentation. - - Ensure the code follows Ballerina best practices and conventions. - -Provide a brief explanation of how your code addresses the query and then output your generated ballerina code. - -Important reminders: -- Only use the libraries, functions, types, services and clients specified in the provided API documentation. -- Always strictly respect the types given in the API Docs. -- Do not introduce any additional libraries or functions not mentioned in the API docs. -- Only use specified fields in records according to the api docs. this applies to array types of that record as well. -- Ensure your code is syntactically correct and follows Ballerina conventions. -- Do not use dynamic listener registrations. -- Do not write code in a way that requires updating/assigning values of function parameters. -- ALWAYS Use two words camel case identifiers (variable, function parameter, resource function parameter and field names). -- If the library name contains a . Always use an alias in the import statement. (import org/package.one as one;) -- Treat generated connectors/clients inside the generated folder as submodules. -- A submodule MUST BE imported before being used. The import statement should only contain the package name and submodule name. For package my_pkg, folder strucutre generated/fooApi the import should be \`import my_pkg.fooApi;\` -- If the return parameter typedesc default value is marked as <> in the given API docs, define a custom record in the code that represents the data structure based on the use case and assign to it. -- Whenever you have a Json variable, NEVER access or manipulate Json variables. ALWAYS define a record and convert the Json to that record and use it. -- When invoking resource function from a client, use the correct paths with accessor and paramters. (eg: exampleClient->/path1/["param"]/path2.get(key="value")) -- When you are accessing a field of a record, always assign it into new variable and use that variable in the next statement. -- Avoid long comments in the code. Use // for single line comments. -- Always use named arguments when providing values to any parameter. (eg: .get(key="value")) -- Mention types EXPLICITLY in variable declarations and foreach statements. -- Do not modify the README.md file unless asked to be modified explicitly in the query. -- Do not add/modify toml files(Config.toml/Ballerina.toml) unless asked. -- In the library API documentation if the service type is specified as generic, adhere to the instructions specified there on writing the service. -- ALWAYS use payload bindings when implementing the resource functions of the services. - \`\`\ - import ballerina/http; - type Album readonly & record {| - string title; - string artist; - |}; - table key(title) albums = table []; - service / on new http:Listener(9090) { - // The \`album\` parameter in the payload annotation represents the entity body of the inbound request. - resource function post albums(Album album) returns Album { - albums.add(album); - return album; - } - } - \`\`\ - - Note the use of \`Album\` instead of a json payload. - -Begin your response with the explanation, once the entire explanation is finished only, include codeblock segments(if any) in the end of the response. -The explanation should explain the control flow decided in step 2, along with the selected libraries and their functions. - -Each file which needs modifications, should have a codeblock segment and it MUST have complete file content with the proposed change. -The codeblock segments should only have .bal contents and it should not generate or modify any other file types. Politely decline if the query requests for such cases. - -Example Codeblock segments: - If the generated code is a service, use an appropriate name for the file. Use \`service\` as a prefix to the file name. Example: - - \`\`\ballerina - //code goes here - \`\`\ - - - If the generated code is a main function, use an appropriate name for the file. Use \`main\` as a prefix to the file name. Example: - - \`\`\ballerina - //code goes here - \`\`\ - -`; -} - -function getUserPrompt( - usecase: string, - projects: ProjectSource[], - fileUploadContents: FileAttatchment[], - packageName: string, - op: OperationType -): string { - const fileInstructions = formatFileUploadContents(fileUploadContents); - const packageContext = buildPackageContext(projects, packageName); - - return `QUERY: The query you need to answer using the provided api documentation. - -${usecase} - - -Existing Code: Users existing code. - -${stringifyExistingCode(projects, op)} - - -${packageContext} - -${fileInstructions} - -`; -} - -export async function getRequiredTypesFromLibJson( - libraries: string[], - prompt: string, - librariesJson: Library[] -): Promise { - if (librariesJson.length === 0) { - return []; - } - - const typeDefs: GetTypesRequest[] = librariesJson - .filter((lib) => libraryContains(lib.name, libraries)) - .map((lib) => ({ - name: lib.name, - description: lib.description, - types: filteredTypes(lib.typeDefs), - })); - - if (typeDefs.length === 0) { - return []; - } - - const getLibSystemPrompt = `You are an assistant tasked with selecting the Ballerina types needed to solve a given question based on a set of Ballerina libraries given in the context as a JSON. - -Objective: Create a JSON output that includes a minimized version of the context JSON, containing only the selected libraries and types necessary to achieve a given question. - -Context Format: A JSON Object that represents a library with its name and types. - -Library Context JSON: -\`\`\`json -${JSON.stringify(typeDefs)} -\`\`\` - -Think step-by-step to choose the required types in order to solve the given question. -1. Identify the unique entities that are required to answer the question. Create a small description for each identified entitiy to better explain their role. -2. When selecting the necessary Ballerina types that represents those entities, consider the following factors: -2.1 Take the description of the types from the context as a way to understand the entity represented by it. -2.2 Compare the types descriptions against the descriptions you generated for each identity and find the mapping types for each entity. -2.3 Find the Ballerina libraries of the selected types using the given context. Use ONLY the given context to find the libraries. -3. For each selected type, find which fields of those types are required to answer the given question by referring to the given context. For each selected field; -3.1 Understands the types of those fields by referring to the context. -3.2 Context json has a link element which indicates the library name. -3.3 Make sure that you select those types and add to the output. When selecting those types pay attention to following: -3.3.1 For each new type, search the context and find the library which defines the new type. Use ONLY the given context to find the libraries. -3.3.2 Add the found library and the types to the output. -4. Once you select the types, please cross check and make sure they are placed under the correct library. -4.1 Go through each library and make sure they exist in the given context json. -4.2 Go through each library and verify the types by referring to the context. -4.2 Fix any issues found and try to re-identify the correct library the problematic type belongs to by referring to the context. -4.3 IT IS A MUST that you do these verification steps. -5. Simplify the type details as per the below rules. -5.1 Include only the type name in the context object. -5.2 Include the name of the type as SAME as the original context. -6. For each selected type, Quote the original type from the context in the thinking field. -7. Respond using the Output format with the selected functions. - -`; - const getLibUserPrompt = "QUESTION\n```\n" + prompt + "\n```"; - - const messages: ModelMessage[] = [ - { role: "system", content: getLibSystemPrompt }, - { role: "user", content: getLibUserPrompt }, - ]; - try { - const { object } = await generateObject({ - model: await getAnthropicClient(ANTHROPIC_HAIKU), - maxOutputTokens: 8192, - temperature: 0, - messages: messages, - schema: getTypesResponseSchema, - abortSignal: AIPanelAbortController.getInstance().signal, - }); - - const libList = object as GetTypesResponse; - return libList.libraries; - } catch (error) { - throw new Error(`Failed to parse bulk functions response: ${error}`); - } -} - -function filteredTypes(typeDefinitions: TypeDefinition[]): MiniType[] { - return typeDefinitions.map((typeDef) => ({ - name: typeDef.name, - description: typeDef.description, - })); -} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/langlibs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/langlibs.ts deleted file mode 100644 index a015e741375..00000000000 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/langlibs.ts +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. - -// WSO2 LLC. licenses this file to you under the Apache License, -// Version 2.0 (the "License"); you may not use this file except -// in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 - -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -import { Library } from "./libs_types"; - -export const LANGLIBS : Library[] = [{"name":"ballerina/lang.runtime", "description":"The `lang.runtime` module provides functions related to the language runtime that are not specific to a particular basic type.", "typeDefs":[{"functions":[], "name":"DynamicListener", "description":"", "type":"Class"}, {"functions":[], "name":"StackFrame", "description":"", "type":"Class"}], "clients":[], "functions":[{"name":"sleep", "type":"Normal Function", "description":"Halts the current strand for a predefined amount of time.\n\n```ballerina\nruntime:sleep(5);\n```", "parameters":[{"name":"seconds", "description":"An amount of time to sleep in seconds", "type":{"name":"decimal"}}], "return":{"type":{"name":"nil"}}}]}, {"name":"ballerina/lang.value", "description":"The `lang.value` module provides functions that work on values of more than one basic type.", "typeDefs":[{"members":[], "name":"Cloneable", "description":"The type of value to which `clone` and `cloneReadOnly` can be applied.", "type":"Union"}, {"members":[], "name":"JsonFloat", "description":"Subtype of `json` that allows only float numbers.", "type":"Union"}, {"members":[], "name":"JsonDecimal", "description":"Subtype of `json` that allows only decimal numbers.", "type":"Union"}, {"members":[], "name":"Type", "description":"", "type":"Union"}], "clients":[], "functions":[{"name":"cloneWithType", "type":"Normal Function", "description":"Constructs a value with a specified type by cloning another value.\n\nWhen parameter `v` is a structural value, the inherent type of the value to be constructed\ncomes from parameter `t`. When parameter `t` is a union, it must be possible to determine which\nmember of the union to use for the inherent type by following the same rules\nthat are used by list constructor expressions and mapping constructor expressions\nwith the contextually expected type. If not, then an error is returned.\nThe `cloneWithType` operation is recursively applied to each member of parameter `v` using\nthe type descriptor that the inherent type requires for that member.\n\nLike the Clone abstract operation, this does a deep copy, but differs in\nthe following respects:\n- the inherent type of any structural values constructed comes from the specified\ntype descriptor rather than the value being constructed\n- the read-only bit of values and fields comes from the specified type descriptor\n- the graph structure of `v` is not preserved; the result will always be a tree;\nan error will be returned if `v` has cycles\n- immutable structural values are copied rather being returned as is; all\nstructural values in the result will be mutable.\n- numeric values can be converted using the NumericConvert abstract operation\n- if a record type descriptor specifies default values, these will be used\nto supply any missing members\n\n```ballerina\nanydata[] arr = [1, 2, 3, 4];\nint[] intArray = check arr.cloneWithType();\nintArray ⇒ [1,2,3,4]\narr === intArray ⇒ false\ntype Vowels string:Char[];\nstring[] vowels = [\"a\", \"e\", \"i\", \"o\", \"u\"];\nvowels.cloneWithType(Vowels) ⇒ [\"a\",\"e\",\"i\",\"o\",\"u\"]\nvowels.cloneWithType(string) ⇒ error\n```", "parameters":[{"name":"v", "description":"the value to be cloned", "type":{"name":"anydata"}}, {"name":"t", "description":"the type for the cloned to be constructed", "type":{"name":"typedesc"}, "default":"<>"}], "return":{"description":"a new value that belongs to parameter `t`, or an error if this cannot be done", "type":{"name":"t|error"}}}, {"name":"ensureType", "type":"Normal Function", "description":"Safely casts a value to a type.\n\nThis casts a value to a type in the same way as a type cast expression,\nbut returns an error if the cast cannot be done, rather than panicking.\n\n```ballerina\njson student = {name: \"Jo\", subjects: [\"CS1212\", \"CS2021\"]};\njson[] subjects = check student.subjects.ensureType();\nsubjects ⇒ [\"CS1212\",\"CS2021\"]\nanydata vowel = \"I\";\nvowel.ensureType(string:Char) ⇒ I;\nvowel.ensureType(int) ⇒ error\n```", "parameters":[{"name":"v", "description":"the value to be cast", "type":{"name":"any|error"}}, {"name":"t", "description":"a typedesc for the type to which to cast it", "type":{"name":"typedesc"}, "default":"<>"}], "return":{"description":"`v` cast to the type described by parameter `t`, or an error, if the cast cannot be done", "type":{"name":"t|error"}}}, {"name":"fromJsonString", "type":"Normal Function", "description":"Parses a string in JSON format and returns the value that it represents.\n\nNumbers in the JSON string are converted into Ballerina values of type\ndecimal except in the following two cases:\nif the JSON number starts with `-` and is numerically equal to zero, then it is\nconverted into float value of `-0.0`;\notherwise, if the JSON number is syntactically an integer and is in the range representable\nby a Ballerina int, then it is converted into a Ballerina int.\nA JSON number is considered syntactically an integer if it contains neither\na decimal point nor an exponent.\n\nReturns an error if the string cannot be parsed.\n\n```ballerina\n\"{\\\"id\\\": 12, \\\"name\\\": \\\"John\\\"}\".fromJsonString() ⇒ {\"id\":12,\"name\":\"John\"}\n\"{12: 12}\".fromJsonString() ⇒ error\n```", "parameters":[{"name":"str", "description":"string in JSON format", "type":{"name":"string"}}], "return":{"description":"`str` parsed to json or error", "type":{"name":"json|error"}}}, {"name":"fromJsonStringWithType", "type":"Normal Function", "description":"Converts a string in JSON format to a user-specified type.\n\nThis is a combination of function `fromJsonString` followed by function `fromJsonWithType`.\n\n```ballerina\nint[] intArray = check \"[1, 2, 3, 4]\".fromJsonStringWithType(); \nintArray ⇒ [1,2,3,4]\n\"2022\".fromJsonStringWithType(int) ⇒ 2022\n\"2022\".fromJsonStringWithType(boolean) ⇒ error\n```", "parameters":[{"name":"str", "description":"string in JSON format", "type":{"name":"string"}}, {"name":"t", "description":"type to convert to", "type":{"name":"typedesc"}, "default":"<>"}], "return":{"description":"value belonging to type parameter `t` or error if this cannot be done", "type":{"name":"t|error"}}}, {"name":"toJson", "type":"Normal Function", "description":"Converts a value of type `anydata` to `json`.\n\nThis does a deep copy of parameter `v` converting values that do\nnot belong to json into values that do.\nA value of type `xml` is converted into a string as if\nby the `toString` function.\nA value of type `table` is converted into a list of\nmappings one for each row.\nThe inherent type of arrays in the return value will be\n`json[]` and of mappings will be `map`.\nA new copy is made of all structural values, including\nimmutable values.\nThis panics if parameter `v` has cycles.\n\n```ballerina\nanydata student = {name: \"Jo\", age: 11};\nstudent.toJson() ⇒ {\"name\":\"Jo\",\"age\":11}\nanydata[] array = [];\narray.push(array);\narray.toJson() ⇒ panic\n```", "parameters":[{"name":"v", "description":"anydata value", "type":{"name":"anydata"}}], "return":{"description":"representation of `v` as value of type json", "type":{"name":"json"}}}, {"name":"toJsonString", "type":"Normal Function", "description":"Returns the string that represents a anydata value in JSON format.\n\nparameter `v` is first converted to `json` as if by the function `toJson`.\n\n```ballerina\nanydata marks = {\"Alice\": 90, \"Bob\": 85, \"Jo\": 91};\nmarks.toJsonString() ⇒ {\"Alice\":90, \"Bob\":85, \"Jo\":91}\n```", "parameters":[{"name":"v", "description":"anydata value", "type":{"name":"anydata"}}], "return":{"description":"string representation of parameter `v` converted to `json`", "type":{"name":"string"}}}, {"name":"toString", "type":"Normal Function", "description":"Performs a direct conversion of a value to a string.\n\nThe conversion is direct in the sense that when applied to a value that is already\na string it leaves the value unchanged.\n\nThe details of the conversion are specified by the ToString abstract operation\ndefined in the Ballerina Language Specification, using the direct style.\n\n```ballerina\ndecimal value = 12.12d;\nvalue.toString() ⇒ 12.12\nanydata[] data = [1, \"Sam\", 12.3f, 12.12d, {value: 12}];\ndata.toString() ⇒ [1,\"Sam\",12.3,12.12,{\"value\":12}]\n```", "parameters":[{"name":"v", "description":"the value to be converted to a string", "type":{"name":"(any)"}}], "return":{"description":"a string resulting from the conversion", "type":{"name":"string"}}}]}, {"name":"ballerina/lang.string", "description":"The `lang.string` module corresponds to the `string` basic type.", "typeDefs":[{"name":"Char", "description":"Built-in subtype of string containing strings of length 1.", "type":"string"}], "clients":[], "functions":[{"name":"'join", "type":"Normal Function", "description":"Joins zero or more strings together with a separator.\n\n```ballerina\nstring:'join(\" \", \"Ballerina\", \"is\", \"a\", \"programming\", \"language\") ⇒ Ballerina is a programming language\nstring[] array = [\"John\", \"23\", \"USA\", \"Computer Science\", \"Swimmer\"];\nstring:'join(\",\", ...array) ⇒ John,23,USA,Computer Science,Swimmer\n```", "parameters":[{"name":"separator", "description":"separator string", "type":{"name":"string"}}, {"name":"strs", "description":"strings to be joined", "type":{"name":"strs"}}], "return":{"description":"a string consisting of all of parameter `strs` concatenated in order\nwith parameter `separator` in between them", "type":{"name":"string"}}}, {"name":"codePointCompare", "type":"Normal Function", "description":"Lexicographically compares strings using their Unicode code points.\n\nThis orders strings in a consistent and well-defined way,\nbut the ordering will often not be consistent with cultural expectations\nfor sorted order.\n\n```ballerina\n\"Austria\".codePointCompare(\"Australia\") ⇒ 1\n```", "parameters":[{"name":"str1", "description":"the first string to be compared", "type":{"name":"string"}}, {"name":"str2", "description":"the second string to be compared", "type":{"name":"string"}}], "return":{"description":"an int that is less than, equal to or greater than zero,\naccording as parameter `str1` is less than, equal to or greater than parameter `str2`", "type":{"name":"int"}}}, {"name":"endsWith", "type":"Normal Function", "description":"Tests whether a string ends with another string.\n\n```ballerina\n\"Welcome to the Ballerina programming language\".endsWith(\"language\") ⇒ true\n```", "parameters":[{"name":"str", "description":"the string to be tested", "type":{"name":"string"}}, {"name":"substr", "description":"the ending string", "type":{"name":"string"}}], "return":{"description":"true if parameter `str` ends with parameter `substr`; false otherwise", "type":{"name":"boolean"}}}, {"name":"fromBytes", "type":"Normal Function", "description":"Constructs a string from its UTF-8 representation in bytes.\n\n```ballerina\nstring:fromBytes([72, 101, 108, 108, 111, 32, 66, 97, 108, 108, 101, 114, 105, 110, 97, 33]) ⇒ Hello, World!\nstring:fromBytes([149, 169, 224]) ⇒ error\n```", "parameters":[{"name":"bytes", "description":"UTF-8 byte array", "type":{"name":"byte[]"}}], "return":{"description":"parameter `bytes` converted to string or error", "type":{"name":"string|error"}}}, {"name":"fromCodePointInt", "type":"Normal Function", "description":"Constructs a single character string from a code point.\n\nAn int is a valid code point if it is in the range 0 to 0x10FFFF inclusive,\nbut not in the range 0xD800 or 0xDFFF inclusive.\n\n```ballerina\nstring:fromCodePointInt(97) ⇒ a\nstring:fromCodePointInt(1114113) ⇒ error\n```", "parameters":[{"name":"codePoint", "description":"an int specifying a code point", "type":{"name":"int"}}], "return":{"description":"a single character string whose code point is parameter `codePoint`; or an error\nif parameter `codePoint` is not a valid code point", "type":{"name":"Char|error", "links":[{"category":"internal", "recordName":"Char"}]}}}, {"name":"fromCodePointInts", "type":"Normal Function", "description":"Constructs a string from an array of code points.\n\nAn int is a valid code point if it is in the range 0 to 0x10FFFF inclusive,\nbut not in the range 0xD800 or 0xDFFF inclusive.\n\n```ballerina\nstring:fromCodePointInts([66, 97, 108, 108, 101, 114, 105, 110, 97]) ⇒ Ballerina\nstring:fromCodePointInts([1114113, 1114114, 1114115]) ⇒ error\n```", "parameters":[{"name":"codePoints", "description":"an array of ints, each specifying a code point", "type":{"name":"int[]"}}], "return":{"description":"a string with a character for each code point in parameter `codePoints`; or an error\nif any member of parameter `codePoints` is not a valid code point", "type":{"name":"string|error"}}}, {"name":"getCodePoint", "type":"Normal Function", "description":"Returns the code point of a character in a string.\n\n```ballerina\n\"Hello, World!\".getCodePoint(3) ⇒ 108\n```", "parameters":[{"name":"str", "description":"the string", "type":{"name":"string"}}, {"name":"index", "description":"an index in parameter `str`", "type":{"name":"int"}}], "return":{"description":"the Unicode code point of the character at parameter `index` in parameter `str`", "type":{"name":"int"}}}, {"name":"includes", "type":"Normal Function", "description":"Tests whether a string includes another string.\n\n```ballerina\n\"Hello World, from Ballerina\".includes(\"Bal\") ⇒ true\n\"Hello World! from Ballerina\".includes(\"Hello\", 10) ⇒ false\n```", "parameters":[{"name":"str", "description":"the string in which to search", "type":{"name":"string"}}, {"name":"substr", "description":"the string to search for", "type":{"name":"string"}}, {"name":"startIndex", "description":"index to start searching from", "type":{"name":"int"}, "default":"0"}], "return":{"description":"`true` if there is an occurrence of parameter `substr` in parameter `str` at an index >= parameter `startIndex`,\nor `false` otherwise", "type":{"name":"boolean"}}}, {"name":"indexOf", "type":"Normal Function", "description":"Finds the first occurrence of one string in another string.\n\n```ballerina\n\"New Zealand\".indexOf(\"land\") ⇒ 7\n\"Ballerinalang is a unique programming language\".indexOf(\"lang\", 15) ⇒ 38\n```", "parameters":[{"name":"str", "description":"the string in which to search", "type":{"name":"string"}}, {"name":"substr", "description":"the string to search for", "type":{"name":"string"}}, {"name":"startIndex", "description":"index to start searching from", "type":{"name":"int"}, "default":"0"}], "return":{"description":"index of the first occurrence of parameter `substr` in parameter `str` that is >= parameter `startIndex`,\nor `()` if there is no such occurrence", "type":{"name":"int?"}}}, {"name":"length", "type":"Normal Function", "description":"Returns the length of the string.\n\n```ballerina\n\"Hello, World!\".length() ⇒ 13;\n```", "parameters":[{"name":"str", "description":"the string", "type":{"name":"string"}}], "return":{"description":"the number of characters (code points) in parameter `str`", "type":{"name":"int"}}}, {"name":"startsWith", "type":"Normal Function", "description":"Tests whether a string starts with another string.\n\n```ballerina\n\"Welcome to the Ballerina programming language\".startsWith(\"Welcome\") ⇒ true\n```", "parameters":[{"name":"str", "description":"the string to be tested", "type":{"name":"string"}}, {"name":"substr", "description":"the starting string", "type":{"name":"string"}}], "return":{"description":"true if parameter `str` starts with parameter `substr`; false otherwise", "type":{"name":"boolean"}}}, {"name":"substring", "type":"Normal Function", "description":"Returns a substring of a string.\n\n```ballerina\n\"Hello, my name is John\".substring(7) ⇒ my name is John\n\"Hello, my name is John Anderson\".substring(18, 22) ⇒ John\n```", "parameters":[{"name":"str", "description":"source string.", "type":{"name":"string"}}, {"name":"startIndex", "description":"the starting index, inclusive", "type":{"name":"int"}}, {"name":"endIndex", "description":"the ending index, exclusive", "type":{"name":"int"}, "default":"str.length()"}], "return":{"description":"substring consisting of characters with index >= `startIndex` and < `endIndex`", "type":{"name":"string"}}}, {"name":"toBytes", "type":"Normal Function", "description":"Represents a string as an array of bytes using UTF-8.\n\n```ballerina\n\"Hello, World!\".toBytes() ⇒ [72,101,108,108,111,44,32,87,111,114,108,100,33]\n```", "parameters":[{"name":"str", "description":"the string", "type":{"name":"string"}}], "return":{"description":"UTF-8 byte array", "type":{"name":"byte[]"}}}, {"name":"toCodePointInt", "type":"Normal Function", "description":"Converts a single character string to a code point.\n\n```ballerina\nstring:toCodePointInt(\"a\") ⇒ 97\n```", "parameters":[{"name":"ch", "description":"a single character string", "type":{"name":"Char", "links":[{"category":"internal", "recordName":"Char"}]}}], "return":{"description":"the code point of parameter `ch`", "type":{"name":"int"}}}, {"name":"toCodePointInts", "type":"Normal Function", "description":"Converts a string to an array of code points.\n\n```ballerina\n\"Hello, world 🌎\".toCodePointInts() ⇒ [72,101,108,108,111,44,32,119,111,114,108,100,32,127758]\n```", "parameters":[{"name":"str", "description":"the string", "type":{"name":"string"}}], "return":{"description":"an array with a code point for each character of parameter `str`", "type":{"name":"int[]"}}}, {"name":"toLowerAscii", "type":"Normal Function", "description":"Converts occurrences of A-Z to a-z.\n\nOther characters are left unchanged.\n\n```ballerina\n\"HELLO, World!\".toLowerAscii() ⇒ hello, world!\n```", "parameters":[{"name":"str", "description":"the string to be converted", "type":{"name":"string"}}], "return":{"description":"parameter `str` with any occurrences of A-Z converted to a-z", "type":{"name":"string"}}}, {"name":"toUpperAscii", "type":"Normal Function", "description":"Converts occurrences of a-z to A-Z.\n\nOther characters are left unchanged.\n\n```ballerina\n\"hello, World!\".toUpperAscii() ⇒ HELLO, WORLD!\n```", "parameters":[{"name":"str", "description":"the string to be converted", "type":{"name":"string"}}], "return":{"description":"parameter `str` with any occurrences of a-z converted to A-Z", "type":{"name":"string"}}}, {"name":"trim", "type":"Normal Function", "description":"Removes ASCII white space characters from the start and end of a string.\n\nThe ASCII white space characters are 0x9...0xD, 0x20.\n\n```ballerina\n\" Hello World \".trim() + \"!\" ⇒ Hello World!\n```", "parameters":[{"name":"str", "description":"the string", "type":{"name":"string"}}], "return":{"description":"parameter `str` with leading or trailing ASCII white space characters removed", "type":{"name":"string"}}}]}, {"name":"ballerina/lang.boolean", "description":"The `lang.boolean` module corresponds to the `boolean` basic type.", "typeDefs":[], "clients":[], "functions":[{"name":"fromString", "type":"Normal Function", "description":"Converts a string to a boolean.\n\nReturns the boolean of which parameter `s` is a string representation.\nThe accepted representations are `true`, `false`\n(in any combination of lower- and upper-case),\nand also `1` for true and `0` for `false`.\nThis is the inverse of function ``value:toString`` applied to a `boolean`.\n\n```ballerina\nboolean:fromString(\"true\") ⇒ true\nboolean:fromString(\"0\") ⇒ false\nboolean:fromString(\"01\") ⇒ error\n```", "parameters":[{"name":"s", "description":"string representing a boolean value", "type":{"name":"string"}}], "return":{"description":"boolean that parameter `s` represents, or an error if there is no such boolean", "type":{"name":"boolean|error"}}}]}, {"name":"ballerina/lang.error", "description":"The `lang.error` module corresponds to the `error` basic type.", "typeDefs":[{"fields":[{"name":"", "description":"Rest field", "type":{"name":"Cloneable"}}], "name":"Detail", "description":"The type to which error detail records must belong.", "type":"Record"}, {"name":"NoMessage", "description":"Error type representing the no message error in worker interactions.", "type":"error"}, {"name":"Retriable", "description":"A type of error which can be retried.", "type":"error"}, {"functions":[], "name":"DefaultRetryManager", "description":"", "type":"Class"}, {"functions":[], "name":"RetryManager", "description":"", "type":"Class"}, {"functions":[], "name":"StackFrame", "description":"", "type":"Class"}, {"members":[], "name":"Cloneable", "description":"Type for value that can be cloned.\nThis is the same as in lang.value, but is copied here to avoid a dependency.", "type":"Union"}], "clients":[], "functions":[{"name":"message", "type":"Normal Function", "description":"Returns the error's message.\n\n```ballerina\nerror(\"IO error\").message() ⇒ IO error\n```", "parameters":[{"name":"e", "description":"the error value", "type":{"name":"error"}}], "return":{"description":"error message", "type":{"name":"string"}}}]}, {"name":"ballerina/lang.float", "description":"The `lang.float` module corresponds to the `float` basic type.", "typeDefs":[{"value":"2.718281828459045", "varType":{"name":"float"}, "name":"E", "description":"Euler's number.", "type":"Constant"}, {"value":"1.0/0.0", "varType":{"name":"float"}, "name":"Infinity", "description":"IEEE positive infinity.", "type":"Constant"}, {"value":"0.0/0.0", "varType":{"name":"float"}, "name":"NaN", "description":"IEEE not-a-number value.", "type":"Constant"}, {"value":"3.141592653589793", "varType":{"name":"float"}, "name":"PI", "description":"The number π.", "type":"Constant"}], "clients":[], "functions":[{"name":"fromString", "type":"Normal Function", "description":"Returns the float value represented by a string.\n\nparameter `s` must follow the syntax of DecimalFloatingPointNumber as defined by the Ballerina specification\nwith the following modifications\n- the DecimalFloatingPointNumber may have a leading `+` or `-` sign\n- `NaN` is allowed\n- `Infinity` is allowed with an optional leading `+` or `-` sign\n- a FloatingPointTypeSuffix is not allowed\nThis is the inverse of function ``value:toString`` applied to an `float`.\n\n```ballerina\nfloat:fromString(\"0.2453\") ⇒ 0.2453\nfloat:fromString(\"-10\") ⇒ -10.0\nfloat:fromString(\"123f\") ⇒ error\n```", "parameters":[{"name":"s", "description":"string representation of a float", "type":{"name":"string"}}], "return":{"description":"float value or error", "type":{"name":"float|error"}}}]}, {"name":"ballerina/lang.decimal", "description":"The `lang.decimal` module corresponds to the `decimal` basic type.", "typeDefs":[], "clients":[], "functions":[{"name":"fromString", "type":"Normal Function", "description":"Returns the decimal value represented by a string.\n\n`s` must follow the syntax of DecimalFloatingPointNumber as defined by the Ballerina specification\nwith the following modifications\n- the DecimalFloatingPointLiteral may have a leading `+` or `-` sign\n- a FloatingPointTypeSuffix is not allowed\nThis is the inverse of function ``value:toString`` applied to an `decimal`.\n\n```ballerina\ndecimal:fromString(\"0.2453\") ⇒ 0.2453\ndecimal:fromString(\"-10\") ⇒ -10\ndecimal:fromString(\"123d\") ⇒ error\n```", "parameters":[{"name":"s", "description":"string representation of a decimal", "type":{"name":"string"}}], "return":{"description":"decimal representation of the argument or error", "type":{"name":"decimal|error"}}}]}, {"name":"ballerina/lang.int", "description":"The `lang.int` module corresponds to the `int` basic type.", "typeDefs":[{"name":"Signed32", "description":"Built-in subtype that allows signed integers that can be represented in 32 bits using two's complement.\nThis allows an int between -2^31 and 2^31 - 1 inclusive,\ni.e., between -2,147,483,648 and 2,147,483,647 inclusive.", "type":"int"}, {"name":"Signed16", "description":"Built-in subtype that allows non-negative integers that can be represented in 16 bits using two's complement.\nThis allows an int between -2^15 and 2^15 - 1 inclusive,\ni.e., between -32,768 and 32,767 inclusive.", "type":"int"}, {"name":"Signed8", "description":"Built-in subtype that allows non-negative integers that can be represented in 8 bits using two's complement.\nThis allows an int between -2^7 and 2^7 - 1 inclusive,\ni.e., between -128 and 127 inclusive.", "type":"int"}, {"name":"Unsigned32", "description":"Built-in subtype that allows non-negative integers that can be represented in 32 bits.\nThis allows an int between 0 and 2^32 - 1 inclusive,\ni.e., between 0 and 4,294,967,295 inclusive.", "type":"int"}, {"name":"Unsigned16", "description":"Built-in subtype that allows non-negative integers that can be represented in 16 bits.\nThis allows an int between 0 and 2^16 - 1 inclusive,\ni.e., between 0 and 65,535 inclusive.", "type":"int"}, {"name":"Unsigned8", "description":"Built-in subtype that allows non-negative integers that can be represented in 8 bits.\nThis allows an int between 0 and 2^8 - 1 inclusive,\ni.e., between 0 and 255 inclusive.\nThis is the same as `byte`.", "type":"int"}, {"value":"9223372036854775807", "varType":{"name":"int"}, "name":"MAX_VALUE", "description":"Maximum value of type `int`.", "type":"Constant"}, {"value":"-9223372036854775807 - 1", "varType":{"name":"int"}, "name":"MIN_VALUE", "description":"Minimum value of type `int`.", "type":"Constant"}, {"value":"32767", "varType":{"name":"int"}, "name":"SIGNED16_MAX_VALUE", "description":"Maximum value of type `Signed16`.", "type":"Constant"}, {"value":"-32768", "varType":{"name":"int"}, "name":"SIGNED16_MIN_VALUE", "description":"Minimum value of type `Signed16`.", "type":"Constant"}, {"value":"2147483647", "varType":{"name":"int"}, "name":"SIGNED32_MAX_VALUE", "description":"Maximum value of type `Signed32`.", "type":"Constant"}, {"value":"-2147483648", "varType":{"name":"int"}, "name":"SIGNED32_MIN_VALUE", "description":"Minimum value of type `Signed32`.", "type":"Constant"}, {"value":"127", "varType":{"name":"int"}, "name":"SIGNED8_MAX_VALUE", "description":"Maximum value of type `Signed8`.", "type":"Constant"}, {"value":"-128", "varType":{"name":"int"}, "name":"SIGNED8_MIN_VALUE", "description":"Minimum value of type `Signed8`.", "type":"Constant"}, {"value":"65535", "varType":{"name":"int"}, "name":"UNSIGNED16_MAX_VALUE", "description":"Maximum value of type `Unsigned16`.", "type":"Constant"}, {"value":"4294967295", "varType":{"name":"int"}, "name":"UNSIGNED32_MAX_VALUE", "description":"Maximum value of type `Unsigned32`.", "type":"Constant"}, {"value":"255", "varType":{"name":"int"}, "name":"UNSIGNED8_MAX_VALUE", "description":"Maximum value of type `Unsigned8`.", "type":"Constant"}], "clients":[], "functions":[{"name":"fromString", "type":"Normal Function", "description":"Returns the integer of a string that represents in decimal.\n\nReturns error if parameter `s` is not the decimal representation of an integer.\nThe first character may be `+` or `-`.\nThis is the inverse of function ``value:toString`` applied to an `int`.\n\n```ballerina\nint:fromString(\"76\") ⇒ 76\nint:fromString(\"-120\") ⇒ -120\nint:fromString(\"0xFFFF\") ⇒ error\n```", "parameters":[{"name":"s", "description":"string representation of a integer value", "type":{"name":"string"}}], "return":{"description":"int representation of the argument or error", "type":{"name":"int|error"}}}]}, {"name":"ballerina/lang.map", "description":"The `lang.map` module corresponds to the `mapping` basic type.", "typeDefs":[{"members":[], "name":"Type", "description":"A type parameter that is a subtype of `any|error`.\nHas the special semantic that when used in a declaration\nall uses in the declaration must refer to same type.", "type":"Union"}, {"members":[], "name":"Type1", "description":"A type parameter that is a subtype of `any|error`.\nHas the special semantic that when used in a declaration\nall uses in the declaration must refer to same type.", "type":"Union"}], "clients":[], "functions":[{"name":"get", "type":"Normal Function", "description":"Returns the member of a map with given key.\n\nThis for use in a case where it is known that the map has a specific key,\nand accordingly panics if parameter `m` does not have a member with parameter `k` key.\n\n```ballerina\nmap marks = {\"Carl\": 85, \"Bob\": 50, \"Max\": 60};\nmarks.get(\"Carl\") ⇒ 85\nmarks.get(\"John\") ⇒ panic\n```", "parameters":[{"name":"m", "description":"the map", "type":{"name":"map"}}, {"name":"k", "description":"the key", "type":{"name":"string"}}], "return":{"description":"member with parameter `k` key", "type":{"name":"any|error"}}}, {"name":"hasKey", "type":"Normal Function", "description":"Tests whether a map value has a member with a given key.\n\n```ballerina\nmap marks = {\"Carl\": 85, \"Bob\": 50, \"Max\": 60};\nmarks.hasKey(\"Carl\") ⇒ true\nmarks.hasKey(\"John\") ⇒ false\n```", "parameters":[{"name":"m", "description":"the map", "type":{"name":"map"}}, {"name":"k", "description":"the key", "type":{"name":"string"}}], "return":{"description":"true if parameter `m` has a member with key parameter `k`", "type":{"name":"boolean"}}}, {"name":"keys", "type":"Normal Function", "description":"Returns a list of all the keys of a map.\n\n```ballerina\n{\"Carl\": 85, \"Bob\": 50, \"Max\": 60}.keys() ⇒ [\"Carl\",\"Bob\",\"Max\"]\n```", "parameters":[{"name":"m", "description":"the map", "type":{"name":"map"}}], "return":{"description":"a new list of all keys", "type":{"name":"string[]"}}}, {"name":"length", "type":"Normal Function", "description":"Returns number of members of a map.\n\n```ballerina\n{\"Carl\": 85, \"Bob\": 50, \"Max\": 60}.length() ⇒ 3\n```", "parameters":[{"name":"m", "description":"the map", "type":{"name":"map"}}], "return":{"description":"number of members in parameter `m`", "type":{"name":"int"}}}, {"name":"remove", "type":"Normal Function", "description":"Removes a member of a map.\n\nThis removes the member of parameter `m` with key parameter `k` and returns it.\nIt panics if there is no such member.\n\n```ballerina\nmap marks = {\"Carl\": 85, \"Bob\": 50, \"Max\": 60};\nmarks.remove(\"Carl\") ⇒ 85\nmarks ⇒ {\"Bob\":50,\"Max\":60}\nmarks.remove(\"John\") ⇒ panic\n```", "parameters":[{"name":"m", "description":"the map", "type":{"name":"map"}}, {"name":"k", "description":"the key", "type":{"name":"string"}}], "return":{"description":"the member of parameter `m` that had key parameter `k`", "type":{"name":"any|error"}}}, {"name":"removeAll", "type":"Normal Function", "description":"Removes all members of a map.\n\nThis panics if any member cannot be removed.\n\n```ballerina\nmap marks = {\"Carl\": 85, \"Bob\": 50, \"Max\": 60};\nmarks.removeAll();\nmarks ⇒ {}\nmap values = {x: 10, y: 20};\nvalues.removeAll() ⇒ panic;\n```", "parameters":[{"name":"m", "description":"the map", "type":{"name":"map"}}], "return":{"type":{"name":"() "}}}, {"name":"removeIfHasKey", "type":"Normal Function", "description":"Removes a member of a map with a given key, if the map has member with the key.\n\nIf parameter `m` has a member with key parameter `k`, it removes and returns it;\notherwise it returns `()`.\n\n```ballerina\nmap marks = {\"Carl\": 85, \"Bob\": 50, \"Max\": 60};\nmarks.removeIfHasKey(\"Carl\") ⇒ 85\nmarks ⇒ {\"Bob\":50,\"Max\":60}\nmarks.removeIfHasKey(\"John\") is () ⇒ true\n```", "parameters":[{"name":"m", "description":"the map", "type":{"name":"map"}}, {"name":"k", "description":"the key", "type":{"name":"string"}}], "return":{"description":"the member of parameter `m` that had key parameter `k`, or `()` if parameter `m` does not have a key parameter `k`", "type":{"name":"any|error?"}}}, {"name":"toArray", "type":"Normal Function", "description":"Returns a list of all the members of a map.\n\n```ballerina\n{\"Carl\": 85, \"Bob\": 50, \"Max\": 60}.toArray() ⇒ [85,50,60]\n```", "parameters":[{"name":"m", "description":"the map", "type":{"name":"map"}}], "return":{"description":"an array whose members are the members of parameter `m`", "type":{"name":"any|error[]"}}}]}, {"name":"ballerina/lang.regexp", "description":"The `lang.regexp` module corresponds to the `regexp` basic type.", "typeDefs":[{"functions":[], "name":"Span", "description":"", "type":"Class"}, {"members":[], "name":"Replacement", "description":"The replacement for the match of a regular expression found within a string.\nA string value specifies that the replacement is a fixed string.\nA function that specifies that the replacement is constructed by calling a function for each match.", "type":"Union"}, {"members":[], "name":"Groups", "description":"A list providing detailed information about the match of a regular expression within string.\nEach member of the list identifies the `Span` within the string matched\nby each of the regular expression's capturing groups.\nThe member with index 0 corresponds to the entire regular expression.\nThe group with index i, where i > 1,is the i-th capturing group;\nthis will be nil if the match of the regular expression did not use\na match of the capturing group.\nThe capturing groups within a regular expression are ordered by the position\nof their opening parenthesis.", "type":"IntersectionType"}], "clients":[], "functions":[{"name":"find", "type":"Normal Function", "description":"Returns the first match of a regular expression within a string.\n\n```ballerina\nstring:RegExp r = re `World`;\nr.find(\"Not A Match\") is () ⇒ true\nr.find(\"Hello World\") is regexp:Span ⇒ true\nr.find(\"Hello World\", 6) is regexp:Span ⇒ true\n```", "parameters":[{"name":"re", "description":"the regular expression", "type":{"name":"RegExp", "links":[{"category":"internal", "recordName":"RegExp"}]}}, {"name":"str", "description":"the string in which to look for a match of `re`", "type":{"name":"string"}}, {"name":"startIndex", "description":"the index within `str` at which to start looking for a match", "type":{"name":"int"}, "default":"0"}], "return":{"description":"a `Span` describing the match, or nil if no match was found", "type":{"name":"Span?", "links":[{"category":"internal", "recordName":"Span"}]}}}, {"name":"findAll", "type":"Normal Function", "description":"Returns a list of all the matches of a regular expression within a string.\nAfter one match is found, it looks for the next match starting where the previous\nmatch ended, so the list of matches will be non-overlapping.\n\n```ballerina\nstring:RegExp r = re `[bB].tt[a-z]*`;\nr.findAll(\"Not A Match\").length() ⇒ 0\nr.findAll(\"Butter was bought by Betty but the butter was bitter.\").length() ⇒ 4\nr.findAll(\"Butter was bought by Betty but the butter was bitter.\", 7).length() ⇒ 3\n```", "parameters":[{"name":"re", "description":"the regular expression", "type":{"name":"RegExp", "links":[{"category":"internal", "recordName":"RegExp"}]}}, {"name":"str", "description":"the string in which to look for matches of `re`", "type":{"name":"string"}}, {"name":"startIndex", "description":"the index within `str` at which to start looking for matches", "type":{"name":"int"}, "default":"0"}], "return":{"description":"a list containing a `Span` for each match found", "type":{"name":"Span[]", "links":[{"category":"internal", "recordName":"Span"}]}}}, {"name":"findAllGroups", "type":"Normal Function", "description":"Returns the `Groups` of all the matches of a regular expression within a string.\nAfter one match is found, it looks for the next match starting where the previous\nmatch ended, so the list of matches will be non-overlapping.\n\n```ballerina\nstring:RegExp r = re `(([a-z]u)(bble))`;\nr.findAllGroups(\"Not A Match\").length() ⇒ 0\nr.findAllGroups(\"rubble, trouble, bubble, hubble\").length() ⇒ 3\nr.findAllGroups(\"rubble, trouble, bubble, hubble\", 7).length() ⇒ 2\n```", "parameters":[{"name":"re", "description":"the regular expression", "type":{"name":"RegExp", "links":[{"category":"internal", "recordName":"RegExp"}]}}, {"name":"str", "description":"the string in which to look for matches of `re`", "type":{"name":"string"}}, {"name":"startIndex", "description":"the index within `str` at which to start looking for matches", "type":{"name":"int"}, "default":"0"}], "return":{"description":"a list containing a `Group` for each match found", "type":{"name":"Groups[]", "links":[{"category":"internal", "recordName":"Groups"}]}}}, {"name":"findGroups", "type":"Normal Function", "description":"Returns the `Groups` for the first match of a regular expression within a string.\n\n```ballerina\nstring:RegExp r = re `([bB].tt[a-z]*)`;\nr.findGroups(\"Not A Match\") is () ⇒ true\nr.findGroups(\"Butter was bought by Betty but the butter was bitter.\") is regexp:Groups ⇒ true\nr.findGroups(\"Butter was bought by Betty but the butter was bitter.\", 7) is regexp:Groups ⇒ true\n```", "parameters":[{"name":"re", "description":"the regular expression", "type":{"name":"RegExp", "links":[{"category":"internal", "recordName":"RegExp"}]}}, {"name":"str", "description":"the string in which to look for a match of `re`", "type":{"name":"string"}}, {"name":"startIndex", "description":"the index within `str` at which to start looking for a match", "type":{"name":"int"}, "default":"0"}], "return":{"description":"a `Groups` list describing the match, or nil if no match was found", "type":{"name":"Groups?", "links":[{"category":"internal", "recordName":"Groups"}]}}}, {"name":"fromString", "type":"Normal Function", "description":"Constructs a regular expression from a string.\nThe syntax of the regular expression is the same as accepted by the `re` tagged data template expression.\n\n```ballerina\nregexp:fromString(\"AB+C*D{1,4}\") ⇒ re `AB+C*D{1,4}`\nregexp:fromString(\"AB+^*\") ⇒ error\n```", "parameters":[{"name":"str", "description":"the string representation of a regular expression", "type":{"name":"string"}}], "return":{"description":"the regular expression, or an error value if `str` is not a valid regular expression", "type":{"name":"RegExp|error", "links":[{"category":"internal", "recordName":"RegExp"}]}}}, {"name":"fullMatchGroups", "type":"Normal Function", "description":"Returns the `Groups` of the match of a regular expression that is a full match of a string.\nA match of the regular expression in a string is a full match if it\nstarts at index 0 and ends at index `n`, where `n` is the length of the string.\n\n```ballerina\nstring:RegExp r = re `([0-9]+)×([0-9]+)`;\nr.fullMatchGroups(\"test: 1440×900\") is () ⇒ true\nr.fullMatchGroups(\"1440×900\") is regexp:Groups ⇒ true\n```", "parameters":[{"name":"re", "description":"the regular expression", "type":{"name":"RegExp", "links":[{"category":"internal", "recordName":"RegExp"}]}}, {"name":"str", "description":"the string in which to look for a match of `re`", "type":{"name":"string"}}], "return":{"description":"a `Groups` list describing the match, or nil if there is not a full match; the\nfirst `Span` in the list will be all of `str`", "type":{"name":"Groups?", "links":[{"category":"internal", "recordName":"Groups"}]}}}, {"name":"isFullMatch", "type":"Normal Function", "description":"Tests whether there is full match of regular expression with a string.\nA match of a regular expression in a string is a full match if it\nstarts at index 0 and ends at index `n`, where `n` is the length of the string.\n\n```ballerina\nstring:RegExp r = re `A|Th.*ch|^`;\nr.isFullMatch(\"This is a Match\") ⇒ true\nr.isFullMatch(\"Not a complete Match\") ⇒ false\n```", "parameters":[{"name":"re", "description":"the regular expression", "type":{"name":"RegExp", "links":[{"category":"internal", "recordName":"RegExp"}]}}, {"name":"str", "description":"the string", "type":{"name":"string"}}], "return":{"description":"true if there is full match of `re` with `str`, and false otherwise", "type":{"name":"boolean"}}}, {"name":"matchAt", "type":"Normal Function", "description":"Tests whether there is a match of a regular expression at a specific index in the string.\n\n```ballerina\nstring:RegExp r = re `World`;\nr.matchAt(\"Hello World\") is () ⇒ true\nr.matchAt(\"Hello World\", 6) is regexp:Span ⇒ true\n```", "parameters":[{"name":"re", "description":"the regular expression", "type":{"name":"RegExp", "links":[{"category":"internal", "recordName":"RegExp"}]}}, {"name":"str", "description":"the string in which to look for a match of `re`", "type":{"name":"string"}}, {"name":"startIndex", "description":"the index within `str` at which to look for a match; defaults to zero", "type":{"name":"int"}, "default":"0"}], "return":{"description":"a `Span` describing the match, or nil if `re` did not match at that index; the startIndex of the\n`Span` will always be equal to `startIndex`", "type":{"name":"Span?", "links":[{"category":"internal", "recordName":"Span"}]}}}, {"name":"matchGroupsAt", "type":"Normal Function", "description":"Returns the `Groups` of the match of a regular expression at a specific index in the string.\n\n```ballerina\nstring:RegExp r = re `([01][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])?`;\nr.matchGroupsAt(\"time: 14:35:59\") is () ⇒ true\nr.matchGroupsAt(\"time: 14:35:59\", 6) is regexp:Groups ⇒ true\n```", "parameters":[{"name":"re", "description":"the regular expression", "type":{"name":"RegExp", "links":[{"category":"internal", "recordName":"RegExp"}]}}, {"name":"str", "description":"the string in which to look for a match of `re`", "type":{"name":"string"}}, {"name":"startIndex", "description":"the index within `str` at which to look for a match; defaults to zero", "type":{"name":"int"}, "default":"0"}], "return":{"description":"a `Groups` list describing the match, or nil if `re` did not match at that index; the startIndex of the\nfirst `Span` in the list will always be equal to the `startIndex` of the first member of the list", "type":{"name":"Groups?", "links":[{"category":"internal", "recordName":"Groups"}]}}}, {"name":"replace", "type":"Normal Function", "description":"Replaces the first match of a regular expression.\n\n```ballerina\nstring:RegExp r = re `0+`;\nr.replace(\"10010011\", \"*\") ⇒ 1*10011\nr.replace(\"10010011\", \"*\", 4) ⇒ 1001*11\nr.replace(\"122111\", \"*\") ⇒ 122111\nr.replace(\"10010011\", replaceFunction) ⇒ 1*10011\nr.replace(\"10010011\", replaceFunction, 4) ⇒ 1001*11\nisolated function replaceFunction(regexp:Groups groups) returns string => \"*\";\n```", "parameters":[{"name":"re", "description":"the regular expression", "type":{"name":"RegExp", "links":[{"category":"internal", "recordName":"RegExp"}]}}, {"name":"str", "description":"the string in which to perform the replacements", "type":{"name":"string"}}, {"name":"replacement", "description":"a `Replacement` that gives the replacement for the match", "type":{"name":"Replacement", "links":[{"category":"internal", "recordName":"Replacement"}]}}, {"name":"startIndex", "description":"the index within `str` at which to start looking for a match; defaults to zero", "type":{"name":"int"}, "default":"0"}], "return":{"description":"`str` with the first match, if any, replaced by the string specified by `replacement`", "type":{"name":"string"}}}, {"name":"replaceAll", "type":"Normal Function", "description":"Replaces all matches of a regular expression.\nAfter one match is found, it looks for the next match starting where the previous\nmatch ended, so the matches will be non-overlapping.\n\n```ballerina\nstring:RegExp r = re `0+`;\nr.replaceAll(\"10010011\", \"*\") ⇒ 1*1*11\nr.replaceAll(\"10010011\", \"*\", 4) ⇒ 1001*11\nr.replaceAll(\"122111\", \"*\") ⇒ 122111\nr.replaceAll(\"10010011\", replaceFunction) ⇒ 121211\nr.replaceAll(\"10010011\", replaceFunction, 4) ⇒ 1001211\nisolated function replaceFunction(regexp:Groups groups) returns string => groups[0].substring().length().toString();\n```", "parameters":[{"name":"re", "description":"the regular expression", "type":{"name":"RegExp", "links":[{"category":"internal", "recordName":"RegExp"}]}}, {"name":"str", "description":"the string in which to perform the replacements", "type":{"name":"string"}}, {"name":"replacement", "description":"a `Replacement` that gives the replacement for each match", "type":{"name":"Replacement", "links":[{"category":"internal", "recordName":"Replacement"}]}}, {"name":"startIndex", "description":"the index within `str` at which to start looking for matches; defaults to zero", "type":{"name":"int"}, "default":"0"}], "return":{"description":"`str` with every match replaced by the string specified by `replacement`", "type":{"name":"string"}}}, {"name":"split", "type":"Normal Function", "description":"Splits a string into substrings separated by matches of a regular expression.\nThis finds the the non-overlapping matches of a regular expression and\nreturns a list of substrings of `str` that occur before the first match,\nbetween matches, or after the last match. If there are no matches, then\n`[str]` will be returned.\n\n```ballerina\nstring:RegExp r = re `,`;\nr.split(\"abc,cde,efg\") ⇒ [\"abc\",\"cde\",\"efg\"]\nr.split(\"abc cde efg\") ⇒ [\"abc cde efg\"]\n```", "parameters":[{"name":"re", "description":"the regular expression that specifies the separator", "type":{"name":"RegExp", "links":[{"category":"internal", "recordName":"RegExp"}]}}, {"name":"str", "description":"the string to be split", "type":{"name":"string"}}], "return":{"description":"a list of substrings of `str` separated by matches of `re`", "type":{"name":"string[]"}}}]}]; - diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts deleted file mode 100644 index 913d1f2d711..00000000000 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs.ts +++ /dev/null @@ -1,147 +0,0 @@ -// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. - -// WSO2 LLC. licenses this file to you under the Apache License, -// Version 2.0 (the "License"); you may not use this file except -// in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 - -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -import { generateObject, ModelMessage } from "ai"; -import { z } from 'zod'; -import { - MinifiedLibrary, - RelevantLibrariesAndFunctionsRequest, - RelevantLibrariesAndFunctionsResponse, -} from "@wso2/ballerina-core"; -import { Library } from "./libs_types"; -import { selectRequiredFunctions } from "./funcs"; -import { getAnthropicClient, ANTHROPIC_HAIKU, getProviderCacheControl } from "../connection"; -import { langClient } from "../../activator"; -import { getGenerationMode } from "../utils"; -import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; - -interface LibraryListResponse { - libraries: string[]; -} - -const LibraryListSchema = z.object({ - libraries: z.array(z.string()), -}); - -// export async function getRelevantLibs(params: GenerateCodeParams): Promise { -// // const prompt = getReadmeQuery(params); -// const selectedLibs: string[] = await getSelectedLibraries(prompt); -// return selectRequiredFunctions(prompt, selectedLibs) -// } - -export enum GenerationType { - CODE_GENERATION = "CODE_GENERATION", - HEALTHCARE_GENERATION = "HEALTHCARE_GENERATION", -} - -export async function getRelevantLibrariesAndFunctions( - params: RelevantLibrariesAndFunctionsRequest, - generationType: GenerationType -): Promise { - const selectedLibs: string[] = await getSelectedLibraries(params.query, generationType); - const relevantTrimmedFuncs: Library[] = await selectRequiredFunctions(params.query, selectedLibs, generationType); - return { - libraries: relevantTrimmedFuncs, - }; -} - -export async function getSelectedLibraries(prompt: string, generationType: GenerationType): Promise { - const allLibraries = await getAllLibraries(generationType); - if (allLibraries.length === 0) { - return []; - } - const cacheOptions = await getProviderCacheControl(); - const messages: ModelMessage[] = [ - { - role: "system", - content: getSystemPrompt(allLibraries), - providerOptions: cacheOptions, - }, - { - role: "user", - content: getUserPrompt(prompt, generationType), - }, - ]; - - //TODO: Add thinking and test with claude haiku - const startTime = Date.now(); - const { object } = await generateObject({ - model: await getAnthropicClient(ANTHROPIC_HAIKU), - maxOutputTokens: 4096, - temperature: 0, - messages: messages, - schema: LibraryListSchema, - abortSignal: AIPanelAbortController.getInstance().signal, - }); - const endTime = Date.now(); - console.log(`Library selection took ${endTime - startTime}ms`); - - console.log("Selected libraries:", object.libraries); - return object.libraries; -} - -function getSystemPrompt(libraryList: MinifiedLibrary[]): string { - return `You are an assistant tasked with selecting all the Ballerina libraries needed to answer a specific question from a given set of libraries provided in the context as a JSON. RESPOND ONLY WITH A JSON. -# Library Context JSON -${JSON.stringify(libraryList)}`; -} - -function getUserPrompt(prompt: string, generationType: GenerationType): string { - return ` -# QUESTION -${prompt} - -# Example -Context: -[ - { - "name": "ballerinax/azure.openai.chat", - "description": "Provides a Ballerina client for the Azure OpenAI Chat API." - }, - { - "name": "ballerinax/github", - "description": "Provides a Ballerina client for the GitHub API." - }, - { - "name": "ballerinax/slack", - "description": "Provides a Ballerina client for the Slack API." - }, - { - "name": "ballerinax/http", - "description": "Allows to intract with HTTP services." - } - -] -Question: -Write an application to read github issue, summarize them and post the summary to a slack channel. - -Response: -{ - "libraries": ["ballerinax/github", "ballerinax/slack", "ballerinax/azure.openai.chat"] -} -${ - generationType === GenerationType.CODE_GENERATION - ? "" - : " ALWAYS include `ballerinax/health.base`, `ballerinax/health.fhir.r4`, `ballerinax/health.fhir.r4.parser`, `ballerinax/health.fhir.r4utils`, `ballerinax/health.fhir.r4.international401`, `ballerinax/health.hl7v2commons` and `ballerinax/health.hl7v2` libraries in the selection in addition to what you selected." -}`; -} - -export async function getAllLibraries(generationType: GenerationType): Promise { - const result = (await langClient.getCopilotCompactLibraries({ - mode: getGenerationMode(generationType), - })) as { libraries: MinifiedLibrary[] }; - return result.libraries as MinifiedLibrary[]; -} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/function_tests.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/function_tests.ts deleted file mode 100644 index eb9989c14e7..00000000000 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/function_tests.ts +++ /dev/null @@ -1,143 +0,0 @@ -// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. - -// WSO2 LLC. licenses this file to you under the Apache License, -// Version 2.0 (the "License"); you may not use this file except -// in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 - -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -import { TestGenerationTarget, TestGeneratorIntermediaryState, Command } from "@wso2/ballerina-core"; -import { getErrorMessage } from "../utils"; -import { generateTest, getDiagnostics } from "../../testGenerator"; -import { URI } from "vscode-uri"; -import * as fs from "fs"; -import * as path from "path"; -import { CopilotEventHandler, createWebviewEventHandler } from "../event"; -import { getCurrentProjectRoot } from "../../../../utils/project-utils"; -import { StateMachine } from "../../../../stateMachine"; - -// Core function test generation that emits events -export async function generateFunctionTestsCore( - params: TestGeneratorIntermediaryState, - eventHandler: CopilotEventHandler -): Promise { - const functionIdentifier = params.resourceFunction; - - eventHandler({ - type: "content_block", - content: `\n\n**Initiating test generation for the function ${functionIdentifier}, following the _outlined test plan_. Please wait...**`, - }); - eventHandler({ - type: "content_block", - content: `\n\nGenerating tests for the function ${functionIdentifier}. This may take a moment.`, - }); - - let projectPath: string; - try { - projectPath = await getCurrentProjectRoot(); - } catch (error) { - console.error("Error getting current project root:", error); - eventHandler({ type: "error", content: getErrorMessage(error) }); - return; - } - - // Compute workspace-relative paths for test files (for display in UI) - const context = StateMachine.context(); - const workspacePath = context.workspacePath; - let testPathForDisplay = "tests/test.bal"; - let configPathForDisplay = "tests/Config.toml"; - - if (workspacePath) { - // Workspace project: include package path prefix (e.g., "foo/tests/test.bal") - const relativeProjectPath = path.relative(workspacePath, projectPath); - testPathForDisplay = path.join(relativeProjectPath, "tests/test.bal"); - configPathForDisplay = path.join(relativeProjectPath, "tests/Config.toml"); - } - - // Use project-relative path for file operations - const testPath = "tests/test.bal"; - - const response = await generateTest(projectPath, { - targetType: TestGenerationTarget.Function, - targetIdentifier: functionIdentifier, - testPlan: params.testPlan, - }); - - eventHandler({ - type: "content_block", - content: `\nAnalyzing generated tests for potential issues.`, - }); - - let existingSource = ""; - try { - // existingSource = await rpcClient.getAiPanelRpcClient().getFromFile({ filePath: testPath }); - const projectFsPath = URI.parse(testPath).fsPath; - existingSource = await fs.promises.readFile(projectFsPath, "utf-8"); - } catch { - // File doesn't exist - } - const generatedFullSource = existingSource - ? existingSource + "\n\n// >>>>>>>>>>>>>>TEST CASES NEED TO BE FIXED <<<<<<<<<<<<<<<\n\n" + response.testSource - : response.testSource; - - const diagnostics = await getDiagnostics(projectPath, { - testSource: generatedFullSource, - }); - - console.log(diagnostics); - - let testCode = response.testSource; - const testConfig = response.testConfig; - - if (diagnostics.diagnostics.length > 0) { - eventHandler({ - type: "content_block", - content: `\nRefining tests based on feedback to ensure accuracy and reliability.`, - }); - - const fixedCode = await generateTest(projectPath, { - targetType: TestGenerationTarget.Function, - targetIdentifier: functionIdentifier, - testPlan: params.testPlan, - diagnostics: diagnostics, - existingTests: generatedFullSource, - }); - testCode = fixedCode.testSource; - } - - eventHandler({ - type: "content_block", - content: `\n\nTest generation completed. Displaying the generated tests for the function ${functionIdentifier} below:`, - }); - eventHandler({ - type: "content_block", - content: `\n\n\n\`\`\`ballerina\n${testCode}\n\`\`\`\n`, - }); - if (testConfig) { - eventHandler({ - type: "content_block", - content: `\n\n\n\`\`\`ballerina\n${testConfig}\n\`\`\`\n`, - }); - } - - eventHandler({ type: "stop", command: Command.Tests }); -} - -// Main public function that uses the default event handler -export async function generateFunctionTests(params: TestGeneratorIntermediaryState): Promise { - const eventHandler = createWebviewEventHandler(Command.Tests); - try { - await generateFunctionTestsCore(params, eventHandler); - } catch (error) { - console.error("Error during function test generation:", error); - eventHandler({ type: "error", content: getErrorMessage(error) }); - } -} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/prompts.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/prompts.ts deleted file mode 100644 index 268c82d4b02..00000000000 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/prompts.ts +++ /dev/null @@ -1,786 +0,0 @@ -// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. - -// WSO2 LLC. licenses this file to you under the Apache License, -// Version 2.0 (the "License"); you may not use this file except -// in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 - -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -import { TestGenerationRequest1, ProjectSource, Diagnostic } from "./test"; -import { ModelMessage } from "ai"; -import { flattenProjectToText, getExternalTypesAsJsonSchema, getTypesAsJsonSchema, getDiagnosticsAsText, extractSectionToFix } from "./utils"; - -// ============================================== -// SYSTEM PROMPTS -// ============================================== - -export function getServiceTestGenerationSystemPrompt(): string { - return `You are an expert Ballerina developer specializing in test automation. Your task is to analyze Ballerina source code and generate comprehensive and compilable test cases that cover functionality, edge cases, and error scenarios.`; -} - -export function getServiceTestGenAssistant1Prompt(): string { - return `I have analyzed both the Ballerina service implementation and the OpenAPI component definitions. I understand: - - All HTTP endpoints and their respective methods - - The request/response payload structures - - External type definitions from OpenAPI components - - How the service uses the OpenAPI-defined types - - Parameter handling (path params, query params) - - Service configurations and listener setup - - Error scenarios and status code mappings - - External service dependencies - -I am ready to generate appropriate test cases for this service. -`; -} - -export function getServiceTestDiagnosticsSystemPrompt(): string { - return `You are an expert Ballerina developer, code debugger and fixer with deep knowledge of JSON schemas and test generation. Your task is to analyze the provided Ballerina codebase, JSON schema, generated test file, and its diagnostics, then provide corrected test code that resolves all issues. Follow these guidelines: - -1. Carefully review each diagnostic and its corresponding line number. -2. Identify the root cause of each issue. -3. Apply best practices and maintain code style consistency when making corrections. -4. Provide the full corrected code, not just the changed lines. -5. If any fixes introduce new variables or functions, ensure they're properly integrated. -6. Verify that your fixes don't introduce new issues.`; -} - -export function getFunctionTestGenerationSystemPrompt(): string { - return `You are an expert Ballerina developer, code debugger and fixer with deep knowledge of JSON schemas and test generation. Your task is to analyze the provided Ballerina codebase, JSON schema, generated test file, and its diagnostics, then provide corrected test code that resolves all issues. Follow these guidelines: - -1. Carefully review each diagnostic and its corresponding line number. -2. Identify the root cause of each issue. -3. Apply best practices and maintain code style consistency when making corrections. -4. Provide the full corrected code, not just the changed lines. -5. If any fixes introduce new variables or functions, ensure they're properly integrated. -6. Verify that your fixes don't introduce new issues.`; -} - -// ============================================== -// SERVICE TEST GEN PROMPTS -// ============================================== - -export function getServiceTestGenUser1Prompt(sourceCode: string, typeSchemas: string): string { - return `I will provide you with: - 1. A Ballerina service implementation - 2. OpenAPI component specifications containing type definitions used by the service - -Please carefully analyze and understand: - - The HTTP endpoints and their methods (GET, POST, PUT, DELETE, PATCH, etc.) - - Request/response payload structures and types - - External type definitions from the OpenAPI components section - - Mapping between service types and OpenAPI-defined types - - Path parameters and query parameters - - Service configuration and listener details - - Error handling and response status codes - - Service dependencies and external service calls - -1. Ballerina Source Code (The first line of the source contains the commented file path and name): -[BEGIN_SOURCE] -${sourceCode} -[END_SOURCE] - - -2. Type Schemas for External Libraries: -[BEGIN_SCHEMAS] -${typeSchemas} -[END_SCHEMAS] -`; -} - -export function getServiceTestGenUser2Prompt(serviceName: string): string { - return `Generate comprehensive test cases for ALL resource functions in the Ballerina service named as ${serviceName}. Your response MUST follow this exact structure: - -Note: In the response don't mention the fact that you are following a defined structure. And don't break the response into sections, just give the response in a natuaral flow. - -1. CONFIGURATION GENERATION (enclosed in tags and use \`\`\`toml{content}\`\`\`); -Generate a Config.toml for the configurable variables in the source code -Note: If there are no any configurable variables just ignore this section - -2. TEST IMPLEMENTATION (enclosed in tags and use \`\`\`ballerina{code}\`\`\`): -Generated test code following these strict guidelines: - -A. Test File Structure: - - Start with necessary imports, including \`ballerina/http\`, \`ballerina/test\` any other imports that is required. - - Define an HTTP Client at the module level named \`clientEp\` - - Include @test:BeforeSuite and @test:AfterSuite if needed - - Organize tests logically: create, read, update, delete - - Create helper functions only when improving readability - - Don't redefine existing types from OpenAPI components - -B. Test Function Generation: - - MUST generate AT LEAST ONE test case for EACH resource function - - Use \`@test:Config {}\` annotation for each test function, with dependsOn property when applicable. - - Ensure each test function returns \`error?\` and use \`check\` keyword for error propagation. - - Use proper HTTP method invocation syntax as per the provided example. - - GET: - - Ballerina Resource -> resource function get books/[string isbn]() returns Book|Error - - Resource invocation -> {Type} {variableName} = check clientEp->/books/[{isbn}](); - - Example -> Book book = check clientEp->/books/[12345678](); - - POST: - - Ballerina Resource -> resource function post books(@http:Payload Book newBook) returns string|error - - Resource invocation -> {Type} {variableName} = clientEp->/books.post({payload}); - - Example -> Book book = check clientEp->/books.post(definedBook); - - PUT: - - Ballerina Resource -> resource function put books/[string isbn](@http:Payload Book updatedBook, @http:Query string name) returns string|error - - Resource invocation -> {Type} {variableName} = clientEp->/books/[{isbn}].put({payload}, name = {value}); - - Example -> Book book = check clientEp->/books/isbn\-number.put(definedUpdatedBook, name = "BookName"); - - DELETE: - - Ballerina Resource -> resource function delete books(@http:Query string isbn) returns string|error - - Resource invocation -> {Type} {variableName} = clientEp->/books.delete(isbn = {value}); - - PATCH: - - Ballerina Resource -> resource function patch books/[string isbn](@http:Payload Book updatedBook, @http:Query string name) returns string|error - - Resource invocation -> {Type} {variableName} = clientEp->/books/[{isbn}].patch({payload}, name = {value}); - - For non-annotated resource function parameters, treat records as body params and others as query params. - - When generating negative test cases, focus only on scenarios that are explicitly handled in the existing code base and avoid generating tests for theoretical edge cases not addressed in the current codebase. - -C. Response Handling: - - Use direct data binding for positive test cases based on source code or type schemas. - - For negative test cases, use \`http:Response\` variables and check status codes. - - Check for \`x-ballerina-type\` extension in type schemas and if those types were used in the code, include necessary imports. - - Always assign responses to variables with specific types. - -D. Assertions and Validation: - - Use only \`test:assertEquals(actualVar, expectedVar, msg)\` for assertions. - - When asserting decimals, use \`d\` at the end of the decimal literal (e.g., 123.45d). - - Provide clear and descriptive messages for each assertion. - -E. Code Quality: - - Follow Ballerina naming conventions and best practices. - - Add comments explaining the purpose of each test and any complex logic. - - Ensure the generated code is comprehensive, robust, maintainable, and clear. - -3. COMPLETION STATUS (enclosed in tags): -Indicate "DONE" if all resource functions are covered, or "CONTINUE" if more tests are pending. - -Important Notes: -- Generate tests for EVERY single resource function in the service -- If response length limits prevent complete coverage, generate as many tests as possible -- Remaining tests can be requested in subsequent prompts -- If there are any remaining tests to be generated don't mention that as a comment as part of the generated code. -`; -} - -export function getServiceTestGenUser2WithPlanPrompt(serviceName: string, testPlan: string): string { - return `Generate comprehensive test cases for ALL resource functions in the Ballerina service named as ${serviceName}, based on the provided test plan. - -The test implementation MUST: - 1. Address each test scenario in the test plan sequentially - 2. Implement exact test conditions specified in the test plan - 3. Validate all expected outcomes mentioned in the test plan - 4. Follow any specific test data requirements provided in the test plan - 5. Not deviate from or add scenarios not mentioned in the test plan - -[BEGIN_TEST_PLAN] -${testPlan} -[END_TEST_PLAN] - -1. CONFIGURATION GENERATION (enclosed in tags and use \`\`\`toml{content}\`\`\`); -Generate a Config.toml for the configurable variables in the source code -Note: If there are no any configurable variables just ignore this section - -2. TEST IMPLEMENTATION (enclosed in tags and use \`\`\`ballerina{code}\`\`\`): -Generated test code following these strict guidelines: - -A. Test File Structure: - - Start with necessary imports, including \`ballerina/http\`, \`ballerina/test\` any other imports that is required. - - Define an HTTP Client at the module level named \`clientEp\` - - Include @test:BeforeSuite and @test:AfterSuite if needed - - Organize tests logically: create, read, update, delete - - Create helper functions only when improving readability - - Don't redefine existing types from OpenAPI components - -B. Test Function Generation: - - MUST strictly follow the test scenarios outlined in the provided test plan - - Generate individual test functions for EACH test scenario mentioned in the test plan - - Name test functions to clearly indicate which test plan scenario they cover - - Include comments referencing the specific test plan scenario being implemented - - Ensure test implementation covers all acceptance criteria mentioned in each test scenario - - For each test scenario in the test plan: - - Implement the exact test conditions specified - - Validate all expected outcomes mentioned - - Handle any specific error cases noted - - Follow any specific test data requirements - - Use \`@test:Config {}\` annotation for each test function, with dependsOn property when applicable - - Ensure each test function returns \`error?\` and use \`check\` keyword for error propagation - - Use proper HTTP method invocation syntax as per the provided example - - GET: - - Ballerina Resource -> resource function get books/[string isbn]() returns Book|Error - - Resource invocation -> {Type} {variableName} = check clientEp->/books/[{isbn}](); - - Example -> Book book = check clientEp->/books/[12345678](); - - POST: - - Ballerina Resource -> resource function post books(@http:Payload Book newBook) returns string|error - - Resource invocation -> {Type} {variableName} = clientEp->/books.post({payload}); - - Example -> Book book = check clientEp->/books.post(definedBook); - - PUT: - - Ballerina Resource -> resource function put books/[string isbn](@http:Payload Book updatedBook, @http:Query string name) returns string|error - - Resource invocation -> {Type} {variableName} = clientEp->/books/[{isbn}].put({payload}, name = {value}); - - Example -> Book book = check clientEp->/books/isbn\-number.put(definedUpdatedBook, name = "BookName"); - - DELETE: - - Ballerina Resource -> resource function delete books(@http:Query string isbn) returns string|error - - Resource invocation -> {Type} {variableName} = clientEp->/books.delete(isbn = {value}); - - PATCH: - - Ballerina Resource -> resource function patch books/[string isbn](@http:Payload Book updatedBook, @http:Query string name) returns string|error - - Resource invocation -> {Type} {variableName} = clientEp->/books/[{isbn}].patch({payload}, name = {value}); - - For non-annotated resource function parameters, treat records as body params and others as query params - - When generating negative test cases, implement only those scenarios explicitly mentioned in the test plan - -C. Response Handling: - - Use direct data binding for positive test cases based on source code or type schemas. - - For negative test cases, use \`http:Response\` variables and check status codes. - - Check for \`x-ballerina-type\` extension in type schemas and if those types were used in the code, include necessary imports. - - Always assign responses to variables with specific types. - -D. Assertions and Validation: - - Use only \`test:assertEquals(actualVar, expectedVar, msg)\` for assertions. - - When asserting decimals, use \`d\` at the end of the decimal literal (e.g., 123.45d). - - Provide clear and descriptive messages for each assertion. - -E. Code Quality: - - Follow Ballerina naming conventions and best practices. - - Add comments explaining the purpose of each test and any complex logic. - - Ensure the generated code is comprehensive, robust, maintainable, and clear. - -3. COMPLETION STATUS (enclosed in tags): -Indicate "DONE" if all resource functions are covered, or "CONTINUE" if more tests are pending. - -Important Notes: -- Generate tests for EVERY single resource function in the service -- If response length limits prevent complete coverage, generate as many tests as possible -- Remaining tests can be requested in subsequent prompts -- If there are any remaining tests to be generated don't mention that as a comment as part of the generated code. -`; -} - -export function getServiceTestDiagnosticsAssistant1Prompt(): string { - return `Thank you for providing the Ballerina codebase and JSON schema. I've carefully analyzed both components and am now prepared to receive the generated test file and its diagnostics. This information will allow me to understand the context fully and identify any inconsistencies or issues between the test file, the codebase, and the schema. - -Please proceed with sharing the generated test file and the diagnostics in your next message. Once I have all the information, I'll be able to provide a comprehensive fix for the test file, ensuring it aligns with the codebase and conforms to the JSON schema. -`; -} - -export function getServiceTestDiagnosticsUser2Prompt(diagnostics: string, sourceCode: string): string { - return `Here's the second part of the information: - -3. Generated Test File: -[GENERATED_TEST_FILE] -\`\`\`ballerina -${sourceCode} -\`\`\` -[GENERATED_TEST_FILE] - -4. Diagnostics: -[BEGIN_DIAGNOSTICS] -${diagnostics} -[END_DIAGNOSTICS] - -5. StatusCode responses -- http:Continue -- http:SwitchingProtocols -- http:Processing -- http:EarlyHints -- http:Ok -- http:Created -- http:Accepted -- http:NonAuthoritativeInformation -- http:NoContent -- http:ResetContent -- http:PartialContent -- http:MultiStatus -- http:AlreadyReported -- http:IMUsed -- http:MultipleChoices -- http:MovedPermanently -- http:Found -- http:SeeOther -- http:NotModified -- http:UseProxy -- http:TemporaryRedirect -- http:PermanentRedirect -- http:BadRequest -- http:Unauthorized -- http:PaymentRequired -- http:Forbidden -- http:NotFound -- http:MethodNotAllowed -- http:NotAcceptable -- http:ProxyAuthenticationRequired -- http:RequestTimeout -- http:Conflict -- http:Gone -- http:LengthRequired -- http:PreconditionFailed -- http:PayloadTooLarge -- http:UriTooLong -- http:UnsupportedMediaType -- http:RangeNotSatisfiable -- http:ExpectationFailed -- http:MisdirectedRequest -- http:UnprocessableEntity -- http:Locked -- http:FailedDependency -- http:TooEarly -- http:PreconditionRequired -- http:UnavailableDueToLegalReasons -- http:UpgradeRequired -- http:TooManyRequests -- http:RequestHeaderFieldsTooLarge -- http:InternalServerError -- http:NotImplemented -- http:BadGateway -- http:ServiceUnavailable -- http:GatewayTimeout -- http:HttpVersionNotSupported -- http:VariantAlsoNegotiates -- http:InsufficientStorage -- http:LoopDetected -- http:NotExtended -- http:NetworkAuthorizationRequired -- http:NetworkAuthenticationRequired - -Task: -Analyze the provided test file, diagnostics and the status code responses, then produce a corrected version of the entire test file that resolves all identified issues. Ensure that the fixed test file is compatible with the given Ballerina codebase and JSON schema. - -Key Considerations: -1. Data Binding Rules: - a. For records that contains Ballerina status code response as inclusions (e.g., \`*http:Ok\`, \`*http:Created\`, \`*http:NotFound\`), bind data to the \`body\` field: - Example: - \`\`\`ballerina - type RecordType record {| - *http:Ok; - Body body; - |}; - - // Service code - service /test on new http:Listener(8080) { - resource function get name() returns RecordType|error { - return { - // values - body: { - // values - } - } - } - } - - // When data binding, - final http:Client clientEP = check new ("http://localhost:8080/test"); - Body body = check clientEP->/name; - \`\`\` - Bind to 'Body' instead of 'RecordType'. - - b. For pure Ballerina status code responses, bind data to \`http:Response\`. - - c. In positive test cases, always bind data directly to the expected type(Except for the above mentioned cases). - -2. Error Handling: Use check expressions instead of error unions, as the function returns an error type. - -3. Make sure to remove any unused imports. - -4. Maintain Existing Correctness: When fixing issues, ensure that you don't introduce new problems or revert correct implementations. - -Output: -Provide the complete, corrected test file with all issues resolved, incorporating the above considerations. Include clear comments explaining significant changes or complex logic. - -Additional Instructions: -- Prioritize code correctness and adherence to Ballerina best practices. -- Ensure all imports are correct and necessary. -- Verify that all test cases are properly implemented and cover the required scenarios. -- Double-check that the corrected code addresses all points in the diagnostics. -`; -} - -// ============================================== -// FUNCTION TEST GEN PROMPTS -// ============================================== - -export function getFunctionTestGenUserPrompt(resourceFunction: string, serviceCode: string, testPlan: string, typeSchemas: string): string { - return `Generate comprehensive test cases for the below resource function, based on the provided test plan, service implementation and types.: - -[BEGIN_RESOURCE_FUNCTION] -${resourceFunction} -[END_RESOURCE_FUNCTION] - -Service Implementation Context: -[BEGIN_SERVICE_CODE] -${serviceCode} -[END_SERVICE_CODE] - -Types Declared in the Source as Json Schema: -[BEGIN_SCHEMAS] -${typeSchemas} -[END_SCHEMAS] - -The test implementation MUST: - 1. Address each test scenario in the test plan sequentially - 2. Implement exact test conditions specified in the test plan - 3. Validate all expected outcomes mentioned in the test plan - 4. Follow any specific test data requirements provided in the test plan - 5. Not deviate from or add scenarios not mentioned in the test plan - -[BEGIN_TEST_PLAN] -${testPlan} -[END_TEST_PLAN] - -1. CONFIGURATION GENERATION (enclosed in tags and use \`\`\`toml{content}\`\`\`); -Generate a Config.toml for the configurable variables in the source code -Note: If there are no any configurable variables just ignore this section - -2. TEST IMPLEMENTATION (enclosed in tags and use \`\`\`ballerina{code}\`\`\`): -Generated test code following these strict guidelines: - -A. Test File Structure: - - Start with necessary imports, including \`ballerina/http\`, \`ballerina/test\` any other imports that is required - - Define an HTTP Client at the module level named \`clientEp\` - - Create helper functions only when improving readability - - Don't redefine any additional record types - -B. Test Function Generation: - - MUST strictly follow the test scenarios outlined in the provided test plan - - Generate individual test functions for EACH test scenario mentioned in the test plan - - Name test functions to clearly indicate which test plan scenario they cover - - Include comments referencing the specific test plan scenario being implemented - - Ensure test implementation covers all acceptance criteria mentioned in each test scenario - - For each test scenario in the test plan: - - Implement the exact test conditions specified - - Validate all expected outcomes mentioned - - Handle any specific error cases noted - - Follow any specific test data requirements - - Use \`@test:Config {}\` annotation for each test function, with dependsOn property when applicable - - Ensure each test function returns \`error?\` and use \`check\` keyword for error propagation - - Use proper HTTP method invocation syntax as per the provided example - - GET: - - Ballerina Resource -> resource function get books/[string isbn]() returns Book|Error - - Resource invocation -> {Type} {variableName} = check clientEp->/books/[{isbn}](); - - Example -> Book book = check clientEp->/books/[12345678](); - - POST: - - Ballerina Resource -> resource function post books(@http:Payload Book newBook) returns string|error - - Resource invocation -> {Type} {variableName} = clientEp->/books.post({payload}); - - Example -> Book book = check clientEp->/books.post(definedBook); - - PUT: - - Ballerina Resource -> resource function put books/[string isbn](@http:Payload Book updatedBook, @http:Query string name) returns string|error - - Resource invocation -> {Type} {variableName} = clientEp->/books/[{isbn}].put({payload}, name = {value}); - - Example -> Book book = check clientEp->/books/isbn\-number.put(definedUpdatedBook, name = "BookName"); - - DELETE: - - Ballerina Resource -> resource function delete books(@http:Query string isbn) returns string|error - - Resource invocation -> {Type} {variableName} = clientEp->/books.delete(isbn = {value}); - - PATCH: - - Ballerina Resource -> resource function patch books/[string isbn](@http:Payload Book updatedBook, @http:Query string name) returns string|error - - Resource invocation -> {Type} {variableName} = clientEp->/books/[{isbn}].patch({payload}, name = {value}); - - For non-annotated resource function parameters, treat records as body params and others as query params - - When generating negative test cases, implement only those scenarios explicitly mentioned in the test plan - - Do not generate types if the type is already defined in the schemas. - - NEVER implement custom mock classes; if mocking is necessary, use Ballerina's built-in test mocking syntax: - \`\`\`ballerina - // Create mock client - clientEndpoint = test:mock(http:Client); - - // Stub method behavior - test:prepare(clientEndpoint).when("methodName").thenReturn(mockResponse()); - - // Stub with specific arguments if needed - test:prepare(clientEndpoint).when("methodName").withArguments("/path").thenReturn(mockResponse()); - \`\`\` - -C. Response Handling: - - Use direct data binding for positive test cases based on source code or type schemas - - For negative test cases, use \`http:Response\` variables and check status codes - - Check for \`x-ballerina-type\` extension in type schemas and if those types were used in the code, include necessary imports - - Always assign responses to variables with specific types - -D. Assertions and Validation: - - Use only \`test:assertEquals(actualVar, expectedVar, msg)\` for assertions - - When asserting decimals, use \`d\` at the end of the decimal literal (e.g., 123.45d) - - Provide clear and descriptive messages for each assertion - -E. Code Quality: - - Follow Ballerina naming conventions and best practices - - Add comments explaining the purpose of each test and any complex logic - - Ensure the generated code is comprehensive, robust, maintainable, and clear -`; -} - -export function getFunctionTestGenUserSubsequentPrompt(resourceFunction: string, serviceCode: string, testPlan: string, typeSchemas: string, existingTestFile: string): string { - return `Please generate additional unit tests for the following Ballerina function, extending the existing test suite. - -FUNCTION TO TEST: ${resourceFunction} - -SERVICE CODE: -${serviceCode} - -TEST PLAN: -${testPlan} - -TYPE SCHEMAS: -${typeSchemas} - -EXISTING TEST FILE: -${existingTestFile} - -Requirements: -- Extend the existing test suite with additional test cases -- Follow the test plan for new scenarios -- Maintain consistency with existing test structure -- Add new test cases without duplicating existing ones -- Include proper assertions and test data - -Please provide the complete updated test file content.`; -} - -export function getFunctionTestGenUserDiagnosticPrompt(resourceFunction: string, serviceCode: string, testPlan: string, typeSchemas: string, existingTestFile: string, sectionToFix: string, diagnostics: string): string { - return `Fix Generated Ballerina Test Code based on Diagnostics - -Project Source Code: -[BEGIN_PROJECT_SOURCE] -${serviceCode} -[END_PROJECT_SOURCE] - -Types Declared in the Source as Json Schema: -[BEGIN_SCHEMAS] -${typeSchemas} -[END_SCHEMAS] - -Complete Test File: -[BEGIN_COMPLETE_TEST_FILE] -${existingTestFile} -[END_COMPLETE_TEST_FILE] - -Part of Test File Needing Fixes: -[BEGIN_SECTION_TO_FIX] -${sectionToFix} -[END_SECTION_TO_FIX] - -Diagnostics: -[BEGIN_DIAGNOSTICS] -${diagnostics} -[END_DIAGNOSTICS] - -Task: Analyze the provided test file and diagnostics, then fix ONLY the section identified in SECTION_TO_FIX. Return only the corrected version of this section. - -Key Considerations: -1. Data Binding Rules: - a. For records that contain Ballerina status code response as inclusions (e.g., \`*http:Ok\`, \`*http:Created\`, \`*http:NotFound\`), bind data to the \`body\` field: - Example: - \`\`\`ballerina - type RecordType record {| - *http:Ok; - Body body; - |}; - - // Service code - service /test on new http:Listener(8080) { - resource function get name() returns RecordType|error { - return { - // values - body: { - // values - } - } - } - } - - // When data binding, - final http:Client clientEP = check new ("http://localhost:8080/test"); - Body body = check clientEP->/name; - \`\`\` - Bind to 'Body' instead of 'RecordType'. - - b. For pure Ballerina status code responses, bind data to \`http:Response\`. - - c. In positive test cases, always bind data directly to the expected type (except for the above mentioned cases). - -2. Error Handling: Use check expressions instead of error unions, as the function returns an error type. - -3. Make sure to identify and fix any unused imports. - -4. Maintain Existing Correctness: When fixing issues, ensure that you don't introduce new problems or revert correct implementations. - -Available Status Code Responses: -- http:Continue -- http:SwitchingProtocols -- http:Processing -- http:EarlyHints -- http:Ok -- http:Created -- http:Accepted -- http:NonAuthoritativeInformation -- http:NoContent -- http:ResetContent -- http:PartialContent -- http:MultiStatus -- http:AlreadyReported -- http:IMUsed -- http:MultipleChoices -- http:MovedPermanently -- http:Found -- http:SeeOther -- http:NotModified -- http:UseProxy -- http:TemporaryRedirect -- http:PermanentRedirect -- http:BadRequest -- http:Unauthorized -- http:PaymentRequired -- http:Forbidden -- http:NotFound -- http:MethodNotAllowed -- http:NotAcceptable -- http:ProxyAuthenticationRequired -- http:RequestTimeout -- http:Conflict -- http:Gone -- http:LengthRequired -- http:PreconditionFailed -- http:PayloadTooLarge -- http:UriTooLong -- http:UnsupportedMediaType -- http:RangeNotSatisfiable -- http:ExpectationFailed -- http:MisdirectedRequest -- http:UnprocessableEntity -- http:Locked -- http:FailedDependency -- http:TooEarly -- http:PreconditionRequired -- http:UnavailableDueToLegalReasons -- http:UpgradeRequired -- http:TooManyRequests -- http:RequestHeaderFieldsTooLarge -- http:InternalServerError -- http:NotImplemented -- http:BadGateway -- http:ServiceUnavailable -- http:GatewayTimeout -- http:HttpVersionNotSupported -- http:VariantAlsoNegotiates -- http:InsufficientStorage -- http:LoopDetected -- http:NotExtended -- http:NetworkAuthorizationRequired -- http:NetworkAuthenticationRequired - -Output: -Provide ONLY the fixed code section. Your response should be enclosed in tags and use \`\`\`ballerina{code}\`\`\` format. -`; -} - -// ============================================== -// MESSAGE CREATION FUNCTIONS -// ============================================== - -export function createServiceTestGenMessages(request: TestGenerationRequest1): ModelMessage[] { - const serviceTestGenUser1 = createServiceTestGenUser1Message(request); - - if (!request.diagnostics || !request.existingTests) { - const serviceTestGenAssistant1 = createServiceTestGenAssistant1Message(); - const serviceTestGenUser2 = createServiceTestGenUser2Message(request); - return [serviceTestGenUser1, serviceTestGenAssistant1, serviceTestGenUser2]; - } else { - const serviceTestDiagnosticsAssistant1 = createServiceTestDiagnosticsAssistant1Message(request); - const serviceTestDiagnosticsUser2 = createServiceTestDiagnosticsUser2Message(request); - return [serviceTestGenUser1, serviceTestDiagnosticsAssistant1, serviceTestDiagnosticsUser2]; - } -} - -export function createServiceTestGenUser1Message(request: TestGenerationRequest1): ModelMessage { - if (!request.openApiSpec) { - throw new Error("OpenAPI specification is required for test generation."); - } - - const flattenedProject = flattenProjectToText(request.projectSource); - const typeSchemas = getExternalTypesAsJsonSchema(request.openApiSpec); - - const prompt = getServiceTestGenUser1Prompt(flattenedProject, typeSchemas); - - return { - role: "user", - content: prompt, - providerOptions: { - anthropic: { cacheControl: { type: "ephemeral" } }, - }, - }; -} - -export function createServiceTestGenAssistant1Message(): ModelMessage { - return { - role: "assistant", - content: getServiceTestGenAssistant1Prompt() - }; -} - -export function createServiceTestGenUser2Message(request: TestGenerationRequest1): ModelMessage { - const prompt = request.testPlan - ? getServiceTestGenUser2WithPlanPrompt(request.targetIdentifier, request.testPlan) - : getServiceTestGenUser2Prompt(request.targetIdentifier); - - return { - role: "user", - content: prompt - }; -} - -export function createServiceTestDiagnosticsAssistant1Message(request: TestGenerationRequest1): ModelMessage { - return { - role: "assistant", - content: getServiceTestDiagnosticsAssistant1Prompt() - }; -} - -export function createServiceTestDiagnosticsUser2Message(request: TestGenerationRequest1): ModelMessage { - if (!request.diagnostics) { - throw new Error("Diagnostics are required for test generation."); - } - if (!request.existingTests) { - throw new Error("Existing tests are required for test generation."); - } - - const diagnosticsText = getDiagnosticsAsText(request.diagnostics); - const prompt = getServiceTestDiagnosticsUser2Prompt(diagnosticsText, request.existingTests); - - return { - role: "user", - content: prompt - }; -} - -export function createFunctionTestGenMessages(request: TestGenerationRequest1): ModelMessage[] { - const functionTestGenUser = createFunctionTestGenUserMessage(request); - return [functionTestGenUser]; -} - -export function createFunctionTestGenUserMessage(request: TestGenerationRequest1): ModelMessage { - if (!request.testPlan) { - throw new Error("Test plan is required for function test generation."); - } - - const flattenedProject = flattenProjectToText(request.projectSource); - const typeSchemas = getTypesAsJsonSchema(request.openApiSpec || ""); - - let prompt: string; - if (!request.existingTests) { - prompt = getFunctionTestGenUserPrompt(request.targetIdentifier, flattenedProject, request.testPlan, typeSchemas); - } else { - if (!request.diagnostics) { - prompt = getFunctionTestGenUserSubsequentPrompt(request.targetIdentifier, flattenedProject, request.testPlan, typeSchemas, request.existingTests); - } else { - const diagnosticsText = getDiagnosticsAsText(request.diagnostics); - const sectionToFix = extractSectionToFix(request.existingTests); - prompt = getFunctionTestGenUserDiagnosticPrompt(request.targetIdentifier, flattenedProject, request.testPlan, typeSchemas, request.existingTests, sectionToFix, diagnosticsText); - } - } - - return { - role: "user", - content: prompt, - providerOptions: { - anthropic: { cacheControl: { type: "ephemeral" } }, - }, - }; -} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts deleted file mode 100644 index 1d6bf1d44b6..00000000000 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test.ts +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. - -// WSO2 LLC. licenses this file to you under the Apache License, -// Version 2.0 (the "License"); you may not use this file except -// in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 - -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -import { Command } from "@wso2/ballerina-core"; -import { generateText, ModelMessage } from "ai"; -import { ANTHROPIC_SONNET_4, getAnthropicClient, getProviderCacheControl } from "../connection"; -import { - getServiceTestGenerationSystemPrompt, - getServiceTestDiagnosticsSystemPrompt, - getFunctionTestGenerationSystemPrompt, - createServiceTestGenMessages, - createFunctionTestGenMessages -} from "./prompts"; -import { - extractCodeFromResponse, - extractConfigFromResponse -} from "./utils"; -import { CopilotEventHandler, createWebviewEventHandler } from "../event"; -import { getErrorMessage } from "../utils"; -import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; - -// Core test generation function that emits events -export async function generateTestFromLLMCore(request: TestGenerationRequest1, eventHandler: CopilotEventHandler): Promise { - try { - const streamContent = await getStreamedTestResponse(request); - const testCode = extractCodeFromResponse(streamContent); - const configContent = extractConfigFromResponse(streamContent); - - return { - testSource: testCode, - testConfig: configContent - }; - } catch (error) { - console.error("Error during test generation:", error); - eventHandler({ type: 'error', content: getErrorMessage(error) }); - throw error; - } -} - -// Main public function that uses the default event handler -export async function generateTestFromLLM(request: TestGenerationRequest1): Promise { - const eventHandler = createWebviewEventHandler(Command.Tests ); - return await generateTestFromLLMCore(request, eventHandler); -} - -export type ProjectModule = { - moduleName: string; - sourceFiles: SourceFile[]; -}; - -export type SourceFile = { - fileName: string; - content: string; -}; - -export type ProjectSource = { - projectModules?: ProjectModule[]; - sourceFiles: SourceFile[]; - configToml?: string; -}; - -export type Diagnostic = { - message: string; -}; - -export type TestGenerationRequest1 = { - targetType: "service" | "function"; - targetIdentifier: string; - projectSource: ProjectSource; - openApiSpec?: string; - testPlan?: string; - diagnostics?: Diagnostic[]; - existingTests?: string; -}; - -type TestGenerationResponse = { - testSource: string; - testConfig?: string; -}; - -async function getStreamedTestResponse(request: TestGenerationRequest1): Promise { - const systemPrompt = createTestGenerationSystemPrompt(request); - let messages: ModelMessage[] = []; - - if (request.targetType === "service") { - messages = createServiceTestGenMessages(request); - } else if (request.targetType === "function") { - messages = createFunctionTestGenMessages(request); - } else { - throw new Error(`Unsupported target type specified: ${request.targetType}. Please use 'service' or 'function'.`); - } - - // Apply provider-aware cache control to messages that have cacheControl - const cacheOptions = await getProviderCacheControl(); - messages = messages.map(message => { - if (message.providerOptions && - (message.providerOptions as any).anthropic?.cacheControl) { - return { - ...message, - providerOptions: cacheOptions - }; - } - return message; - }); - - const { text } = await generateText({ - model: await getAnthropicClient(ANTHROPIC_SONNET_4), - maxOutputTokens: 16384, - temperature: 0, - system: systemPrompt, - messages: messages, - abortSignal: AIPanelAbortController.getInstance().signal - }); - - return text; -} - -function createTestGenerationSystemPrompt(request: TestGenerationRequest1): string { - if (request.targetType === "service") { - if (!request.diagnostics || !request.existingTests) { - return getServiceTestGenerationSystemPrompt(); - } else { - return getServiceTestDiagnosticsSystemPrompt(); - } - } else if (request.targetType === "function") { - return getFunctionTestGenerationSystemPrompt(); - } - throw new Error(`Unsupported target type specified: ${request.targetType}. Please use 'service' or 'function'.`); -} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test_plan.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test_plan.ts deleted file mode 100644 index a4d9ffb612c..00000000000 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/test_plan.ts +++ /dev/null @@ -1,409 +0,0 @@ -// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. - -// WSO2 LLC. licenses this file to you under the Apache License, -// Version 2.0 (the "License"); you may not use this file except -// in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 - -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -import { ModelMessage, streamText } from "ai"; -import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../connection"; -import { getErrorMessage } from "../utils"; -import { TestGenerationTarget, TestPlanGenerationRequest, Command } from "@wso2/ballerina-core"; -import { generateTest, getDiagnostics } from "../../testGenerator"; -import { CopilotEventHandler, createWebviewEventHandler } from "../event"; -import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; -import { getCurrentProjectRoot } from "../../../../utils/project-utils"; -import { StateMachine } from "../../../../stateMachine"; -import * as path from "path"; - -export interface TestPlanResponse { - testPlan: string; -} - -/** - * Buffer management for test plan streaming with tag detection - */ -class TestPlanBuffer { - private buffer: string = ""; - private readonly fullScenarioRegex = /([\s\S]*?)<\/scenario>/; - private readonly scenarioOpenTagRegex = //; - private readonly partialScenarioRegex = /<(s(c(e(n(a(r(i(o(>)?)?)?)?)?)?)?)?)?/; - - /** - * Processes new text and returns chunks that should be emitted - * @param text New text to add to buffer - * @returns Object with shouldEmit flag and text to emit - */ - processText(text: string): { shouldEmit: boolean; textToEmit: string } { - if (text === "") { - return { shouldEmit: false, textToEmit: "" }; - } - - this.buffer += text; - - const fullScenarioMatch = this.fullScenarioRegex.exec(this.buffer); - const partialScenarioMatch = this.partialScenarioRegex.exec(this.buffer); - const actualFullScenarioMatch = this.scenarioOpenTagRegex.exec(this.buffer); - - // If no partial match, emit entire buffer - if (!partialScenarioMatch) { - const textToEmit = this.buffer; - this.buffer = ""; - return { shouldEmit: true, textToEmit }; - } - - // If partial match is at the end of buffer, wait for more content - if (partialScenarioMatch.index + partialScenarioMatch[0].length === this.buffer.length) { - return { shouldEmit: false, textToEmit: "" }; - } - - // If we have a complete opening tag but no full scenario - if (actualFullScenarioMatch && !fullScenarioMatch) { - // Continue waiting for the complete scenario - return { shouldEmit: false, textToEmit: "" }; - } - - // If we have a complete scenario tag (full ...) - if (fullScenarioMatch) { - const endIndex = fullScenarioMatch.index + fullScenarioMatch[0].length; - const textToEmit = this.buffer.substring(0, endIndex); - this.buffer = this.buffer.substring(endIndex); - return { shouldEmit: true, textToEmit }; - } - - // Partial match not at end, emit everything before the partial match - const textToEmit = this.buffer; - this.buffer = ""; - return { shouldEmit: true, textToEmit }; - } - - /** - * Flushes remaining buffer content - */ - flush(): string { - const remaining = this.buffer; - this.buffer = ""; - return remaining; - } -} - -// Core test plan generation function that emits events -export async function generateTestPlanCore( - params: TestPlanGenerationRequest, - eventHandler: CopilotEventHandler -): Promise { - const { targetType, targetSource, target } = params; - let systemPrompt: string; - let userPrompt: string; - - if (targetType === TestGenerationTarget.Service) { - systemPrompt = getServiceSystemPrompt(); - userPrompt = getServiceUserPrompt(targetSource); - } else { - systemPrompt = getFunctionSystemPrompt(); - userPrompt = getFunctionUserPrompt(targetSource); - } - - const allMessages: ModelMessage[] = [ - { - role: "system", - content: systemPrompt, - }, - { - role: "user", - content: userPrompt, - }, - ]; - const { fullStream } = streamText({ - model: await getAnthropicClient(ANTHROPIC_SONNET_4), - maxOutputTokens: 8192, - temperature: 0, - messages: allMessages, - abortSignal: AIPanelAbortController.getInstance().signal, - }); - - eventHandler({ type: "start" }); - const buffer = new TestPlanBuffer(); - let assistantResponse: string = ""; - - for await (const part of fullStream) { - switch (part.type) { - case "text-delta": { - const textPart = part.text; - assistantResponse += textPart; - - // Process through buffer for scenario tag detection - const result = buffer.processText(textPart); - - if (result.shouldEmit && result.textToEmit) { - eventHandler({ type: "content_block", content: result.textToEmit }); - } - break; - } - case "error": { - const error = part.error; - console.error("Error during test plan generation:", error); - eventHandler({ type: "error", content: getErrorMessage(error) }); - break; - } - case "finish": { - // Flush any remaining buffer content - const remainingText = buffer.flush(); - if (remainingText) { - eventHandler({ type: "content_block", content: remainingText }); - } - if (targetType === "service") { - eventHandler({ - type: "content_block", - content: `\n\n**Initiating test generation for the ${target} service, following the _outlined test plan_. Please wait...**`, - }); - eventHandler({ - type: "content_block", - content: `\n\nGenerating tests for the ${target} service. This may take a moment.`, - }); - let projectPath: string; - try { - projectPath = await getCurrentProjectRoot(); - } catch (error) { - console.error("Error getting current project root:", error); - eventHandler({ type: "error", content: getErrorMessage(error) }); - return; - } - - // Compute workspace-relative paths for test files - const context = StateMachine.context(); - const workspacePath = context.workspacePath; - let testPath = "tests/test.bal"; - let configPath = "tests/Config.toml"; - - if (workspacePath) { - // Workspace project: include package path prefix (e.g., "foo/tests/test.bal") - const relativeProjectPath = path.relative(workspacePath, projectPath); - testPath = path.join(relativeProjectPath, "tests/test.bal"); - configPath = path.join(relativeProjectPath, "tests/Config.toml"); - } - - const testResp = await generateTest(projectPath, { - targetType: TestGenerationTarget.Service, - targetIdentifier: target, - testPlan: assistantResponse, - }); - eventHandler({ - type: "content_block", - content: `\nAnalyzing generated tests for potential issues.`, - }); - const diagnostics = await getDiagnostics(projectPath, testResp); - let testCode = testResp.testSource; - const testConfig = testResp.testConfig; - if (diagnostics.diagnostics.length > 0) { - eventHandler({ - type: "content_block", - content: `\nRefining tests based on feedback to ensure accuracy and reliability.`, - }); - const fixedCode = await generateTest(projectPath, { - targetType: TestGenerationTarget.Service, - targetIdentifier: target, - testPlan: assistantResponse, - diagnostics: diagnostics, - existingTests: testResp.testSource, - }); - testCode = fixedCode.testSource; - } - - eventHandler({ - type: "content_block", - content: `\n\nTest generation completed. Displaying the generated tests for the ${target} service below:`, - }); - eventHandler({ - type: "content_block", - content: `\n\n\n\`\`\`ballerina\n${testCode}\n\`\`\`\n`, - }); - if (testConfig) { - eventHandler({ - type: "content_block", - content: `\n\n\n\`\`\`ballerina\n${testConfig}\n\`\`\`\n`, - }); - } - eventHandler({ type: "stop", command: Command.Tests }); - } else { - eventHandler({ - type: "content_block", - content: `\n\n`, - }); - eventHandler({ - type: "intermediary_state", - state: { - resourceFunction: target, - testPlan: assistantResponse, - }, - }); - } - break; - } - } - } -} - -// Main public function that uses the default event handler -export async function generateTestPlan(params: TestPlanGenerationRequest): Promise { - const eventHandler = createWebviewEventHandler(Command.Tests); - try { - await generateTestPlanCore(params, eventHandler); - } catch (error) { - console.error("Error during test plan generation:", error); - eventHandler({ type: "error", content: getErrorMessage(error) }); - } -} - -function getServiceSystemPrompt(): string { - return `You are an expert test engineer specializing in creating test plans for Ballerina services. You have extensive experience in identifying critical test scenarios while maintaining efficiency by focusing on essential test cases. Your expertise lies in analyzing service code and determining the minimum set of test cases needed to ensure core functionality.`; -} - -function getFunctionSystemPrompt(): string { - return `You are a specialized test analyzer focused on generating precise test scenarios by examining code implementations, identifying explicit happy paths, documented error conditions, and handled edge cases while strictly limiting scenarios to what's actually supported in the source code, ensuring each test case maps directly to implemented functionality without speculating beyond the code's scope.`; -} - -function getServiceUserPrompt(source: string): string { - return `Task: Analyze the provided Ballerina service code and create a detailed test plan following the specified format. - -Context: - - You are analyzing a Ballerina service implementation requiring comprehensive test coverage - - The output must follow a specific structured format - - Focus on practical, implementable test scenarios - -Input Code: -[BEGIN_SOURCE] -\`\`\`ballerina -${source} -\`\`\` -[END_SOURCE] - -[BEGIN_OUTPUT_FORMAT] -**Test plan for [service_name] service** - -**Overview** -[Brief description of what the test plan covers] - -[For each resource function, numbered sequentially:] -[N]. Resource Function: [HTTP_METHOD] [PATH] - -_Scenario [N.1] (Happy Path)_ -- Action: [What the test does] -- Expected: [Expected outcome] -- Validation: [What to verify] - -[If applicable:] -_Scenario [N.2] (Error Path)_ -- Action: [Error scenario details] -- Expected: [Expected error response] -- Validation: [Error validation points] - -**Test Dependencies** -[List major dependencies with bullet points] - -**Test Execution Notes** -[List key execution requirements with bullet points] -[END_OUTPUT_FORMAT] - -Requirements: -1. Analyze the service code with focus on: - - Resource functions and their logic - - Error handling mechanisms - - Input validation - - Business logic implementation - - External dependencies - -Test Scenario Generation Rules: -1. Generate scenarios in sequential order -2. For each resource function: - - Minimum: 1 test scenario - - Maximum: 2 test scenarios -3. Coverage Requirements: - - Happy Path: Include successful execution flows - - Error Path: Only include error scenarios that are explicitly handled in the code(if there are any errors other than ballerina error is returned.) - -Constraints: -- Focus on practical, implementable scenarios -- Avoid edge cases not handled in the code -- Ensure scenarios align with the actual implementation - -Please analyze the code and generate the test plan following these specifications. -`; -} - -function getFunctionUserPrompt(source: string): string { - return `Task: Analyze the provided Ballerina function code and create a detailed test plan following the specified format. - -Context: - - You are analyzing a Ballerina function implementation requiring comprehensive test coverage - - The output must follow the given output format strictly where only scenarios are taged and DO NOT number scenarios - - Focus on practical, implementable test scenarios - -Input Code: -[BEGIN_SOURCE] -\`\`\`ballerina -${source} -\`\`\` -[END_SOURCE] - -[BEGIN_OUTPUT_FORMAT] -**Test plan for resource** - -**Overview** -[Brief description of what the test plan covers] - -[For each scenario:] - - Clear, descriptive scenario title - - Detailed scenario description including: - - Purpose of the test - - Input parameters and their values - - Expected outcome - - Any specific conditions or prerequisites - - - -[After all scenarios:] - - -**Test Execution Notes** -[List key execution requirements with bullet points] -[END_OUTPUT_FORMAT] - -Requirements: -1. Analyze the function code with focus on: - - Input parameters and their types - - Return types and values - - Error handling mechanisms - - Business logic implementation - - External dependencies - - Edge cases handled in the code - -Test Scenario Generation Rules: -1. Generate scenarios in sequential order -2. Maximum of 5 test scenarios -3. Coverage Requirements: - - Happy Path: Include successful execution flows - - Error Path: Only include error scenarios that are explicitly handled in the code - - Edge Cases: Include boundary conditions that are handled in the implementation - -Constraints: -- Focus on practical, implementable scenarios -- Avoid edge cases not handled in the code -- Ensure scenarios align with the actual implementation -- Prioritize quality over quantity -- Focus on scenarios that provide maximum coverage of critical functionality - -Note: Please analyze the code and generate the test plan following these specifications. -`; -} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/utils.ts deleted file mode 100644 index e52f74bdf61..00000000000 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/test/utils.ts +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. - -// WSO2 LLC. licenses this file to you under the Apache License, -// Version 2.0 (the "License"); you may not use this file except -// in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 - -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -import { ProjectSource, Diagnostic } from "./test"; - -// ============================================== -// UTILITY FUNCTIONS -// ============================================== - -export function extractCodeFromResponse(testCode: string): string { - const matches = testCode.split("```ballerina\n"); - if (matches.length > 1) { - const codeParts = matches[1].split("\n```"); - if (codeParts.length > 0) { - return codeParts[0]; - } - throw new Error("No code found between the delimiters."); - } - throw new Error("No Ballerina code block found in the content."); -} - -export function extractConfigFromResponse(response: string): string | undefined { - const configMatches = response.split("```toml\n"); - if (configMatches.length > 1) { - const configParts = configMatches[1].split("\n```"); - if (configParts.length > 0) { - return configParts[0]; - } - } - return undefined; -} - -export function flattenProjectToText(projectSource: ProjectSource): string { - let flattenedProject = ""; - - const modules = projectSource.projectModules; - if (modules) { - for (const module of modules) { - let moduleSource = ""; - for (const sourceFile of module.sourceFiles) { - moduleSource += `\`\`\`ballerina -# modules/${module.moduleName}/${sourceFile.fileName} - -${sourceFile.content} -\`\`\` - -`; - } - flattenedProject += moduleSource; - } - } - - for (const sourceFile of projectSource.sourceFiles) { - flattenedProject += `\`\`\`ballerina -# ${sourceFile.fileName} - -${sourceFile.content} -\`\`\` - -`; - } - - return flattenedProject; -} - -export function getExternalTypesAsJsonSchema(openApiSpec: string): string { - try { - const externalTypes: Record = {}; - - const openApiSpecObj = JSON.parse(openApiSpec); - const components = openApiSpecObj.components; - - if (components && components.schemas) { - for (const componentName in components.schemas) { - const componentSchema = components.schemas[componentName]; - if (componentSchema && componentSchema['x-ballerina-type'] !== undefined) { - externalTypes[componentName] = componentSchema; - } - } - } - - return JSON.stringify(externalTypes); - } catch (error) { - // Return empty object if parsing fails - return "{}"; - } -} - -export function getTypesAsJsonSchema(openApiSpec: string): string { - try { - const openApiSpecObj = JSON.parse(openApiSpec); - const components = openApiSpecObj.components; - - if (components) { - return JSON.stringify(components); - } - - return "{}"; - } catch (error) { - // Return empty object if parsing fails - return "{}"; - } -} - -export function getDiagnosticsAsText(diagnostics: Diagnostic[]): string { - let flattenedDiagnostics = ""; - - for (const diagnostic of diagnostics) { - flattenedDiagnostics += `- Message: ${diagnostic.message} - -`; - } - - return flattenedDiagnostics; -} - -export function extractSectionToFix(existingTests: string): string { - const marker = "// >>>>>>>>>>>>>>TEST CASES NEED TO BE FIXED <<<<<<<<<<<<<<<"; - const index = existingTests.indexOf(marker); - if (index !== -1) { - return existingTests.substring(index + marker.length); - } - return ""; -} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/types.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/service/types.ts deleted file mode 100644 index 2ff5f20d6c4..00000000000 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/types.ts +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. - -// WSO2 LLC. licenses this file to you under the Apache License, -// Version 2.0 (the "License"); you may not use this file except -// in compliance with the License. -// You may obtain a copy of the License at - -// http://www.apache.org/licenses/LICENSE-2.0 - -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. - -export interface SystemMessage { - cache_control?: { - type: "ephemeral"; - }; - type: "text"; - text: string; -} - -export interface TextBlock { - cache_control?: { - type: "ephemeral"; - }; - text: string; - type: "text"; -} - -export interface ImageBlockSource { - data: string; - media_type: "image/jpeg" | "image/png" | "image/gif" | "image/webp"; - type: "base64"; -} - -export interface ImageBlock { - source: ImageBlockSource; - type: "image"; -} - -export interface DocumentBlock { - source: DocumentBlockSource; - type: "document"; -} - -export interface DocumentBlockSource { - data: string; - media_type: "application/pdf"; - type: "base64"; -} - -export interface ToolUseBlock { - id: string; - name: string; - input: Record; - type: "tool_use"; -} - -export interface ToolResultBlock { - tool_use_id: string; - content: string | Block[]; - is_error?: boolean; - type: "tool_result"; -} - -export type Block = TextBlock | ImageBlock | ToolUseBlock | ToolResultBlock | DocumentBlock; - -export type MessageRole = "user" | "assistant"; - -export interface Usage { - input_tokens: number; - output_tokens: number; -} - -export type StopReason = "end_turn" | "max_tokens" | "stop_sequence" | "tool_use" | null; - -export interface Message { - id?: string; - content: string | Block[]; - role: MessageRole; - model?: string; - stop_reason?: StopReason; - stop_sequence?: any; - type?: string; - usage?: Usage; -} - -export interface CreateMessageRequestMetadata { - user_id?: string; -} - -export type ToolChoiceType = "auto" | "any" | "tool"; - -export interface ToolChoice { - type: ToolChoiceType; - name?: string; -} - -export interface Tool { - name: string; - description?: string; - input_schema: Record; -} - -export interface CreateMessageRequest { - model: string | "claude-3-5-sonnet-20240620" | "claude-3-haiku-20240307" | "claude-3-opus-20240229" | "claude-3-sonnet-20240229" | "claude-2.0" | "claude-2.1" | "claude-instant-1.2"; - messages: Message[]; - max_tokens: number; - metadata?: CreateMessageRequestMetadata; - stop_sequences?: string[]; - system?: string | SystemMessage[]; - temperature?: number; - tool_choice?: ToolChoice; - tools?: Tool[]; - top_k?: number; - top_p?: number; - stream?: boolean; -} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalManager.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalManager.ts new file mode 100644 index 00000000000..c61dcf4d2f5 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/state/ApprovalManager.ts @@ -0,0 +1,356 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { Task } from '@wso2/ballerina-core/lib/state-machine-types'; +import { CopilotEventHandler } from '../utils/events'; + +/** + * Plan approval response + */ +export interface PlanApprovalResponse { + approved: boolean; + comment?: string; +} + +/** + * Task approval response + */ +export interface TaskApprovalResponse { + approved: boolean; + comment?: string; + approvedTaskDescription?: string; +} + +/** + * Connector spec response + */ +export interface ConnectorSpecResponse { + provided: boolean; + spec?: any; + comment?: string; +} + +/** + * Generic promise resolver for approval requests + */ +interface PromiseResolver { + resolve: (value: T) => void; + reject: (error: Error) => void; + timeoutId?: NodeJS.Timeout; +} + +/** + * ApprovalManager - Global singleton for managing human-in-the-loop approval workflows + * + * Replaces XState state machine subscription pattern with promise-based approvals. + * Supports parallel executions through unique requestId per execution. + */ +//TODO: Migrate this to be part of chat state manager. +export class ApprovalManager { + private static instance: ApprovalManager; + + private planApprovals = new Map>(); + private taskApprovals = new Map>(); + private connectorSpecs = new Map>(); + + // Default timeout for abandoned approvals (30 minutes) + private readonly DEFAULT_TIMEOUT_MS = 30 * 60 * 1000; + + private constructor() { + // Private constructor for singleton pattern + } + + static getInstance(): ApprovalManager { + if (!ApprovalManager.instance) { + ApprovalManager.instance = new ApprovalManager(); + } + return ApprovalManager.instance; + } + + // ============================================ + // Plan Approval + // ============================================ + + /** + * Request plan approval from user + * Emits task_approval_request event and waits for user response + * + * @param requestId - Unique identifier for this approval request + * @param tasks - Array of tasks in the plan + * @param eventHandler - Event handler to emit approval request + * @returns Promise that resolves when user approves/declines + */ + requestPlanApproval( + requestId: string, + tasks: Task[], + eventHandler: CopilotEventHandler + ): Promise { + console.log(`[ApprovalManager] Requesting plan approval: ${requestId}`); + + // Emit event to frontend + eventHandler({ + type: "task_approval_request", + requestId: requestId, + approvalType: "plan", + tasks: tasks, + message: "Please review the implementation plan" + }); + + // Create promise that will be resolved by resolvePlanApproval() + return new Promise((resolve, reject) => { + const timeoutId = setTimeout(() => { + this.planApprovals.delete(requestId); + reject(new Error(`Plan approval timeout for request ${requestId}`)); + }, this.DEFAULT_TIMEOUT_MS); + + this.planApprovals.set(requestId, { resolve, reject, timeoutId }); + }); + } + + /** + * Resolve plan approval (called by RPC method when user responds) + * + * @param requestId - Unique identifier for this approval request + * @param approved - Whether the plan was approved + * @param comment - Optional comment from user + */ + resolvePlanApproval(requestId: string, approved: boolean, comment?: string): void { + const resolver = this.planApprovals.get(requestId); + if (!resolver) { + console.warn(`[ApprovalManager] No pending plan approval for request: ${requestId}`); + return; + } + + console.log(`[ApprovalManager] Resolving plan approval: ${requestId}, approved: ${approved}`); + + // Clear timeout + if (resolver.timeoutId) { + clearTimeout(resolver.timeoutId); + } + + // Resolve promise + resolver.resolve({ approved, comment }); + + // Cleanup + this.planApprovals.delete(requestId); + } + + // ============================================ + // Task Approval + // ============================================ + + /** + * Request task completion approval from user + * Emits task_approval_request event and waits for user response + * + * @param requestId - Unique identifier for this approval request + * @param taskDescription - Description of the completed task + * @param tasks - Array of all tasks (for UI display) + * @param eventHandler - Event handler to emit approval request + * @returns Promise that resolves when user approves/declines + */ + requestTaskApproval( + requestId: string, + taskDescription: string, + tasks: Task[], + eventHandler: CopilotEventHandler + ): Promise { + console.log(`[ApprovalManager] Requesting task approval: ${requestId}`); + + // Emit event to frontend + eventHandler({ + type: "task_approval_request", + requestId: requestId, + approvalType: "completion", + tasks: tasks, + taskDescription: taskDescription, + message: `Please verify the completed work for: ${taskDescription}` + }); + + // Create promise that will be resolved by resolveTaskApproval() + return new Promise((resolve, reject) => { + const timeoutId = setTimeout(() => { + this.taskApprovals.delete(requestId); + reject(new Error(`Task approval timeout for request ${requestId}`)); + }, this.DEFAULT_TIMEOUT_MS); + + this.taskApprovals.set(requestId, { resolve, reject, timeoutId }); + }); + } + + /** + * Resolve task approval (called by RPC method when user responds) + * + * @param requestId - Unique identifier for this approval request + * @param approved - Whether the task was approved + * @param comment - Optional comment from user + * @param approvedTaskDescription - Description of approved task + */ + resolveTaskApproval( + requestId: string, + approved: boolean, + comment?: string, + approvedTaskDescription?: string + ): void { + const resolver = this.taskApprovals.get(requestId); + if (!resolver) { + console.warn(`[ApprovalManager] No pending task approval for request: ${requestId}`); + return; + } + + console.log(`[ApprovalManager] Resolving task approval: ${requestId}, approved: ${approved}`); + + // Clear timeout + if (resolver.timeoutId) { + clearTimeout(resolver.timeoutId); + } + + // Resolve promise + resolver.resolve({ approved, comment, approvedTaskDescription }); + + // Cleanup + this.taskApprovals.delete(requestId); + } + + // ============================================ + // Connector Spec Request + // ============================================ + + /** + * Request connector spec from user + * Emits connector_generation_notification event and waits for user response + * + * @param requestId - Unique identifier for this approval request + * @param eventHandler - Event handler to emit spec request + * @returns Promise that resolves when user provides/cancels spec + */ + requestConnectorSpec( + requestId: string, + eventHandler: CopilotEventHandler + ): Promise { + console.log(`[ApprovalManager] Requesting connector spec: ${requestId}`); + + // Emit event to frontend + eventHandler({ + type: "connector_generation_notification", + requestId: requestId, + stage: "requesting_input", + message: "Please provide the OpenAPI specification" + }); + + // Create promise that will be resolved by resolveConnectorSpec() + return new Promise((resolve, reject) => { + const timeoutId = setTimeout(() => { + this.connectorSpecs.delete(requestId); + reject(new Error(`Connector spec request timeout for request ${requestId}`)); + }, this.DEFAULT_TIMEOUT_MS); + + this.connectorSpecs.set(requestId, { resolve, reject, timeoutId }); + }); + } + + /** + * Resolve connector spec request (called by RPC method when user responds) + * + * @param requestId - Unique identifier for this approval request + * @param provided - Whether the spec was provided + * @param spec - The OpenAPI spec (if provided) + * @param comment - Optional comment from user + */ + resolveConnectorSpec( + requestId: string, + provided: boolean, + spec?: any, + comment?: string + ): void { + const resolver = this.connectorSpecs.get(requestId); + if (!resolver) { + console.warn(`[ApprovalManager] No pending connector spec request for: ${requestId}`); + return; + } + + console.log(`[ApprovalManager] Resolving connector spec: ${requestId}, provided: ${provided}`); + + // Clear timeout + if (resolver.timeoutId) { + clearTimeout(resolver.timeoutId); + } + + // Resolve promise + resolver.resolve({ provided, spec, comment }); + + // Cleanup + this.connectorSpecs.delete(requestId); + } + + // ============================================ + // Cleanup + // ============================================ + + /** + * Cancel all pending approvals (useful for abort scenarios) + * + * @param reason - Reason for cancellation + */ + cancelAllPending(reason: string): void { + console.log(`[ApprovalManager] Cancelling all pending approvals: ${reason}`); + + const error = new Error(reason); + + // Cancel plan approvals + for (const [requestId, resolver] of this.planApprovals.entries()) { + if (resolver.timeoutId) { + clearTimeout(resolver.timeoutId); + } + resolver.reject(error); + } + this.planApprovals.clear(); + + // Cancel task approvals + for (const [requestId, resolver] of this.taskApprovals.entries()) { + if (resolver.timeoutId) { + clearTimeout(resolver.timeoutId); + } + resolver.reject(error); + } + this.taskApprovals.clear(); + + // Cancel connector specs + for (const [requestId, resolver] of this.connectorSpecs.entries()) { + if (resolver.timeoutId) { + clearTimeout(resolver.timeoutId); + } + resolver.reject(error); + } + this.connectorSpecs.clear(); + } + + /** + * Get count of pending approvals (useful for debugging) + */ + getPendingCount(): { plans: number; tasks: number; connectorSpecs: number } { + return { + plans: this.planApprovals.size, + tasks: this.taskApprovals.size, + connectorSpecs: this.connectorSpecs.size + }; + } +} + +// Export singleton instance for convenience +export const approvalManager = ApprovalManager.getInstance(); diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/testGenerator.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/testGenerator.ts deleted file mode 100644 index 71e75d07134..00000000000 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/testGenerator.ts +++ /dev/null @@ -1,498 +0,0 @@ -/** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. - * - * WSO2 LLC. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { DiagnosticEntry, Diagnostics, OpenAPISpec, ProjectDiagnostics, ProjectModule, ProjectSource, SyntaxTree, TestGenerationRequest, TestGenerationResponse, TestGenerationTarget } from '@wso2/ballerina-core'; -import { ErrorCode } from "@wso2/ballerina-core"; -import { DotToken, IdentifierToken, ModulePart, ResourceAccessorDefinition, ResourcePathRestParam, ResourcePathSegmentParam, ServiceDeclaration, SlashToken, STKindChecker } from "@wso2/syntax-tree"; -import { Uri } from "vscode"; -import { PARSING_ERROR, UNKNOWN_ERROR, ENDPOINT_REMOVED } from '../../views/ai-panel/errorCodes'; -import { langClient } from './activator'; -import * as fs from 'fs'; -import * as path from 'path'; -import * as os from 'os'; -import { writeBallerinaFileDidOpenTemp } from '../../utils/modification'; -import { closeAllBallerinaFiles } from './utils'; -import { generateTestFromLLM, TestGenerationRequest1 } from './service/test/test'; - -const TEST_GEN_REQUEST_TIMEOUT = 100000; - -// ----------- TEST GENERATOR ----------- -export async function generateTest( - projectRoot: string, - testGenRequest: TestGenerationRequest, - abortController: AbortController = null -): Promise { - const projectSource = await getProjectSource(projectRoot); - if (!projectSource) { - throw new Error("The current project is not recognized as a valid Ballerina project. Please ensure you have opened a Ballerina project."); - } - - if (testGenRequest.targetType === TestGenerationTarget.Service) { - if (!testGenRequest.targetIdentifier) { - throw new Error("Service name is missing in the test request. Please provide a valid service name to generate tests."); - } - - const serviceName = testGenRequest.targetIdentifier; - const { serviceDeclaration, serviceDocFilePath } = await getServiceDeclaration(projectRoot, serviceName); - - const openApiSpec = await getOpenAPISpecification(serviceDocFilePath); - const testPlan = testGenRequest.testPlan; - - if (typeof testGenRequest.existingTests === 'undefined' || typeof testGenRequest.diagnostics === 'undefined') { - const unitTestResp: TestGenerationResponse | ErrorCode = await getUnitTests(testGenRequest, projectSource, abortController, openApiSpec); - if (isErrorCode(unitTestResp)) { - throw new Error((unitTestResp as ErrorCode).message); - } - return unitTestResp as TestGenerationResponse; - } else { - const updatedUnitTestResp: TestGenerationResponse | ErrorCode = await getUnitTests(testGenRequest, projectSource, abortController, openApiSpec); - if (isErrorCode(updatedUnitTestResp)) { - throw new Error((updatedUnitTestResp as ErrorCode).message); - } - return updatedUnitTestResp as TestGenerationResponse; - } - - } else if (testGenRequest.targetType === TestGenerationTarget.Function) { - if (!testGenRequest.targetIdentifier) { - throw new Error("Function identifier is missing in the test request. Please provide a valid function identifier to generate tests."); - } - - const functionIdentifier = testGenRequest.targetIdentifier; - const { serviceDeclaration, resourceAccessorDef, serviceDocFilePath } = await getResourceAccessorDef(projectRoot, functionIdentifier); - const openApiSpec = await getOpenAPISpecification(serviceDocFilePath); - - // TODO: At the moment we just look at the test.bal file, technically we should be maintain a state of the test file that we are working, - // and do the amendments accordingly. - - if (!testGenRequest.diagnostics) { - const projectSourceWithTests = await getProjectSourceWithTests(projectRoot); - const testFile = projectSourceWithTests.projectTests.find(test => - test.filePath.split('/').pop() === 'test.bal' - ); - const updatedTestGenRequest: TestGenerationRequest = { - ...testGenRequest, - existingTests: testFile?.content, - }; - const serviceProjectSource: ProjectSource = { - sourceFiles: [ - { - filePath: "service.bal", - content: serviceDeclaration.source - } - ], - projectName: "", - packagePath: "", - isActive: true - }; - - const unitTestResp: TestGenerationResponse | ErrorCode = await getUnitTests(updatedTestGenRequest, serviceProjectSource, abortController, openApiSpec); - if (isErrorCode(unitTestResp)) { - throw new Error((unitTestResp as ErrorCode).message); - } - return unitTestResp as TestGenerationResponse; - } else { - const updatedUnitTestResp: TestGenerationResponse | ErrorCode = await getUnitTests(testGenRequest, projectSource, abortController, openApiSpec); - if (isErrorCode(updatedUnitTestResp)) { - throw new Error((updatedUnitTestResp as ErrorCode).message); - } - return updatedUnitTestResp as TestGenerationResponse; - } - } else { - throw new Error("Invalid test generation target type."); - } -} - -export async function getServiceDeclaration(projectRoot: string, serviceName: string): Promise<{ serviceDeclaration: ServiceDeclaration | null, serviceDocFilePath: string }> { - const projectSource = await getProjectSource(projectRoot); - if (!projectSource) { - throw new Error("The current project is not recognized as a valid Ballerina project. Please ensure you have opened a Ballerina project."); - } - - let serviceDeclaration: ServiceDeclaration | null = null; - let serviceDocFilePath = ""; - - for (const sourceFile of projectSource.sourceFiles) { - serviceDocFilePath = sourceFile.filePath; - const fileUri = Uri.file(serviceDocFilePath).toString(); - const syntaxTree = await langClient.getSyntaxTree({ - documentIdentifier: { - uri: fileUri - } - }) as SyntaxTree; - const matchedService = findMatchingServiceDeclaration(syntaxTree, serviceName); - if (matchedService) { - serviceDeclaration = matchedService; - break; - } - } - - if (!serviceDeclaration) { - throw new Error(`Couldn't find any services matching the service name provided, which is "${serviceName}". Please recheck if the provided service name is correct.`); - } - - return { serviceDeclaration, serviceDocFilePath }; -} - -export async function getResourceAccessorDef(projectRoot: string, resourceMethodAndPath: string): Promise<{ serviceDeclaration: ServiceDeclaration | null, resourceAccessorDef: ResourceAccessorDefinition | null, serviceDocFilePath: string }> { - const projectSource = await getProjectSource(projectRoot); - if (!projectSource) { - throw new Error("The current project is not recognized as a valid Ballerina project. Please ensure you have opened a Ballerina project."); - } - - let serviceDeclaration: ServiceDeclaration | null = null; - let resourceAccessorDef: ResourceAccessorDefinition | null = null; - let serviceDocFilePath = ""; - - let found = false; - - for (const sourceFile of projectSource.sourceFiles) { - if (found) { break; } - - serviceDocFilePath = sourceFile.filePath; - const fileUri = Uri.file(serviceDocFilePath).toString(); - const syntaxTree = await langClient.getSyntaxTree({ - documentIdentifier: { - uri: fileUri - } - }) as SyntaxTree; - - if (!STKindChecker.isModulePart(syntaxTree.syntaxTree)) { - continue; - } - - for (const member of (syntaxTree.syntaxTree as ModulePart).members) { - if (found) { break; } - - if (STKindChecker.isServiceDeclaration(member)) { - const resourceAccessors = (member as ServiceDeclaration).members.filter(m => STKindChecker.isResourceAccessorDefinition(m)); - for (const resourceAccessor of resourceAccessors) { - const resourceMethod = (resourceAccessor as ResourceAccessorDefinition).functionName.value; - const resourcePath = (resourceAccessor as ResourceAccessorDefinition).relativeResourcePath.reduce((accumulator, currentValue) => { - let value = ""; - - if (STKindChecker.isIdentifierToken(currentValue)) { - value = (currentValue as IdentifierToken).value; - } else if (STKindChecker.isDotToken(currentValue)) { - value = (currentValue as DotToken).value; - } else if (STKindChecker.isResourcePathRestParam(currentValue)) { - value = (currentValue as ResourcePathRestParam).source; - } else if (STKindChecker.isResourcePathSegmentParam(currentValue)) { - value = (currentValue as ResourcePathSegmentParam).source; - } else if (STKindChecker.isSlashToken(currentValue)) { - value = (currentValue as SlashToken).value; - } - - return accumulator + value; - }, ""); - - const constructedResource = resourceMethod + " " + resourcePath; - - if (constructedResource.toLowerCase() === resourceMethodAndPath) { - serviceDeclaration = member as ServiceDeclaration; - resourceAccessorDef = resourceAccessor as ResourceAccessorDefinition; - found = true; - break; - } - } - } - } - } - - if (!serviceDeclaration) { - throw new Error(`Couldn't find any resources matching the resourcemethod and path provided, which is "${resourceMethodAndPath}". Please recheck if the provided resource is correct.`); - } - - return { serviceDeclaration, resourceAccessorDef, serviceDocFilePath }; -} - -export async function getDiagnostics( - ballerinaProjectRoot: string, - generatedTestSource: TestGenerationResponse -): Promise { - const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'temp-bal-test-gen-')); - fs.cpSync(ballerinaProjectRoot, tempDir, { recursive: true }); - const tempTestFolderPath = path.join(tempDir, 'tests'); - if (!fs.existsSync(tempTestFolderPath)) { - fs.mkdirSync(tempTestFolderPath, { recursive: true }); - } - const tempTestFilePath = path.join(tempTestFolderPath, 'test.bal'); - writeBallerinaFileDidOpenTemp(tempTestFilePath, generatedTestSource.testSource); - - const diagnosticsResult = await langClient.getDiagnostics({ documentIdentifier: { uri: Uri.file(tempTestFilePath).toString() } }); - await closeAllBallerinaFiles(tempDir); - fs.rmSync(tempDir, { recursive: true, force: true }); - if (Array.isArray(diagnosticsResult)) { - const errorDiagnostics = getErrorDiagnostics(diagnosticsResult, tempTestFilePath); - return errorDiagnostics; - } - return { - diagnostics: [] - }; -} - -async function getProjectSource(projectRoot: string): Promise { - - const projectSource: ProjectSource = { - sourceFiles: [], - projectTests: [], - projectModules: [], - projectName: "", - packagePath: projectRoot, - isActive: true - }; - - // Read root-level .bal files - const rootFiles = fs.readdirSync(projectRoot); - for (const file of rootFiles) { - if (file.endsWith('.bal')) { - const filePath = path.join(projectRoot, file); - const content = await fs.promises.readFile(filePath, 'utf-8'); - projectSource.sourceFiles.push({ filePath, content }); - } - } - - // Read modules - const modulesDir = path.join(projectRoot, 'modules'); - if (fs.existsSync(modulesDir)) { - const modules = fs.readdirSync(modulesDir, { withFileTypes: true }); - for (const moduleDir of modules) { - if (moduleDir.isDirectory()) { - const projectModule: ProjectModule = { - moduleName: moduleDir.name, - sourceFiles: [], - isGenerated: false, - }; - - const moduleFiles = fs.readdirSync(path.join(modulesDir, moduleDir.name)); - for (const file of moduleFiles) { - if (file.endsWith('.bal')) { - const filePath = path.join(modulesDir, moduleDir.name, file); - const content = await fs.promises.readFile(filePath, 'utf-8'); - projectModule.sourceFiles.push({ filePath, content }); - } - } - - projectSource.projectModules.push(projectModule); - } - } - } - - return projectSource; -} - -async function getProjectSourceWithTests(projectRoot: string): Promise { - - const projectSourceWithTests: ProjectSource = await getProjectSource(projectRoot); - - // Read tests - const testsDir = path.join(projectRoot, 'tests'); - if (fs.existsSync(testsDir)) { - const testFiles = fs.readdirSync(testsDir); - for (const file of testFiles) { - if (file.endsWith('.bal') || file.endsWith('Config.toml')) { - const filePath = path.join(testsDir, file); - const content = await fs.promises.readFile(filePath, 'utf-8'); - projectSourceWithTests.projectTests.push({ filePath, content }); - } - } - } - - return projectSourceWithTests; -} - -const findMatchingServiceDeclaration = (syntaxTree: SyntaxTree, targetServiceName: string): ServiceDeclaration | null => { - const serviceDeclarations = findServiceDeclarations(syntaxTree); - - for (const serviceDecl of serviceDeclarations) { - const serviceName = constructServiceName(serviceDecl); - if (serviceName === targetServiceName) { - return serviceDecl; - } - } - - return null; -}; - -const findServiceDeclarations = (syntaxTree: SyntaxTree): ServiceDeclaration[] => { - const serviceDeclarations: ServiceDeclaration[] = []; - - const modulePartNode = syntaxTree.syntaxTree as ModulePart; - for (const member of modulePartNode.members) { - if (STKindChecker.isServiceDeclaration(member)) { - serviceDeclarations.push(member); - } - } - return serviceDeclarations; -}; - -function constructServiceName(targetNode: ServiceDeclaration): string { - return targetNode.absoluteResourcePath.map(item => { - if ('value' in item) { return item.value; } - if ('literalToken' in item) { return item.literalToken.value; } - return ''; - }).join(''); -} - -async function getOpenAPISpecification(documentFilePath: string): Promise { - const response = await langClient.convertToOpenAPI({ documentFilePath, enableBalExtension: true }) as OpenAPISpec; - if (response.error) { - throw new Error(response.error); - } - return JSON.stringify(response.content[0].spec); -} - -async function getUnitTests(request: TestGenerationRequest, projectSource: ProjectSource, abortController: AbortController, openApiSpec?: string): Promise { - try { - let response = await sendTestGeneRequest(request, projectSource, abortController, openApiSpec); - return response; - } catch (error) { - return UNKNOWN_ERROR; - } -} - -async function sendTestGeneRequest(request: TestGenerationRequest, projectSource: ProjectSource, abortController: AbortController, openApiSpec?: string): Promise { - const body:TestGenerationRequest1 = { - targetType: request.targetType, - targetIdentifier: request.targetIdentifier, - projectSource: { - projectModules: projectSource.projectModules?.map((module) => ({ - moduleName: module.moduleName, - sourceFiles: module.sourceFiles.map((file) => ({ - fileName: file.filePath, - content: file.content, - })), - })), - sourceFiles: projectSource.sourceFiles.map((file) => ({ - fileName: file.filePath, - content: file.content, - })), - }, - ...(openApiSpec && { openApiSpec: openApiSpec }), - ...(request.testPlan && { testPlan: request.testPlan }), - ...(request.diagnostics?.diagnostics && { - diagnostics: request.diagnostics.diagnostics.map((diagnosticEntry) => ({ - message: `L${diagnosticEntry.line ?? "unknown"}: ${diagnosticEntry.message}`, - })), - }), - ...(request.existingTests && { existingTests: request.existingTests }), - }; - - const resp: TestGenerationResponse = await generateTestFromLLM(body); - return resp; -} - -function getErrorDiagnostics(diagnostics: Diagnostics[], filePath: string): ProjectDiagnostics { - const errorDiagnostics: DiagnosticEntry[] = []; - - diagnostics.forEach(diagParam => { - if (diagParam.uri === Uri.file(filePath).toString()) { - diagParam.diagnostics.forEach(diag => { - if (diag.severity === 1) { - errorDiagnostics.push({ - line: diag.range.start.line + 1, - message: diag.message - }); - } - }); - } - }); - - return { - diagnostics: errorDiagnostics - }; -} - -async function filterTestGenResponse(resp: Response): Promise { - if (resp.status == 200 || resp.status == 201) { - const data = (await resp.json()) as any; - return { - testSource: data.testSource, - testConfig: data.testConfig - }; - } - if (resp.status == 404) { - return ENDPOINT_REMOVED; - } - if (resp.status == 400) { - const data = (await resp.json()) as any; - return PARSING_ERROR; - } - else { - //TODO: Handle more error codes - return { code: 4, message: `An unknown error occured. ${resp.statusText}.` }; - } -} - -function isErrorCode(error: any): boolean { - return error.hasOwnProperty("code") && error.hasOwnProperty("message"); -} - -// Functions to extract service names and resource names -export async function getServiceDeclarationNames(projectRoot: string): Promise { - const projectSource = await getProjectSource(projectRoot); - if (!projectSource) { - throw new Error("Invalid Ballerina project. Please open a valid Ballerina project."); - } - - return (await Promise.all( - projectSource.sourceFiles.map(async ({ filePath }) => { - const syntaxTree = await langClient.getSyntaxTree({ - documentIdentifier: { uri: Uri.file(filePath).toString() } - }) as SyntaxTree; - return findServiceDeclarations(syntaxTree).map(constructServiceName); - }) - )).flat(); -} - -export async function getResourceAccessorNames(projectRoot: string): Promise { - const projectSource = await getProjectSource(projectRoot); - if (!projectSource) { - throw new Error("Invalid Ballerina project. Please open a valid Ballerina project."); - } - - return (await Promise.all( - projectSource.sourceFiles.map(async ({ filePath }) => { - const syntaxTree = await langClient.getSyntaxTree({ - documentIdentifier: { uri: Uri.file(filePath).toString() } - }) as SyntaxTree; - - if (!STKindChecker.isModulePart(syntaxTree.syntaxTree)) { return []; } - - return (syntaxTree.syntaxTree as ModulePart).members - .filter(STKindChecker.isServiceDeclaration) - .flatMap(service => - (service as ServiceDeclaration).members - .filter(STKindChecker.isResourceAccessorDefinition) - .map(resourceAccessor => { - const method = (resourceAccessor as ResourceAccessorDefinition).functionName.value; - const path = (resourceAccessor as ResourceAccessorDefinition).relativeResourcePath - .map(segment => - STKindChecker.isIdentifierToken(segment) ? (segment as IdentifierToken).value : - STKindChecker.isDotToken(segment) ? (segment as DotToken).value : - STKindChecker.isResourcePathRestParam(segment) ? (segment as ResourcePathRestParam).source : - STKindChecker.isResourcePathSegmentParam(segment) ? (segment as ResourcePathSegmentParam).source : - STKindChecker.isSlashToken(segment) ? (segment as SlashToken).value : - "" - ).join(""); - - return `${method} ${path}`; - }) - ); - }) - )).flat(); -} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts index 51336418baa..c2210f2296f 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils.ts @@ -21,8 +21,8 @@ import path from "path"; import vscode, { Uri, workspace } from 'vscode'; import { StateMachine } from "../../stateMachine"; -import { getRefreshedAccessToken, REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE } from '../../../src/utils/ai/auth'; -import { AIStateMachine } from '../../../src/views/ai-panel/aiMachine'; +import { getRefreshedAccessToken, REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE } from '../../utils/ai/auth'; +import { AIStateMachine } from '../../views/ai-panel/aiMachine'; import { AIMachineEventType } from '@wso2/ballerina-core/lib/state-machine-types'; import { CONFIG_FILE_NAME, ERROR_NO_BALLERINA_SOURCES, PROGRESS_BAR_MESSAGE_FROM_WSO2_DEFAULT_MODEL } from './constants'; import { getCurrentBallerinaProjectFromContext } from '../config-generator/configGenerator'; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-client.ts similarity index 100% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/connection.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-client.ts diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-types.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-types.ts new file mode 100644 index 00000000000..3dd25baaffa --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-types.ts @@ -0,0 +1,17 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +export type MessageRole = "user" | "assistant"; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-utils.ts similarity index 69% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-utils.ts index 29431e50dcc..9a1c1c0aa18 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/ai-utils.ts @@ -20,14 +20,10 @@ import { ChatNotify, ChatStart, DiagnosticEntry, - GENERATE_CODE_AGAINST_THE_REQUIREMENT, - GENERATE_TEST_AGAINST_THE_REQUIREMENT, - GenerateCodeRequest, IntermidaryState, onChatNotify, ProjectSource, SourceFile, - TestGeneratorIntermediaryState, ToolCall, ToolResult, Command, @@ -36,14 +32,15 @@ import { HttpPayloadContext, MessageQueuePayloadContext, FileAttatchment, - OperationType + OperationType, + Protocol } from "@wso2/ballerina-core"; import { ModelMessage } from "ai"; -import { MessageRole } from "./types"; -import { RPCLayer } from "../../../../src/RPCLayer"; +import { MessageRole } from "./ai-types"; +import { RPCLayer } from "../../../RPCLayer"; import { AiPanelWebview } from "../../../views/ai-panel/webview"; -import { GenerationType } from "./libs/libs"; -import { REQUIREMENTS_DOCUMENT_KEY } from "./code/np_prompts"; +import { GenerationType } from "./libs/libraries"; +// import { REQUIREMENTS_DOCUMENT_KEY } from "./code/np_prompts"; export function populateHistory(chatHistory: ChatEntry[]): ModelMessage[] { if (!chatHistory || chatHistory.length === 0) { @@ -63,6 +60,22 @@ export function populateHistory(chatHistory: ChatEntry[]): ModelMessage[] { return messages; } +export function populateHistoryForAgent(chatHistory: any[]): ModelMessage[] { + if (!chatHistory || chatHistory.length === 0) { + return []; + } + const messages: ModelMessage[] = []; + for (const entry of chatHistory) { + if ('role' in entry) { + messages.push({ + role: entry.role, + content: entry.content, + }); + } + } + return messages; +} + /** * Builds file paths for project files with workspace-aware prefixing. * Returns structured data including file path, content, package name, and active status. @@ -116,29 +129,6 @@ export function flattenProjectToFiles(projects: ProjectSource[]): SourceFile[] { })); } -/** - * Creates workspace context message for AI prompts. - * Handles single vs multi-package scenarios and provides instructions for working with workspaces. - * - * @param projects - Array of project sources - * @param packageName - Name of the current active package - * @returns Formatted context string for AI prompts - */ -export function buildPackageContext(projects: ProjectSource[], packageName: string): string { - const hasMultiplePackages = projects.length > 1; - - if (!hasMultiplePackages) { - return `Current Package name: ${packageName}`; - } - - return `Current Active Package: ${packageName} - -Note: This is a Ballerina workspace with multiple packages. File paths are prefixed with their package paths (e.g., "mainpackage/main.bal"). -Files from external packages (not the active package) are marked with the externalPackageName attribute (e.g., ). -You can import these packages by just using the package name (e.g., import otherpackage;). -When creating or modifying files, you should always prefer making edits for the current active package. Make sure to include the package path as prefix for the file edits.`; -} - /** * Formats file upload contents for AI prompts. * Returns empty string if no files are uploaded. @@ -163,7 +153,7 @@ ${formattedFiles}`; export function extractResourceDocumentContent(sourceFiles: readonly SourceFile[]): string { const requirementFiles = sourceFiles - .filter(sourceFile => sourceFile.filePath.toLowerCase().endsWith(REQUIREMENTS_DOCUMENT_KEY)) + .filter(sourceFile => sourceFile.filePath.toLowerCase().endsWith("Requirements.md")) .slice(0, 1) .map(sourceFile => sourceFile.content); @@ -173,42 +163,6 @@ export function extractResourceDocumentContent(sourceFiles: readonly SourceFile[ return requirementFiles[0]; } -//TODO: This should be a query rewriter ideally. -export function getRewrittenPrompt(params: GenerateCodeRequest, projects: ProjectSource[]) { - const prompt = params.usecase; - if (prompt.trim() === GENERATE_CODE_AGAINST_THE_REQUIREMENT) { - const sourceFiles = flattenProjectToFiles(projects); - const resourceContent = extractResourceDocumentContent(sourceFiles); - return `${GENERATE_CODE_AGAINST_THE_REQUIREMENT}: -${resourceContent}`; - } - if (prompt.trim() === GENERATE_TEST_AGAINST_THE_REQUIREMENT) { - const sourceFiles = flattenProjectToFiles(projects); - const resourceContent = extractResourceDocumentContent(sourceFiles); - return `${GENERATE_TEST_AGAINST_THE_REQUIREMENT}: -${resourceContent}`; - } - - if (!prompt.toLowerCase().includes("readme")) { - return prompt; - } - - const sourceFiles = flattenProjectToFiles(projects); - const readmeFiles = sourceFiles - .filter((sourceFile) => sourceFile.filePath.toLowerCase().endsWith("readme.md")) - .map((sourceFile) => sourceFile.content); - - if (readmeFiles.length === 0) { - return prompt; - } - - const readmeContent = readmeFiles[0]; - - return `${prompt} -Readme Contents: -${readmeContent}`; -} - export function sendMessagesNotification(messages: any[]): void { const msg: ChatNotify = { type: "messages", @@ -225,6 +179,13 @@ export function sendDiagnosticMessageNotification(diags: DiagnosticEntry[]): voi sendAIPanelNotification(msg); } +export function sendReviewActionsNotification(): void { + const msg: ChatNotify = { + type: "review_actions", + }; + sendAIPanelNotification(msg); +} + export function sendContentReplaceNotification(content: string): void { const msg: ChatNotify = { type: "content_replace", @@ -264,7 +225,7 @@ export function sendMessageStartNotification(): void { sendAIPanelNotification(msg); } -export function sendIntermidateStateNotification(intermediaryState: TestGeneratorIntermediaryState | DocumentationGeneratorIntermediaryState): void { +export function sendIntermidateStateNotification(intermediaryState: DocumentationGeneratorIntermediaryState): void { const msg: IntermidaryState = { type: "intermediary_state", state: intermediaryState, @@ -272,15 +233,16 @@ export function sendIntermidateStateNotification(intermediaryState: TestGenerato sendAIPanelNotification(msg); } -export function sendToolCallNotification(toolName: string): void { +export function sendToolCallNotification(toolName: string, toolInput?: any): void { const msg: ToolCall = { type: "tool_call", toolName: toolName, + toolInput: toolInput, }; sendAIPanelNotification(msg); } -export function sendToolResultNotification(toolName: string, toolOutput: any): void { +export function sendToolResultNotification(toolName: string, toolOutput?: any): void { const msg: ToolResult = { type: "tool_result", toolName: toolName, @@ -289,6 +251,35 @@ export function sendToolResultNotification(toolName: string, toolOutput: any): v sendAIPanelNotification(msg); } +export function sendTaskApprovalRequestNotification(approvalType: "plan" | "completion", tasks: any[], taskDescription?: string, message?: string, requestId?: string): void { + const msg: ChatNotify = { + type: "task_approval_request", + requestId: requestId || `approval-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`, + approvalType: approvalType, + tasks: tasks, + taskDescription: taskDescription, + message: message, + }; + sendAIPanelNotification(msg); +} + +export function sendAbortNotification(command: Command): void { + const msg: ChatNotify = { + type: "abort", + command + }; + sendAIPanelNotification(msg); +} + +export function sendSaveChatNotification(command: Command, messageId: string): void { + const msg: ChatNotify = { + type: "save_chat", + command, + messageId + }; + sendAIPanelNotification(msg); +} + export function sendGeneratedSourcesNotification(fileArray: SourceFile[]): void { const msg: ChatNotify = { type: "generated_sources", @@ -297,6 +288,10 @@ export function sendGeneratedSourcesNotification(fileArray: SourceFile[]): void sendAIPanelNotification(msg); } +export function sendConnectorGenerationNotification(event: ChatNotify & { type: "connector_generation_notification" }): void { + sendAIPanelNotification(event); +} + function sendAIPanelNotification(msg: ChatNotify): void { RPCLayer._messenger.sendNotification(onChatNotify, { type: "webview", webviewType: AiPanelWebview.viewType }, msg); } @@ -345,33 +340,9 @@ export function getErrorMessage(error: unknown): string { } export function isHttpPayloadContext(context: PayloadContext): context is HttpPayloadContext { - return context.protocol === "HTTP"; + return context.protocol === Protocol.HTTP; } export function isMessageQueuePayloadContext(context: PayloadContext): context is MessageQueuePayloadContext { - return context.protocol === "MESSAGE_BROKER"; -} - -/** - * Parses XML-formatted assistant response to extract source files. - * Extracts code blocks with format: ```ballerina...``` - * - * @param xmlString - The assistant response containing XML code blocks - * @returns Array of SourceFile objects parsed from the XML - */ -export function parseSourceFilesFromXML(xmlString: string): SourceFile[] { - const sourceFiles: SourceFile[] = []; - const regex = /\s*```ballerina([\s\S]*?)```\s*<\/code>/g; - let match; - - while ((match = regex.exec(xmlString)) !== null) { - const filePath = match[1]; - const fileContent = match[2].trim(); - sourceFiles.push({ - filePath, - content: fileContent - }); - } - - return sourceFiles; + return context.protocol === Protocol.MESSAGE_BROKER; } diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/events.ts similarity index 57% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/utils/events.ts index cffce53741f..f4893ac6c28 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/event.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/events.ts @@ -15,10 +15,34 @@ // under the License. import { ChatNotify, Command } from "@wso2/ballerina-core"; -import { sendContentAppendNotification, sendContentReplaceNotification, sendDiagnosticMessageNotification, sendErrorNotification, sendMessagesNotification, sendMessageStartNotification, sendMessageStopNotification, sendIntermidateStateNotification, sendToolCallNotification, sendToolResultNotification, sendGeneratedSourcesNotification } from "./utils"; +import { + sendContentAppendNotification, + sendContentReplaceNotification, + sendDiagnosticMessageNotification, + sendErrorNotification, + sendMessagesNotification, + sendMessageStartNotification, + sendMessageStopNotification, + sendIntermidateStateNotification, + sendToolCallNotification, + sendToolResultNotification, + sendTaskApprovalRequestNotification, + sendAbortNotification, + sendSaveChatNotification, + sendConnectorGenerationNotification, + sendReviewActionsNotification, +} from "./ai-utils"; export type CopilotEventHandler = (event: ChatNotify) => void; +/** + * Updates chat message with model messages and triggers save + * This is a shared utility used by agent, datamapper, and other AI features + */ +export function updateAndSaveChat(messageId: string, command: Command, eventHandler: CopilotEventHandler): void { + eventHandler({ type: "save_chat", command, messageId }); +} + // Event listener that handles events and sends notifications export function createWebviewEventHandler(command: Command): CopilotEventHandler { return (event: ChatNotify) => { @@ -38,6 +62,12 @@ export function createWebviewEventHandler(command: Command): CopilotEventHandler case "stop": sendMessageStopNotification(command); break; + case "abort": + sendAbortNotification(event.command); + break; + case "save_chat": + sendSaveChatNotification(event.command, event.messageId); + break; case "intermediary_state": sendIntermidateStateNotification(event.state); break; @@ -45,11 +75,21 @@ export function createWebviewEventHandler(command: Command): CopilotEventHandler sendMessagesNotification(event.messages); break; case "tool_call": - sendToolCallNotification(event.toolName); + sendToolCallNotification(event.toolName, event.toolInput); break; case "tool_result": sendToolResultNotification(event.toolName, event.toolOutput); break; + case "task_approval_request": + console.log("[Event Handler] Task approval request received:", event); + sendTaskApprovalRequestNotification( + event.approvalType, + event.tasks, + event.taskDescription, + event.message, + event.requestId + ); + break; case "evals_tool_result": case "usage_metrics": // Ignore evals-specific events in webview @@ -57,8 +97,11 @@ export function createWebviewEventHandler(command: Command): CopilotEventHandler case "diagnostics": sendDiagnosticMessageNotification(event.diagnostics); break; - case "generated_sources": - sendGeneratedSourcesNotification(event.fileArray); + case "review_actions": + sendReviewActionsNotification(); + break; + case "connector_generation_notification": + sendConnectorGenerationNotification(event); break; default: console.warn(`Unhandled event type: ${event}`); diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/function-registry.ts similarity index 83% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/function-registry.ts index c2960ab34c0..ef6c86198d1 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/function-registry.ts @@ -25,15 +25,14 @@ import { MinifiedRemoteFunction, MinifiedResourceFunction, PathParameter, -} from "./funcs_inter_types"; -import { Client, GetTypeResponse, Library, RemoteFunction, ResourceFunction } from "./libs_types"; -import { TypeDefinition, AbstractFunction, Type, RecordTypeDefinition } from "./libs_types"; -import { getAnthropicClient, ANTHROPIC_HAIKU } from "../connection"; -import { GenerationType } from "./libs"; -import { getRequiredTypesFromLibJson } from "../healthcare/healthcare"; +} from "./function-types"; +import { Client, GetTypeResponse, GetTypesRequest, GetTypesResponse, getTypesResponseSchema, Library, MiniType, RemoteFunction, ResourceFunction } from "./library-types"; +import { TypeDefinition, AbstractFunction, Type, RecordTypeDefinition } from "./library-types"; +import { getAnthropicClient, ANTHROPIC_HAIKU } from "../ai-client"; +import { GenerationType } from "./libraries"; +// import { getRequiredTypesFromLibJson } from "../healthcare/healthcare"; import { langClient } from "../../activator"; -import { getGenerationMode } from "../utils"; -import { AIPanelAbortController } from "../../../../../src/rpc-managers/ai-panel/utils"; +import { getGenerationMode } from "../ai-utils"; // Constants for type definitions const TYPE_RECORD = 'Record'; @@ -41,7 +40,7 @@ const TYPE_CONSTRUCTOR = 'Constructor'; export async function selectRequiredFunctions(prompt: string, selectedLibNames: string[], generationType: GenerationType): Promise { const selectedLibs: Library[] = await getMaximizedSelectedLibs(selectedLibNames, generationType); - const functionsResponse: GetFunctionResponse[] = await getRequiredFunctions(selectedLibNames, prompt, selectedLibs); + const functionsResponse: GetFunctionResponse[] = await getRequiredFunctions(selectedLibNames, prompt, selectedLibs, generationType); let typeLibraries: Library[] = []; if (generationType === GenerationType.HEALTHCARE_GENERATION) { const resp: GetTypeResponse[] = await getRequiredTypesFromLibJson(selectedLibNames, prompt, selectedLibs); @@ -119,7 +118,8 @@ function selectTypes(fullDefOfSelectedLib: any[], minifiedSelectedLib: GetTypeRe async function getRequiredFunctions( libraries: string[], prompt: string, - librariesJson: Library[] + librariesJson: Library[], + generationType: GenerationType ): Promise { if (librariesJson.length === 0) { return []; @@ -132,7 +132,7 @@ async function getRequiredFunctions( name: lib.name, description: lib.description, clients: filteredClients(lib.clients), - functions: filteredNormalFunctions(lib.functions), + functions: filteredNormalFunctions(lib.functions, generationType), })); const largeLibs = libraryList.filter((lib) => getClientFunctionCount(lib.clients) >= 100); @@ -238,7 +238,7 @@ Now, based on the provided libraries, clients, and functions, and the user query temperature: 0, messages: messages, schema: getFunctionsResponseSchema, - abortSignal: AIPanelAbortController.getInstance().signal, + abortSignal: new AbortController().signal, }); const libList = object as GetFunctionsResponse; @@ -316,7 +316,7 @@ function filteredFunctions( return output; } -function filteredNormalFunctions(functions?: RemoteFunction[]): MinifiedRemoteFunction[] | undefined { +function filteredNormalFunctions(functions?: RemoteFunction[], generationType?: GenerationType): MinifiedRemoteFunction[] | undefined { if (!functions) { return undefined; } @@ -325,6 +325,7 @@ function filteredNormalFunctions(functions?: RemoteFunction[]): MinifiedRemoteFu name: item.name, parameters: item.parameters.map((param) => param.name), returnType: item.return.type.name, + ...(generationType === GenerationType.HEALTHCARE_GENERATION && { description: item?.description }), })); } @@ -747,3 +748,89 @@ async function getExternalRecords( } } } + +export async function getRequiredTypesFromLibJson( + libraries: string[], + prompt: string, + librariesJson: Library[] +): Promise { + if (librariesJson.length === 0) { + return []; + } + + const typeDefs: GetTypesRequest[] = librariesJson + .filter((lib) => libraryContains(lib.name, libraries)) + .map((lib) => ({ + name: lib.name, + description: lib.description, + types: filteredTypes(lib.typeDefs), + })); + + if (typeDefs.length === 0) { + return []; + } + + const getLibSystemPrompt = `You are an assistant tasked with selecting the Ballerina types needed to solve a given question based on a set of Ballerina libraries given in the context as a JSON. + +Objective: Create a JSON output that includes a minimized version of the context JSON, containing only the selected libraries and types necessary to achieve a given question. + +Context Format: A JSON Object that represents a library with its name and types. + +Library Context JSON: +\`\`\`json +${JSON.stringify(typeDefs)} +\`\`\` + +Think step-by-step to choose the required types in order to solve the given question. +1. Identify the unique entities that are required to answer the question. Create a small description for each identified entitiy to better explain their role. +2. When selecting the necessary Ballerina types that represents those entities, consider the following factors: +2.1 Take the description of the types from the context as a way to understand the entity represented by it. +2.2 Compare the types descriptions against the descriptions you generated for each identity and find the mapping types for each entity. +2.3 Find the Ballerina libraries of the selected types using the given context. Use ONLY the given context to find the libraries. +3. For each selected type, find which fields of those types are required to answer the given question by referring to the given context. For each selected field; +3.1 Understands the types of those fields by referring to the context. +3.2 Context json has a link element which indicates the library name. +3.3 Make sure that you select those types and add to the output. When selecting those types pay attention to following: +3.3.1 For each new type, search the context and find the library which defines the new type. Use ONLY the given context to find the libraries. +3.3.2 Add the found library and the types to the output. +4. Once you select the types, please cross check and make sure they are placed under the correct library. +4.1 Go through each library and make sure they exist in the given context json. +4.2 Go through each library and verify the types by referring to the context. +4.2 Fix any issues found and try to re-identify the correct library the problematic type belongs to by referring to the context. +4.3 IT IS A MUST that you do these verification steps. +5. Simplify the type details as per the below rules. +5.1 Include only the type name in the context object. +5.2 Include the name of the type as SAME as the original context. +6. For each selected type, Quote the original type from the context in the thinking field. +7. Respond using the Output format with the selected functions. + +`; + const getLibUserPrompt = "QUESTION\n```\n" + prompt + "\n```"; + + const messages: ModelMessage[] = [ + { role: "system", content: getLibSystemPrompt }, + { role: "user", content: getLibUserPrompt }, + ]; + try { + const { object } = await generateObject({ + model: await getAnthropicClient(ANTHROPIC_HAIKU), + maxOutputTokens: 8192, + temperature: 0, + messages: messages, + schema: getTypesResponseSchema, + abortSignal: new AbortController().signal, + }); + + const libList = object as GetTypesResponse; + return libList.libraries; + } catch (error) { + throw new Error(`Failed to parse bulk functions response: ${error}`); + } +} + +function filteredTypes(typeDefinitions: TypeDefinition[]): MiniType[] { + return typeDefinitions.map((typeDef) => ({ + name: typeDef.name, + description: typeDef.description, + })); +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs_inter_types.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/function-types.ts similarity index 99% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs_inter_types.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/function-types.ts index df21446528d..37b99379cd9 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/funcs_inter_types.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/function-types.ts @@ -36,6 +36,7 @@ export interface MinifiedRemoteFunction extends MiniFunction { export interface MiniFunction { parameters?: string[]; returnType?: string; + description?: string; } export interface MinifiedResourceFunction extends MiniFunction { diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/generator/openapi-types.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/generator/openapi-types.ts new file mode 100644 index 00000000000..4bc7750d361 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/generator/openapi-types.ts @@ -0,0 +1,81 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +export interface SpecFetcherInput { + serviceName: string; + serviceDescription?: string; +} + +export type HttpMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD" | "OPTIONS"; + +export interface ParsedEndpoint { + path: string; + method: HttpMethod; + operationId?: string; + summary?: string; + parameters?: string[]; + requestContentTypes?: string[]; + responseContentTypes?: string[]; + responseType?: string; +} + +export interface ParsedService { + name: string; + description?: string; + endpoints: ParsedEndpoint[]; +} + +export interface ParsedSchema { + name: string; + type: string; + properties?: string[]; +} + +export interface ParsedSpec { + version: string; + title: string; + description?: string; + baseUrl?: string; + endpointCount: number; + methods: HttpMethod[]; + services: ParsedService[]; + schemas?: ParsedSchema[]; + securitySchemes?: string[]; +} + +export interface SpecFetcherSuccess { + success: true; + message?: string; + spec?: ParsedSpec; + connector?: { + moduleName: string; + importStatement: string; + generatedFiles: Array<{ + path: string; + content: string; + }>; + }; +} + +export interface SpecFetcherError { + success: false; + message?: string; + error: string; + errorCode: "USER_SKIPPED" | "INVALID_SPEC" | "PARSE_ERROR" | "UNSUPPORTED_VERSION" | "INVALID_INPUT"; + details?: string; +} + +export type SpecFetcherResult = SpecFetcherSuccess | SpecFetcherError; diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/langlibs.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/langlibs.ts new file mode 100644 index 00000000000..d3cf1a944d4 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/langlibs.ts @@ -0,0 +1,464 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + +/** + * Instruction-based usage guide for Ballerina Langlibs (Language Libraries). + * These instructions are included in the system prompt to guide code generation. + */ +export const LANGLIB_USAGE_INSTRUCTIONS = ` +# Using Ballerina's Built-in Language Libraries + +## Type Conversion + +When you need to convert values from string type to another, use fromString() which works for int, float, decimal, boolean, and xml: +\`\`\`ballerina +// Converting strings to numbers +int age = check int:fromString("25"); +float price = check float:fromString("19.99"); +decimal exact = check decimal:fromString("10.50"); + +// Converting strings to boolean +boolean flag = check boolean:fromString("true"); + +// Converting strings to xml +xml bookName = check xml:fromString("HamletSherlock Holmes"); +\`\`\` + +Working with floats (supports NaN and Infinity): +\`\`\`ballerina +// Parsing strings to floats +// Special values +float notANumber = check float:fromString("NaN"); +float infinity = check float:fromString("Infinity"); +float negInfinity = check float:fromString("-Infinity"); +\`\`\` + +When working with JSON data, you can parse and convert in different ways: +\`\`\`ballerina +// Parsing JSON from a string +string jsonText = "{\"id\":12,\"name\":\"Alice\"}"; +json data = check jsonText.fromJsonString(); + +// Converting JSON directly to a specific type +string jsonArray = "[1, 2, 3]"; +int[] numbers = check jsonArray.fromJsonStringWithType(); + +// Converting JSON to a record type +string configText = "{\"port\":8080,\"timeout\":60}"; +type Config record {| int port; int timeout; |}; +Config config = check configText.fromJsonStringWithType(Config); +\`\`\` + +To convert any value to a string for display or logging: +\`\`\`ballerina +map scores = {Alice: 90, Bob: 85}; +string output = scores.toString(); +\`\`\` + +To convert data to JSON format for APIs: +\`\`\`ballerina +record {string name; int age;} person = {name: "Alice", age: 30}; +json result = person.toJson(); +string jsonText = person.toJsonString(); +\`\`\` + +When you need to copy data, use clone() to make a modifiable copy: +\`\`\`ballerina +int[] original = [1, 2, 3]; +int[] copy = original.clone(); +copy.push(4); // original stays [1, 2, 3] +\`\`\` + +To convert between types while preserving data, use cloneWithType(): +\`\`\`ballerina +json cfg = {port: 8080}; +type Config record {| int port; int timeout = 60; |}; +Config config = check cfg.cloneWithType(); + +// Converting arrays +json[] arr = [1, 2, 3]; +int[] numbers = check arr.cloneWithType(); +\`\`\` + +To validate that a value matches a specific type, use ensureType(): +\`\`\`ballerina +json student = {name: "Jo", subjects: ["CS1212"]}; +json[] subjects = check student.subjects.ensureType(); +\`\`\` + +## Working with Arrays + +Counting elements in an array: +\`\`\`ballerina +int[] numbers = [1, 2, 3, 4, 5]; +int count = numbers.length(); // 5 +\`\`\` + +Finding where an element is located (returns the index if found, or () if not found): +\`\`\`ballerina +int[] numbers = [10, 20, 30, 40]; +int? position = numbers.indexOf(30); // 2 +int? notFound = numbers.indexOf(99); // () +\`\`\` + +Adding and removing elements: +\`\`\`ballerina +int[] numbers = [1, 2, 3]; +numbers.push(4); // [1, 2, 3, 4] +int last = numbers.pop(); // last = 4, numbers = [1, 2, 3] + +numbers.unshift(0); // [0, 1, 2, 3] +int first = numbers.shift(); // first = 0, numbers = [1, 2, 3] +\`\`\` + +Sorting arrays: +\`\`\`ballerina +int[] numbers = [3, 1, 4, 1, 5]; +int[] sorted = numbers.sort(); // [1, 1, 3, 4, 5] +int[] descending = numbers.sort("descending"); // [5, 4, 3, 1, 1] +\`\`\` + +## Working with Strings + +Counting characters/code points in a string: +\`\`\`ballerina +string text = "Hello"; +int length = text.length(); // 5 +\`\`\` + +Joining strings together with a separator: +\`\`\`ballerina +string result = string:'join(", ", "apple", "banana", "orange"); +// "apple, banana, orange" +\`\`\` + +Comparing strings alphabetically (returns negative if first is smaller, 0 if equal, positive if first is larger): +\`\`\`ballerina +int result1 = "apple".codePointCompare("banana"); // negative number +int result2 = "apple".codePointCompare("apple"); // 0 +int result3 = "banana".codePointCompare("apple"); // positive number +\`\`\` + +Concatenating multiple strings together: +\`\`\`ballerina +string greeting = "Hello".concat(" ", "World"); // "Hello World" +string full = "".concat("apple", "banana", "cherry"); // "applebananacherry" +string path = "/home".concat("/", "user", "/", "documents"); // "/home/user/documents" +\`\`\` + +Checking how a string starts or ends: +\`\`\`ballerina +boolean starts = "Hello World".startsWith("Hello"); // true +boolean ends = "Hello World".endsWith("World"); // true +\`\`\` + +Converting between bytes and text using UTF-8: +\`\`\`ballerina +// String to bytes +string text = "Hello"; +byte[] bytes = text.toBytes(); // [72, 101, 108, 108, 111] + +// Bytes to string +byte[] data = [72, 101, 108, 108, 111]; +string result = check string:fromBytes(data); // "Hello" +\`\`\` + +Working with characters/code points (Unicode character codes): +\`\`\`ballerina +// Character to code point +int code = string:toCodePointInt("A"); // 65 + +// Code point to character +string char = check string:fromCodePointInt(65); // "A" + +// String to array of code points +int[] codes = "Hello".toCodePointInts(); // [72, 101, 108, 108, 111] + +// Array of code points to string +string text = check string:fromCodePointInts([72, 101, 108, 108, 111]); // "Hello" + +// Get code point at a specific position +int code = "Hello".getCodePoint(0); // 72 +\`\`\` + +Checking if a string contains a substring: +\`\`\`ballerina +boolean found = "Hello World".includes("World"); // true +boolean notFound = "Hello World".includes("Goodbye"); // false +boolean foundFromIndex = "Hello World".includes("o", 5); // true (finds "o" in "World") +\`\`\` + +Finding the position of a substring (returns index or () if not found): +\`\`\`ballerina +int? position = "Hello World".indexOf("World"); // 6 +int? notFound = "Hello World".indexOf("Goodbye"); // () +int? fromIndex = "Hello World".indexOf("o", 5); // 7 +\`\`\` + +Extracting part of a string: +\`\`\`ballerina +string text = "Hello World"; +string sub1 = text.substring(0, 5); // "Hello" +string sub2 = text.substring(6); // "World" +\`\`\` + +Changing ASCII case: +\`\`\`ballerina +string upper = "hello".toUpperAscii(); // "HELLO" +string lower = "HELLO".toLowerAscii(); // "hello" +\`\`\` + +Trimming whitespace: +\`\`\`ballerina +string trimmed = " hello ".trim(); // "hello" +\`\`\` + +Working with Regular Expressions: +Regular expressions provide powerful pattern matching capabilities for string operations. + +**IMPORTANT:** To use regular expressions, you must import the regexp module at the top of your file: +\`\`\`ballerina +import ballerina/lang.regexp; +\`\`\` + +To use regular expressions, you need to import the regexp module: +\`\`\`ballerina +import ballerina/lang.regexp; +\`\`\` + +Creating a regular expression pattern: +\`\`\`ballerina +// Using re template +string:RegExp digitPattern = re \`[0-9]+\`; + +// Building from a string at runtime +string:RegExp pattern = check regexp:fromString("[0-9]+"); +\`\`\` + +Finding matches in text: +\`\`\`ballerina +string:RegExp pattern = re \`World\`; + +// Find first match +regexp:Span? match = pattern.find("Hello World"); // returns match info + +// Find all matches +string:RegExp digits = re \`[0-9]+\`; +regexp:Span[] matches = digits.findAll("a1b23c456"); // finds "1", "23", "456" +\`\`\` + +Using capture groups to extract parts: +\`\`\`ballerina +string:RegExp pattern = re \`([a-z]+)([0-9]+)\`; +regexp:Groups? groups = pattern.findGroups("abc123"); +if groups is regexp:Groups { + string fullMatch = groups[0].substring(); // "abc123" + string letters = groups[1].substring(); // "abc" + string numbers = groups[2].substring(); // "123" +} +\`\`\` + +Validating that text fully matches a pattern: +\`\`\`ballerina +string:RegExp pattern = re \`[0-9]+\`; +boolean valid = pattern.isFullMatch("123"); // true +boolean invalid = pattern.isFullMatch("12a3"); // false +\`\`\` + +Replacing text using patterns: +\`\`\`ballerina +string:RegExp pattern = re \`[0-9]+\`; + +// Replace first match +string result = pattern.replace("a1b2", "X"); // "aXb2" + +// Replace all matches +string result = pattern.replaceAll("a1b2", "X"); // "aXbX" +\`\`\` + +Splitting text by a pattern: +\`\`\`ballerina +string:RegExp pattern = re \`,\\s*\`; +string[] parts = pattern.split("a, b, c"); // ["a", "b", "c"] +\`\`\` + +## Working with Maps + +Counting entries in a map: +\`\`\`ballerina +map scores = {Alice: 90, Bob: 85, Carol: 92}; +int count = scores.length(); // 3 +\`\`\` + +Getting a value by key (panics if key doesn't exist): +\`\`\`ballerina +map scores = {Alice: 90, Bob: 85}; +int aliceScore = scores.get("Alice"); // 90 +\`\`\` + +Checking if a key exists: +\`\`\`ballerina +map scores = {Alice: 90, Bob: 85}; +boolean hasAlice = scores.hasKey("Alice"); // true +boolean hasCarol = scores.hasKey("Carol"); // false +\`\`\` + +Getting all keys or values: +\`\`\`ballerina +map scores = {Alice: 90, Bob: 85, Carol: 92}; +string[] names = scores.keys(); // ["Alice", "Bob", "Carol"] +int[] allScores = scores.toArray(); // [90, 85, 92] +\`\`\` + +Removing entries from a map: +\`\`\`ballerina +map scores = {Alice: 90, Bob: 85}; + +// Remove and return value (panics if key doesn't exist) +int removed = scores.remove("Alice"); // 90 + +// Safely remove (returns () if key doesn't exist) +int? value = scores.removeIfHasKey("Carol"); // () + +// Remove all entries +scores.removeAll(); // {} +\`\`\` + +## Working with Numbers + +Working with integers: +\`\`\`ballerina +// Converting to hex +string hex = (255).toHexString(); // "ff" + +// Parsing hex strings +int value = check int:fromHexString("ff"); // 255 +\`\`\` + +## Working with Errors + +Getting information from errors: +\`\`\`ballerina +error err = error("Connection failed", message = "Timeout", code = 500); + +// Get the error message +string msg = err.message(); // "Connection failed" + +// Get error details (returns a readonly record with detail fields) +map & readonly detail = err.detail(); // {message: "Timeout", code: 500} +// Note: 'Cloneable' refers to values that can be deep-copied (readonly, xml, arrays, maps, tables) +// Note: 'readonly' means the value cannot be changed after creation + +// Get the cause of an error (returns error or ()) +error causeErr = error("Network issue"); +error mainErr = error("Connection failed", causeErr); +error? cause = mainErr.cause(); // returns the Network issue error +\`\`\` + +## Pausing Execution with lang.runtime + +To pause the working thread, you need to import lang.runtime and use the sleep() function: + +\`\`\`ballerina +import ballerina/lang.runtime; +runtime:sleep(2); // Pause for 2 seconds +\`\`\` + +## Using Query Expressions + +Query expressions let you work with collections (arrays, streams, tables) in a readable way, similar to SQL. Use query expressions to filter, transform, and process data. + +Basic query to filter and transform: +\`\`\`ballerina +int[] numbers = [1, 2, 3, 4, 5, 6]; + +// Filter even numbers and double them +int[] evenDoubled = from int num in numbers + where num % 2 == 0 + select num * 2; +// Result: [4, 8, 12] +\`\`\` + +Query with records: +\`\`\`ballerina +type Person record { + string name; + int age; +}; + +Person[] people = [ + {name: "Alice", age: 25}, + {name: "Bob", age: 30}, + {name: "Carol", age: 22} +]; + +// Get names of people over 23 +string[] names = from var person in people + where person.age > 23 + select person.name; +// Result: ["Alice", "Bob"] +\`\`\` + +Consuming streams with query expressions: +\`\`\`ballerina +// Process stream data using query +stream numberStream = [1, 2, 3, 4, 5].toStream(); + +int[] filtered = from int num in numberStream + where num > 2 + select num; +// Result: [3, 4, 5] +\`\`\` + +## Working with XML + +Constructing XML values: +\`\`\`ballerina +// Create XML elements +xml element = xml \`The Great Gatsby\`; + +// Combine multiple XML values +xml books = xml \`Book1\` + xml \`Book2\`; + +// Using xml:concat() +xml combined = xml:concat( + xml \`First\`, + xml \`Second\` +); +\`\`\` + +Parsing XML from text: +\`\`\`ballerina +string xmlText = "Value"; +xml parsed = check xml:fromString(xmlText); +\`\`\` + +Getting information about XML: +\`\`\`ballerina +xml items = xml \`\`; +int count = items.length(); // 3 +\`\`\` + +For converting between XML and records, use the ballerina/data.xmldata module. +`; + +/** + * Get the langlib usage instructions to include in prompts + */ +export function getLanglibInstructions(): string { + return LANGLIB_USAGE_INSTRUCTIONS; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts new file mode 100644 index 00000000000..ce9be84388b --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/libraries.ts @@ -0,0 +1,41 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import { MinifiedLibrary } from "@wso2/ballerina-core"; +import { langClient } from "../../activator"; +import { getGenerationMode } from "../ai-utils"; + + + +export const LIBRARY_PROVIDER_TOOL = "LibraryProviderTool"; + +// export async function getRelevantLibs(params: GenerateCodeParams): Promise { +// // const prompt = getReadmeQuery(params); +// const selectedLibs: string[] = await getSelectedLibraries(prompt); +// return selectRequiredFunctions(prompt, selectedLibs) +// } + +export enum GenerationType { + CODE_GENERATION = "CODE_GENERATION", + HEALTHCARE_GENERATION = "HEALTHCARE_GENERATION", +} + +export async function getAllLibraries(generationType: GenerationType): Promise { + const result = (await langClient.getCopilotCompactLibraries({ + mode: getGenerationMode(generationType), + })) as { libraries: MinifiedLibrary[] }; + return result.libraries as MinifiedLibrary[]; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs_types.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/library-types.ts similarity index 100% rename from workspaces/ballerina/ballerina-extension/src/features/ai/service/libs/libs_types.ts rename to workspaces/ballerina/ballerina-extension/src/features/ai/utils/libs/library-types.ts diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/project/ls-schema-notifications.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/project/ls-schema-notifications.ts new file mode 100644 index 00000000000..2604e531d22 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/project/ls-schema-notifications.ts @@ -0,0 +1,285 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import * as fs from 'fs'; +import * as path from 'path'; +import { Uri } from 'vscode'; +import { StateMachine } from "../../../../stateMachine"; +import { ProjectSource } from "@wso2/ballerina-core"; + +/** + * Sends didOpen notifications for a file to both file:// and ai:// schemas + * Used for initial temp project files and newly created files during agent operations + * @param tempProjectPath The root path of the temporary project + * @param filePath The relative file path + */ +export function sendBothSchemaDidOpen(tempProjectPath: string, filePath: string): void { + try { + const tempFileFullPath = path.join(tempProjectPath, filePath); + if (!fs.existsSync(tempFileFullPath)) { + console.warn(`[AgentNotification] File does not exist, skipping didOpen: ${tempFileFullPath}`); + return; + } + + const fileContent = fs.readFileSync(tempFileFullPath, 'utf-8'); + + // 1. Send didOpen with 'file' schema (temp project path) + const tempFileUri = Uri.file(tempFileFullPath).toString(); + try { + StateMachine.langClient().didOpen({ + textDocument: { + uri: tempFileUri, + languageId: 'ballerina', + version: 1, + text: fileContent + } + }); + console.log(`[AgentNotification] Sent didOpen (file schema) for: ${filePath}`); + } catch (error) { + console.error(`[AgentNotification] Failed didOpen (file schema) for ${filePath}:`, error); + } + + // 2. Send didOpen with 'ai' schema (temp project path) + const aiUri = 'ai' + tempFileUri.substring(4); // Replace 'file' prefix with 'ai' + try { + StateMachine.langClient().didOpen({ + textDocument: { + uri: aiUri, + languageId: 'ballerina', + version: 1, + text: fileContent + } + }); + console.log(`[AgentNotification] Sent didOpen (ai schema) for: ${filePath}`); + } catch (error) { + console.error(`[AgentNotification] Failed didOpen (ai schema) for ${filePath}:`, error); + } + } catch (error) { + console.error(`[AgentNotification] Failed to send didOpen for ${filePath}:`, error); + } +} + +/** + * Sends didOpen notifications for a file to both ai:// schemas + * Used for initial temp project files and newly created files during agent operations + * @param tempProjectPath The root path of the temporary project + * @param filePath The relative file path + */ +export function sendAiSchemaDidOpen(tempProjectPath: string, filePath: string): void { + try { + const tempFileFullPath = path.join(tempProjectPath, filePath); + if (!fs.existsSync(tempFileFullPath)) { + console.warn(`[AgentNotification] File does not exist, skipping didOpen: ${tempFileFullPath}`); + return; + } + + const fileContent = fs.readFileSync(tempFileFullPath, 'utf-8'); + const tempFileUri = Uri.file(tempFileFullPath).toString(); + + // 2. Send didOpen with 'ai' schema (temp project path) + const aiUri = 'ai' + tempFileUri.substring(4); // Replace 'file' prefix with 'ai' + try { + StateMachine.langClient().didOpen({ + textDocument: { + uri: aiUri, + languageId: 'ballerina', + version: 1, + text: fileContent + } + }); + console.log(`[AgentNotification] Sent didOpen (ai schema) for: ${filePath}`); + } catch (error) { + console.error(`[AgentNotification] Failed didOpen (ai schema) for ${filePath}:`, error); + } + } catch (error) { + console.error(`[AgentNotification] Failed to send didOpen for ${filePath}:`, error); + } +} + +/** + * Sends didChange notification for a modified file to ai:// schema only. + * The file:// schema remains frozen at initial state (from didOpen). + * This enables semantic diff between ai: (current) and file: (initial). + * @param tempProjectPath The root path of the temporary project + * @param filePath The relative file path that was modified + */ +export function sendAISchemaDidChange(tempProjectPath: string, filePath: string): void { + try { + const tempFileFullPath = path.join(tempProjectPath, filePath); + if (!fs.existsSync(tempFileFullPath)) { + console.warn(`[AgentNotification] File does not exist, skipping didChange: ${tempFileFullPath}`); + return; + } + + const fileContent = fs.readFileSync(tempFileFullPath, 'utf-8'); + + // Send didChange to 'ai' schema only (file schema stays frozen at initial state) + // Both schemas point to temp project path for semantic diff comparison + const tempFileUri = Uri.file(tempFileFullPath).toString(); + const aiUri = 'ai' + tempFileUri.substring(4); // Replace 'file' prefix with 'ai' + try { + StateMachine.langClient().didChange({ + textDocument: { + uri: aiUri, + version: 1 + }, + contentChanges: [{ + text: fileContent + }] + }); + console.log(`[AgentNotification] Sent didChange (ai schema) for: ${filePath}`); + } catch (error) { + console.error(`[AgentNotification] Failed didChange (ai schema) for ${filePath}:`, error); + } + + } catch (error) { + console.error(`[AgentNotification] Failed to send didChange for ${filePath}:`, error); + } +} + +/** + * Sends didOpen notifications for all initial project files from project sources + * Includes source files, module files, and test files + * For workspace projects, prepends the package path to each file path + * @param tempProjectPath The root path of the temporary project + * @param projects Array of project sources containing source files, modules, and tests + */ +export function sendAgentDidOpenForFreshProjects(tempProjectPath: string, projects: ProjectSource[]): void { + const allFiles: string[] = []; + + projects.forEach(project => { + const pkgPath = project.packagePath || ""; // Empty for single package, relative path for workspace + + // Add root-level source files + project.sourceFiles.forEach(f => { + const relativePath = pkgPath ? path.join(pkgPath, f.filePath) : f.filePath; + allFiles.push(relativePath); + }); + + // Add module files + project.projectModules?.forEach(module => { + module.sourceFiles.forEach(f => { + const relativePath = pkgPath + ? path.join(pkgPath, 'modules', module.moduleName, f.filePath) + : path.join('modules', module.moduleName, f.filePath); + allFiles.push(relativePath); + }); + }); + + // Add test files + if (project.projectTests) { + project.projectTests.forEach(f => { + const relativePath = pkgPath + ? path.join(pkgPath, 'tests', f.filePath) + : path.join('tests', f.filePath); + allFiles.push(relativePath); + }); + } + }); + + console.log(`[AgentNotification] Sending didOpen for ${allFiles.length} files across ${projects.length} project(s)`); + allFiles.forEach(file => sendBothSchemaDidOpen(tempProjectPath, file)); +} + +/** + * Sends didClose notifications for a file to both file:// and ai:// schemas + * Used for cleanup when temp project is deleted or replaced + * @param tempProjectPath The root path of the temporary project + * @param filePath The relative file path + */ +export function sendBothSchemaDidClose(tempProjectPath: string, filePath: string): void { + try { + const fullPath = path.join(tempProjectPath, filePath); + + const fileUri = Uri.file(fullPath).toString(); + try { + StateMachine.langClient().didClose({ + textDocument: { + uri: fileUri + } + }); + } catch (error) { + console.error(`[AgentNotification] Failed didClose (file schema) for ${filePath}:`, error); + } + + const aiUri = 'ai' + fileUri.substring(4); + try { + StateMachine.langClient().didClose({ + textDocument: { + uri: aiUri + } + }); + } catch (error) { + console.error(`[AgentNotification] Failed didClose (ai schema) for ${filePath}:`, error); + } + } catch (error) { + console.error(`[AgentNotification] Failed to send didClose for ${filePath}:`, error); + } +} + +/** + * Sends didClose notifications for multiple files in batch + * Used when cleaning up entire temp project + * @param tempProjectPath The root path of the temporary project + * @param files Array of relative file paths to close + */ +export function sendAgentDidCloseBatch(tempProjectPath: string, files: string[]): void { + files.forEach(file => sendBothSchemaDidClose(tempProjectPath, file)); +} + +/** + * Sends didClose notifications for all project files from project sources + * Includes source files, module files, and test files + * For workspace projects, prepends the package path to each file path + * @param tempProjectPath The root path of the temporary project + * @param projects Array of project sources containing source files, modules, and tests + */ +export function sendAgentDidCloseForProjects(tempProjectPath: string, projects: ProjectSource[]): void { + const allFiles: string[] = []; + + projects.forEach(project => { + const pkgPath = project.packagePath || ""; // Empty for single package, relative path for workspace + + // Add root-level source files + project.sourceFiles.forEach(f => { + const relativePath = pkgPath ? path.join(pkgPath, f.filePath) : f.filePath; + allFiles.push(relativePath); + }); + + // Add module files + project.projectModules?.forEach(module => { + module.sourceFiles.forEach(f => { + const relativePath = pkgPath + ? path.join(pkgPath, 'modules', module.moduleName, f.filePath) + : path.join('modules', module.moduleName, f.filePath); + allFiles.push(relativePath); + }); + }); + + // Add test files + if (project.projectTests) { + project.projectTests.forEach(f => { + const relativePath = pkgPath + ? path.join(pkgPath, 'tests', f.filePath) + : path.join('tests', f.filePath); + allFiles.push(relativePath); + }); + } + }); + + console.log(`[AgentNotification] Sending didClose for ${allFiles.length} files across ${projects.length} project(s)`); + sendAgentDidCloseBatch(tempProjectPath, allFiles); +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/project/temp-project.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/project/temp-project.ts new file mode 100644 index 00000000000..783266dc2de --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/project/temp-project.ts @@ -0,0 +1,336 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import * as crypto from 'crypto'; +import * as fs from 'fs'; +import * as os from 'os'; +import * as path from 'path'; +import { StateMachine } from '../../../../stateMachine'; +import { OperationType, ProjectModule, ProjectSource, ExecutionContext } from '@wso2/ballerina-core'; +import { getWorkspaceTomlValues } from '../../../../utils'; +import { NATURAL_PROGRAMMING_DIR_NAME, REQ_KEY, REQUIREMENT_DOC_PREFIX, REQUIREMENT_MD_DOCUMENT, REQUIREMENT_TEXT_DOCUMENT } from '../../../../rpc-managers/ai-panel/constants'; +import { isErrorCode, requirementsSpecification } from '../../../../rpc-managers/ai-panel/utils'; +import { sendAgentDidCloseBatch } from './ls-schema-notifications'; +import { parseTomlToConfig } from '../../../../../src/features/config-generator/utils'; +import { BALLERINA_TOML } from '../../../../../src/utils/project-utils'; + +/** + * Result of getTempProject operation + */ +export interface TempProjectResult { + /** Path to the temporary project directory */ + path: string; +} + +interface BallerinaProject { + projectName: string; + modules?: BallerinaModule[]; + sources: { [key: string]: string }; +} + +interface BallerinaModule { + moduleName: string; + sources: { [key: string]: string }; + isGenerated: boolean; +} + +/** + * Recursively finds all .bal files in a directory + * @param dir Directory to search + * @param baseDir Base directory for relative paths (defaults to dir) + * @returns Array of relative file paths + */ +function findAllBalFiles(dir: string, baseDir?: string): string[] { + const base = baseDir || dir; + const files: string[] = []; + + if (!fs.existsSync(dir)) { + return files; + } + + try { + const entries = fs.readdirSync(dir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(dir, entry.name); + + if (entry.isDirectory()) { + files.push(...findAllBalFiles(fullPath, base)); + } else if (entry.isFile() && entry.name.endsWith('.bal')) { + const relativePath = path.relative(base, fullPath); + files.push(relativePath); + } + } + } catch (error) { + console.warn(`[findAllBalFiles] Error reading directory ${dir}:`, error); + } + + return files; +} + +// TODO: Improve sync strategy and timing +// Current approach syncs all workspace files to temp on every session continuation. +// Consider: +// - More granular sync triggers (only sync when external changes detected) +// - Smarter sync timing (sync before AI operations, not during session start) +// - Bidirectional conflict detection (workspace vs temp changes) +// - Performance optimization for large projects + +/** + * Creates a temporary project directory for AI operations. + * + * Priority order for source project path: + * 1. ctx.projectPath (set by caller, isolated per execution) + * 2. ctx.workspacePath (fallback for workspace context) + * + * @param ctx - Execution context containing project paths + * @returns Result containing temp path + */ +export async function getTempProject(ctx: ExecutionContext): Promise { + let projectRoot = ctx.projectPath; + const workspacePath = ctx.workspacePath; + if (workspacePath) { + projectRoot = workspacePath; + } + + const projectHash = crypto.createHash('sha256').update(projectRoot).digest('hex'); + const timestamp = Date.now(); + const randomSuffix = crypto.randomBytes(4).toString('hex'); + const tempDir = path.join(os.tmpdir(), `bal-proj-${projectHash}-${timestamp}-${randomSuffix}`); + + if (fs.existsSync(tempDir)) { + const existingFiles = findAllBalFiles(tempDir); + + if (existingFiles.length > 0) { + sendAgentDidCloseBatch(tempDir, existingFiles); + await new Promise(resolve => setTimeout(resolve, 300)); + } + + fs.rmSync(tempDir, { recursive: true, force: true }); + } + + // Create temp directory + fs.mkdirSync(tempDir, { recursive: true }); + + // Copy entire project to temp directory + await fs.promises.cp(projectRoot, tempDir, { recursive: true }); + + return { + path: tempDir + }; +} + +/** + * Cleans up a temporary project directory + * Sends didClose notifications to Language Server for both file:// and ai:// schemas + * before deleting files to prevent orphaned LS references + * + * @param tempPath Path to the temporary project to delete + */ +export async function cleanupTempProject(tempPath: string): Promise { + if (!fs.existsSync(tempPath)) { + return; + } + + try { + // Find all .bal files and send didClose notifications + const balFiles = findAllBalFiles(tempPath); + if (balFiles.length > 0) { + sendAgentDidCloseBatch(tempPath, balFiles); // Handles both file:// and ai:// schemas + await new Promise(resolve => setTimeout(resolve, 300)); // Wait for LS to process + } + + // Delete temp directory + fs.rmSync(tempPath, { recursive: true, force: true }); + } catch (error) { + console.error(`Failed to cleanup temp project at ${tempPath}:`, error); + } +} + +export async function getProjectSource(requestType: OperationType, ctx: ExecutionContext): Promise { + const currentProjectPath = ctx.projectPath; + const workspacePath = ctx.workspacePath; + + // Early return for non-workspace case: single project only + if (!workspacePath) { + const project = await getCurrentProjectSource(requestType, ctx); + if (!project) { + throw new Error('Cannot get project source - ExecutionContext projectPath not initialized'); + } + // No workspace context, so packagePath is empty string + return [convertToProjectSource(project, "", true)]; + } + + // Workspace case: load all packages from the workspace + const workspaceTomlValues = await getWorkspaceTomlValues(workspacePath); + + // Fallback to single project if workspace.toml is invalid or has no packages + if (!workspaceTomlValues || !workspaceTomlValues.workspace || !workspaceTomlValues.workspace.packages) { + const project = await getCurrentProjectSource(requestType, ctx); + // Workspace exists but invalid, treat as non-workspace + return [convertToProjectSource(project, "", true)]; + } + + const packagePaths = StateMachine.context().projectInfo?.children.map(child => child.projectPath); + // Load all packages in parallel + const projectSources: ProjectSource[] = await Promise.all( + packagePaths.map(async (pkgPath) => { + // Resolve the full path for reading files and checking if active + const fullPackagePath = path.isAbsolute(pkgPath) + ? pkgPath + : path.join(workspacePath, pkgPath); + + const project = await getCurrentProjectSource(requestType, ctx, fullPackagePath); + const isActive = fullPackagePath === currentProjectPath; + + // Use relative path from workspace for packagePath + const relativePackagePath = path.isAbsolute(pkgPath) + ? path.relative(workspacePath, pkgPath) + : pkgPath; + + return convertToProjectSource(project, relativePackagePath, isActive); + }) + ); + + return projectSources; +} + +async function getCurrentProjectSource( + requestType: OperationType, + ctx: ExecutionContext, + projectPathOverride?: string +): Promise { + const targetProjectPath = projectPathOverride || ctx.projectPath; + if (!targetProjectPath) { + return null; + } + + // Read the Ballerina.toml file to get package name + const ballerinaTomlPath = path.join(targetProjectPath, 'Ballerina.toml'); + let packageName: string = ''; + if (fs.existsSync(ballerinaTomlPath)) { + const tomlContent = await fs.promises.readFile(ballerinaTomlPath, 'utf-8'); + // Simple parsing to extract the package.name field + try { + const tomlObj: BALLERINA_TOML = parseTomlToConfig(tomlContent) as BALLERINA_TOML; + packageName = tomlObj.package.name; + } catch (error) { + packageName = ''; + } + } + + const project: BallerinaProject = { + modules: [], + sources: {}, + projectName: packageName + }; + + // Read root-level .bal files + const rootFiles = fs.readdirSync(targetProjectPath); + for (const file of rootFiles) { + if (file.endsWith('.bal') || file.toLowerCase() === "readme.md") { + const filePath = path.join(targetProjectPath, file); + project.sources[file] = await fs.promises.readFile(filePath, 'utf-8'); + } + } + + if (requestType) { + const naturalProgrammingDirectory = targetProjectPath + `/${NATURAL_PROGRAMMING_DIR_NAME}`; + if (fs.existsSync(naturalProgrammingDirectory)) { + const reqFiles = fs.readdirSync(naturalProgrammingDirectory); + for (const file of reqFiles) { + const filePath = path.join(targetProjectPath, `${NATURAL_PROGRAMMING_DIR_NAME}`, file); + if (file.toLowerCase() == REQUIREMENT_TEXT_DOCUMENT || file.toLowerCase() == REQUIREMENT_MD_DOCUMENT) { + project.sources[REQ_KEY] = await fs.promises.readFile(filePath, 'utf-8'); + continue; + } else if (file.toLowerCase().startsWith(REQUIREMENT_DOC_PREFIX)) { + const requirements = await requirementsSpecification(filePath); + if (!isErrorCode(requirements)) { + project.sources[REQ_KEY] = requirements.toString(); + continue; + } + project.sources[REQ_KEY] = ""; + } + } + } + } + + // Read modules + const modulesDir = path.join(targetProjectPath, 'modules'); + const generatedDir = path.join(targetProjectPath, 'generated'); + await populateModules(modulesDir, project); + await populateModules(generatedDir, project); + return project; +} + +async function populateModules(modulesDir: string, project: BallerinaProject) { + if (fs.existsSync(modulesDir)) { + const modules = fs.readdirSync(modulesDir, { withFileTypes: true }); + for (const moduleDir of modules) { + if (moduleDir.isDirectory()) { + const module: BallerinaModule = { + moduleName: moduleDir.name, + sources: {}, + isGenerated: path.basename(modulesDir) !== 'modules' + }; + + const moduleFiles = fs.readdirSync(path.join(modulesDir, moduleDir.name)); + for (const file of moduleFiles) { + if (file.endsWith('.bal')) { + const filePath = path.join(modulesDir, moduleDir.name, file); + module.sources[file] = await fs.promises.readFile(filePath, 'utf-8'); + } + } + + project.modules.push(module); + } + } + } +} + +function convertToProjectSource(project: BallerinaProject, pkgPath: string, isActive: boolean): ProjectSource { + const projectSource: ProjectSource = { + sourceFiles: [], + projectModules: [], + projectName: project.projectName, + packagePath: pkgPath, + isActive: isActive + }; + + // Iterate through root-level sources + for (const [filePath, content] of Object.entries(project.sources)) { + projectSource.sourceFiles.push({ filePath, content }); + } + + // Iterate through module sources + if (project.modules) { + for (const module of project.modules) { + const projectModule: ProjectModule = { + moduleName: module.moduleName, + sourceFiles: [], + isGenerated: module.isGenerated + }; + for (const [fileName, content] of Object.entries(module.sources)) { + projectModule.sourceFiles.push({ filePath: fileName, content }); + } + projectSource.projectModules.push(projectModule); + } + } + + return projectSource; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/ai/utils/string-utils.ts b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/string-utils.ts new file mode 100644 index 00000000000..15147221c71 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/ai/utils/string-utils.ts @@ -0,0 +1,80 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +/** + * String utilities for handling Unicode characters that may cause issues + * when LLMs attempt to reproduce text content. + * + * Problem: LLMs often cannot correctly reproduce invisible or special Unicode + * characters (e.g., non-breaking spaces). This causes string matching to fail + * when the LLM sends a regular space but the file contains U+00A0. + * + * Solution: Normalize these characters to their standard ASCII equivalents + * before performing string operations. + */ + +/** + * Character normalization rules. + * Each entry maps problematic Unicode characters to their standard replacement. + */ +const CHAR_NORMALIZATION_RULES: ReadonlyArray<{ + readonly pattern: RegExp; + readonly replacement: string; + readonly description: string; +}> = [ + { + // Various Unicode space characters → regular space (U+0020) + pattern: /[\u00A0\u2000-\u200A\u202F\u205F\u3000]/g, + replacement: ' ', + description: 'Unicode spaces (NBSP, en/em space, ideographic space, etc.)' + }, + { + // Zero-width characters → removed + pattern: /[\u200B-\u200D\uFEFF]/g, + replacement: '', + description: 'Zero-width characters (ZWSP, ZWNJ, ZWJ, BOM)' + }, + { + // Soft hyphen → removed + pattern: /\u00AD/g, + replacement: '', + description: 'Soft hyphen' + } +]; + +/** + * Normalizes text by replacing problematic invisible/special Unicode characters + * with their standard ASCII equivalents. + * + * This ensures consistent string matching when LLMs may not correctly reproduce + * special characters in their output. + * + * Characters normalized: + * - Unicode spaces (U+00A0, U+2000-U+200A, U+202F, U+205F, U+3000) → regular space + * - Zero-width characters (U+200B-U+200D, U+FEFF) → removed + * - Soft hyphen (U+00AD) → removed + * - Line/paragraph separators (U+2028, U+2029) → newline + * + * @param text - The text to normalize + * @returns The normalized text with problematic characters replaced + */ +export function normalizeInvisibleChars(text: string): string { + let result = text; + for (const rule of CHAR_NORMALIZATION_RULES) { + result = result.replace(rule.pattern, rule.replacement); + } + return result; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/bi/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/bi/activator.ts index ba06c56a1c7..94c158ff4c3 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/bi/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/bi/activator.ts @@ -36,7 +36,7 @@ import { readFileSync, readdirSync, statSync } from "fs"; import path from "path"; import { isPositionEqual, isPositionWithinDeletedComponent } from "../../utils/history/util"; import { startDebugging } from "../editor-support/activator"; -import { createBIProjectFromMigration, createBIProjectPure } from "../../utils/bi"; +import { createBIProjectFromMigration, createBIProjectPure, createBIWorkspace, openInVSCode } from "../../utils/bi"; import { createVersionNumber, findBallerinaPackageRoot, isSupportedSLVersion } from ".././../utils"; import { extension } from "../../BalExtensionContext"; import { VisualizerWebview } from "../../views/visualizer/webview"; @@ -78,7 +78,7 @@ export function activate(context: BallerinaExtension) { }); commands.registerCommand(BI_COMMANDS.ADD_CUSTOM_CONNECTOR, async (item?: TreeItem) => { - await handleCommandWithContext(item, MACHINE_VIEW.AddCustomConnector); + await handleCommandWithContext(item, MACHINE_VIEW.AddConnectionWizard); }); commands.registerCommand(BI_COMMANDS.ADD_ENTRY_POINT, async (item?: TreeItem) => { @@ -105,12 +105,30 @@ export function activate(context: BallerinaExtension) { await handleCommandWithContext(item, MACHINE_VIEW.ViewConfigVariables); }); - commands.registerCommand(BI_COMMANDS.SHOW_OVERVIEW, () => { - const isBallerinaWorkspace = !!StateMachine.context().workspacePath; - if (isBallerinaWorkspace) { - openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.WorkspaceOverview }); - } else { - openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.PackageOverview }); + commands.registerCommand(BI_COMMANDS.SHOW_OVERVIEW, async () => { + try { + const result = await findWorkspaceTypeFromWorkspaceFolders(); + if (result.type === "BALLERINA_WORKSPACE") { + openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.WorkspaceOverview }); + } else if (result.type === "SINGLE_PROJECT") { + openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.PackageOverview }); + } else { + const packageRoot = await getCurrentProjectRoot(); + if (!packageRoot || !window.activeTextEditor) { + window.showErrorMessage(MESSAGES.NO_PROJECT_FOUND); + return; + } + const projectInfo = await StateMachine.langClient().getProjectInfo({ projectPath: packageRoot }); + await StateMachine.updateProjectRootAndInfo(packageRoot, projectInfo); + openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.PackageOverview }); + + } + } catch (error) { + if (error instanceof Error && error.message === 'No valid Ballerina project found') { + window.showErrorMessage(error.message); + } else { + window.showErrorMessage("Unknown error occurred."); + } } }); @@ -139,7 +157,13 @@ export function activate(context: BallerinaExtension) { commands.registerCommand(BI_COMMANDS.TOGGLE_TRACE_LOGS, toggleTraceLogs); commands.registerCommand(BI_COMMANDS.CREATE_BI_PROJECT, (params) => { - return createBIProjectPure(params); + let path: string; + if (params.createAsWorkspace) { + path = createBIWorkspace(params); + } else { + path = createBIProjectPure(params); + } + return path; }); commands.registerCommand(BI_COMMANDS.CREATE_BI_MIGRATION_PROJECT, (params) => { @@ -374,9 +398,13 @@ const findBallerinaFiles = (dir: string, fileList: string[] = []): string[] => { const handleComponentDeletion = async (componentType: string, itemLabel: string, filePath: string) => { const rpcClient = new BiDiagramRpcManager(); - const projectPath = StateMachine.context().projectPath; + const { projectPath, projectInfo } = StateMachine.context(); + const projectRoot = await findBallerinaPackageRoot(filePath); + if (projectRoot && (!projectPath || projectRoot !== projectPath)) { + await StateMachine.updateProjectRootAndInfo(projectRoot, projectInfo); + } const projectStructure = await rpcClient.getProjectStructure(); - const project = projectStructure.projects.find(project => project.projectPath === projectPath); + const project = projectStructure.projects.find(project => project.projectPath === projectRoot); const componentCategory = project?.directoryMap[componentType]; if (!componentCategory) { @@ -384,7 +412,7 @@ const handleComponentDeletion = async (componentType: string, itemLabel: string, return; } - componentCategory.forEach((component) => { + for (const component of componentCategory) { if (component.name === itemLabel) { const componentInfo: ComponentInfo = { name: component.name, @@ -396,9 +424,10 @@ const handleComponentDeletion = async (componentType: string, itemLabel: string, resources: component?.resources }; - deleteComponent(componentInfo, rpcClient, filePath); + await deleteComponent(componentInfo, rpcClient, filePath); + return; } - }); + } }; const handleLocalModuleDeletion = async (moduleName: string, filePath: string) => { diff --git a/workspaces/ballerina/ballerina-extension/src/features/debugger/config-provider.ts b/workspaces/ballerina/ballerina-extension/src/features/debugger/config-provider.ts index 18b6c9890b4..44b15bd0046 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/debugger/config-provider.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/debugger/config-provider.ts @@ -346,7 +346,11 @@ export function activateDebugConfigProvider(ballerinaExtInstance: BallerinaExten // Listener to support reflect breakpoint changes in diagram when debugger is inactive context.subscriptions.push(debug.onDidChangeBreakpoints((session) => { - notifyBreakpointChange(); + // Only notify if there's no active debug session + // When debugging, breakpoint changes are handled by the tracker factory + if (!debug.activeDebugSession) { + notifyBreakpointChange(); + } })); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/activator.ts index 2c8397cc9ef..d3fedcde92a 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/activator.ts @@ -16,7 +16,7 @@ * under the License. */ -import vscode from 'vscode'; +import vscode, { window } from 'vscode'; import { ENABLE_BACKGROUND_DRIFT_CHECK } from "../../core/preferences"; import { debounce } from 'lodash'; import { StateMachine } from "../../stateMachine"; @@ -30,6 +30,8 @@ import { } from './constants'; import { isSupportedSLVersion, createVersionNumber } from "../../utils"; import { CustomDiagnostic } from './custom-diagnostics'; +import { resolveProjectPath } from '../../utils/project-utils'; +import { MESSAGES } from '../project'; let diagnosticCollection: vscode.DiagnosticCollection; const BALLERINA_UPDATE_13 = createVersionNumber(2201, 13, 0); // Version 2201.13.0 @@ -139,7 +141,13 @@ export function activate(ballerinaExtInstance: BallerinaExtension) { }); vscode.commands.registerCommand("ballerina.configureDefaultModelForNaturalFunctions", async (...args: any[]) => { - const configPath = await getConfigFilePath(ballerinaExtInstance, projectPath); + const targetPath = await resolveProjectPath("Select an integration to configure default model for natural functions"); + if (!targetPath) { + window.showErrorMessage(MESSAGES.NO_PROJECT_FOUND); + return; + } + + const configPath = await getConfigFilePath(ballerinaExtInstance, targetPath); if (configPath != null) { const isNaturalFunctionsAvailableInBallerinaOrg = isSupportedSLVersion(ballerinaExtInstance, BALLERINA_UPDATE_13); diff --git a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/drift-check/index.ts b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/drift-check/index.ts new file mode 100644 index 00000000000..ca66ed20564 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/drift-check/index.ts @@ -0,0 +1,110 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { generateObject } from "ai"; +import { getAnthropicClient, ANTHROPIC_SONNET_4 } from "../../ai/utils/ai-client"; +import { getCodeAndApiDocsSyncPrompt, getCodeAndDocumentationSyncPrompt } from "./prompts"; +import { + ApiDocsDriftResponseSchema, + DocumentationDriftResponseSchema, + ApiDocsDriftResponse, + DocumentationDriftResponse +} from "./schemas"; + +export interface ApiDocsDriftCheckParams { + ballerinaSourceFiles: string; +} + +export interface DocumentationDriftCheckParams { + ballerinaSourceFiles: string; + requirementSpecification: string; + readmeDocumentation: string; + developerDocumentation: string; + nonDefaultModules?: string; +} + +/** + * Validates drift between code and API documentation + * @param ballerinaSources - The Ballerina source files as XML string + * @returns The drift check result with structured output + */ +export async function validateDriftWithApiDocs(ballerinaSources: string): Promise { + const prompt = getCodeAndApiDocsSyncPrompt(ballerinaSources); + + const { object } = await generateObject({ + model: await getAnthropicClient(ANTHROPIC_SONNET_4), + maxOutputTokens: 8192, + temperature: 0, + schema: ApiDocsDriftResponseSchema, + messages: [ + { + role: "user", + content: prompt, + } + ], + }); + + return object; +} + +/** + * Validates drift between code and documentation (requirements, README, developer docs) + * @param params - DocumentationDriftCheckParams containing all documentation sources + * @returns The drift check result with structured output + */ +export async function validateDriftWithDocumentation(params: DocumentationDriftCheckParams): Promise { + const prompt = getCodeAndDocumentationSyncPrompt( + params.ballerinaSourceFiles, + params.requirementSpecification, + params.readmeDocumentation, + params.developerDocumentation + ); + + const { object } = await generateObject({ + model: await getAnthropicClient(ANTHROPIC_SONNET_4), + maxOutputTokens: 8192, + temperature: 0, + schema: DocumentationDriftResponseSchema, + messages: [ + { + role: "user", + content: prompt, + } + ], + }); + + return object; +} + +/** + * Performs API docs drift check + * @param params - ApiDocsDriftCheckParams containing Ballerina source files + * @returns ApiDocsDriftResponse with structured results + */ +export async function performApiDocsDriftCheck(params: ApiDocsDriftCheckParams): Promise { + return await validateDriftWithApiDocs(params.ballerinaSourceFiles); +} + +/** + * Performs documentation drift check + * @param params - DocumentationDriftCheckParams containing all documentation sources + * @returns DocumentationDriftResponse with structured results + */ +export async function performDocumentationDriftCheck(params: DocumentationDriftCheckParams): Promise { + return await validateDriftWithDocumentation(params); +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/drift-check/prompts.ts b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/drift-check/prompts.ts new file mode 100644 index 00000000000..e1d39e84419 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/drift-check/prompts.ts @@ -0,0 +1,1002 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +// ============================================== +// CODE AND API DOCS SYNC PROMPT +// ============================================== + +export function getCodeAndApiDocsSyncPrompt(ballerinaSourceFiles: string): string { + return `## **Terminology** + +- **Program**: The actual Ballerina program with API documentation and implementation. +- **Entity**: A function, resource, service, class, variable definition, or class method in the Ballerina program. +- **Nested Entity**: An entity (e.g., resource, class method) that is defined within another entity (e.g., service, class, function). +- **Implementation**: Only the Ballerina implementation of an entity without any API documentation. +- **API Documentation**: The API documentation provided in the Ballerina program that starts with \`#\`. Comments (\`//\`) are **not** considered API documentation and MUST be ignored entirely. +- **Extra Spaces**: Blank lines or white spaces. +- **Synchronized**: When an entity is synchronized, it means either there is no documentation present for the entity, or the implementation perfectly aligns with the documentation. If API documentation is present and synchronized, it means the documentation accurately describes the entity's behavior, function signatures, return types, and edge cases, matching the actual implementation. This ensures consistency and removes any discrepancies between the documented and actual behavior of the entity in the program. +- **Natural Programming Function**: A function where the implementation is described in a \`prompt\` parameter, and the function definition ends with \`= @np:LlmCall external;\`. For such functions, the \`prompt\` parameter's value is treated as the function's implementation. These function may have parameters other than \`prompt\`. +- **callLlm Invocation**: The \`callLlm\` function calls a Large Language Model (LLM) with the prompt passed as an argument and returns the result. The \`prompt\` argument describes the task that the function performs. + +You are an expert Ballerina programmer tasked with verifying the synchronization between implementation and API documentation (**only if API documentation is present**) for entities in a Ballerina program. + +## **Input:** + +\`\`\`xml +${ballerinaSourceFiles} +\`\`\` + +Follow these steps: + +1. Iterate through each \`\` tag within the \`\`. +2. Each file represents a Ballerina program with line numbers for reference. +3. For each and every \`\` tag: + - Extract the filename from the \`filename\` attribute. + - Identify all entities and nested entities that contains API documentation in the file. + - Analyze the implementation and API documentation of each (identified in the step b) entities separately. Determine whether they are synchronized or not. + - Do not assume or infer any details not explicitly mentioned in the API documentation or implementation. + - If the entity is synchronized, ignore it. + - If the entity is not synchronized: + - Generate a response object with the following fields: + - **\`id\`**: Unique string identifier for the issue. + - **\`cause\`**: Reason why the implementation and API documentation are not synchronized. + - **\`fileName\`**: Filename from the \`filename\` attribute in the \`\` tag. + - **Response fields to identify solutions for synchronizing the entity**: + - **Synchronization Approach** + - Synchronization between the implementation and API documentation can be achieved in two ways: + - **Modifying the implementation** to align with the API documentation. + - **Updating the API documentation** to align with the implementation. + - **Key Step**: Analyze the implementation and API documentation of the entity to determine: + - Whether synchronization can be achieved by **changing the implementation only**. + - Whether synchronization can be achieved by **changing the API documentation only**. + - Every possible effort should be made to find a solution through implementation changes. **Only if no viable solution exists** (e.g., due to architectural mismatches, major feature gaps, or fundamental constraints), should **API documentation changes be considered as the sole approach** to achieve synchronization. + - Otherwise, provide **both solutions** (implementation changes and API documentation changes) to ensure synchronization. + - **Changing the API documentation to synchronize with the implementation**: + - **\`startRowforDocChangedAction\`**: The start row number of the API documentation that needs to be changed to align with the implementation. + - **\`endRowforDocChangedAction\`**: The end row number of the API documentation that needs to be changed to align with the implementation. + - **\`docChangeSolution\`**: The corrected API documentation for the specified lines. This must include the complete lines from \`startRowforDocChangedAction\` to \`endRowforDocChangedAction\`, ensuring it contains only API documentation (no implementation or comments without \`#\`). + - **If synchronization can be achieved by changing the implementation**, include the following fields: + - **Changing the implementation to synchronize with the API documentation**: + - **\`startRowforImplementationChangedAction\`**: The start row number of the implementation that needs to be changed to align with the API documentation. + - **\`endRowforImplementationChangedAction\`**: The end row number of the implementation that needs to be changed to align with the API documentation. + - **\`implementationChangeSolution\`**: The corrected implementation code for the specified lines. This must include the complete lines from \`startRowforImplementationChangedAction\` to \`endRowforImplementationChangedAction\`, ensuring it contains only implementation code (no API documentation or comments starting with \`#\`). + - **If synchronization can not be achieved by changing the implementation**, include the following fields: + - **\`startRowforImplementationChangedAction\`**: -1 + - **\`endRowforImplementationChangedAction\`**: -1 + - **\`implementationChangeSolution\`**: empty string (\`""\`) + - Always refer to the **exact line numbers** from the original program for: + - \`startRowforImplementationChangedAction\` and \`endRowforImplementationChangedAction\` (for implementation changes). + - \`startRowforDocChangedAction\` and \`endRowforDocChangedAction\` (for documentation changes). + - Preserve all comments in the orginal program for \`implementationChangeSolution\` and \`docChangeSolution\`. + - Ensure that \`implementationChangeSolution\` and \`docChangeSolution\` are **complete and syntactically correct** within their respective line ranges. + - Do not include any extra spaces or comments in the \`implementationChangeSolution\` or \`docChangeSolution\`. + - Validate the correctness of the response in following way: + - **Exclude Responses for Missing or Empty API Documentation**: + - If the \`cause\` in the response indicates issues such as: + - Missing API documentation for an entity. + - Empty API documentation (e.g., no content or only whitespace). + - Missing implementation for an entity. + - Empty implementation (e.g., no content or only whitespace). + - **Remove such responses entirely** from the final \`results\` array. These issues are not related to synchronization between the program and its API documentation and do not require fixes within the existing implementation or documentation. + - **Validate the \`implementationChangeSolution\`**: + - If \`implementationChangeSolution\` is not an empty string: + - validation process for \`implementationChangeSolution\`: + - Ensure \`implementationChangeSolution\` does not contain program lines starting with \`#\`. + - Ensure \`implementationChangeSolution\` is not blank. + - Ensure \`implementationChangeSolution\` does not contains any extra spaces, extra comments, explinations compared to the original program. + - Ensure \`implementationChangeSolution\` does not contains any syntax errors or invalid program snippets. + - Search the code snippet from \`startRowforImplementationChangedAction\` to \`endRowforImplementationChangedAction\` in the original program. + - Replace the extracted code snippet in above with \`implementationChangeSolution\` in the original program file. + - Check if the updated entity is now synchronized with the relevant API documentation. + - If validation fails, correct the \`implementationChangeSolution\`, \`startRowforImplementationChangedAction\`, \`endRowforImplementationChangedAction\` and revalidate. + - **Validate the \`docChangeSolution\`**: + - validation process for \`docChangeSolution\`: + - If \`docChangeSolution\` is not present in the response, its an invalid response. + - Ensure \`docChangeSolution\` contains only lines starting with \`#\`. + - Ensure \`docChangeSolution\` is not blank. + - Ensure \`docChangeSolution\` does not contains any extra spaces, extra comments, explinations compared to the original program. + - Ensure \`docChangeSolution\` does not contains any syntax errors or invalid program snippets. + - Search the API documentation from \`startRowforDocChangedAction\` to \`endRowforDocChangedAction\` in the original program. + - Replace the extracted API documentation in above with \`docChangeSolution\` in the program file. + - Check if the updated entity is now synchronized with the relevant implementation. + - If validation fails, correct the \`docChangeSolution\`, \`startRowforDocChangedAction\`, \`endRowforDocChangedAction\` and revalidate. + - **Validate the \`cause\` field**: + - validation process for \`cause\`: + - Ensure the \`cause\` does not contains empty or invalid reason. + - If the validation fails, correct the \`cause\` and revalidate. + - If all validations are got passed for a response, include it in the final \`results\` array. + - Identify and report as many unsynchronized issues as possible. +4. After processing all files, combine all result objects into a single \`results\` array. +5. If no issues are found, return a valid JSON object with an empty \`results\` array. +6. Validate the corrcetness of the final response array as follows: + - Validation rules: + - The final response **MUST** strictly adhere to the JSON schema provided in below. + - Do not include any additional text, explanations, or notes outside the JSON structure. + - Do not include Markdown formatting (e.g., \`\`\`json\`\`\`) or any other text outside the response. + - Do not generate incomplete JSON responses, invalid JSON, or wrong JSON responses. + - If the response includes any non-JSON text or fails validation, the system **MUST** correct the response to ensure it is a valid JSON object that adheres to the schema. + - If the all validations are got passed, return the response + - If validation failed correct the final response and revalidate + + +## **JSON Schema for Response** + +\`\`\`json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "fileName": { + "type": "string" + }, + "startRowforImplementationChangedAction": { + "type": "integer" + }, + "endRowforImplementationChangedAction": { + "type": "integer" + }, + "implementationChangeSolution": { + "type": "string" + }, + "startRowforDocChangedAction": { + "type": "integer" + }, + "endRowforDocChangedAction": { + "type": "integer" + }, + "docChangeSolution": { + "type": "string" + }, + "cause": { + "type": "string" + } + }, + "required": [ + "id", + "fileName", + "startRowforDocChangedAction", + "endRowforDocChangedAction", + "docChangeSolution", + "cause", + "startRowforImplementationChangedAction", + "endRowforImplementationChangedAction", + "implementationChangeSolution" + ], + "additionalProperties": false + } + } + }, + "required": [ + "results" + ], + "additionalProperties": false +} +\`\`\` + +### Example Responses + +#### Example 1: Not Synchronized Entities + +\`\`\`xml + + + 1|# Calculates the factorial of a given integer. + 2|# + n - The integer number to calculate factorial for + 3|# + return - The factorial of the input number, or 0 if input is negative + 4|public function factorial(int n) returns int { + 5| if n == 0 || n == 1 { + 6| return 1; + 7| } + 8| return n * factorial(n - 1); + 9|} + + +\`\`\` + +The correct response is: + +\`\`\`json +{ + "results": [ + { + "id": "1", + "fileName": "main.bal", + "startRowforImplementationChangedAction": 5, + "endRowforImplementationChangedAction": 5, + "implementationChangeSolution": "if n < 0 {\\n return 0;\\n}\\nif n == 0 || n == 1 {", + "startRowforDocChangedAction": 3, + "endRowforDocChangedAction": 3, + "docChangeSolution": "# + return - The factorial of the input number. Returns 1 for input 0 or 1.", + "cause": "The API documentation states that the function returns 0 for negative input, but the implementation does not handle negative numbers." + } + ] +} +\`\`\` + +#### Example 2: Nested Entities + +**Ballerina Program:** + +\`\`\`xml + + + 1|# Service to manage user operations. + 2|service /users on new http:Listener(8080) { + 3| # Retrieves a list of all users. + 4| # + return - A JSON array of user details. + 5| resource function get ./[string userId]() returns json|error { + 6| if userId == "123" { + 7| return {id: "123", name: "John Doe", age: 30}; + 8| } + 9| return error("User not found"); + 10| } + 11|} + + +\`\`\` + +The correct response is: + +\`\`\`json +{ + "results": [ + { + "id": "1", + "fileName": "service.bal", + "startRowforImplementationChangedAction": 6, + "endRowforImplementationChangedAction": 9, + "implementationChangeSolution": "return [{id: \\"123\\", name: \\"John Doe\\", age: 30}, {id: \\"456\\", name: \\"Jane Doe\\", age: 25}];", + "startRowforDocChangedAction": 4, + "endRowforDocChangedAction": 4, + "docChangeSolution": "# + return - A JSON of User details, if userId is 123, else an error.", + "cause": "The API documentation specifies that the function retrieves a list of all users, but the implementation only handles a specific user ID (\\"123\\") and does not return a list." + } + ] +} +\`\`\` + +### Example 3: Incorrect API Documentation for Edge Case + +**Ballerina Program:** + +\`\`\`xml + + + 1|# Divides two numbers. + 2|# + a - The dividend + 3|# + b - The divisor + 4|# + return - The result of the division + 5|public function divide(float a, float b) returns float { + 6| if b == 0 { + 7| return 0.0; + 8| } + 9| return a / b; + 10|} + + +\`\`\` + +**JSON Response:** + +\`\`\`json +{ + "results": [ + { + "id": "1", + "fileName": "division.bal", + "startRowforImplementationChangedAction": 6, + "endRowforImplementationChangedAction": 9, + "implementationChangeSolution": "return a / b;", + "startRowforDocChangedAction": 4, + "endRowforDocChangedAction": 4, + "docChangeSolution": "# + return - The result of the division, or 0.0 if the divisor is 0", + "cause": "The API documentation does not mention the edge case where the divisor is 0, and the implementation returns 0.0 instead of NaN." + } + ] +} +\`\`\` + +### Example 4: No API Documentation at All + +This example demonstrates a file with no API documentation for any entity. + +**Ballerina Program:** + +\`\`\`xml + + + 1|public function greet(string name) returns string { + 2| return "Hello, " + name + "!"; + 3|} + 4| + 5|service /greet on new http:Listener(8083) { + 6| resource function get ./[string orderId]() returns json|error { + 7| if orderId == "o1" { + 8| return {id: "o1", product: "Product 1", quantity: 10}; + 9| } + 10| return error("Order not found"); + 11| } + 12|} + + +\`\`\` + +**JSON Response:** + +\`\`\`json +{ + "results": [] +} +\`\`\` + +--- + +#### Example 5: Natural Programming Function with \`prompt\` Parameter and \`@np:LlmCall\` annotation + +**Ballerina Program:** + +\`\`\`xml + + + 1|# Filters and merges questions for a session. + 2|# + session - The session details + 3|# + currentQuestions - The current list of questions + 4|# + newQuestions - The new list of questions + 5|# + return - A merged and filtered list of questions + 6|public isolated function filterQuestions( + 7| SessionDetails session, + 8| string[] currentQuestions, + 9| string[] newQuestions, + 10| np:Prompt prompt = \`Select list of most relevent question for the \${session} using \${currentQuestions} and \${newQuestions}\` + 11|) returns Result|error = @np:LlmCall external; + + + 1|# Summarize a text. + 2|# + text - Text that needs to be summarized. + 6|public isolated function summarize( + 7| string text + 8| np:Prompt prompt = \`Summarize the given text\` + 9|) returns Result|error = @np:LlmCall external; + + + 1|public isolated function filterCountries( + 2| string[] countries, + 3| np:Prompt prompt = \`Filter countries based on the population\` + 4|) returns Result|error = @np:LlmCall external; + + +\`\`\` + +**JSON Response:** + +\`\`\`json +{ + "results": [ + { + "id": "1", + "fileName": "filter_questions.bal", + "startRowforImplementationChangedAction": 10, + "endRowforImplementationChangedAction": 10, + "implementationChangeSolution": "np:Prompt prompt = \`Analyse the questions and return merged and filtered list of questions\`", + "startRowforDocChangedAction": 5, + "endRowforDocChangedAction": 5, + "docChangeSolution": "# + return - Get list of most relevant question for the given session", + "cause": "The API documentation says the function returns a merged and filtered list of questions, but the actual implementation returns a list of the most relevant questions for the session." + } + ] +} +\`\`\` + +--- + +#### Example 6: CalLLM invocation + +**Ballerina Program:** + +\`\`\`xml + + + 1|import ballerina/np; + 2| + 3|# Rates a blog based on its title and content + 4|# + title - Title of the blog + 5|# + content - Content of the blog + 6|# + return - Rating of the blog out of 10 + 7|function rateBlog(string title, string content) returns int|error? { + 8| int rating = check np:callLlm(\`Rate this blog out of 10. + 9| Title: "\${title}" + 10| Content: \${content}\`); + 11| return rating; + 12|} + 13| + + + 1|import ballerina/np as naturalprogramming; + 2| + 3|# Summarize a text. + 4|# + text - Text that needs to summarize + 5|# + return - summarized text + 6|function summarizeText(string text) returns string|error? { + 7| return check naturalprogramming:callLlm(\`Summarize this text. + 8| Text: "\${text}"\`); + 9|} + 10| + 11|# Adds two integers. + 12|# + a - The first integer + 13|# + b - The second integer + 14|# + return - The sum of the two integers + 15|public function add(int a, int b, int c) returns int { + 16| return a + b + c; + 17|} + 18| + + + 1|import ballerina/np; + 2| + 3|# Substract two integers. + 4|# + a - first integer + 5|# + b - second integer + 6|# + return - substraction between two integers + 7|function substract(int a, int b) returns int { + 8| return check np:callLlm(\`Multiply this two integers, \${a}, \${b}\`); + 10|} + 11| + + + 1|import ballerina/np as naturalprogramming; + 2| + 3|# Multiply two integers. + 4|# + a - first integer + 5|# + b - second integer + 6|# + return - multiplication between two integers + 7|function multiply(int a, int b) returns int { + 8| return check np:callLlm(\`Substract this two integers, \${a}, \${b}\`); + 10|} + 11| + + +\`\`\` + +**JSON Response:** + +\`\`\`json +{ + "results": [ + { + "id": "1", + "fileName": "math_operations.bal", + "startRowforImplementationChangedAction":15, + "endRowforImplementationChangedAction": 15, + "implementationChangeSolution": "public function add(int a, int b) returns int {", + "startRowforDocChangedAction": 13, + "endRowforDocChangedAction": 13, + "docChangeSolution": "# + b - The second integer\\n# + c - The third integer", + "cause": "The function signature includes a third parameter 'c', but the API documentation only describes two parameters." + }, + { + "id": "1", + "fileName": "substract.bal", + "startRowforImplementationChangedAction":8, + "endRowforImplementationChangedAction": 8, + "implementationChangeSolution": " return check np:callLlm(\`Substract this two integers, \${a}, \${b}\`);", + "startRowforDocChangedAction": 3, + "endRowforDocChangedAction": 6, + "docChangeSolution": "# Multiply two integers.\\n# + a - first integer\\n# + b - second integer\\n# + return - multiplication between two integers", + "cause": "The API documentation implies substraction while implementation do the multiplication" + }, + { + "id": "1", + "fileName": "multiplication.bal", + "startRowforImplementationChangedAction":8, + "endRowforImplementationChangedAction": 8, + "implementationChangeSolution": " return check np:callLlm(\`Multiply this two integers, \${a}, \${b}\`);", + "startRowforDocChangedAction": 3, + "endRowforDocChangedAction": 6, + "docChangeSolution": "# Substract two integers.\\n# + a - first integer\\n# + b - second integer", + "cause": "The API documentation implies multiplication while implementation do the substraction" + } + ] +} +\`\`\``; +} + +// ============================================== +// CODE AND DOCUMENTATION SYNC PROMPT +// ============================================== + +export function getCodeAndDocumentationSyncPrompt( + ballerinaSourceFiles: string, + requirementSpecification: string, + readmeDocumentation: string, + developerDocumentation: string +): string { + return `## Terminology + +1. **Program**: The actual Ballerina project containing Ballerina program files. +2. **Requirement Specification**: Defines the expected behavior, features, and functional and non-functional requirements of the Ballerina project. +3. **README Documentation (e.g., README.md)**: Explains the purpose, behavior, constraints, functional requirements, non-functional requirements, features, and functionalities of the Ballerina project. +4. **Project Documentation**: The requirement specification and README documentation files. +5. **Program-Requirement Synchronized**: The program is fully aligned with the requirement specification. If the requirement specification is missing, the program is considered synchronized. +6. **Program-README Documentation Synchronized**: The program is fully aligned with the README documentation. If the README is missing, the program is considered synchronized. +7. **Synchronized**: The program is both Program-Requirement Synchronized and Program-README Documentation Synchronized. +8. **Unsynchronized**: The program is not synchronized with either the requirement specification, README documentation, or both. +9. **Implementation**: The Ballerina implementation of an entity without any API Description. +10. **API Description**: Documentation in the Ballerina program starting with \`#\`. Comments (\`//\`) are **not** considered API Description. +11. **Developer Documentation (developer.md)**: Summarizes the developer's intentions during development, reflecting how the current version of the code was arrived at. Used to validate the program against the requirement specification and README documentation. +12. **Natural Programming Function**: A function where the implementation is described in a \`prompt\` parameter, and the function definition ends with \`= @np:LlmCall external;\`. The \`prompt\` parameter's value is treated as the function's implementation. +13. **callLlm Invocation**: The \`callLlm\` function calls a Large Language Model (LLM) with a prompt and returns the result. The \`prompt\` describes the task the function performs. +14. **Ballerina Config.toml**: A configuration file used in Ballerina to externalize configuration values. +15. **Configuration Variables**: Key-value pairs defined in the \`Config.toml\` file or environment variables that are used to configure the behavior of the Ballerina program. + +--- + +## **Objective** + +Your task is to verify the synchronization between a Ballerina project and its requirement specification and README documentation. Ensure that the Ballerina program files are accurately implemented in accordance with both the requirement specification and project README documentation. + +--- + +## **Inputs** + +1. **Requirement Specification**: ${requirementSpecification} +2. **README Documentation**: ${readmeDocumentation} +3. **Developer Documentation**: ${developerDocumentation} +4. **Ballerina Source Files**: ${ballerinaSourceFiles} + +--- + +## **Steps for Analysis** + +1. **Read Requirement Specification**: + - If the requirement specification is missing or empty, consider the program as Program-Requirement Synchronized. + - If the requirement specification is present + - Thoroughly read the complete requirement specification and understand the content. + - Understand all the expected behavior, constraints, functional requirements, non-functional requirements, features, and functionalities of the Ballerina project. + +2. **Read README Documentation**: + - If the README documentation is missing or empty, consider the program as Program-README Documentation Synchronized. + - If the README documentation is present + - Thoroughly read the complete README documentation and understand the content. + - Understand the purpose, functionalities, usages, examples, constraints, dependencies, configurations, and development setups defined in the README documentation + - Ignore unrelated information (e.g., License, Contributing Guidelines). + +3. **Read Developer Documentation**: + - If the developer documentation is missing or empty, proceed without it. + - If the developer documentation is present + - Thoroughly read the developer documentation and understand the content. + - Understand the developer's intentions and how they arrived at the current version of the code + +4. **Verify Ballerina Program Implements What the Requirement Specification and README Describe** + - For each and every \`\` tag in the \`\`: + - Read and analyze the **Ballerina program content** thoroughly. + - while reading, **Ignore the API Description** present within the Ballerina program. + - Understand the **actual implementation** of the Ballerina program. + - **Cross-check** the implementation against the **requirement specification**: + - **Identify all unsynchronized implementations** by thoroughly analyzing the program against the expected behavior, constraints, functional and non-functional requirements, features, and functionalities outlined in the requirement specification. + - **Cross-check** the implementation against the **README documentation**: + - **Identify all unsynchronized implementations** by thoroughly analyzing the program against the **purpose, functionalities, usages, examples, constraints, dependencies, configurations, and development setups** described in the README documentation. + - **Ignore discrepancies** between the implementation and the API Description inside the program file. + - Do not assume or infer any details **not explicitly mentioned** in the requirement specification or README documentation. + - Ensure that all discrepancies are noted as unsynchronized implementations. + +5. **Verify Requirement Specification and README Accurately Reflect the Ballerina Program** + **Step 1: Analyze Requirement Specification & README** + - For each key section in the **requirement specification** and **README documentation**: + - Extract all **functional requirements**. + - Extract all **functional and non-functional requirements**. + - Identify all **purpose, functionalities, usages, examples, dependencies, configurations, and development setups**. + - Extract all **specified behaviors, constraints, and expected system responses**. + + **Step 2: Map Requirements & Documentation to Ballerina Implementation** + - For each extracted functional and non functional requirements, expected behavior, constraints, features, purpose, functionalities, usages, examples, dependencies, configurations, development setups: + - Locate the corresponding **implementation** in the **Ballerina source files**. + - Verify whether each functional requirement is: + - **Fully implemented** + - **Partially implemented** + - **Not implemented** + - Verify whether each non-functional requirement is: + - **Fully implemented** + - **Partially implemented** + - **Not implemented** + - Verify whether each **purpose, usage, examples, constraints, dependencies, configurations, and development setups** are: + - **Fully implemented** + - **Partially implemented** + - **Not implemented** + - Verify that each documented **functionality or feature** is: + - **Fully implemented** + - **Partially implemented** + - **Not implemented** + + **Step 3: Identify Missing or Incomplete Implementations** + - Identify all requirements that are **not implemented** in the Ballerina program and note them as unsynchronized implementations. + - Identify all requirements that are **partially implemented** in the Ballerina program and note them as unsynchronized implementations. + - Identify all features in the **README** that are **Described in the README but missing in the implementation.** and **Described in the README but partially implemented**, then note them as unsynchronized implementations + +6. **Categorize unsynchronized implementations**: + - For all unsynchronized implementations noted in above steps, categorize them as follows: + - **Fixable Issues**: Issues that can be resolved with minor code changes, such as: + - Missing simple tasks or validations. + - Incorrect conditions or logic. + - Mismatches in API endpoints or parameters. + - Incorrect or incomplete LLM prompt values. + - Parameter or return type mismatches. + - **Non-Fixable Issues**: Issues that require significant changes or are not feasible to fix, such as: + - Missing major features or modules. + - Authentication or security-related gaps. + - Architectural mismatches or design flaws. + - Scenarios requiring complete function rewrites or reimplementation. + +7. **Generate Response Object**: + - For each and every unsynchronized implementation, create a response object with the following fields: + - **\`id\`**: Unique identifier for the issue. + - **\`cause\`**: Detailed, comprehensive description of why the program and requirement specification/README are unsynchronized, Clearly mention what is expected and what is implemented/not implemented + - **\`fileName\`**: The filename of the requirement specification or README documentation related to the issue. + - if the unsynchronized implementation is a fixable issue: + - **\`codeFileName\`**: The filename of the Ballerina program file where the code change is required. + - **\`startRowforImplementationChangedAction\`**: The start row number of the code that needs to be changed. + - **\`endRowforImplementationChangedAction\`**: The end row number of the code that needs to be changed. + - **\`implementationChangeSolution\`**: The corrected code for the specified lines. + +8. **Duplicate Issue Handling**: + - If the same code snippet causes unsynchronization in both the requirement specification and README: + - Create **two separate response entries**, one for each project documentation file (requirement specification and README). + - Ensure the \`cause\` message is **specific to each project documentation file**. + - For **fixable issues**: + - Include the \`implementationChangeSolution\` **only in the response for the requirement specification**. + - For the README response, **exclude the \`implementationChangeSolution\`** but include all other fields (e.g., \`cause\`, \`fileName\`, etc.). + +9. **Validate Response**: + - **Exclude Responses for Missing or Empty Project Documentation**: + - **If the \`fileName\` attribute in the response does not contain \`natural-programming/requirements.\` or \`README.md\` (case-insensitive), exclude the response.** + - If the \`cause\` in the response indicates issues such as: + - Not relevant to requirement specification document or README documentation. + - validating Ballerina program against API Description. + - Missing requirements file or the requirements file is empty. + - Missing README file or the README content is empty. + - Missing developer documentation or the developer documentation is empty. + - Issues related to API Descriptions. + - **Remove such responses entirely** from the final \`results\` array, as these issues are not related to code synchronization and do not require fixes within the program. + - For fixable issues: + - Ensure \`implementationChangeSolution\` does not contain program lines starting with \`#\`. + - Search the code snippet from \`startRowforImplementationChangedAction\` to \`endRowforImplementationChangedAction\` in the original program. + - Replace the extracted code snippet with \`implementationChangeSolution\` in the original program file. + - Validate the updated program snippet against the relevant sections in the requirement specification/README documentation. + - If validation fails, correct the \`implementationChangeSolution\`, \`startRowforImplementationChangedAction\`, \`endRowforImplementationChangedAction\` and revalidate. + +10. **Combine Results**: + - Combine all result objects into a single \`results\` array. + - If no issues are found, return a valid JSON object with an empty \`results\` array. + +11. **Validate the correctness of the final response array** + - Validation rules: + - The final response **MUST** be a valid JSON object that strictly adheres to the provided JSON schema. + - The response **MUST NOT** include any additional text, explanations, or notes outside the JSON structure. + - The response **MUST NOT** include Markdown formatting (e.g., \`\`\`json\`\`\`) or any other text outside the JSON object. + - The response **MUST NOT** generate incomplete JSON, invalid JSON, or incorrect JSON responses. + - If the response includes any non-JSON text or fails validation, the system **MUST** correct the response to ensure it is a valid JSON object that adheres to the schema. + - The response **MUST** be returned as a pure JSON object with no extraneous content. + - If the all validations are got passed, return the response array + - If validation failed correct the final response array and revalidate + +--- + +## **JSON Schema for Response** + +\`\`\`json +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "properties": { + "results": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { "type": "string" }, + "cause": { "type": "string" }, + "fileName": { "type": "string" }, + "codeFileName": { "type": "string" }, + "startRowforImplementationChangedAction": { "type": "integer" }, + "endRowforImplementationChangedAction": { "type": "integer" }, + "implementationChangeSolution": { "type": "string" } + }, + "required": ["id", "cause", "fileName"], + "oneOf": [ + { "required": ["codeFileName", "startRowforImplementationChangedAction", "endRowforImplementationChangedAction", "implementationChangeSolution"] }, + {} + ] + } + } + }, + "required": ["results"] +} +\`\`\` + +--- + +## **Examples** + +### **Example 1: Fixable Requirement Mismatch** + +#### **Input:** + +\`\`\`xml + + + 1|public function factorial(int n) returns int { + 2| if n == 0 || n == 1 { + 3| return 1; + 4| } + 5| return n * factorial(n - 1); + 6|} + + + This project provides a factorial function. It should handle negative inputs by returning an error. + + + This project provides a factorial function. + + +\`\`\` + +#### **Expected JSON Output:** + +\`\`\`json +{ + "results": [{ + "id": "1", + "fileName": "requirements.md", + "codeFileName": "factorial.bal", + "startRowforImplementationChangedAction": 2, + "endRowforImplementationChangedAction": 2, + "implementationChangeSolution": "if n < 0 \\n return error(\\"Negative input\\");\\nif n == 0 || n == 1 return 1;", + "cause": "requirement specifies negative input handling missing in code" + }] +} +\`\`\` + +### **Example 2: Non-Fixable README Mismatch** + +#### **Input:** + +\`\`\`xml + + + 1|public function login(string user) returns boolean { + 2| return true; // No actual authentication + 3|} + + + Implement basic login functionality + + + Implements OAuth2 authentication + + +\`\`\` + +#### **Expected JSON Output:** + +\`\`\`json +{ + "results": [{ + "id": "2", + "fileName": "README.md", + "cause": "README claims OAuth2 implementation but code has basic login" + }] +} +\`\`\` + +--- + +### **Example 3: Synchronized** + +#### **Input:** + +\`\`\`xml + + + 1|public function factorial(int n) returns int { + 2| if n == 0 || n == 1 { + 3| return 1; + 4| } + 5| return n * factorial(n - 1); + 6|} + + + This project provides a factorial function for numbers that greater than 0. + + + This project provides a factorial function for numbers that greater than 0. + + +\`\`\` + +#### **Expected JSON Output:** + +\`\`\`json +{ + "results": [] +} +\`\`\` + +--- + +#### **Example 4: Natural Programming Function Fix** + +##### **Input:** + +\`\`\`xml + + + 1|public function filterData( + 2| np:Prompt prompt = \`Filter inactive users\` + 3|) = @np:LlmCall external; + + + Filter users by registration date + + + This project filters users by registration date. + + +\`\`\` + +##### **Expected JSON Output:** + +\`\`\`json +{ + "results": [{ + "id": "4", + "fileName": "natural-programming/requirements.png", + "codeFileName": "filter.bal", + "startRowforImplementationChangedAction": 2, + "endRowforImplementationChangedAction": 2, + "implementationChangeSolution": "np:Prompt prompt = \`Filter users by registration date\`", + "cause": "Filter criteria mismatch between implementation and requirements" + }, { + "id": "4", + "fileName": "README.md", + "cause": "Filter criteria mismatch between implementation and README" + }] +} +\`\`\` + +#### **Example 5: CallLLM Invocation Fix** + +##### **Input:** + +\`\`\`xml + + + 1|function summarize(string text) { + 2| np:callLlm( + 3| \`analyze text and check grammar errors, \${text}\`); + 4|} + + + Generate summary of the given text + + + This project generates a summary of the input. + + +\`\`\` + +##### **Expected JSON Output:** + +\`\`\`json +{ + "results": [{ + "id": "5", + "fileName": "natural-programming/requirements.md", + "codeFileName": "summarize.bal", + "startRowforImplementationChangedAction": 3, + "endRowforImplementationChangedAction": 4, + "implementationChangeSolution": "np:callLlm(\`Generate summary of the given text, \${text}\`)", + "cause": "LLM task is to check grammar errors while requirements document asked to generate the summary" + }, { + "id": "6", + "fileName": "README.md", + "cause": "LLM task is to check grammar errors while README document asked to generate the summary" + }] +} +\`\`\` + +#### **Example 6: Non-Fixable Requirement Mismatch** + +##### **Input:** + +\`\`\`xml + + + 1|service /orders on new http:Listener(8080) { + 2| resource function get order/[string orderId]() returns json|error { + 3| return {id: 1, name: "order1"}; + 4| } + 5|} + + + Provide an HTTP-based service to retrieve order details by order ID, including error handling for invalid order IDs. + + + This project provides a service to retrieve order details by order ID. + + +\`\`\` + +##### **Expected JSON Output:** + +\`\`\`json +{ + "results": [{ + "id": "1", + "fileName": "natural-programming/requirements.md", + "cause": "The requirement specifies error handling for invalid order IDs, but the program does not implement this functionality." + }] +} +\`\`\` + +#### **Example 7: Fixable README and Requirements Mismatch But more closer to README documentation** + +##### **Input:** + +\`\`\`xml + + + 1|public function add(int a, int b) returns int { + 2| return a + b; + 3|} + + + This project provides a function to multiply three integers. + + + Implement addition of three integers + + +\`\`\` + +##### **Expected JSON Output:** + +\`\`\`json +{ + "results": [{ + "id": "1", + "fileName": "requirements.png", + "cause": "Requirements specify multiplication, but the code implements addition." + }, { + "id": "2", + "fileName": "README.md", + "codeFileName": "math_operations.bal", + "startRowforImplementationChangedAction": 1, + "endRowforImplementationChangedAction": 3, + "implementationChangeSolution": "public function add(int a, int b, int c) returns int {\\n return a + b + c;\\n}", + "cause": "README specifies addition of three numbers, but the code implements addition of two numbers." + }] +} +\`\`\``; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/drift-check/schemas.ts b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/drift-check/schemas.ts new file mode 100644 index 00000000000..aa2ccbbabec --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/drift-check/schemas.ts @@ -0,0 +1,63 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { z } from "zod"; + +// Schema for API Documentation drift check result +export const ApiDocsDriftResultSchema = z.object({ + id: z.string().describe("Unique identifier for the issue"), + fileName: z.string().describe("Filename from the file tag"), + startRowforImplementationChangedAction: z.number().describe("Start row for implementation changes, -1 if not applicable"), + endRowforImplementationChangedAction: z.number().describe("End row for implementation changes, -1 if not applicable"), + implementationChangeSolution: z.string().describe("Corrected implementation code, empty string if not applicable"), + startRowforDocChangedAction: z.number().describe("Start row for documentation changes"), + endRowforDocChangedAction: z.number().describe("End row for documentation changes"), + docChangeSolution: z.string().describe("Corrected API documentation"), + cause: z.string().describe("Reason why implementation and API documentation are not synchronized") +}); + +// Schema for Documentation drift check result (requirements/README) +export const DocumentationDriftResultSchema = z.object({ + id: z.string().describe("Unique identifier for the issue"), + fileName: z.string().describe("Filename of the requirement specification or README documentation"), + cause: z.string().describe("Detailed description of why program and documentation are unsynchronized"), + // Optional fields for fixable issues + codeFileName: z.string().optional().describe("Filename of Ballerina program file where code change is required"), + startRowforImplementationChangedAction: z.number().optional().describe("Start row for code changes"), + endRowforImplementationChangedAction: z.number().optional().describe("End row for code changes"), + implementationChangeSolution: z.string().optional().describe("Corrected code for the specified lines") +}); + +// Schema for API Documentation drift check response +export const ApiDocsDriftResponseSchema = z.object({ + results: z.array(ApiDocsDriftResultSchema).describe("Array of drift check results for API documentation") +}); + +// Schema for Documentation drift check response +export const DocumentationDriftResponseSchema = z.object({ + results: z.array(DocumentationDriftResultSchema).describe("Array of drift check results for documentation") +}); + +// TypeScript types derived from Zod schemas +export type ApiDocsDriftResult = z.infer; +export type DocumentationDriftResult = z.infer; +export type ApiDocsDriftResponse = z.infer; +export type DocumentationDriftResponse = z.infer; + +// Combined result type for processing +export type DriftResult = ApiDocsDriftResult | DocumentationDriftResult; diff --git a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts index 49847d9fb9d..587e15e1496 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/natural-programming/utils.ts @@ -25,7 +25,6 @@ import { CustomDiagnostic } from './custom-diagnostics'; import { requirementsSpecification, isErrorCode } from "../../rpc-managers/ai-panel/utils"; import { BallerinaPluginConfig, ResultItem, DriftResponseData, DriftResponse, BallerinaSource } from "./interfaces"; import { - PROJECT_DOCUMENTATION_DRIFT_CHECK_ENDPOINT, API_DOCS_DRIFT_CHECK_ENDPOINT, DEVELOPER_OVERVIEW_FILENAME, NATURAL_PROGRAMMING_PATH, DEVELOPER_OVERVIEW_RELATIVE_PATH, REQUIREMENT_DOC_PREFIX, REQUIREMENT_TEXT_DOCUMENT, REQUIREMENT_MD_DOCUMENT, README_FILE_NAME_LOWERCASE, DRIFT_DIAGNOSTIC_ID, @@ -37,17 +36,16 @@ import { ERROR_NO_BALLERINA_SOURCES, LOGIN_REQUIRED_WARNING } from "./constants"; -import { isError, isNumber } from 'lodash'; +import { isNumber } from 'lodash'; import { HttpStatusCode } from 'axios'; import { AIMachineEventType, BallerinaProject, BIIntelSecrets, LoginMethod } from '@wso2/ballerina-core'; import { isBallerinaProjectAsync, OLD_BACKEND_URL } from '../ai/utils'; import { getCurrentBallerinaProjectFromContext } from '../config-generator/configGenerator'; import { BallerinaExtension } from 'src/core'; -import { getAccessToken as getAccesstokenFromUtils, getLoginMethod, getRefreshedAccessToken, REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE, TOKEN_REFRESH_ONLY_SUPPORTED_FOR_BI_INTEL } from '../../../src/utils/ai/auth'; -import { AIStateMachine } from '../../../src/views/ai-panel/aiMachine'; -import { fetchWithAuth } from '../ai/service/connection'; - -let controller = new AbortController(); +import { getAccessToken as getAccesstokenFromUtils, getLoginMethod, getRefreshedAccessToken, REFRESH_TOKEN_NOT_AVAILABLE_ERROR_MESSAGE, TOKEN_REFRESH_ONLY_SUPPORTED_FOR_BI_INTEL } from '../../utils/ai/auth'; +import { AIStateMachine } from '../../views/ai-panel/aiMachine'; +import { performApiDocsDriftCheck, performDocumentationDriftCheck } from './drift-check'; +import { ApiDocsDriftResponse, DocumentationDriftResponse } from './drift-check/schemas'; export async function getLLMDiagnostics(projectPath: string, diagnosticCollection : vscode.DiagnosticCollection): Promise { @@ -56,95 +54,62 @@ export async function getLLMDiagnostics(projectPath: string, diagnosticCollectio = getSourcesOfNonDefaultModulesWithReadme(path.join(projectPath, "modules")); const sources: BallerinaSource[] = [ballerinaProjectSource, ...sourcesOfNonDefaultModulesWithReadme]; - const backendurl = await getBackendURL(); - const token = await getAccessToken(); - - const responses = await getLLMResponses(sources, token, backendurl); - if (responses == null) { - return; - } + const responses = await getLLMResponses(sources); if (isNumber(responses)) { return responses; } await createDiagnosticCollection(responses, projectPath, diagnosticCollection); + return null; } -async function getLLMResponses(sources: BallerinaSource[], token: string, backendurl: string) - : Promise { - let promises: Promise[] = []; - const nonDefaultModulesWithReadmeFiles: string[] - = sources.map(source => source.moduleName).filter(name => name != DEFAULT_MODULE); - - const commentResponsePromise = fetchWithAuth( - backendurl + API_DOCS_DRIFT_CHECK_ENDPOINT, - { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${token}`, - }, - body: JSON.stringify([sources[0].balFiles]), - signal: controller.signal, - }, - ); - promises.push(commentResponsePromise); - - sources.forEach(source => { - let body: string[] = [source.balFiles, source.requirements, source.readme, source.developerOverview]; - - if (source.moduleName == DEFAULT_MODULE) { - body.push(nonDefaultModulesWithReadmeFiles.join(", ")); - } - - const documentationSourceResponsePromise = fetchWithAuth( - backendurl + PROJECT_DOCUMENTATION_DRIFT_CHECK_ENDPOINT, - { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${token}`, - }, - body: JSON.stringify(body), - signal: controller.signal, - }, +async function getLLMResponses(sources: BallerinaSource[]) + : Promise { + try { + const promises: Promise[] = []; + const nonDefaultModulesWithReadmeFiles: string[] + = sources.map(source => source.moduleName).filter(name => name !== DEFAULT_MODULE); + + // API docs drift check + promises.push( + performApiDocsDriftCheck({ + ballerinaSourceFiles: sources[0].balFiles + }) ); - promises.push(documentationSourceResponsePromise); - }); - let responses: (Response | Error)[] = await Promise.all(promises); - const firstResponse = responses[0]; - - const filteredResponses: Response[] - = responses.filter(response => response != undefined && !isError(response) && response.ok) as Response[]; - - if (filteredResponses.length === 0) { - if (isError(firstResponse)) { - return HttpStatusCode.InternalServerError; - } + // Documentation drift check for each source + sources.forEach(source => { + promises.push( + performDocumentationDriftCheck({ + ballerinaSourceFiles: source.balFiles, + requirementSpecification: source.requirements, + readmeDocumentation: source.readme, + developerDocumentation: source.developerOverview, + nonDefaultModules: source.moduleName === DEFAULT_MODULE + ? nonDefaultModulesWithReadmeFiles.join(", ") + : undefined + }) + ); + }); - if (firstResponse == undefined) { - return null; - } - return firstResponse.status; - } + const responses = await Promise.all(promises); - let extractedResponses: any[] = []; + // Convert structured responses to DriftResponseData format + const driftResponses: DriftResponseData[] = responses + .filter(response => response && response.results && response.results.length > 0) + .map(response => ({ results: response.results as ResultItem[] })); - for (const response of filteredResponses) { - const extractedResponse = await extractResponseAsJsonFromString(await streamToString(response.body)); - if (extractedResponse != null) { - extractedResponses.push(extractedResponse); - } + return driftResponses; + } catch (error) { + console.error('Error in drift check:', error); + return HttpStatusCode.InternalServerError; } - - return extractedResponses; } async function createDiagnosticCollection( - responses: any[], + responses: DriftResponseData[], projectPath: string, diagnosticCollection: vscode.DiagnosticCollection ) { @@ -270,20 +235,14 @@ export async function getLLMDiagnosticArrayAsString(projectPath: string): Promis = getSourcesOfNonDefaultModulesWithReadme(path.join(projectPath, "modules")); const sources: BallerinaSource[] = [ballerinaProjectSource, ...sourcesOfNonDefaultModulesWithReadme]; - const backendurl = await getBackendURL(); - const token = await getAccessToken(); - const responses = await getLLMResponses(sources, token, backendurl); - - if (responses == null) { - return ""; - } + const responses = await getLLMResponses(sources); if (isNumber(responses)) { return responses; } - let diagnosticArray = (await createDiagnosticArray(responses, projectPath)).map(diagnostic => { + const diagnosticArray = (await createDiagnosticArray(responses, projectPath)).map(diagnostic => { return `${diagnostic.message}`; }) .join("\n\n"); @@ -291,8 +250,8 @@ export async function getLLMDiagnosticArrayAsString(projectPath: string): Promis return diagnosticArray; } -async function createDiagnosticArray(responses: any[], projectPath: string): Promise { - const diagnostics = []; +async function createDiagnosticArray(responses: DriftResponseData[], projectPath: string): Promise { + const diagnostics: Diagnostic[] = []; for (const response of responses) { await createDiagnosticList(response, projectPath, diagnostics); @@ -545,7 +504,7 @@ export function handleChatSummaryFailure(message: string) { } // Function to find a file in a case-insensitive way -function findFileCaseInsensitive(directory, fileName) { +function findFileCaseInsensitive(directory: string, fileName: string) { const files = fs.readdirSync(directory); const targetFile = files.find(file => file.toLowerCase() === fileName.toLowerCase()); const file = targetFile ? targetFile : fileName; diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/cloud.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/cloud.ts index 29fc636363e..669cd4b547d 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/cloud.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/cloud.ts @@ -19,57 +19,87 @@ import { LANGUAGE } from "../../../core"; import { extension } from "../../../BalExtensionContext"; import { commands, window } from "vscode"; -import { outputChannel } from "../../../utils"; +import { findBallerinaPackageRoot, outputChannel } from "../../../utils"; import { TM_EVENT_PROJECT_CLOUD, TM_EVENT_ERROR_EXECUTE_PROJECT_CLOUD, CMP_PROJECT_CLOUD, sendTelemetryEvent, sendTelemetryException, getMessageObject } from "../../telemetry"; -import { getCurrentBallerinaProject } from "../../../utils/project-utils"; -import { MESSAGES, PALETTE_COMMANDS, PROJECT_TYPE } from "./cmd-runner"; +import { getCurrentProjectRoot, tryGetCurrentBallerinaFile } from "../../../utils/project-utils"; +import { MESSAGES, PALETTE_COMMANDS } from "./cmd-runner"; import * as fs from 'fs'; -import { sep } from 'path'; +import { findWorkspaceTypeFromWorkspaceFolders } from "../../../rpc-managers/common/utils"; +import { StateMachine } from "../../../stateMachine"; +import { selectPackageOrPrompt, requiresPackageSelection, needsProjectDiscovery } from "../../../utils/command-utils"; +import { join } from "path"; +import { URI } from "vscode-uri"; +import { VisualizerWebview } from "../../../views/visualizer/webview"; +import { discoverProjectPath } from "./doc"; -const CLOUD_CONFIG_FILE_NAME = `${sep}Cloud.toml`; +// const CLOUD_CONFIG_FILE_NAME = `${sep}Cloud.toml`; +const CLOUD_CONFIG_FILE_NAME = 'Cloud.toml'; -export function activateCloudCommand() { +function activateCloudCommand() { // register create Cloud.toml command handler commands.registerCommand(PALETTE_COMMANDS.CLOUD, async () => { try { sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_PROJECT_CLOUD, CMP_PROJECT_CLOUD); - if (window.activeTextEditor && window.activeTextEditor.document.languageId != LANGUAGE.BALLERINA) { + if (window.activeTextEditor && window.activeTextEditor.document.languageId !== LANGUAGE.BALLERINA) { window.showErrorMessage(MESSAGES.NOT_IN_PROJECT); return; } - const isDiagram: boolean = extension.ballerinaExtInstance.getDocumentContext().isActiveDiagram(); - const currentProject = isDiagram ? await - getCurrentBallerinaProject(extension.ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) - : await getCurrentBallerinaProject(); + const result = await findWorkspaceTypeFromWorkspaceFolders(); + let { workspacePath, view: webviewType, projectPath, projectInfo } = StateMachine.context(); + const isWebviewOpen = VisualizerWebview.currentPanel !== undefined; + const hasActiveTextEditor = !!window.activeTextEditor; + const currentBallerinaFile = tryGetCurrentBallerinaFile(); + const projectRoot = await findBallerinaPackageRoot(currentBallerinaFile); - if (currentProject.kind !== PROJECT_TYPE.SINGLE_FILE) { - if (currentProject.path) { - let cloudTomlPath = currentProject.path + CLOUD_CONFIG_FILE_NAME; - if (!fs.existsSync(cloudTomlPath)) { - const commandArgs = { - key: "uri", - value: isDiagram ? extension.ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString() - : window.activeTextEditor!.document.uri.toString() - }; - commands.executeCommand('ballerina.create.cloud.exec', commandArgs); - outputChannel.appendLine(`Cloud.toml created in ${currentProject.path}`); - } else { - const message = `Cloud.toml already exists in the project.`; - sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_CLOUD, - CMP_PROJECT_CLOUD, getMessageObject(message)); - window.showErrorMessage(message); + let targetPath = projectPath ?? ""; + + if (result.type === "MULTIPLE_PROJECTS") { + const packageRoot = await getCurrentProjectRoot(); + if (!packageRoot) { + window.showErrorMessage(MESSAGES.NO_PROJECT_FOUND); + return; + } + projectInfo = await StateMachine.langClient().getProjectInfo({ projectPath: packageRoot }); + targetPath = projectInfo.projectPath ?? packageRoot; + } else if (result.type === "BALLERINA_WORKSPACE") { + if (requiresPackageSelection(workspacePath, webviewType, projectPath, isWebviewOpen, hasActiveTextEditor)) { + const availablePackages = projectInfo?.children.map((child: any) => child.projectPath) ?? []; + const selectedPackage = await selectPackageOrPrompt( + availablePackages, + "Select the project to create Cloud.toml in" + ); + if (!selectedPackage) { + return; } + targetPath = selectedPackage; + await StateMachine.updateProjectRootAndInfo(selectedPackage, projectInfo); + } else if (needsProjectDiscovery(projectInfo, projectRoot, projectPath)) { + targetPath = await discoverProjectPath(); + } else { + targetPath = await getCurrentProjectRoot(); } + } + + + let cloudTomlPath = join(targetPath, CLOUD_CONFIG_FILE_NAME); + if (projectInfo.projectPath && !fs.existsSync(cloudTomlPath)) { + const commandArgs = { + key: "uri", + value: window.activeTextEditor ? window.activeTextEditor!.document.uri.toString() : URI.file(join(targetPath, 'main.bal')).toString(), + }; + commands.executeCommand('ballerina.create.cloud.exec', commandArgs); + outputChannel.appendLine(`Cloud.toml created in ${projectInfo.projectPath}`); + window.showInformationMessage(`Cloud.toml created at ${targetPath}`); } else { - const message = `Cloud.toml is not supported for single file projects.`; - sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_CLOUD, CMP_PROJECT_CLOUD, - getMessageObject(message)); + const message = `Cloud.toml already exists in the project.`; + sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_CLOUD, + CMP_PROJECT_CLOUD, getMessageObject(message)); window.showErrorMessage(message); } } catch (error) { @@ -77,8 +107,10 @@ export function activateCloudCommand() { sendTelemetryException(extension.ballerinaExtInstance, error, CMP_PROJECT_CLOUD); window.showErrorMessage(error.message); } else { - window.showErrorMessage("Unkown error occurred."); + window.showErrorMessage("Unknown error occurred."); } } }); } + +export { activateCloudCommand }; \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/configRun.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/configRun.ts index d8787db53b1..d0c960f8297 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/configRun.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/configRun.ts @@ -17,10 +17,18 @@ */ import { commands, languages, Uri, window, workspace } from "vscode"; -import { getRunCommand, PALETTE_COMMANDS, runCommand } from "./cmd-runner"; +import { getRunCommand, MESSAGES, PALETTE_COMMANDS, runCommand } from "./cmd-runner"; import { extension } from "../../../BalExtensionContext"; import { getConfigCompletions } from "../../config-generator/utils"; import { BiDiagramRpcManager } from "../../../rpc-managers/bi-diagram/rpc-manager"; +import { findWorkspaceTypeFromWorkspaceFolders } from "../../../rpc-managers/common/utils"; +import { StateMachine } from "../../../stateMachine"; +import { getCurrentProjectRoot } from "../../../utils/project-utils"; +import { needsProjectDiscovery, requiresPackageSelection, selectPackageOrPrompt } from "../../../utils/command-utils"; +import { tryGetCurrentBallerinaFile } from "../../../utils/project-utils"; +import { findBallerinaPackageRoot } from "../../../utils/file-utils"; +import { discoverProjectPath } from "./doc"; +import { VisualizerWebview } from "../../../views/visualizer/webview"; function activateConfigRunCommand() { // register the config view run command @@ -28,8 +36,8 @@ function activateConfigRunCommand() { const currentProject = extension.ballerinaExtInstance.getDocumentContext().getCurrentProject(); if (currentProject) { runCommand(currentProject, extension.ballerinaExtInstance.getBallerinaCmd(), - getRunCommand(), - currentProject.path!); + getRunCommand(), + currentProject.path!); return; } }); @@ -37,18 +45,51 @@ function activateConfigRunCommand() { commands.registerCommand(PALETTE_COMMANDS.CONFIG_CREATE_COMMAND, async () => { try { // Open current config.toml or create a new config.toml if it does not exist - let projectPath: string; - if (window.activeTextEditor) { - projectPath = window.activeTextEditor.document.uri.fsPath; - } else if (workspace.workspaceFolders && workspace.workspaceFolders.length > 0) { - projectPath = workspace.workspaceFolders[0].uri.fsPath; + const result = await findWorkspaceTypeFromWorkspaceFolders(); + let { workspacePath, view: webviewType, projectPath, projectInfo } = StateMachine.context(); + const isWebviewOpen = VisualizerWebview.currentPanel !== undefined; + const hasActiveTextEditor = !!window.activeTextEditor; + const currentBallerinaFile = tryGetCurrentBallerinaFile(); + const projectRoot = await findBallerinaPackageRoot(currentBallerinaFile); + + let targetPath = projectPath ?? ""; + + if (result.type === "MULTIPLE_PROJECTS") { + const packageRoot = await getCurrentProjectRoot(); + if (!packageRoot) { + window.showErrorMessage(MESSAGES.NO_PROJECT_FOUND); + return; + } + projectInfo = await StateMachine.langClient().getProjectInfo({ projectPath: packageRoot }); + targetPath = projectInfo.projectPath ?? packageRoot; + } else if (result.type === "BALLERINA_WORKSPACE") { + if (requiresPackageSelection(workspacePath, webviewType, projectPath, isWebviewOpen, hasActiveTextEditor)) { + const availablePackages = projectInfo?.children.map((child: any) => child.projectPath) ?? []; + const selectedPackage = await selectPackageOrPrompt( + availablePackages, + "Select the project to create Config.toml in" + ); + if (!selectedPackage) { + return; + } + targetPath = selectedPackage; + await StateMachine.updateProjectRootAndInfo(selectedPackage, projectInfo); + } else if (needsProjectDiscovery(projectInfo, projectRoot, projectPath)) { + targetPath = await discoverProjectPath(); + } else { + targetPath = await getCurrentProjectRoot(); + } } const biDiagramRpcManager = new BiDiagramRpcManager(); - await biDiagramRpcManager.openConfigToml({ filePath: projectPath }); + await biDiagramRpcManager.openConfigToml({ filePath: targetPath }); return; } catch (error) { - throw new Error("Unable to create Config.toml file. Try again with a valid Ballerina file open in the editor."); + if (error instanceof Error && error.message === 'No valid Ballerina project found') { + window.showErrorMessage(error.message); + } else { + window.showErrorMessage("Unknown error occurred."); + } } }); @@ -61,6 +102,8 @@ function activateConfigRunCommand() { return suggestions; } }); + + } export { activateConfigRunCommand }; diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/doc.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/doc.ts index 45580f45267..8363930607f 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/doc.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/doc.ts @@ -16,16 +16,36 @@ * under the License. */ -import { extension } from "../../../BalExtensionContext"; import { commands, window } from "vscode"; +import { EVENT_TYPE, MACHINE_VIEW } from "@wso2/ballerina-core"; +import { extension } from "../../../BalExtensionContext"; import { TM_EVENT_PROJECT_DOC, TM_EVENT_ERROR_EXECUTE_PROJECT_DOC, CMP_PROJECT_DOC, sendTelemetryEvent, sendTelemetryException, getMessageObject } from "../../telemetry"; -import { runCommand, BALLERINA_COMMANDS, MESSAGES, PROJECT_TYPE, PALETTE_COMMANDS } from "./cmd-runner"; -import { getCurrentBallerinaProject } from "../../../utils/project-utils"; +import { + runCommand, + BALLERINA_COMMANDS, + MESSAGES, + PROJECT_TYPE, + PALETTE_COMMANDS +} from "./cmd-runner"; +import { + getCurrentBallerinaProject, + getCurrentProjectRoot, + tryGetCurrentBallerinaFile +} from "../../../utils/project-utils"; import { LANGUAGE } from "../../../core"; +import { openView, StateMachine } from "../../../stateMachine"; +import { + needsProjectDiscovery, + requiresPackageSelection, + selectPackageOrPrompt +} from "../../../utils/command-utils"; +import { VisualizerWebview } from "../../../views/visualizer/webview"; +import { findBallerinaPackageRoot } from "../../../utils/file-utils"; +import { findWorkspaceTypeFromWorkspaceFolders } from "../../../rpc-managers/common/utils"; function activateDocCommand() { // register ballerina doc handler @@ -38,9 +58,42 @@ function activateDocCommand() { return; } - const currentProject = await extension.ballerinaExtInstance.getDocumentContext().isActiveDiagram() ? await - getCurrentBallerinaProject(extension.ballerinaExtInstance.getDocumentContext().getLatestDocument()?.toString()) - : await getCurrentBallerinaProject(); + const { workspacePath, view: webviewType, projectPath, projectInfo } = StateMachine.context(); + const isWebviewOpen = VisualizerWebview.currentPanel !== undefined; + const hasActiveTextEditor = !!window.activeTextEditor; + const currentBallerinaFile = tryGetCurrentBallerinaFile(); + const projectRoot = await findBallerinaPackageRoot(currentBallerinaFile); + + let targetPath = projectPath ?? ""; + + if (requiresPackageSelection(workspacePath, webviewType, projectPath, isWebviewOpen, hasActiveTextEditor)) { + const availablePackages = projectInfo?.children.map((child: any) => child.projectPath) ?? []; + const selectedPackage = await selectPackageOrPrompt( + availablePackages, + "Select a package to build documentation" + ); + if (!selectedPackage) { + return; + } + targetPath = selectedPackage; + await StateMachine.updateProjectRootAndInfo(selectedPackage, projectInfo); + } else if (needsProjectDiscovery(projectInfo, projectRoot, projectPath)) { + targetPath = await discoverProjectPath(); + } else { + targetPath = await getCurrentProjectRoot(); + } + + if (!targetPath) { + window.showErrorMessage(MESSAGES.NO_PROJECT_FOUND); + return; + } + + if (isWebviewOpen) { + openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.PackageOverview, projectPath: targetPath }); + } + + const currentProject = await getCurrentBallerinaProject(targetPath); + if (currentProject.kind === PROJECT_TYPE.SINGLE_FILE) { sendTelemetryEvent(extension.ballerinaExtInstance, TM_EVENT_ERROR_EXECUTE_PROJECT_DOC, CMP_PROJECT_DOC, getMessageObject(MESSAGES.NOT_IN_PROJECT)); @@ -55,10 +108,32 @@ function activateDocCommand() { sendTelemetryException(extension.ballerinaExtInstance, error, CMP_PROJECT_DOC); window.showErrorMessage(error.message); } else { - window.showErrorMessage("Unkown error occurred."); + window.showErrorMessage("Unknown error occurred."); } } }); } -export { activateDocCommand }; +async function discoverProjectPath(): Promise { + const workspaceType = await findWorkspaceTypeFromWorkspaceFolders(); + const packageRoot = await getCurrentProjectRoot(); + + if (!packageRoot) { + return undefined; + } + + if (workspaceType.type === "MULTIPLE_PROJECTS") { + const projectInfo = await StateMachine.langClient().getProjectInfo({ projectPath: packageRoot }); + await StateMachine.updateProjectRootAndInfo(packageRoot, projectInfo); + return packageRoot; + } + + if (workspaceType.type === "BALLERINA_WORKSPACE") { + await StateMachine.updateProjectRootAndInfo(packageRoot, StateMachine.context().projectInfo); + return packageRoot; + } + + return undefined; +} + +export { activateDocCommand, discoverProjectPath }; diff --git a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/pack.ts b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/pack.ts index e7b7e719c36..207d7e688e3 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/project/cmds/pack.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/project/cmds/pack.ts @@ -44,8 +44,7 @@ export function activatePackCommand() { const context = StateMachine.context(); const { workspacePath, view: webviewType, projectPath } = context; - let targetPath = projectPath ?? ""; - + let targetPath = projectPath ?? ""; if (workspacePath && webviewType === MACHINE_VIEW.WorkspaceOverview) { targetPath = workspacePath; } else if (workspacePath && !projectPath) { diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts index 81a1cf1eefa..dd21af2f309 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/commands.ts @@ -17,22 +17,35 @@ * under the License. */ -import { commands, TestItem } from "vscode"; +import { commands, TestItem, window } from "vscode"; import { openView, StateMachine, history } from "../../stateMachine"; import { BI_COMMANDS, EVENT_TYPE, MACHINE_VIEW } from "@wso2/ballerina-core"; import { isTestFunctionItem } from "./discover"; import path from "path"; import { promises as fs } from 'fs'; +import { needsProjectDiscovery, requiresPackageSelection, selectPackageOrPrompt } from "../../utils/command-utils"; +import { VisualizerWebview } from "../../views/visualizer/webview"; +import { getCurrentProjectRoot, tryGetCurrentBallerinaFile } from "../../utils/project-utils"; +import { findBallerinaPackageRoot } from "../../utils"; +import { MESSAGES } from "../project"; +import { findWorkspaceTypeFromWorkspaceFolders } from "../../rpc-managers/common/utils"; export function activateEditBiTest() { // register run project tests handler commands.registerCommand(BI_COMMANDS.BI_EDIT_TEST_FUNCTION, async (entry: TestItem) => { + const projectPath = await findProjectPath(entry.uri?.fsPath); + + if (!projectPath) { + window.showErrorMessage(MESSAGES.NO_PROJECT_FOUND); + return; + } + if (!isTestFunctionItem(entry)) { return; } const fileName = entry.id.split(":")[1]; - const fileUri = path.resolve(StateMachine.context().projectPath, `tests`, fileName); + const fileUri = path.resolve(projectPath, `tests`, fileName); if (fileUri) { const range = entry.range; openView(EVENT_TYPE.OPEN_VIEW, { documentUri: fileUri, @@ -42,20 +55,34 @@ export function activateEditBiTest() { } }); - commands.registerCommand(BI_COMMANDS.BI_ADD_TEST_FUNCTION, () => { - const fileUri = path.resolve(StateMachine.context().projectPath, `tests`, `tests.bal`); + commands.registerCommand(BI_COMMANDS.BI_ADD_TEST_FUNCTION, async (entry?: TestItem) => { + const projectPath = await findProjectPath(entry?.uri?.fsPath); + + if (!projectPath) { + window.showErrorMessage(MESSAGES.NO_PROJECT_FOUND); + return; + } + + const fileUri = path.resolve(projectPath, `tests`, `tests.bal`); ensureFileExists(fileUri); openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.BITestFunctionForm, documentUri: fileUri, identifier: '', serviceType: 'ADD_NEW_TEST' }); }); - commands.registerCommand(BI_COMMANDS.BI_EDIT_TEST_FUNCTION_DEF, (entry: TestItem) => { + commands.registerCommand(BI_COMMANDS.BI_EDIT_TEST_FUNCTION_DEF, async (entry: TestItem) => { + const projectPath = await findProjectPath(entry.uri?.fsPath); + + if (!projectPath) { + window.showErrorMessage(MESSAGES.NO_PROJECT_FOUND); + return; + } + if (!isTestFunctionItem(entry)) { return; } const fileName = entry.id.split(":")[1]; - const fileUri = path.resolve(StateMachine.context().projectPath, `tests`, fileName); + const fileUri = path.resolve(projectPath, `tests`, fileName); if (fileUri) { openView(EVENT_TYPE.OPEN_VIEW, { view: MACHINE_VIEW.BITestFunctionForm, documentUri: fileUri, identifier: entry.label, serviceType: 'UPDATE_TEST' }); @@ -74,3 +101,57 @@ async function ensureFileExists(filePath: string) { console.log('File created:', filePath); } } + +async function findProjectPath(filePath?: string): Promise { + const { projectInfo, projectPath, view, workspacePath } = StateMachine.context(); + + // 1. Try resolving from provided file path + if (filePath) { + const projectRoot = await findBallerinaPackageRoot(filePath); + if (projectRoot) { + if (!projectPath || projectRoot !== projectPath) { + await StateMachine.updateProjectRootAndInfo(projectRoot, projectInfo); + } + return projectRoot; + } + } + + // 2. Try package selection if needed + const isWebviewOpen = VisualizerWebview.currentPanel !== undefined; + const hasActiveTextEditor = !!window.activeTextEditor; + + if (requiresPackageSelection(workspacePath, view, projectPath, isWebviewOpen, hasActiveTextEditor)) { + const availablePackages = projectInfo?.children.map((child: any) => child.projectPath) ?? []; + const selectedPackage = await selectPackageOrPrompt(availablePackages); + if (selectedPackage) { + await StateMachine.updateProjectRootAndInfo(selectedPackage, projectInfo); + return selectedPackage; + } + return undefined; + } + + // 3. Try project discovery if needed + const currentBallerinaFile = tryGetCurrentBallerinaFile(); + const projectRoot = await findBallerinaPackageRoot(currentBallerinaFile); + + if (needsProjectDiscovery(projectInfo, projectRoot, projectPath)) { + try { + const packageRoot = await getCurrentProjectRoot(); + if (!packageRoot) { + return undefined; + } + + // Test explorer only supports build-projects and workspace-projects. + // Single-file projects don't require discovery, so we only proceed for workspaces. + if (!!workspacePath) { + await StateMachine.updateProjectRootAndInfo(packageRoot, projectInfo); + return packageRoot; + } + } catch { + window.showErrorMessage(MESSAGES.NO_PROJECT_FOUND); + } + return undefined; + } + + return projectPath; +} diff --git a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/discover.ts b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/discover.ts index e618da6e936..98d80744175 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/test-explorer/discover.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/test-explorer/discover.ts @@ -19,10 +19,11 @@ import path from "path"; import { StateMachine } from "../../stateMachine"; -import { TestsDiscoveryRequest, TestsDiscoveryResponse, FunctionTreeNode } from "@wso2/ballerina-core"; +import { TestsDiscoveryRequest, TestsDiscoveryResponse, FunctionTreeNode, ProjectInfo } from "@wso2/ballerina-core"; import { BallerinaExtension } from "../../core"; import { Position, Range, TestController, Uri, TestItem, commands } from "vscode"; import { getWorkspaceRoot, getCurrentProjectRoot } from "../../utils/project-utils"; +import { URI } from "vscode-uri"; let groups: string[] = []; @@ -44,22 +45,22 @@ export async function discoverTestFunctionsInProject(ballerinaExtInstance: Balle } async function discoverTestsInWorkspace( - children: any[], + projects: ProjectInfo[], ballerinaExtInstance: BallerinaExtension, testController: TestController ) { // Iterate over project children sequentially to allow awaiting each request - for (const child of children) { - if (!child?.projectPath) { + for (const project of projects) { + if (!project?.projectPath) { continue; } const response: TestsDiscoveryResponse = await ballerinaExtInstance.langClient?.getProjectTestFunctions({ - projectPath: child.projectPath + projectPath: project.projectPath }); if (response) { - createTests(response, testController, child.projectPath); + createTests(response, testController, project.projectPath); setGroupsContext(); } } @@ -109,7 +110,7 @@ function createTests(response: TestsDiscoveryResponse, testController: TestContr projectGroupItem = testController.items.get(projectGroupId); if (!projectGroupItem) { - projectGroupItem = testController.createTestItem(projectGroupId, projectName); + projectGroupItem = testController.createTestItem(projectGroupId, projectName, URI.file(projectPath)); testController.items.add(projectGroupItem); groups.push(projectGroupId); } diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/activate.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/activate.ts index 32b21e20a77..d33bf3c59f6 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/activate.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/activate.ts @@ -21,6 +21,11 @@ import { TracerMachine } from './tracer-machine'; import { TraceTreeDataProvider } from './trace-tree-view'; import { TraceServer, Trace } from './trace-server'; import { TraceDetailsWebview } from './trace-details-webview'; +import { StateMachine } from '../../stateMachine'; +import { VisualizerWebview } from '../../views/visualizer/webview'; +import { getCurrentProjectRoot, tryGetCurrentBallerinaFile } from '../../utils/project-utils'; +import { findBallerinaPackageRoot } from '../../utils'; +import { requiresPackageSelection, selectPackageOrPrompt } from '../../utils/command-utils'; export const TRACE_WINDOW_COMMAND = 'ballerina.showTraceWindow'; export const ENABLE_TRACING_COMMAND = 'ballerina.enableTracing'; @@ -33,18 +38,8 @@ let treeDataProvider: TraceTreeDataProvider | undefined; let treeView: vscode.TreeView | undefined; export function activateTracing(ballerinaExtInstance: BallerinaExtension) { - const workspaceDirs: string[] = []; - try { - const folders = vscode.workspace.workspaceFolders; - if (folders && folders.length > 0) { - workspaceDirs.push(...folders.map(folder => folder.uri.fsPath)); - } - } catch (_) { - // ignore - } - // Initialize TracerMachine - TracerMachine.initialize(workspaceDirs.length > 0 ? workspaceDirs : undefined); + TracerMachine.initialize(StateMachine.context().projectPath); // Create TreeDataProvider treeDataProvider = new TraceTreeDataProvider(); @@ -69,16 +64,23 @@ export function activateTracing(ballerinaExtInstance: BallerinaExtension) { await showTraceWindow(); }); - const enableTracingCommand = vscode.commands.registerCommand(ENABLE_TRACING_COMMAND, () => { - TracerMachine.enable(); - // Focus the VS Code panel section - vscode.commands.executeCommand('workbench.action.focusPanel'); + const enableTracingCommand = vscode.commands.registerCommand(ENABLE_TRACING_COMMAND, async () => { + const targetPath = await resolveTracingTargetPath("Select a package to enable tracing"); + if (!targetPath) { + return; + } + + TracerMachine.enable(targetPath); // Reveal/focus the ballerina-traceView (shows trace panel in panel) vscode.commands.executeCommand('workbench.view.extension.ballerina-traceView'); }); - const disableTracingCommand = vscode.commands.registerCommand(DISABLE_TRACING_COMMAND, () => { - TracerMachine.disable(); + const disableTracingCommand = vscode.commands.registerCommand(DISABLE_TRACING_COMMAND, async () => { + const targetPath = await resolveTracingTargetPath("Select a package to disable tracing"); + if (!targetPath) { + return; + } + TracerMachine.disable(targetPath); }); const clearTracesCommand = vscode.commands.registerCommand(CLEAR_TRACES_COMMAND, () => { @@ -107,6 +109,37 @@ export function activateTracing(ballerinaExtInstance: BallerinaExtension) { ); } +/** + * Resolves the target project path for tracing operations. + * Handles package selection when required and updates the state machine accordingly. + * @param promptMessage - The message to display when prompting for package selection + * @returns The resolved target path, or undefined if the user cancelled the selection + */ +async function resolveTracingTargetPath(promptMessage: string): Promise { + const { workspacePath, view: webviewType, projectPath, projectInfo } = StateMachine.context(); + const isWebviewOpen = VisualizerWebview.currentPanel !== undefined; + const hasActiveTextEditor = !!vscode.window.activeTextEditor; + const currentBallerinaFile = tryGetCurrentBallerinaFile(); + const projectRoot = await findBallerinaPackageRoot(currentBallerinaFile); + + let targetPath = projectPath ?? ""; + + if (requiresPackageSelection(workspacePath, webviewType, projectPath, isWebviewOpen, hasActiveTextEditor)) { + const availablePackages = projectInfo?.children.map((child: any) => child.projectPath) ?? []; + const selectedPackage = await selectPackageOrPrompt(availablePackages, promptMessage); + if (!selectedPackage) { + return undefined; + } + targetPath = selectedPackage; + await StateMachine.updateProjectRootAndInfo(selectedPackage, projectInfo); + } else if (projectRoot && projectRoot !== projectPath) { + targetPath = await getCurrentProjectRoot(); + await StateMachine.updateProjectRootAndInfo(targetPath, projectInfo); + } + + return targetPath; +} + /** * Update VS Code context based on TracerMachine state */ diff --git a/workspaces/ballerina/ballerina-extension/src/features/tracing/tracer-machine.ts b/workspaces/ballerina/ballerina-extension/src/features/tracing/tracer-machine.ts index db7143831e9..c9df5c00ec2 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tracing/tracer-machine.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tracing/tracer-machine.ts @@ -55,7 +55,7 @@ export interface TracerMachineContext { serverPid?: number; error?: string; startFailureReason?: string; - workspaceDirs?: string[]; + currentProjectPath?: string; isDisabling?: boolean; traceServer?: TraceServer; taskExecution?: vscode.TaskExecution; @@ -67,62 +67,50 @@ export interface TracerMachineContext { */ function isTraceEnabledInProject(context: TracerMachineContext): Promise<{ isTraceEnabledInProject: boolean }> { return new Promise((resolve) => { - // Check if a file called trace_enabled.bal exists in any workspace dir - const traceEnabled = context.workspaceDirs?.some((workspaceDir) => { - return fs.existsSync(path.join(workspaceDir, 'trace_enabled.bal')); - }) ?? false; - + if (!context.currentProjectPath) { + resolve({ isTraceEnabledInProject: false }); + return; + } + // Check if a file called trace_enabled.bal exists in the current project path + const traceEnabled = fs.existsSync(path.join(context.currentProjectPath, 'trace_enabled.bal')); resolve({ isTraceEnabledInProject: traceEnabled }); }); } function enableTracingInProject(context: TracerMachineContext, event?: any): void { - console.log('enableTracingInProject called with context:', { - workspaceDirs: context.workspaceDirs, - hasWorkspaceDirs: !!context.workspaceDirs, - workspaceDirsLength: context.workspaceDirs?.length || 0 - }); + console.log('enableTracingInProject called with project path:', event?.projectPath); - if (!context.workspaceDirs || context.workspaceDirs.length === 0) { - console.error('enableTracingInProject: No workspace directories provided'); + if (!event?.projectPath) { + console.error('enableTracingInProject: No project path provided'); return; } - context.workspaceDirs.forEach((workspaceDir) => { - try { - const traceFilePath = path.join(workspaceDir, 'trace_enabled.bal'); - fs.writeFileSync(traceFilePath, 'import ballerinax/idetraceprovider as _;'); - - setTracingConfig(workspaceDir); - } catch (error) { - console.error(`Failed to write trace_enabled.bal to ${workspaceDir}:`, error); - } - }); + try { + const traceFilePath = path.join(event.projectPath, 'trace_enabled.bal'); + fs.writeFileSync(traceFilePath, 'import ballerinax/idetraceprovider as _;'); + setTracingConfig(event.projectPath); + } catch (error) { + console.error(`Failed to write trace_enabled.bal to ${event.projectPath}:`, error); + } } function disableTracingInProject(context: TracerMachineContext, event?: any): void { - console.log('disableTracingInProject called with context:', { - workspaceDirs: context.workspaceDirs, - hasWorkspaceDirs: !!context.workspaceDirs, - workspaceDirsLength: context.workspaceDirs?.length || 0 - }); + console.log('disableTracingInProject called with project path:', event?.projectPath); - if (!context.workspaceDirs || context.workspaceDirs.length === 0) { - console.error('disableTracingInProject: No workspace directories provided'); + if (!event?.projectPath) { + console.error('disableTracingInProject: No project path provided'); return; } - context.workspaceDirs.forEach((workspaceDir) => { - try { - const traceFilePath = path.join(workspaceDir, 'trace_enabled.bal'); - if (fs.existsSync(traceFilePath)) { - fs.unlinkSync(traceFilePath); - } - removeTracingConfig(workspaceDir); - } catch (error) { - console.error(`Failed to disable tracing in ${workspaceDir}:`, error); + try { + const traceFilePath = path.join(event.projectPath, 'trace_enabled.bal'); + if (fs.existsSync(traceFilePath)) { + fs.unlinkSync(traceFilePath); } - }); + removeTracingConfig(event.projectPath); + } catch (error) { + console.error(`Failed to disable tracing in ${event.projectPath}:`, error); + } } function startServer(context: TracerMachineContext, event?: any): Thenable { @@ -138,7 +126,7 @@ function stopServer(context: TracerMachineContext, event?: any): Promise { /** * Creates a state machine for managing the tracing server lifecycle */ -function createTracerMachine(workspaceDirs?: string[]) { +function createTracerMachine(projectPath?: string) { return createMachine( { /** @xstate-layout N4IgpgJg5mDOIC5QBcBOBDAxmVBZLAFgJYB2YAxAIIAi1A+gOoDyASgNIDKACpQMICiHANoAGALqJQABwD2sIsiIySkkAA9EARgBM2gMwA6TQBYRANgCsAdgAcFm2e0mANCACeWkVYMBOC3s1NHxsREWMLYzM9AF9o1zQsHHxMYjJyFn5cJgA1fkZWTh4BYXFVWXlFZVUNBB0vAz1g4z0RPWMrYzszVw9a7Vj4jGw8QlIwA1IFcghlcdIANxkAa3GE4eTUuZIFBAWZTHRKklExE7K5BSUVJHVEC00bIwe-MzNNKzM7HsROiwMOqx6SzaGwfXRAgYgNZJUZkCbbZDTWbwxYrAzQkYpMbwnZ7A5HE5CTQSG7lS5VG41d7GAxOczWETaaz+XTfBBmYw+AzWHyaBkWMJ8qyQjEbbGTRE4VAyVAGKQAG0OADMZQBbdFDGFYuES3YkRb4q6E0qki5HapaHyGUG6bQ+XT+EQCvRskIiXyRNpeKyhEQ+MwizWYzYGMAkdAAI3lkHI1AAkhxKAAhAAy-DOpoqVwtCCsugMZh9Zh8rXMVl5xjZmg5ZiMIk0jT8rRemkDiWD2LDkejEHS-AAYhkOAAJDPSM3ZymIWzeHxWyyhPS2dqV9yIRruvkmJdBV5LtvrWHjLtRyAGWA4eY4DjIGRSKQxjgAFUoLCfdA4-BYuRYY5AZPNKdcwsbQCyZUsHEZECbCrRlNAMYxdBsFc-TncIDy1EMTx7c9L2vZB0FQRQSCgJEdX1ZZViDMU4Wws8L1QK9UBvQjiKgPUDUOI1xD-ADJ1AKk-VAwFjFE6xAm0esXTXWpWm8d4QR9RDATMJ0MI7Wjw1PCBcMY-DWNIUipRlOVFWQFVUHVUUj1DLScIYpiWKIwyOP2LjlGNElxyzCkBM8e1-jaMSrAkqTXRCgt-QCRpNHrGd1Jo487PovDUH7dAiB7J8ZCcxEMifFgAE1eInXzblqKJDHLT5nV5VoHDZEt5LzBwrFsBslxsBKbLonSHJwdLMsgbLcr7AriuJc4fOuPyKr0Kr-TsZtYr0BqZK6AsWs5f1PidHxuu1JLuxSvTmIIojHyfJguA-L8fxK6ac0k7RawsecojeyxAhgmT7W8RCQTeCwgbUuIoWonrkr61KbzvKRDLIrZUSo9tEts47odO2H7xcvF3OOHiTW88kZvK57XvevRPvuB42UBf6kPaOSWneA6sKh3THNvHGSPIYzZQVZU1Q1VHIYxzn8Lh3GKMNDzCa8-9StJmpntnJdlOUgVbFdNoEOLDpC0ZODWzB6zDoMCAiFgDHyH4AA5ZM0wekmc2sKs2tAmw7X0HRAjeTo2exS3re0vtB0EUcicVx6gIbeCQrCN4Pdeawft6BsSwMGwSy9v1OmQ4xYjBkgZAgOBVDNzYppdoCAFpNDZFpQK+4xqxBCxgb+wPyIUavANm9o2Vb0CFJsea5zebQPm7o7tL7-jyv8bx-B0K1fSCPk2Q7917RBPwfDa4J+lNiHzd6iWzrhyB57Kmp7D+Fe7RaUIN4sRqve5cxdwCUwQv2k-RZnw5v1M6BkSI32Voge0jxCwbytNWSwwRGrBAQkhJ0QQC5WAsDPdG2kL6DSyjlc6yAIE5m3H8dqLQsHZycFPV0xZfBITHlTSSXscHnxAbla+mYa6zQeI4MCApORMlWiFNOiBQTwVHn4NoNhYp2nYcAmG3N4bgJ4f3MmQIuQcidP4FkIkdZ-G-sCcI5YAg4ODhjUhQFn4GFaHUVuC5VrIXdkELO2d5FWnuH4Iu0QgA */ @@ -149,23 +137,11 @@ function createTracerMachine(workspaceDirs?: string[]) { serverPid: undefined, error: undefined, startFailureReason: undefined, - workspaceDirs: workspaceDirs || [], + currentProjectPath: projectPath, isDisabling: false, taskExecution: undefined, taskTerminationListener: undefined }, - on: { - ADD_WORKSPACES: { - actions: assign({ - workspaceDirs: (context, event) => [...context.workspaceDirs, (event as any).workspaceDir], - }), - }, - REMOVE_WORKSPACES: { - actions: assign({ - workspaceDirs: (context, event) => context.workspaceDirs.filter((dir) => dir !== (event as any).workspaceDir), - }), - }, - }, states: { /** * Initial state when the tracer machine is first created @@ -234,6 +210,9 @@ function createTracerMachine(workspaceDirs?: string[]) { target: 'disabled', actions: [ disableTracingInProject, + assign({ + currentProjectPath: undefined, + }), ], }, ], @@ -409,7 +388,12 @@ function createTracerMachine(workspaceDirs?: string[]) { on: { ENABLE: { target: 'enabled', - actions: enableTracingInProject, + actions: [ + enableTracingInProject, + assign({ + currentProjectPath: (context, event) => (event as any).projectPath, + }) + ] }, REFRESH: { target: 'init', @@ -454,21 +438,12 @@ export const TracerMachine = { /** * Create and start the tracer machine with workspace directories */ - initialize: (workspaceDirs?: string[]) => { - const machine = createTracerMachine(workspaceDirs); + initialize: (projectPath?: string) => { + const machine = createTracerMachine(projectPath); tracerService = interpret(machine) as ReturnType; tracerService.start(); }, - addWorkspace: (workspaceDir: string) => { - ensureInitialized().send({ type: 'ADD_WORKSPACES' }, { workspaceDir }); - }, - - removeWorkspace: (workspaceDir: string) => { - ensureInitialized().send({ type: 'REMOVE_WORKSPACES' }, { workspaceDir }); - }, - - isEnabled: () => { const value = ensureInitialized().getSnapshot().value; if (typeof value === 'string') { @@ -508,20 +483,20 @@ export const TracerMachine = { ensureInitialized().send({ type: 'STOP_SERVER' }); }, - enable: () => { - ensureInitialized().send({ type: 'ENABLE' }); + enable: (projectPath: string) => { + ensureInitialized().send({ type: 'ENABLE', projectPath } as any); }, - disable: () => { - ensureInitialized().send({ type: 'DISABLE' }); + disable: (projectPath: string) => { + ensureInitialized().send({ type: 'DISABLE', projectPath } as any); }, - refresh: (workspaceDirs?: string[]) => { + refresh: (projectPath?: string) => { const snapshot = ensureInitialized().getSnapshot(); const context = snapshot.context as TracerMachineContext; - const currentWorkspaceDirs = context.workspaceDirs || []; - const updatedWorkspaceDirs = workspaceDirs || currentWorkspaceDirs; - const machine = createTracerMachine(updatedWorkspaceDirs); + const currentProjectPath = context.currentProjectPath; + const updatedProjectPath = projectPath || currentProjectPath; + const machine = createTracerMachine(updatedProjectPath); tracerService = interpret(machine) as ReturnType; tracerService.start(); }, diff --git a/workspaces/ballerina/ballerina-extension/src/features/tryit/activator.ts b/workspaces/ballerina/ballerina-extension/src/features/tryit/activator.ts index 0dbd81a42cd..1752037dcd2 100644 --- a/workspaces/ballerina/ballerina-extension/src/features/tryit/activator.ts +++ b/workspaces/ballerina/ballerina-extension/src/features/tryit/activator.ts @@ -33,6 +33,7 @@ import { openView, StateMachine } from "../../stateMachine"; import { getCurrentProjectRoot } from "../../utils/project-utils"; import { requiresPackageSelection, selectPackageOrPrompt } from "../../utils/command-utils"; import { VisualizerWebview } from "../../views/visualizer/webview"; +import { TracerMachine } from "../tracing"; // File constants const FILE_NAMES = { @@ -43,6 +44,14 @@ const FILE_NAMES = { let errorLogWatcher: FileSystemWatcher | undefined; +// Store session IDs by chat endpoint to maintain sessions across reopenings +const chatSessionMap: Map = new Map(); + +// Export a function to update the session ID for an endpoint (used when clearing chat) +export function updateChatSessionId(endpoint: string, newSessionId: string): void { + chatSessionMap.set(endpoint, newSessionId); +} + export function activateTryItCommand(ballerinaExtInstance: BallerinaExtension) { try { clientManager.setClient(ballerinaExtInstance.langClient); @@ -71,13 +80,17 @@ async function openTryItView(withNotice: boolean = false, resourceMetadata?: Res } const projectAndServices = await getProjectPathAndServices(serviceMetadata, filePath); - + if (!projectAndServices) { return; } const { projectPath, services } = projectAndServices; + // Check if service is already running BEFORE we potentially start it + // This will be used to determine if we should reuse the session ID for AI Agent service + const wasServiceAlreadyRunning = await isServiceAlreadyRunning(projectPath); + if (withNotice) { const selection = await vscode.window.showInformationMessage( `${services.length} service${services.length === 1 ? '' : 's'} found in the integration. Test with Try It Client?`, @@ -167,10 +180,13 @@ async function openTryItView(withNotice: boolean = false, resourceMetadata?: Res await openMcpInspector(serviceUrl); } else { + // AI Agent service - start the tracing server if enabled + TracerMachine.startServer(); + const selectedPort: number = await getServicePort(projectPath, selectedService); selectedService.port = selectedPort; - await openChatView(selectedService.basePath, selectedPort.toString()); + await openChatView(selectedService.basePath, selectedPort.toString(), wasServiceAlreadyRunning); } // Setup the error log watcher @@ -203,7 +219,7 @@ async function openInSplitView(fileUri: vscode.Uri, editorType: string = 'defaul } } -async function openChatView(basePath: string, port: string) { +async function openChatView(basePath: string, port: string, wasServiceAlreadyRunning: boolean) { try { const baseUrl = `http://localhost:${port}`; const chatPath = "chat"; @@ -212,14 +228,35 @@ async function openChatView(basePath: string, port: string) { const cleanedServiceEp = serviceEp.pathname.replace(/\/$/, '') + "/" + chatPath.replace(/^\//, ''); const chatEp = new URL(cleanedServiceEp, serviceEp.origin); - const sessionId = uuidv4(); + const chatEndpoint = chatEp.href; + + let sessionId: string; + + if (!wasServiceAlreadyRunning) { + // Service was just started - generate a new session ID for a fresh start + sessionId = uuidv4(); + chatSessionMap.set(chatEndpoint, sessionId); + } else { + // Service was already running - reuse existing session ID if available, or create new + sessionId = chatSessionMap.get(chatEndpoint) || uuidv4(); + chatSessionMap.set(chatEndpoint, sessionId); + } - commands.executeCommand("ballerina.open.agent.chat", { chatEp: chatEp.href, chatSessionId: sessionId }); + commands.executeCommand("ballerina.open.agent.chat", { chatEp: chatEndpoint, chatSessionId: sessionId }); } catch (error) { vscode.window.showErrorMessage(`Failed to call Chat-Agent: ${error}`); } } +async function isServiceAlreadyRunning(projectDir: string): Promise { + try { + const balProcesses = await findRunningBallerinaProcesses(projectDir); + return balProcesses && balProcesses.length > 0; + } catch (error) { + return false; + } +} + async function openMcpInspector(serverUrl: string) { const extensionId = 'wso2.mcp-server-inspector'; diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-handler.ts index b2fd21add3b..b92592eb749 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-handler.ts @@ -23,7 +23,10 @@ import { getChatMessage, getTracingStatus, showTraceView, - TraceInput + TraceInput, + getChatHistory, + clearChatHistory, + getAgentStatus } from "@wso2/ballerina-core"; import { Messenger } from "vscode-messenger"; import { AgentChatRpcManager } from "./rpc-manager"; @@ -34,4 +37,7 @@ export function registerAgentChatRpcHandlers(messenger: Messenger) { messenger.onNotification(abortChatRequest, () => rpcManger.abortChatRequest()); messenger.onRequest(getTracingStatus, () => rpcManger.getTracingStatus()); messenger.onNotification(showTraceView, (args: TraceInput) => rpcManger.showTraceView(args)); + messenger.onRequest(getChatHistory, () => rpcManger.getChatHistory()); + messenger.onRequest(clearChatHistory, () => rpcManger.clearChatHistory()); + messenger.onRequest(getAgentStatus, () => rpcManger.getAgentStatus()); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts index 635f82f4b3c..031e10b92eb 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/agent-chat/rpc-manager.ts @@ -21,16 +21,26 @@ import { ChatReqMessage, ChatRespMessage, TraceInput, - TraceStatus + TraceStatus, + ChatHistoryMessage, + ChatHistoryResponse, + AgentStatusResponse, + ClearChatResponse } from "@wso2/ballerina-core"; import * as vscode from 'vscode'; import { extension } from '../../BalExtensionContext'; import { TracerMachine, TraceServer } from "../../features/tracing"; import { TraceDetailsWebview } from "../../features/tracing/trace-details-webview"; import { Trace } from "../../features/tracing/trace-server"; +import { v4 as uuidv4 } from "uuid"; +import { updateChatSessionId } from "../../features/tryit/activator"; export class AgentChatRpcManager implements AgentChatAPI { private currentAbortController: AbortController | null = null; + // Store chat history per session ID + private static chatHistoryMap: Map = new Map(); + // Track active sessions + private static activeSessions: Set = new Set(); async getChatMessage(params: ChatReqMessage): Promise { return new Promise(async (resolve, reject) => { @@ -42,18 +52,63 @@ export class AgentChatRpcManager implements AgentChatAPI { throw new Error('Invalid Agent Chat Context: Missing or incorrect ChatEP or ChatSessionID!'); } + // Store user message in history + const sessionId = extension.agentChatContext.chatSessionId; + // Mark session as active when first message is sent + AgentChatRpcManager.activeSessions.add(sessionId); + + this.addMessageToHistory(sessionId, { + type: 'message', + text: params.message, + isUser: true + }); + this.currentAbortController = new AbortController(); + + const payload = { sessionId: extension.agentChatContext.chatSessionId, ...params }; + console.log('[Agent Chat] Sending message with session ID:', payload.sessionId); + const response = await this.fetchTestData( extension.agentChatContext.chatEp, - { sessionId: extension.agentChatContext.chatSessionId, ...params }, + payload, this.currentAbortController.signal ); if (response && response.message) { - resolve(response as ChatRespMessage); + // Find trace and extract tool calls and execution steps + const trace = this.findTraceForMessage(params.message); + + const chatResponse: ChatRespMessage = { + message: response.message + }; + + // Store agent response in history + this.addMessageToHistory(sessionId, { + type: 'message', + text: response.message, + isUser: false, + traceId: trace?.traceId + }); + + resolve(chatResponse); } else { reject(new Error("Invalid response format:", response)); } } catch (error) { + // Store error message in history + const errorMessage = + error && typeof error === "object" && "message" in error + ? String(error.message) + : "An unknown error occurred"; + + const sessionId = extension.agentChatContext?.chatSessionId; + if (sessionId) { + this.addMessageToHistory(sessionId, { + type: 'error', + text: errorMessage, + isUser: false + }); + } + reject(error); } finally { this.currentAbortController = null; @@ -61,7 +116,14 @@ export class AgentChatRpcManager implements AgentChatAPI { }); } - async abortChatRequest(): Promise { + private addMessageToHistory(sessionId: string, message: ChatHistoryMessage): void { + if (!AgentChatRpcManager.chatHistoryMap.has(sessionId)) { + AgentChatRpcManager.chatHistoryMap.set(sessionId, []); + } + AgentChatRpcManager.chatHistoryMap.get(sessionId)!.push(message); + } + + abortChatRequest(): void { if (this.currentAbortController) { this.currentAbortController.abort(); this.currentAbortController = null; @@ -232,4 +294,69 @@ export class AgentChatRpcManager implements AgentChatAPI { async showTraceView(params: TraceInput): Promise { await this.showTraceDetailsForMessage(params.message); } + + async getChatHistory(): Promise { + return new Promise(async (resolve) => { + const sessionId = extension.agentChatContext?.chatSessionId; + + if (!sessionId) { + resolve({ + messages: [], + isAgentRunning: false + }); + return; + } + + // Session is considered "running" if it's in the active sessions set + const isAgentRunning = AgentChatRpcManager.activeSessions.has(sessionId); + const messages = AgentChatRpcManager.chatHistoryMap.get(sessionId) || []; + + resolve({ + messages, + isAgentRunning + }); + }); + } + + async clearChatHistory(): Promise { + return new Promise(async (resolve) => { + const oldSessionId = extension.agentChatContext?.chatSessionId; + if (oldSessionId) { + // Clear the old session's history and mark it as inactive + AgentChatRpcManager.chatHistoryMap.delete(oldSessionId); + AgentChatRpcManager.activeSessions.delete(oldSessionId); + } + + // Generate a new session ID + const newSessionId = uuidv4(); + + // Update the agent chat context with the new session ID + if (extension.agentChatContext) { + extension.agentChatContext.chatSessionId = newSessionId; + + // Mark the new session as active + AgentChatRpcManager.activeSessions.add(newSessionId); + + // Update the activator's chatSessionMap with the new session ID + const chatEp = extension.agentChatContext.chatEp; + if (chatEp) { + updateChatSessionId(chatEp, newSessionId); + } + } + + resolve({ + newSessionId + }); + }); + } + + async getAgentStatus(): Promise { + return new Promise(async (resolve) => { + const sessionId = extension.agentChatContext?.chatSessionId; + const isRunning = sessionId ? AgentChatRpcManager.activeSessions.has(sessionId) : false; + resolve({ + isRunning + }); + }); + } } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/repair-utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/repair-utils.ts index b9d3bfbf54b..d9d3ffe0272 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/repair-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/repair-utils.ts @@ -43,14 +43,23 @@ export async function attemptRepairProject(langClient: ExtendedLangClient, tempD return projectDiags; } -export async function checkProjectDiagnostics(langClient: ExtendedLangClient, tempDir: string): Promise { +export async function checkProjectDiagnostics(langClient: ExtendedLangClient, tempDir: string, isAISchema: boolean = false): Promise { const allDiags: Diagnostics[] = []; + let projectUri = Uri.file(tempDir).toString(); + if (isAISchema) { + projectUri = Uri.file(tempDir).with({ scheme: 'ai' }).toString(); + } + console.log("Getting project diagnostics for URI:", projectUri); let response: ProjectDiagnosticsResponse = await langClient.getProjectDiagnostics({ projectRootIdentifier: { - uri: Uri.file(tempDir).toString() + uri: projectUri } }); - if (!response.errorDiagnosticMap || Object.keys(response.errorDiagnosticMap).length === 0) { + if (!response.errorDiagnosticMap) { + throw new Error("Internal error while getting diagnostics from language server"); + } + + if (Object.keys(response.errorDiagnosticMap).length === 0) { return []; } for (const [filePath, diagnostics] of Object.entries(response.errorDiagnosticMap)) { @@ -83,31 +92,17 @@ export async function isModuleNotFoundDiagsExist(diagnosticsResult: Diagnostics[ // Process each unique diagnostic only once let projectModified = false; for (const [_, { uri }] of uniqueDiagnosticMap.entries()) { - const dependenciesResponse = await langClient.resolveMissingDependencies({ + const dependenciesResponse = await langClient.resolveModuleDependencies({ documentIdentifier: { uri: uri } }); - const response = dependenciesResponse as SyntaxTree; - if (response.parseSuccess) { - // Read and save content to a string - const sourceFile = await workspace.openTextDocument(Uri.parse(uri)); - const content = sourceFile.getText(); - - langClient.didOpen({ - textDocument: { - uri: uri, - languageId: 'ballerina', - version: 1, - text: content - } - }); - projectModified = true; - } else { - console.log("Module resolving failed for uri: " + uri + " with response: " + JSON.stringify(response) + "\n" + uniqueDiagnosticMap + "\n"); - throw Error("Module resolving failed"); + const response = dependenciesResponse; + if (!response.success) { + throw new Error("Module resolving failed"); } + projectModified = true; } return projectModified; @@ -347,8 +342,6 @@ export async function addCheckExpressionErrors( continue; } - const astModifications: STModification[] = []; - // Process each diagnostic individually for (const diagnostic of checkExprDiagnostics) { try { @@ -372,7 +365,6 @@ export async function addCheckExpressionErrors( } // Find the action that adds error to return type - // The language server typically provides actions like "Change return type to ..." const action = codeActions.find( action => action.title && ( action.title.toLowerCase().includes("change") && @@ -387,9 +379,10 @@ export async function addCheckExpressionErrors( const docEdit = action.edit.documentChanges[0] as TextDocumentEdit; - // Process all edits from the code action - for (const edit of docEdit.edits) { - astModifications.push({ + // Apply modifications to syntax tree + const syntaxTree = await langClient.stModify({ + documentIdentifier: { uri: docEdit.textDocument.uri }, + astModifications: docEdit.edits.map(edit => ({ startLine: edit.range.start.line, startColumn: edit.range.start.character, endLine: edit.range.end.line, @@ -397,31 +390,22 @@ export async function addCheckExpressionErrors( type: "INSERT", isImport: false, config: { STATEMENT: edit.newText } - }); + })) + }); + + // Update file content + const { source } = syntaxTree as SyntaxTree; + if (!source) { + // Handle the case where source is undefined, when compiler issue occurs + return false; } + const absolutePath = fileURLToPath(fileUri); + writeBallerinaFileDidOpenTemp(absolutePath, source); + projectModified = true; } catch (err) { console.warn(`Could not apply code action for ${fileUri} at line ${diagnostic.range.start.line}:`, err); } } - - // Apply modifications to syntax tree - if (astModifications.length > 0) { - const syntaxTree = await langClient.stModify({ - documentIdentifier: { uri: fileUri }, - astModifications: astModifications - }); - - // Update file content - const { source } = syntaxTree as SyntaxTree; - if (!source) { - // Handle the case where source is undefined, when compiler issue occurs - return false; - } - const absolutePath = fileURLToPath(fileUri); - writeBallerinaFileDidOpenTemp(absolutePath, source); - projectModified = true; - } } - return projectModified; } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/rpc-handler.ts index 16dabff26cc..06868551057 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/rpc-handler.ts @@ -19,80 +19,66 @@ */ import { abortAIGeneration, - abortTestGeneration, - addChatSummary, + AbortAIGenerationRequest, + acceptChanges, addFilesToProject, AddFilesToProjectRequest, - AIChatSummary, - applyDoOnFailBlocks, - checkSyntaxError, + AIPanelPrompt, + approvePlan, + approveTask, + ApproveTaskRequest, + cancelConnectorSpec, + clearChat, clearInitialPrompt, + ConnectorSpecCancelRequest, + ConnectorSpecRequest, createTestDirecoryIfNotExists, - deleteFromProject, - DeleteFromProjectRequest, - DeveloperDocument, + declineChanges, + declinePlan, + declineTask, DocGenerationRequest, - fetchData, - FetchDataRequest, - generateCode, - GenerateCodeRequest, + generateAgent, + GenerateAgentCodeRequest, generateContextTypes, - generateFunctionTests, - generateHealthcareCode, generateInlineMappingCode, generateMappingCode, generateOpenAPI, GenerateOpenAPIRequest, - generateTestPlan, - getAccessToken, + getActiveTempDir, getAIMachineSnapshot, - getBackendUrl, + getChatMessages, + getCheckpoints, getDefaultPrompt, getDriftDiagnosticContents, - getFileExists, getFromDocumentation, - getFromFile, - GetFromFileRequest, getGeneratedDocumentation, - getGeneratedTests, getLoginMethod, - getProjectUuid, - getRefreshedAccessToken, - getRelevantLibrariesAndFunctions, - getResourceMethodAndPaths, - getResourceSourceForMethodAndPath, + getSemanticDiff, + getAffectedPackages, + isWorkspaceProject, getServiceNames, - getServiceSourceForName, - getShadowDiagnostics, - getTestDiagnostics, - handleChatSummaryError, isCopilotSignedIn, - isNaturalProgrammingDirectoryExists, - isRequirementsSpecificationFileExist, + isPlanModeFeatureEnabled, isUserAuthenticated, markAlertShown, MetadataWithAttachments, + openAIPanel, openChatWindowWithCommand, - postProcess, - PostProcessRequest, + PlanApprovalRequest, ProcessContextTypeCreationRequest, ProcessMappingParametersRequest, - ProjectSource, promptGithubAuthorize, - promptWSO2AILogout, - readDeveloperMdFile, - RelevantLibrariesAndFunctionsRequest, - repairGeneratedCode, - RepairParams, + provideConnectorSpec, RequirementSpecification, + restoreCheckpoint, + RestoreCheckpointRequest, + SemanticDiffRequest, showSignInAlert, submitFeedback, SubmitFeedbackRequest, - TestGenerationRequest, - TestGenerationResponse, - TestGeneratorIntermediaryState, - TestPlanGenerationRequest, - updateDevelopmentDocument, + TaskDeclineRequest, + updateChatMessage, + UpdateChatMessageRequest, updateRequirementSpecification } from "@wso2/ballerina-core"; import { Messenger } from "vscode-messenger"; @@ -100,58 +86,47 @@ import { AiPanelRpcManager } from "./rpc-manager"; export function registerAiPanelRpcHandlers(messenger: Messenger) { const rpcManger = new AiPanelRpcManager(); - messenger.onRequest(getBackendUrl, () => rpcManger.getBackendUrl()); - messenger.onRequest(getProjectUuid, () => rpcManger.getProjectUuid()); messenger.onRequest(getLoginMethod, () => rpcManger.getLoginMethod()); - messenger.onRequest(getAccessToken, () => rpcManger.getAccessToken()); - messenger.onRequest(getRefreshedAccessToken, () => rpcManger.getRefreshedAccessToken()); messenger.onRequest(getDefaultPrompt, () => rpcManger.getDefaultPrompt()); messenger.onRequest(getAIMachineSnapshot, () => rpcManger.getAIMachineSnapshot()); - messenger.onRequest(fetchData, (args: FetchDataRequest) => rpcManger.fetchData(args)); - messenger.onRequest(getFromFile, (args: GetFromFileRequest) => rpcManger.getFromFile(args)); - messenger.onRequest(getFileExists, (args: GetFromFileRequest) => rpcManger.getFileExists(args)); - messenger.onNotification(deleteFromProject, (args: DeleteFromProjectRequest) => rpcManger.deleteFromProject(args)); - messenger.onRequest(getShadowDiagnostics, (args: ProjectSource) => rpcManger.getShadowDiagnostics(args)); - messenger.onRequest(checkSyntaxError, (args: ProjectSource) => rpcManger.checkSyntaxError(args)); messenger.onNotification(clearInitialPrompt, () => rpcManger.clearInitialPrompt()); - messenger.onRequest(openChatWindowWithCommand, () => rpcManger.openChatWindowWithCommand()); - messenger.onRequest(generateContextTypes, (args: ProcessContextTypeCreationRequest) => rpcManger.generateContextTypes(args)); - messenger.onRequest(generateMappingCode, (args: ProcessMappingParametersRequest) => rpcManger.generateMappingCode(args)); - messenger.onRequest(generateInlineMappingCode, (args: MetadataWithAttachments) => rpcManger.generateInlineMappingCode(args)); - messenger.onRequest(getGeneratedTests, (args: TestGenerationRequest) => rpcManger.getGeneratedTests(args)); - messenger.onRequest(getTestDiagnostics, (args: TestGenerationResponse) => rpcManger.getTestDiagnostics(args)); - messenger.onRequest(getServiceSourceForName, (args: string) => rpcManger.getServiceSourceForName(args)); - messenger.onRequest(getResourceSourceForMethodAndPath, (args: string) => rpcManger.getResourceSourceForMethodAndPath(args)); + messenger.onNotification(openChatWindowWithCommand, () => rpcManger.openChatWindowWithCommand()); + messenger.onNotification(generateContextTypes, (args: ProcessContextTypeCreationRequest) => rpcManger.generateContextTypes(args)); + messenger.onNotification(generateMappingCode, (args: ProcessMappingParametersRequest) => rpcManger.generateMappingCode(args)); + messenger.onNotification(generateInlineMappingCode, (args: MetadataWithAttachments) => rpcManger.generateInlineMappingCode(args)); messenger.onRequest(getServiceNames, () => rpcManger.getServiceNames()); - messenger.onRequest(getResourceMethodAndPaths, () => rpcManger.getResourceMethodAndPaths()); - messenger.onNotification(abortTestGeneration, () => rpcManger.abortTestGeneration()); - messenger.onNotification(applyDoOnFailBlocks, () => rpcManger.applyDoOnFailBlocks()); - messenger.onRequest(postProcess, (args: PostProcessRequest) => rpcManger.postProcess(args)); messenger.onRequest(promptGithubAuthorize, () => rpcManger.promptGithubAuthorize()); - messenger.onRequest(promptWSO2AILogout, () => rpcManger.promptWSO2AILogout()); messenger.onRequest(isCopilotSignedIn, () => rpcManger.isCopilotSignedIn()); messenger.onRequest(showSignInAlert, () => rpcManger.showSignInAlert()); messenger.onNotification(markAlertShown, () => rpcManger.markAlertShown()); messenger.onRequest(getFromDocumentation, (args: string) => rpcManger.getFromDocumentation(args)); - messenger.onRequest(isRequirementsSpecificationFileExist, (args: string) => rpcManger.isRequirementsSpecificationFileExist(args)); - messenger.onRequest(getDriftDiagnosticContents, (args: string) => rpcManger.getDriftDiagnosticContents(args)); - messenger.onRequest(addChatSummary, (args: AIChatSummary) => rpcManger.addChatSummary(args)); - messenger.onNotification(handleChatSummaryError, (args: string) => rpcManger.handleChatSummaryError(args)); - messenger.onRequest(isNaturalProgrammingDirectoryExists, (args: string) => rpcManger.isNaturalProgrammingDirectoryExists(args)); - messenger.onRequest(readDeveloperMdFile, (args: string) => rpcManger.readDeveloperMdFile(args)); - messenger.onNotification(updateDevelopmentDocument, (args: DeveloperDocument) => rpcManger.updateDevelopmentDocument(args)); + messenger.onRequest(getDriftDiagnosticContents, () => rpcManger.getDriftDiagnosticContents()); messenger.onNotification(updateRequirementSpecification, (args: RequirementSpecification) => rpcManger.updateRequirementSpecification(args)); - messenger.onNotification(createTestDirecoryIfNotExists, (args: string) => rpcManger.createTestDirecoryIfNotExists(args)); + messenger.onNotification(createTestDirecoryIfNotExists, () => rpcManger.createTestDirecoryIfNotExists()); messenger.onRequest(submitFeedback, (args: SubmitFeedbackRequest) => rpcManger.submitFeedback(args)); - messenger.onRequest(getRelevantLibrariesAndFunctions, (args: RelevantLibrariesAndFunctionsRequest) => rpcManger.getRelevantLibrariesAndFunctions(args)); messenger.onNotification(generateOpenAPI, (args: GenerateOpenAPIRequest) => rpcManger.generateOpenAPI(args)); - messenger.onNotification(generateCode, (args: GenerateCodeRequest) => rpcManger.generateCode(args)); - messenger.onNotification(repairGeneratedCode, (args: RepairParams) => rpcManger.repairGeneratedCode(args)); - messenger.onNotification(generateTestPlan, (args: TestPlanGenerationRequest) => rpcManger.generateTestPlan(args)); - messenger.onNotification(generateFunctionTests, (args: TestGeneratorIntermediaryState) => rpcManger.generateFunctionTests(args)); - messenger.onNotification(generateHealthcareCode, (args: GenerateCodeRequest) => rpcManger.generateHealthcareCode(args)); - messenger.onNotification(abortAIGeneration, () => rpcManger.abortAIGeneration()); - messenger.onNotification(getGeneratedDocumentation, (args: DocGenerationRequest) => rpcManger.getGeneratedDocumentation(args)); + messenger.onRequest(generateAgent, (args: GenerateAgentCodeRequest) => rpcManger.generateAgent(args)); + messenger.onNotification(abortAIGeneration, (args: AbortAIGenerationRequest) => rpcManger.abortAIGeneration(args)); + messenger.onRequest(getGeneratedDocumentation, (args: DocGenerationRequest) => rpcManger.getGeneratedDocumentation(args)); messenger.onRequest(addFilesToProject, (args: AddFilesToProjectRequest) => rpcManger.addFilesToProject(args)); messenger.onRequest(isUserAuthenticated, () => rpcManger.isUserAuthenticated()); + messenger.onRequest(openAIPanel, (args: AIPanelPrompt) => rpcManger.openAIPanel(args)); + messenger.onRequest(isPlanModeFeatureEnabled, () => rpcManger.isPlanModeFeatureEnabled()); + messenger.onRequest(getSemanticDiff, (args: SemanticDiffRequest) => rpcManger.getSemanticDiff(args)); + messenger.onRequest(getAffectedPackages, () => rpcManger.getAffectedPackages()); + messenger.onRequest(isWorkspaceProject, () => rpcManger.isWorkspaceProject()); + messenger.onRequest(acceptChanges, () => rpcManger.acceptChanges()); + messenger.onRequest(declineChanges, () => rpcManger.declineChanges()); + messenger.onRequest(approvePlan, (args: PlanApprovalRequest) => rpcManger.approvePlan(args)); + messenger.onRequest(declinePlan, (args: PlanApprovalRequest) => rpcManger.declinePlan(args)); + messenger.onRequest(approveTask, (args: ApproveTaskRequest) => rpcManger.approveTask(args)); + messenger.onRequest(declineTask, (args: TaskDeclineRequest) => rpcManger.declineTask(args)); + messenger.onRequest(provideConnectorSpec, (args: ConnectorSpecRequest) => rpcManger.provideConnectorSpec(args)); + messenger.onRequest(cancelConnectorSpec, (args: ConnectorSpecCancelRequest) => rpcManger.cancelConnectorSpec(args)); + messenger.onRequest(getChatMessages, () => rpcManger.getChatMessages()); + messenger.onRequest(getCheckpoints, () => rpcManger.getCheckpoints()); + messenger.onRequest(restoreCheckpoint, (args: RestoreCheckpointRequest) => rpcManger.restoreCheckpoint(args)); + messenger.onRequest(clearChat, () => rpcManger.clearChat()); + messenger.onRequest(updateChatMessage, (args: UpdateChatMessageRequest) => rpcManger.updateChatMessage(args)); + messenger.onRequest(getActiveTempDir, () => rpcManger.getActiveTempDir()); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/rpc-manager.ts index 96f82979f3e..9b46f21f63c 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/rpc-manager.ts @@ -14,135 +14,74 @@ * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * + * * THIS FILE INCLUDES AUTO GENERATED CODE */ import { - AIChatSummary, AIMachineSnapshot, AIPanelAPI, AIPanelPrompt, + AbortAIGenerationRequest, AddFilesToProjectRequest, - BIIntelSecrets, - BIModuleNodesRequest, - BISourceCodeResponse, - DeleteFromProjectRequest, - DeveloperDocument, - DiagnosticEntry, - Diagnostics, + CheckpointInfo, + Command, DocGenerationRequest, - FetchDataRequest, - FetchDataResponse, - GenerateCodeRequest, + GenerateAgentCodeRequest, GenerateOpenAPIRequest, - GetFromFileRequest, GetModuleDirParams, LLMDiagnostics, LoginMethod, MetadataWithAttachments, - OperationType, - PackageTomlValues, - PostProcessRequest, - PostProcessResponse, ProcessContextTypeCreationRequest, ProcessMappingParametersRequest, - ProjectDiagnostics, - ProjectModule, - ProjectSource, - RelevantLibrariesAndFunctionsRequest, - RelevantLibrariesAndFunctionsResponse, - RepairParams, RequirementSpecification, - SourceFile, + RestoreCheckpointRequest, + SemanticDiffRequest, + SemanticDiffResponse, SubmitFeedbackRequest, TestGenerationMentions, - TestGenerationRequest, - TestGenerationResponse, - TestGeneratorIntermediaryState, - TestPlanGenerationRequest + UIChatMessage, + UpdateChatMessageRequest } from "@wso2/ballerina-core"; -import * as crypto from 'crypto'; import * as fs from 'fs'; -import * as os from 'os'; import path from "path"; -import { parse } from "@iarna/toml"; -import { workspace } from 'vscode'; +import { extensions, workspace } from 'vscode'; +import { URI } from "vscode-uri"; import { isNumber } from "lodash"; -import { ExtendedLangClient } from "src/core"; -import { fetchWithAuth } from "../../../src/features/ai/service/connection"; -import { generateContextTypes, generateInlineMappingCode, generateMappingCode, openChatWindowWithCommand } from "../../../src/features/ai/service/datamapper/datamapper"; -import { generateOpenAPISpec } from "../../../src/features/ai/service/openapi/openapi"; -import { AIStateMachine } from "../../../src/views/ai-panel/aiMachine"; +import { getServiceDeclarationNames } from "../../../src/features/ai/documentation/utils"; +import { AIStateMachine, openAIPanelWithPrompt } from "../../../src/views/ai-panel/aiMachine"; +import { checkToken } from "../../../src/views/ai-panel/utils"; import { extension } from "../../BalExtensionContext"; -import { generateCode, triggerGeneratedCodeRepair } from "../../features/ai/service/code/code"; -import { generateDocumentationForService } from "../../features/ai/service/documentation/doc_generator"; -import { generateHealthcareCode } from "../../features/ai/service/healthcare/healthcare"; -import { selectRequiredFunctions } from "../../features/ai/service/libs/funcs"; -import { GenerationType, getSelectedLibraries } from "../../features/ai/service/libs/libs"; -import { Library } from "../../features/ai/service/libs/libs_types"; -import { generateFunctionTests } from "../../features/ai/service/test/function_tests"; -import { generateTestPlan } from "../../features/ai/service/test/test_plan"; -import { generateTest, getDiagnostics, getResourceAccessorDef, getResourceAccessorNames, getServiceDeclaration, getServiceDeclarationNames } from "../../features/ai/testGenerator"; -import { OLD_BACKEND_URL, closeAllBallerinaFiles } from "../../features/ai/utils"; -import { getLLMDiagnosticArrayAsString, handleChatSummaryFailure } from "../../features/natural-programming/utils"; +import { openChatWindowWithCommand } from "../../features/ai/data-mapper/index"; +import { generateDocumentationForService } from "../../features/ai/documentation/generator"; +import { generateOpenAPISpec } from "../../features/ai/openapi/index"; +import { OLD_BACKEND_URL } from "../../features/ai/utils"; +import { fetchWithAuth } from "../../features/ai/utils/ai-client"; +import { getLLMDiagnosticArrayAsString } from "../../features/natural-programming/utils"; import { StateMachine, updateView } from "../../stateMachine"; -import { getAccessToken, getLoginMethod, getRefreshedAccessToken, loginGithubCopilot } from "../../utils/ai/auth"; -import { writeBallerinaFileDidOpen, writeBallerinaFileDidOpenTemp } from "../../utils/modification"; -import { updateSourceCode } from "../../utils/source-utils"; +import { getLoginMethod, loginGithubCopilot } from "../../utils/ai/auth"; +import { normalizeCodeContext } from "../../views/ai-panel/codeContextUtils"; import { refreshDataMapper } from "../data-mapper/utils"; -import { buildProjectsStructure } from "../../utils/project-artifacts"; import { - DEVELOPMENT_DOCUMENT, - NATURAL_PROGRAMMING_DIR_NAME, REQUIREMENT_DOC_PREFIX, - REQUIREMENT_MD_DOCUMENT, - REQUIREMENT_TEXT_DOCUMENT, - REQ_KEY, TEST_DIR_NAME + TEST_DIR_NAME } from "./constants"; -import { attemptRepairProject, checkProjectDiagnostics } from "./repair-utils"; -import { AIPanelAbortController, addToIntegration, cleanDiagnosticMessages, isErrorCode, requirementsSpecification, searchDocumentation } from "./utils"; -import { fetchData } from "./utils/fetch-data-utils"; -import { checkToken } from "../../../src/views/ai-panel/utils"; -import { getWorkspaceTomlValues } from "./../../../src/utils/config"; -export class AiPanelRpcManager implements AIPanelAPI { - - // ================================== - // General Functions - // ================================== - async getBackendUrl(): Promise { - return new Promise(async (resolve) => { - resolve(OLD_BACKEND_URL); - }); - } +import { addToIntegration, cleanDiagnosticMessages, searchDocumentation } from "./utils"; + +import { onHideReviewActions } from '@wso2/ballerina-core'; +import { createExecutionContextFromStateMachine, createExecutorConfig, generateAgent } from '../../features/ai/agent/index'; +import { integrateCodeToWorkspace } from "../../features/ai/agent/utils"; +import { ContextTypesExecutor } from '../../features/ai/executors/datamapper/ContextTypesExecutor'; +import { FunctionMappingExecutor } from '../../features/ai/executors/datamapper/FunctionMappingExecutor'; +import { InlineMappingExecutor } from '../../features/ai/executors/datamapper/InlineMappingExecutor'; +import { approvalManager } from '../../features/ai/state/ApprovalManager'; +import { cleanupTempProject } from "../../features/ai/utils/project/temp-project"; +import { RPCLayer } from '../../RPCLayer'; +import { chatStateStorage } from '../../views/ai-panel/chatStateStorage'; +import { restoreWorkspaceSnapshot } from '../../views/ai-panel/checkpoint/checkpointUtils'; +import { WI_EXTENSION_ID } from "../../features/ai/constants"; - async getProjectUuid(): Promise { - return new Promise(async (resolve) => { - // Check if there is at least one workspace folder - if (!workspace.workspaceFolders || workspace.workspaceFolders.length === 0) { - resolve(""); - return; - } - - try { - let projectIdentifier: string; - const cloudProjectId = process.env.CLOUD_INITIAL_PROJECT_ID; - - if (cloudProjectId) { - projectIdentifier = cloudProjectId; - } else { - projectIdentifier = workspace.workspaceFolders[0].uri.fsPath; - } - - const hash = crypto.createHash('sha256') - .update(projectIdentifier) - .digest('hex'); - - resolve(hash); - } catch (error) { - resolve(""); - } - }); - } +export class AiPanelRpcManager implements AIPanelAPI { async getLoginMethod(): Promise { return new Promise(async (resolve) => { @@ -151,33 +90,17 @@ export class AiPanelRpcManager implements AIPanelAPI { }); } - async getAccessToken(): Promise { - return new Promise(async (resolve, reject) => { - try { - const credentials = await getAccessToken(); - - if (!credentials) { - reject(new Error("Access Token is undefined")); - return; - } - const secrets = credentials.secrets as BIIntelSecrets; - const accessToken = secrets.accessToken; - resolve(accessToken); - } catch (error) { - reject(error); - } - }); - } - - async getRefreshedAccessToken(): Promise { - return new Promise(async (resolve) => { - const token = await getRefreshedAccessToken(); - resolve(token); - }); - } - async getDefaultPrompt(): Promise { - const defaultPrompt = extension.aiChatDefaultPrompt; + let defaultPrompt: AIPanelPrompt = extension.aiChatDefaultPrompt; + + // Normalize code context to use relative paths + if (defaultPrompt && 'codeContext' in defaultPrompt && defaultPrompt.codeContext) { + defaultPrompt = { + ...defaultPrompt, + codeContext: normalizeCodeContext(defaultPrompt.codeContext) + }; + } + return new Promise((resolve) => { resolve(defaultPrompt); }); @@ -190,168 +113,10 @@ export class AiPanelRpcManager implements AIPanelAPI { }; } - async fetchData(params: FetchDataRequest): Promise { - return { - response: await fetchData(params.url, params.options) - }; - } - - async getFromFile(req: GetFromFileRequest): Promise { - let projectPath = StateMachine.context().projectPath; - const workspacePath = StateMachine.context().workspacePath; - if (workspacePath) { - projectPath = workspacePath; - } - const ballerinaProjectFile = path.join(projectPath, 'Ballerina.toml'); - if (!fs.existsSync(ballerinaProjectFile)) { - throw new Error("Not a Ballerina project."); - } - - const balFilePath = path.join(projectPath, req.filePath); - try { - const content = await fs.promises.readFile(balFilePath, 'utf-8'); - return content; - } catch (error) { - throw error; - } - } - - async deleteFromProject(req: DeleteFromProjectRequest): Promise { - let projectPath = StateMachine.context().projectPath; - const workspacePath = StateMachine.context().workspacePath; - if (workspacePath) { - projectPath = workspacePath; - } - const ballerinaProjectFile = path.join(projectPath, 'Ballerina.toml'); - if (!fs.existsSync(ballerinaProjectFile)) { - throw new Error("Not a Ballerina project."); - } - - const balFilePath = path.join(projectPath, req.filePath); - if (fs.existsSync(balFilePath)) { - try { - fs.unlinkSync(balFilePath); - } catch (err) { - throw new Error("Could not delete the file."); - } - } else { - throw new Error("File does not exist."); - } - - await new Promise(resolve => setTimeout(resolve, 1000)); - updateView(); - } - - async getFileExists(req: GetFromFileRequest): Promise { - const projectPath = StateMachine.context().projectPath; - const ballerinaProjectFile = path.join(projectPath, 'Ballerina.toml'); - if (!fs.existsSync(ballerinaProjectFile)) { - throw new Error("Not a Ballerina project."); - } - - const balFilePath = path.join(projectPath, req.filePath); - if (fs.existsSync(balFilePath)) { - return true; - } - return false; - } - - async getShadowDiagnostics(project: ProjectSource): Promise { - const environment = await setupProjectEnvironment(project); - if (!environment) { - return { diagnostics: [] }; - } - - const { langClient, tempDir } = environment; - let remainingDiags: Diagnostics[] = await attemptRepairProject(langClient, tempDir); - const filteredDiags: DiagnosticEntry[] = getErrorDiagnostics(remainingDiags); - await closeAllBallerinaFiles(tempDir); - return { - diagnostics: filteredDiags - }; - } - async clearInitialPrompt(): Promise { extension.aiChatDefaultPrompt = undefined; } - async checkSyntaxError(project: ProjectSource): Promise { - const environment = await setupProjectEnvironment(project); - if (!environment) { - return false; - } - - const { langClient, tempDir } = environment; - // check project diagnostics - const projectDiags: Diagnostics[] = await checkProjectDiagnostics(langClient, tempDir); - await closeAllBallerinaFiles(tempDir); - for (const diagnostic of projectDiags) { - for (const diag of diagnostic.diagnostics) { - console.log(diag.code); - if (typeof diag.code === "string" && diag.code.startsWith("BCE")) { - const match = diag.code.match(/^BCE(\d+)$/); - if (match) { - const codeNumber = Number(match[1]); - if (codeNumber < 2000) { - return true; - } - } - } - } - } - - return false; - } - - async getGeneratedTests(params: TestGenerationRequest): Promise { - return new Promise(async (resolve, reject) => { - try { - const projectPath = StateMachine.context().projectPath; - - const generatedTests = await generateTest(projectPath, params, AIPanelAbortController.getInstance()); - resolve(generatedTests); - } catch (error) { - reject(error); - } - }); - } - - async getTestDiagnostics(params: TestGenerationResponse): Promise { - return new Promise(async (resolve, reject) => { - try { - const projectPath = StateMachine.context().projectPath; - const diagnostics = await getDiagnostics(projectPath, params); - resolve(diagnostics); - } catch (error) { - reject(error); - } - }); - } - - async getServiceSourceForName(params: string): Promise { - return new Promise(async (resolve, reject) => { - try { - const projectPath = StateMachine.context().projectPath; - const { serviceDeclaration } = await getServiceDeclaration(projectPath, params); - resolve(serviceDeclaration.source); - } catch (error) { - reject(error); - } - }); - } - - async getResourceSourceForMethodAndPath(params: string): Promise { - return new Promise(async (resolve, reject) => { - try { - const projectPath = StateMachine.context().projectPath; - const { resourceAccessorDef } = await getResourceAccessorDef(projectPath, params); - resolve(resourceAccessorDef.source); - } catch (error) { - reject(error); - } - }); - } - async getServiceNames(): Promise { return new Promise(async (resolve, reject) => { try { @@ -366,62 +131,6 @@ export class AiPanelRpcManager implements AIPanelAPI { }); } - async getResourceMethodAndPaths(): Promise { - return new Promise(async (resolve, reject) => { - try { - const projectPath = StateMachine.context().projectPath; - const resourceAccessorNames = await getResourceAccessorNames(projectPath); - resolve({ - mentions: resourceAccessorNames - }); - } catch (error) { - reject(error); - } - }); - } - - async abortTestGeneration(): Promise { - AIPanelAbortController.getInstance().abort(); - } - - async postProcess(req: PostProcessRequest): Promise { - return await postProcess(req); - } - - async applyDoOnFailBlocks(): Promise { - const projectPath = StateMachine.context().projectPath; - - if (!projectPath) { - return null; - } - - const balFiles: string[] = []; - - const findBalFiles = (dir: string) => { - const files = fs.readdirSync(dir); - for (const file of files) { - const filePath = path.join(dir, file); - const stat = fs.statSync(filePath); - if (stat.isDirectory()) { - findBalFiles(filePath); - } else if (file.endsWith('.bal')) { - balFiles.push(filePath); - } - } - }; - - findBalFiles(projectPath); - - for (const balFile of balFiles) { - const req: BIModuleNodesRequest = { - filePath: balFile - }; - - const resp: BISourceCodeResponse = await StateMachine.langClient().addErrorHandler(req); - await updateSourceCode({ textEdits: resp.textEdits, description: 'Error Handler Creation' }); - } - } - async getFromDocumentation(content: string): Promise { return new Promise(async (resolve, reject) => { try { @@ -439,11 +148,6 @@ export class AiPanelRpcManager implements AIPanelAPI { // return true; } - async promptWSO2AILogout(): Promise { - // ADD YOUR IMPLEMENTATION HERE - throw new Error('Not implemented'); - } - async isCopilotSignedIn(): Promise { const token = await extension.context.secrets.get('GITHUB_COPILOT_TOKEN'); if (token && token !== '') { @@ -453,73 +157,38 @@ export class AiPanelRpcManager implements AIPanelAPI { } async showSignInAlert(): Promise { - const resp = await extension.context.secrets.get('LOGIN_ALERT_SHOWN'); - if (resp === 'true') { + // Don't show alert in WI environment (WSO2 Integrator extension is installed) + const isInWI = !!extensions.getExtension(WI_EXTENSION_ID); + if (isInWI) { return false; } - const isWso2Signed = await this.isCopilotSignedIn(); - if (isWso2Signed) { + // Don't show alert in Devant environment + const isInDevant = !!process.env.CLOUD_STS_TOKEN; + if (isInDevant) { return false; } - return true; - } - async markAlertShown(): Promise { - await extension.context.secrets.store('LOGIN_ALERT_SHOWN', 'true'); - } - - async isRequirementsSpecificationFileExist(filePath: string): Promise { - const dirPath = path.join(filePath, NATURAL_PROGRAMMING_DIR_NAME); - - if (!fs.existsSync(dirPath) || !fs.lstatSync(dirPath).isDirectory()) { - return false; // Directory doesn't exist or isn't a folder + // Check if alert was already dismissed + const resp = await extension.context.secrets.get('LOGIN_ALERT_SHOWN'); + if (resp === 'true') { + return false; } - const files = fs.readdirSync(dirPath); - return Promise.resolve(files.some(file => file.toLowerCase().startsWith(REQUIREMENT_DOC_PREFIX))); - } - - async addChatSummary(filepathAndSummary: AIChatSummary): Promise { - const filepath = filepathAndSummary.filepath; - var summaryResponse = filepathAndSummary.summary; - - const summaryJson: SummaryResponse = JSON.parse(summaryResponse); - let summary = summaryJson.summary; - - const naturalProgrammingDirectory = path.join(filepath, NATURAL_PROGRAMMING_DIR_NAME); - - if (!fs.existsSync(naturalProgrammingDirectory)) { + const isWso2Signed = await this.isCopilotSignedIn(); + if (isWso2Signed) { return false; } - const developerMdPath = path.join(naturalProgrammingDirectory, DEVELOPMENT_DOCUMENT); - fs.writeFileSync(developerMdPath, summary, 'utf8'); return true; } - async readDeveloperMdFile(directoryPath: string): Promise { - const developerMdPath = path.join(directoryPath, NATURAL_PROGRAMMING_DIR_NAME, DEVELOPMENT_DOCUMENT); - if (!fs.existsSync(developerMdPath)) { - return ""; - } - - let developerMdContent = fs.readFileSync(developerMdPath, 'utf8'); - return Promise.resolve(developerMdContent); - } - - async updateDevelopmentDocument(developerDocument: DeveloperDocument) { - const projectPath = developerDocument.filepath; - const content = developerDocument.content; - - const developerMdPath = path.join(projectPath, NATURAL_PROGRAMMING_DIR_NAME, DEVELOPMENT_DOCUMENT); - if (fs.existsSync(developerMdPath)) { - fs.writeFileSync(developerMdPath, content, 'utf8'); - } + async markAlertShown(): Promise { + await extension.context.secrets.store('LOGIN_ALERT_SHOWN', 'true'); } async updateRequirementSpecification(requirementsSpecification: RequirementSpecification) { - const naturalProgrammingDir = path.join(requirementsSpecification.filepath, 'natural-programming'); + const naturalProgrammingDir = path.join(StateMachine.context().projectPath, 'natural-programming'); const requirementsFilePath = path.join(naturalProgrammingDir, 'requirements.txt'); // Create the 'natural-programming' directory if it doesn't exist @@ -531,8 +200,8 @@ export class AiPanelRpcManager implements AIPanelAPI { fs.writeFileSync(requirementsFilePath, requirementsSpecification.content, 'utf8'); } - async getDriftDiagnosticContents(projectPath: string): Promise { - const result = await getLLMDiagnosticArrayAsString(projectPath); + async getDriftDiagnosticContents(): Promise { + const result = await getLLMDiagnosticArrayAsString(StateMachine.context().projectPath); if (isNumber(result)) { return { statusCode: result, @@ -546,25 +215,13 @@ export class AiPanelRpcManager implements AIPanelAPI { }; } - async createTestDirecoryIfNotExists(directoryPath: string) { - const testDirName = path.join(directoryPath, TEST_DIR_NAME); + async createTestDirecoryIfNotExists() { + const testDirName = path.join(StateMachine.context().projectPath, TEST_DIR_NAME); if (!fs.existsSync(testDirName)) { fs.mkdirSync(testDirName, { recursive: true }); // Add recursive: true } } - async handleChatSummaryError(message: string): Promise { - return handleChatSummaryFailure(message); - } - - async isNaturalProgrammingDirectoryExists(projectPath: string): Promise { - const dirPath = path.join(projectPath, NATURAL_PROGRAMMING_DIR_NAME); - if (!fs.existsSync(dirPath) || !fs.lstatSync(dirPath).isDirectory()) { - return false; // Directory doesn't exist or isn't a folder - } - return true; - } - async getModuleDirectory(params: GetModuleDirParams): Promise { return new Promise((resolve) => { const projectFsPath = params.filePath; @@ -609,40 +266,21 @@ export class AiPanelRpcManager implements AIPanelAPI { }); } - async getRelevantLibrariesAndFunctions(params: RelevantLibrariesAndFunctionsRequest): Promise { - const selectedLibs: string[] = await getSelectedLibraries(params.query, GenerationType.CODE_GENERATION); - const relevantTrimmedFuncs: Library[] = await selectRequiredFunctions(params.query, selectedLibs, GenerationType.CODE_GENERATION); - return { - libraries: relevantTrimmedFuncs - }; - } - async generateOpenAPI(params: GenerateOpenAPIRequest): Promise { await generateOpenAPISpec(params); } - async generateCode(params: GenerateCodeRequest): Promise { - await generateCode(params); - } + async abortAIGeneration(params: AbortAIGenerationRequest): Promise { + const workspaceId = params?.workspaceId || StateMachine.context().projectPath; + const threadId = params?.threadId || 'default'; - async repairGeneratedCode(params: RepairParams): Promise { - await triggerGeneratedCodeRepair(params); - } + const aborted = chatStateStorage.abortActiveExecution(workspaceId, threadId); - async generateTestPlan(params: TestPlanGenerationRequest): Promise { - await generateTestPlan(params); - } - - async generateFunctionTests(params: TestGeneratorIntermediaryState): Promise { - await generateFunctionTests(params); - } - - async generateHealthcareCode(params: GenerateCodeRequest): Promise { - await generateHealthcareCode(params); - } - - async abortAIGeneration(): Promise { - AIPanelAbortController.getInstance().abort(); + if (aborted) { + console.log(`[RPC] Aborted execution for workspace=${workspaceId}, thread=${threadId}`); + } else { + console.warn(`[RPC] No active execution found for workspace=${workspaceId}, thread=${threadId}`); + } } async getGeneratedDocumentation(params: DocGenerationRequest): Promise { @@ -687,15 +325,51 @@ export class AiPanelRpcManager implements AIPanelAPI { } async generateMappingCode(params: ProcessMappingParametersRequest): Promise { - await generateMappingCode(params); + try { + // Create config using factory function + const config = createExecutorConfig(params, { + command: Command.DataMap, + chatStorageEnabled: true, // Enable chat storage for checkpoint support + cleanupStrategy: 'immediate', // DataMapper uses immediate cleanup, + }); + + await new FunctionMappingExecutor(config).run(); + } catch (error) { + console.error('[RPC Manager] Error in generateMappingCode:', error); + throw error; + } } async generateInlineMappingCode(params: MetadataWithAttachments): Promise { - await generateInlineMappingCode(params); + try { + // Create config using factory function + const config = createExecutorConfig(params, { + command: Command.DataMap, + chatStorageEnabled: true, // Enable chat storage for checkpoint support + cleanupStrategy: 'immediate' // DataMapper uses immediate cleanup + }); + + await new InlineMappingExecutor(config).run(); + } catch (error) { + console.error('[RPC Manager] Error in generateInlineMappingCode:', error); + throw error; + } } async generateContextTypes(params: ProcessContextTypeCreationRequest): Promise { - await generateContextTypes(params); + try { + // Create config using factory function + const config = createExecutorConfig(params, { + command: Command.TypeCreator, + chatStorageEnabled: true, // Enable chat storage for checkpoint support + cleanupStrategy: 'immediate' // DataMapper uses immediate cleanup + }); + + await new ContextTypesExecutor(config).run(); + } catch (error) { + console.error('[RPC Manager] Error in generateContextTypes:', error); + throw error; + } } async openChatWindowWithCommand(): Promise { @@ -710,300 +384,328 @@ export class AiPanelRpcManager implements AIPanelAPI { return false; } } -} + async generateAgent(params: GenerateAgentCodeRequest): Promise { + return await generateAgent(params); + } -interface SummaryResponse { - summary: string; -} + async openAIPanel(params: AIPanelPrompt): Promise { + openAIPanelWithPrompt(params); + } -interface BalModification { - fileUri: string; - moduleName: string; -} + async isPlanModeFeatureEnabled(): Promise { + const config = workspace.getConfiguration('ballerina'); + return config.get('ai.planMode', false); + } -async function setupProjectEnvironment(project: ProjectSource): Promise<{ langClient: ExtendedLangClient, tempDir: string } | null> { - //TODO: Move this to LS - let projectPath = StateMachine.context().projectPath; - const workspacePath = StateMachine.context().workspacePath; - if (workspacePath) { - projectPath = workspacePath; - } - if (!projectPath) { - return null; - } - - const randomNum = Math.floor(Math.random() * 90000) + 10000; - const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), `bal-proj-${randomNum}-`)); - fs.cpSync(projectPath, tempDir, { recursive: true }); - //Copy project - const langClient = StateMachine.langClient(); - //Apply edits - for (const sourceFile of project.sourceFiles) { - // Update lastUpdatedBalFile if it's a .bal file - if (sourceFile.filePath.endsWith('.bal')) { - const tempFilePath = path.join(tempDir, sourceFile.filePath); - writeBallerinaFileDidOpenTemp(tempFilePath, sourceFile.content); + async getSemanticDiff(params: SemanticDiffRequest): Promise { + const context = StateMachine.context(); + console.log(">>> requesting semantic diff from ls", JSON.stringify(params)); + try { + const res: SemanticDiffResponse = await context.langClient.getSemanticDiff(params); + console.log(">>> semantic diff response from ls", JSON.stringify(res)); + return res; + } catch (error) { + console.log(">>> error in getting semantic diff", error); + return undefined; } } - return { langClient, tempDir }; -} - + async getAffectedPackages(): Promise { + // Get workspace ID and thread ID + const ctx = createExecutionContextFromStateMachine(); + const workspaceId = ctx.projectPath; + const threadId = 'default'; -function getErrorDiagnostics(diagnostics: Diagnostics[]): DiagnosticEntry[] { - const errorDiagnostics: DiagnosticEntry[] = []; + // Get the LATEST under_review generation (not the first one) + const thread = chatStateStorage.getOrCreateThread(workspaceId, threadId); + const underReviewGenerations = thread.generations.filter( + g => g.reviewState.status === 'under_review' + ); - for (const diagParam of diagnostics) { - for (const diag of diagParam.diagnostics) { - if (diag.severity === 1) { - const fileName = path.basename(diagParam.uri); - const msgPrefix = `[${fileName}:${diag.range.start.line},${diag.range.start.character}:${diag.range.end.line},${diag.range.end.character}] `; - errorDiagnostics.push({ - code: diag.code.toString(), - message: msgPrefix + diag.message - }); - } + if (underReviewGenerations.length === 0) { + console.log(">>> No pending review generation, returning empty affected packages"); + return []; } + + // Return packages from the LATEST under_review generation + const latestReview = underReviewGenerations[underReviewGenerations.length - 1]; + const affectedPackages = latestReview.reviewState.affectedPackagePaths || []; + console.log(`>>> Returning ${affectedPackages.length} affected packages from generation ${latestReview.id}:`, affectedPackages); + return affectedPackages; } - return errorDiagnostics; -} + async isWorkspaceProject(): Promise { + const context = StateMachine.context(); + const isWorkspace = context.projectInfo?.projectKind === 'WORKSPACE_PROJECT'; + console.log(`>>> isWorkspaceProject: ${isWorkspace}`); + return isWorkspace; + } -interface BallerinaProject { - projectName: string; - modules?: BallerinaModule[]; - sources: { [key: string]: string }; -} + async acceptChanges(): Promise { + try { + // Get workspace ID and thread ID + const ctx = createExecutionContextFromStateMachine(); + const workspaceId = ctx.projectPath; + const threadId = 'default'; + + // Get ALL under_review generations + const thread = chatStateStorage.getOrCreateThread(workspaceId, threadId); + const underReviewGenerations = thread.generations.filter( + g => g.reviewState.status === 'under_review' + ); + + if (underReviewGenerations.length === 0) { + console.warn("[Review Actions] No pending review generation found for accept"); + return; + } -interface BallerinaModule { - moduleName: string; - sources: { [key: string]: string }; - isGenerated: boolean; -} + // Get LATEST generation for integration + const latestReview = underReviewGenerations[underReviewGenerations.length - 1]; + console.log(`[Review Actions] Accepting generation ${latestReview.id} with ${latestReview.reviewState.modifiedFiles.length} modified file(s)`); + + // Integrate LATEST generation's code to workspace + if (latestReview.reviewState.modifiedFiles.length > 0) { + const modifiedFilesSet = new Set(latestReview.reviewState.modifiedFiles); + await integrateCodeToWorkspace( + latestReview.reviewState.tempProjectPath!, + modifiedFilesSet, + ctx + ); + console.log(`[Review Actions] Integrated ${latestReview.reviewState.modifiedFiles.length} file(s) to workspace`); + } -enum CodeGenerationType { - CODE_FOR_USER_REQUIREMENT = "CODE_FOR_USER_REQUIREMENT", - TESTS_FOR_USER_REQUIREMENT = "TESTS_FOR_USER_REQUIREMENT", - CODE_GENERATION = "CODE_GENERATION" -} + // Cleanup ALL under_review temp projects (prevents memory leak) + if (!process.env.AI_TEST_ENV) { + for (const generation of underReviewGenerations) { + if (generation.reviewState.tempProjectPath) { + await cleanupTempProject(generation.reviewState.tempProjectPath); + } + } + } -async function getCurrentProjectSource(requestType: OperationType, projectPath?: string): Promise { - const targetProjectPath = projectPath || StateMachine.context().projectPath; - if (!targetProjectPath) { - return null; - } + // Mark ALL under_review generations as accepted + chatStateStorage.acceptAllReviews(workspaceId, threadId); + console.log("[Review Actions] Marked all under_review generations as accepted"); - // Read the Ballerina.toml file to get package name - const ballerinaTomlPath = path.join(targetProjectPath, 'Ballerina.toml'); - let packageName; - if (fs.existsSync(ballerinaTomlPath)) { - const tomlContent = await fs.promises.readFile(ballerinaTomlPath, 'utf-8'); - // Simple parsing to extract the package.name field - try { - const tomlObj = parse(tomlContent) as Partial; - packageName = tomlObj?.package?.name; + // Clear affectedPackagePaths from all completed reviews to prevent stale data + for (const generation of underReviewGenerations) { + chatStateStorage.updateReviewState(workspaceId, threadId, generation.id, { + affectedPackagePaths: [] + }); + } + console.log("[Review Actions] Cleared affected packages from accepted generations"); + + // Notify AI panel webview to hide review actions + RPCLayer._messenger.sendNotification(onHideReviewActions, { + type: 'webview', + webviewType: 'ballerina.ai-panel' + }); } catch (error) { - packageName = ''; + console.error("[Review Actions] Error accepting changes:", error); + throw error; } } - const project: BallerinaProject = { - modules: [], - sources: {}, - projectName: packageName - }; + async declineChanges(): Promise { + try { + // Get workspace ID and thread ID + const ctx = createExecutionContextFromStateMachine(); + const workspaceId = ctx.projectPath; + const threadId = 'default'; + + // Get ALL under_review generations + const thread = chatStateStorage.getOrCreateThread(workspaceId, threadId); + const underReviewGenerations = thread.generations.filter( + g => g.reviewState.status === 'under_review' + ); + + if (underReviewGenerations.length === 0) { + console.warn("[Review Actions] No pending review generation found for decline"); + return; + } - // Read root-level .bal files - const rootFiles = fs.readdirSync(targetProjectPath); - for (const file of rootFiles) { - if (file.endsWith('.bal') || file.toLowerCase() === "readme.md") { - const filePath = path.join(targetProjectPath, file); - project.sources[file] = await fs.promises.readFile(filePath, 'utf-8'); - } - } + console.log(`[Review Actions] Declining ${underReviewGenerations.length} generation(s)`); - if (requestType != "CODE_GENERATION") { - const naturalProgrammingDirectory = targetProjectPath + `/${NATURAL_PROGRAMMING_DIR_NAME}`; - if (fs.existsSync(naturalProgrammingDirectory)) { - const reqFiles = fs.readdirSync(naturalProgrammingDirectory); - for (const file of reqFiles) { - const filePath = path.join(targetProjectPath, `${NATURAL_PROGRAMMING_DIR_NAME}`, file); - if (file.toLowerCase() == REQUIREMENT_TEXT_DOCUMENT || file.toLowerCase() == REQUIREMENT_MD_DOCUMENT) { - project.sources[REQ_KEY] = await fs.promises.readFile(filePath, 'utf-8'); - continue; - } else if (file.toLowerCase().startsWith(REQUIREMENT_DOC_PREFIX)) { - const requirements = await requirementsSpecification(filePath); - if (!isErrorCode(requirements)) { - project.sources[REQ_KEY] = requirements.toString(); - continue; + // Cleanup ALL under_review temp projects (prevents memory leak) + if (!process.env.AI_TEST_ENV) { + for (const generation of underReviewGenerations) { + if (generation.reviewState.tempProjectPath) { + await cleanupTempProject(generation.reviewState.tempProjectPath); } - project.sources[REQ_KEY] = ""; } } + + // Mark ALL under_review generations as error/declined + chatStateStorage.declineAllReviews(workspaceId, threadId); + console.log("[Review Actions] Marked all under_review generations as declined"); + + // Clear affectedPackagePaths from all completed reviews to prevent stale data + for (const generation of underReviewGenerations) { + chatStateStorage.updateReviewState(workspaceId, threadId, generation.id, { + affectedPackagePaths: [] + }); + } + console.log("[Review Actions] Cleared affected packages from declined generations"); + + // Notify AI panel webview to hide review actions + RPCLayer._messenger.sendNotification(onHideReviewActions, { + type: 'webview', + webviewType: 'ballerina.ai-panel' + }); + } catch (error) { + console.error("[Review Actions] Error declining changes:", error); + throw error; } } - // Read modules - const modulesDir = path.join(targetProjectPath, 'modules'); - const generatedDir = path.join(targetProjectPath, 'generated'); - await populateModules(modulesDir, project); - await populateModules(generatedDir, project); - return project; -} + async approvePlan(params: { requestId: string; comment?: string }): Promise { + approvalManager.resolvePlanApproval(params.requestId, true, params.comment); + } -async function populateModules(modulesDir: string, project: BallerinaProject) { - if (fs.existsSync(modulesDir)) { - const modules = fs.readdirSync(modulesDir, { withFileTypes: true }); - for (const moduleDir of modules) { - if (moduleDir.isDirectory()) { - const module: BallerinaModule = { - moduleName: moduleDir.name, - sources: {}, - isGenerated: path.basename(modulesDir) !== 'modules' - }; + async declinePlan(params: { requestId: string; comment?: string }): Promise { + approvalManager.resolvePlanApproval(params.requestId, false, params.comment); + } - const moduleFiles = fs.readdirSync(path.join(modulesDir, moduleDir.name)); - for (const file of moduleFiles) { - if (file.endsWith('.bal')) { - const filePath = path.join(modulesDir, moduleDir.name, file); - module.sources[file] = await fs.promises.readFile(filePath, 'utf-8'); - } - } + async approveTask(params: { requestId: string; approvedTaskDescription?: string }): Promise { + approvalManager.resolveTaskApproval(params.requestId, true, undefined, params.approvedTaskDescription); + } - project.modules.push(module); - } - } + async declineTask(params: { requestId: string; comment?: string }): Promise { + approvalManager.resolveTaskApproval(params.requestId, false, params.comment); } -} -export async function postProcess(req: PostProcessRequest): Promise { - // Fix import statement format - const processedSourceFiles = req.sourceFiles.map(sf => ({ - ...sf, - content: sf.content.replace(/import ballerinax\/client\.config/g, "import ballerinax/'client.config") - })); - - const project: ProjectSource = { - sourceFiles: processedSourceFiles, - projectName: "", - packagePath: "", - isActive: true - }; - - const environment = await setupProjectEnvironment(project); - if (!environment) { - return { sourceFiles: processedSourceFiles, diagnostics: { diagnostics: [] } }; - } - - let { langClient, tempDir } = environment; - let remainingDiags: Diagnostics[] = []; - if (StateMachine.context().workspacePath) { - // this is a workspace project - // assign active project path to tempDir - const projectTempDir = path.join(tempDir, path.basename(StateMachine.context().projectPath)); - remainingDiags = await attemptRepairProject(langClient, projectTempDir); - } else { - remainingDiags = await attemptRepairProject(langClient, tempDir); - } - - const filteredDiags: DiagnosticEntry[] = getErrorDiagnostics(remainingDiags); - - // Read repaired files from temp directory - const repairedSourceFiles = []; - for (const sourceFile of project.sourceFiles) { - const newContentPath = path.join(tempDir, sourceFile.filePath); - if (!fs.existsSync(newContentPath) && !(sourceFile.filePath.endsWith('.bal'))) { - repairedSourceFiles.push({ filePath: sourceFile.filePath, content: sourceFile.content }); - continue; - } - repairedSourceFiles.push({ filePath: sourceFile.filePath, content: fs.readFileSync(newContentPath, 'utf-8') }); + async provideConnectorSpec(params: { requestId: string; spec: any }): Promise { + approvalManager.resolveConnectorSpec(params.requestId, true, params.spec); } - await closeAllBallerinaFiles(tempDir); - return { - sourceFiles: repairedSourceFiles, - diagnostics: { - diagnostics: filteredDiags + async cancelConnectorSpec(params: { requestId: string; comment?: string }): Promise { + approvalManager.resolveConnectorSpec(params.requestId, false, undefined, params.comment); + } + + async restoreCheckpoint(params: RestoreCheckpointRequest): Promise { + // Get workspace and thread identifiers + const workspaceId = StateMachine.context().projectPath; + const threadId = 'default'; + + // Find the checkpoint + const found = chatStateStorage.findCheckpoint(workspaceId, threadId, params.checkpointId); + + if (!found) { + throw new Error(`Checkpoint ${params.checkpointId} not found`); } - }; -} -function convertToProjectSource(project: BallerinaProject, pkgPath: string, isActive: boolean): ProjectSource { - const projectSource: ProjectSource = { - sourceFiles: [], - projectModules: [], - projectName: project.projectName, - packagePath: pkgPath, - isActive: isActive - }; - - // Iterate through root-level sources - for (const [filePath, content] of Object.entries(project.sources)) { - projectSource.sourceFiles.push({ filePath, content }); - } - - // Iterate through module sources - if (project.modules) { - for (const module of project.modules) { - const projectModule: ProjectModule = { - moduleName: module.moduleName, - sourceFiles: [], - isGenerated: module.isGenerated - }; - for (const [fileName, content] of Object.entries(module.sources)) { - projectModule.sourceFiles.push({ filePath: fileName, content }); - } - projectSource.projectModules.push(projectModule); + const { checkpoint } = found; + + // 1. Restore workspace files from checkpoint snapshot + await restoreWorkspaceSnapshot(checkpoint); + + // 2. Truncate thread history to this checkpoint + const restored = chatStateStorage.restoreThreadToCheckpoint( + workspaceId, + threadId, + params.checkpointId + ); + + if (!restored) { + throw new Error('Failed to restore thread to checkpoint'); } } - return projectSource; -} + async clearChat(): Promise { + // Get workspace identifier + const workspaceId = StateMachine.context().projectPath; -export async function getProjectSource(requestType: OperationType): Promise { - const context = StateMachine.context(); - const currentProjectPath = context.projectPath; - const workspacePath = context.workspacePath; + // Clear the workspace (all threads) + await chatStateStorage.clearWorkspace(workspaceId); - // Early return for non-workspace case: single project only - if (!workspacePath) { - const project = await getCurrentProjectSource(requestType); - // No workspace context, so packagePath is empty string - return [convertToProjectSource(project, "", true)]; + console.log(`[RPC] Cleared chat for workspace: ${workspaceId}`); } - // Workspace case: load all packages from the workspace - const workspaceTomlValues = await getWorkspaceTomlValues(workspacePath); + async updateChatMessage(params: UpdateChatMessageRequest): Promise { + const workspaceId = StateMachine.context().projectPath; + const threadId = 'default'; + + // The messageId is actually a generation ID + // This is called when streaming completes to save the final UI-formatted response + const generation = chatStateStorage.getGeneration(workspaceId, threadId, params.messageId); + + if (!generation) { + console.warn(`[RPC] Generation ${params.messageId} not found in thread ${threadId}`); + return; + } + + // Update the UI response with the final formatted content + chatStateStorage.updateGeneration(workspaceId, threadId, params.messageId, { + uiResponse: params.content + }); - // Fallback to single project if workspace.toml is invalid or has no packages - if (!workspaceTomlValues || !workspaceTomlValues.workspace || !workspaceTomlValues.workspace.packages) { - const project = await getCurrentProjectSource(requestType); - // Workspace exists but invalid, treat as non-workspace - return [convertToProjectSource(project, "", true)]; + console.log(`[RPC] Updated generation ${params.messageId} UI response`); + } + + async getChatMessages(): Promise { + const ctx = StateMachine.context(); + const workspaceId = ctx.projectPath; + const threadId = 'default'; + + // Get all generations from chat storage + const generations = chatStateStorage.getGenerations(workspaceId, threadId); + + // Convert generations to UI messages format + const uiMessages: UIChatMessage[] = []; + for (const generation of generations) { + // Add user message + uiMessages.push({ + role: 'user', + content: generation.userPrompt, + checkpointId: generation.checkpoint?.id, + messageId: generation.id + }); + + // Add assistant message if available + if (generation.uiResponse) { + uiMessages.push({ + role: 'assistant', + content: generation.uiResponse, + messageId: generation.id + }); + } + } + + return uiMessages; } - const packagePaths = StateMachine.context().projectInfo?.children.map(child => child.projectPath); + async getCheckpoints(): Promise { + const ctx = StateMachine.context(); + const workspaceId = ctx.projectPath; + const threadId = 'default'; - // Load all packages in parallel - const projectSources: ProjectSource[] = await Promise.all( - packagePaths.map(async (pkgPath) => { - // Resolve the full path for reading files and checking if active - const fullPackagePath = path.isAbsolute(pkgPath) - ? pkgPath - : path.join(workspacePath, pkgPath); + // Get checkpoints from ChatStateStorage + const checkpoints = chatStateStorage.getCheckpoints(workspaceId, threadId); - const project = await getCurrentProjectSource(requestType, fullPackagePath); - const isActive = fullPackagePath === currentProjectPath; + // Convert to CheckpointInfo format + return checkpoints.map(cp => ({ + id: cp.id, + messageId: cp.messageId, + timestamp: cp.timestamp, + snapshotSize: cp.snapshotSize + })); + } - // Use relative path from workspace for packagePath - const relativePackagePath = path.isAbsolute(pkgPath) - ? path.relative(workspacePath, pkgPath) - : pkgPath; + async getActiveTempDir(): Promise { + const context = StateMachine.context(); + const workspaceId = context.projectPath; + const threadId = 'default'; - return convertToProjectSource(project, relativePackagePath, isActive); - }) - ); + // Always get tempProjectPath from active generation in chatStateStorage + const pendingReview = chatStateStorage.getPendingReviewGeneration(workspaceId, threadId); + if (!pendingReview || !pendingReview.reviewState.tempProjectPath) { + console.log(">>> no pending review or temp project path found for semantic diff"); + return undefined; + } - return projectSources; + const projectPath = pendingReview.reviewState.tempProjectPath; + console.log(">>> active temp project path", projectPath); + return projectPath; + } } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/utils.ts index 2b67b5bf780..537ae35582c 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/ai-panel/utils.ts @@ -22,13 +22,15 @@ import { Position, Range, Uri, workspace, WorkspaceEdit } from 'vscode'; import path from "path"; import * as fs from 'fs'; import { AIChatError } from "./utils/errors"; -import { processDataMapperInput } from "../../../src/features/ai/service/datamapper/context_api"; -import { DataMapperRequest, DataMapperResponse, FileData, RepairedMappings } from "../../../src/features/ai/service/datamapper/types"; -import { getAskResponse } from "../../../src/features/ai/service/ask/ask"; +import { processDataMapperInput } from "../../features/ai/data-mapper/context-api"; +import { DataMapperRequest, DataMapperResponse, FileData, RepairedMappings } from "../../features/ai/data-mapper/types"; +import { getAskResponse } from "../../features/ai/ask/index"; import { MappingFileRecord} from "./types"; -import { generateAutoMappings, generateRepairCode } from "../../../src/features/ai/service/datamapper/datamapper"; +import { generateAutoMappings, generateRepairCode } from "../../features/ai/data-mapper/index"; import { ArtifactNotificationHandler, ArtifactsUpdated } from "../../utils/project-artifacts-handler"; -import { CopilotEventHandler } from "../../../src/features/ai/service/event"; +import { CopilotEventHandler } from "../../features/ai/utils/events"; +import { VisualizerRpcManager } from "../visualizer/rpc-manager"; +import { renderDatamapper } from "../../../src/views/ai-panel/checkpoint/checkpointUtils"; // const BACKEND_BASE_URL = BACKEND_URL.replace(/\/v2\.0$/, ""); //TODO: Temp workaround as custom domain seem to block file uploads @@ -36,39 +38,8 @@ const CONTEXT_UPLOAD_URL_V1 = "https://e95488c8-8511-4882-967f-ec3ae2a0f86f-prod // const CONTEXT_UPLOAD_URL_V1 = BACKEND_BASE_URL + "/context-api/v1.0"; // const ASK_API_URL_V1 = BACKEND_BASE_URL + "/ask-api/v1.0"; -export class AIPanelAbortController { - private static instance: AIPanelAbortController; - private abortController: AbortController; - - private constructor() { - this.abortController = new AbortController(); - } - - public static getInstance(): AIPanelAbortController { - if (!AIPanelAbortController.instance) { - AIPanelAbortController.instance = new AIPanelAbortController(); - } - return AIPanelAbortController.instance; - } - - public get signal(): AbortSignal { - return this.abortController.signal; - } - - public abort(): void { - this.abortController.abort(); - // Create a new AbortController for the next operation - this.abortController = new AbortController(); - } -} - // Common functions -// Aborts the current AI panel operation -export function handleStop() { - AIPanelAbortController.getInstance().abort(); -} - // Checks if an error object has both 'code' and 'message' properties export function isErrorCode(error: any): boolean { return error.hasOwnProperty("code") && error.hasOwnProperty("message"); @@ -113,6 +84,8 @@ export async function addToIntegration(workspaceFolderPath: string, fileChanges: } fs.writeFileSync(absoluteFilePath, fileChange.content, 'utf8'); } + await renderDatamapper(); + return new Promise((resolve, reject) => { if (!isBalFileAdded) { resolve([]); @@ -121,6 +94,7 @@ export async function addToIntegration(workspaceFolderPath: string, fileChanges: const notificationHandler = ArtifactNotificationHandler.getInstance(); // Subscribe to artifact updated notifications let unsubscribe = notificationHandler.subscribe(ArtifactsUpdated.method, undefined, async (payload) => { + new VisualizerRpcManager().updateCurrentArtifactLocation({ artifacts: payload.data }); clearTimeout(timeoutId); resolve(payload.data); unsubscribe(); diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/bi-diagram/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/bi-diagram/rpc-handler.ts index eb91491530b..bdd91ec0b50 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/bi-diagram/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/bi-diagram/rpc-handler.ts @@ -23,10 +23,14 @@ import { AddFieldRequest, addFunction, AddFunctionRequest, + addProjectToWorkspace, + AddProjectToWorkspaceRequest, AIChatRequest, BIAiSuggestionsRequest, BIAvailableNodesRequest, BIDeleteByComponentInfoRequest, + BIDesignModelRequest, + BIFlowModelRequest, BIGetEnclosedFunctionRequest, BIGetVisibleVariableTypesRequest, BINodeTemplateRequest, @@ -56,6 +60,8 @@ import { EndOfFileRequest, ExpressionCompletionsRequest, ExpressionDiagnosticsRequest, + ExpressionTokensRequest, + FormDiagnosticsRequest, formDidClose, FormDidCloseParams, formDidOpen, @@ -73,7 +79,6 @@ import { getBreakpointInfo, getConfigVariableNodeTemplate, GetConfigVariableNodeTemplateRequest, - getConfigVariables, getConfigVariablesV2, getDataMapperCompletions, getDesignModel, @@ -82,6 +87,7 @@ import { getEndOfFile, getExpressionCompletions, getExpressionDiagnostics, + getExpressionTokens, getFlowModel, getFormDiagnostics, getFunctionNames, @@ -119,6 +125,7 @@ import { openConfigToml, OpenConfigTomlRequest, openReadme, + OpenReadmeRequest, ProjectRequest, ReadmeContentRequest, RecordSourceGenRequest, @@ -131,9 +138,7 @@ import { ServiceClassSourceRequest, SignatureHelpRequest, updateClassField, - UpdateConfigVariableRequest, UpdateConfigVariableRequestV2, - updateConfigVariables, updateConfigVariablesV2, updateImports, UpdateImportsRequest, @@ -146,20 +151,14 @@ import { UpdateTypesRequest, verifyTypeDelete, VerifyTypeDeleteRequest, - VisibleTypesRequest, - FormDiagnosticsRequest, - getExpressionTokens, - ExpressionTokensRequest, - addProjectToWorkspace, - AddProjectToWorkspaceRequest, - OpenReadmeRequest + VisibleTypesRequest } from "@wso2/ballerina-core"; import { Messenger } from "vscode-messenger"; import { BiDiagramRpcManager } from "./rpc-manager"; export function registerBiDiagramRpcHandlers(messenger: Messenger) { const rpcManger = new BiDiagramRpcManager(); - messenger.onRequest(getFlowModel, () => rpcManger.getFlowModel()); + messenger.onRequest(getFlowModel, (args: BIFlowModelRequest) => rpcManger.getFlowModel(args)); messenger.onRequest(getSourceCode, (args: BISourceCodeRequest) => rpcManger.getSourceCode(args)); messenger.onRequest(deleteFlowNode, (args: BISourceCodeRequest) => rpcManger.deleteFlowNode(args)); messenger.onRequest(deleteByComponentInfo, (args: BIDeleteByComponentInfoRequest) => rpcManger.deleteByComponentInfo(args)); @@ -184,8 +183,6 @@ export function registerBiDiagramRpcHandlers(messenger: Messenger) { messenger.onRequest(getVisibleVariableTypes, (args: BIGetVisibleVariableTypesRequest) => rpcManger.getVisibleVariableTypes(args)); messenger.onRequest(getExpressionCompletions, (args: ExpressionCompletionsRequest) => rpcManger.getExpressionCompletions(args)); messenger.onRequest(getDataMapperCompletions, (args: ExpressionCompletionsRequest) => rpcManger.getDataMapperCompletions(args)); - messenger.onRequest(getConfigVariables, () => rpcManger.getConfigVariables()); - messenger.onRequest(updateConfigVariables, (args: UpdateConfigVariableRequest) => rpcManger.updateConfigVariables(args)); messenger.onRequest(getConfigVariablesV2, (args: ConfigVariableRequest) => rpcManger.getConfigVariablesV2(args)); messenger.onRequest(updateConfigVariablesV2, (args: UpdateConfigVariableRequestV2) => rpcManger.updateConfigVariablesV2(args)); messenger.onRequest(deleteConfigVariableV2, (args: DeleteConfigVariableRequestV2) => rpcManger.deleteConfigVariableV2(args)); @@ -209,7 +206,7 @@ export function registerBiDiagramRpcHandlers(messenger: Messenger) { messenger.onRequest(getExpressionTokens, (args: ExpressionTokensRequest) => rpcManger.getExpressionTokens(args)); messenger.onNotification(formDidOpen, (args: FormDidOpenParams) => rpcManger.formDidOpen(args)); messenger.onNotification(formDidClose, (args: FormDidCloseParams) => rpcManger.formDidClose(args)); - messenger.onRequest(getDesignModel, () => rpcManger.getDesignModel()); + messenger.onRequest(getDesignModel, (args: BIDesignModelRequest) => rpcManger.getDesignModel(args)); messenger.onRequest(getTypes, (args: GetTypesRequest) => rpcManger.getTypes(args)); messenger.onRequest(getType, (args: GetTypeRequest) => rpcManger.getType(args)); messenger.onRequest(updateType, (args: UpdateTypeRequest) => rpcManger.updateType(args)); diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/bi-diagram/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/bi-diagram/rpc-manager.ts index 511554dc277..dca33238b36 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/bi-diagram/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/bi-diagram/rpc-manager.ts @@ -22,6 +22,7 @@ import { AddFieldRequest, AddFunctionRequest, AddImportItemResponse, + AddProjectToWorkspaceRequest, ArtifactData, BIAiSuggestionsRequest, BIAiSuggestionsResponse, @@ -30,6 +31,7 @@ import { BICopilotContextRequest, BIDeleteByComponentInfoRequest, BIDeleteByComponentInfoResponse, + BIDesignModelRequest, BIDesignModelResponse, BIDiagramAPI, BIFlowModelRequest, @@ -54,8 +56,8 @@ import { BreakpointRequest, BuildMode, ClassFieldModifierRequest, - Command, ComponentRequest, + ConfigVariableRequest, ConfigVariableResponse, CreateComponentResponse, CurrentBreakpointsResponse, @@ -74,6 +76,9 @@ import { ExpressionCompletionsResponse, ExpressionDiagnosticsRequest, ExpressionDiagnosticsResponse, + ExpressionTokensRequest, + FormDiagnosticsRequest, + FormDiagnosticsResponse, FormDidCloseParams, FormDidOpenParams, FunctionNodeRequest, @@ -100,6 +105,7 @@ import { OpenAPIGeneratedModulesRequest, OpenAPIGeneratedModulesResponse, OpenConfigTomlRequest, + OpenReadmeRequest, ProjectComponentsResponse, ProjectRequest, ProjectStructureResponse, @@ -116,11 +122,8 @@ import { SignatureHelpRequest, SignatureHelpResponse, SourceEditResponse, - TemplateId, TextEdit, - UpdateConfigVariableRequest, UpdateConfigVariableRequestV2, - UpdateConfigVariableResponse, UpdateConfigVariableResponseV2, UpdateImportsRequest, UpdateImportsResponse, @@ -137,17 +140,10 @@ import { WorkspaceFolder, WorkspacesResponse, BIIntelSecrets, - ConfigVariableRequest, AvailableNode, Item, Category, - NodePosition, - FormDiagnosticsRequest, - FormDiagnosticsResponse, - ExpressionTokensRequest, - ExpressionTokensResponse, - AddProjectToWorkspaceRequest, - OpenReadmeRequest, + NodePosition } from "@wso2/ballerina-core"; import * as fs from "fs"; import * as path from 'path'; @@ -164,10 +160,10 @@ import { window, workspace } from "vscode"; import { DebugProtocol } from "vscode-debugprotocol"; -import { fetchWithAuth } from "../../../src/features/ai/service/connection"; import { extension } from "../../BalExtensionContext"; import { notifyBreakpointChange } from "../../RPCLayer"; import { OLD_BACKEND_URL } from "../../features/ai/utils"; +import { fetchWithAuth } from "../../features/ai/utils/ai-client"; import { cleanAndValidateProject, getCurrentBIProject } from "../../features/config-generator/configGenerator"; import { BreakpointManager } from "../../features/debugger/breakpoint-manager"; import { StateMachine, updateView } from "../../stateMachine"; @@ -177,46 +173,65 @@ import { README_FILE, addProjectToExistingWorkspace, convertProjectToWorkspace, import { writeBallerinaFileDidOpen } from "../../utils/modification"; import { updateSourceCode } from "../../utils/source-utils"; import { getView } from "../../utils/state-machine-utils"; +import { openAIPanelWithPrompt } from "../../views/ai-panel/aiMachine"; +import { chatStateStorage } from "../../views/ai-panel/chatStateStorage"; import { checkProjectDiagnostics, removeUnusedImports } from "../ai-panel/repair-utils"; +import { getCurrentBallerinaProject } from "../../utils/project-utils"; export class BiDiagramRpcManager implements BIDiagramAPI { OpenConfigTomlRequest: (params: OpenConfigTomlRequest) => Promise; - async getFlowModel(): Promise { - console.log(">>> requesting bi flow model from ls"); + async getFlowModel(params: BIFlowModelRequest): Promise { + console.log(">>> requesting bi flow model from ls", params); return new Promise((resolve) => { - const context = StateMachine.context(); - if (!context.position) { - console.log(">>> position not found in the context"); - return new Promise((resolve) => { + let request: BIFlowModelRequest; + + // If params has all required fields, use them directly + if (params?.filePath && params?.startLine && params?.endLine) { + console.log(">>> using params to create request"); + request = { + filePath: params.filePath, + startLine: params.startLine, + endLine: params.endLine, + forceAssign: params.forceAssign ?? true, + }; + } else { + // Fall back to context if params are not complete + console.log(">>> params incomplete, falling back to context"); + const context = StateMachine.context(); + + if (!context.position) { + // TODO: check why this hits when we are in review mode + console.log(">>> position not found in context, cannot create request"); resolve(undefined); - }); + return; + } + + request = { + filePath: params?.filePath || context.documentUri, + startLine: params?.startLine || { + line: context.position.startLine ?? 0, + offset: context.position.startColumn ?? 0, + }, + endLine: params?.endLine || { + line: context.position.endLine ?? 0, + offset: context.position.endColumn ?? 0, + }, + forceAssign: params?.forceAssign ?? true, + }; } - const params: BIFlowModelRequest = { - filePath: context.documentUri, - startLine: { - line: context.position.startLine ?? 0, - offset: context.position.startColumn ?? 0, - }, - endLine: { - line: context.position.endLine ?? 0, - offset: context.position.endColumn ?? 0, - }, - forceAssign: true, // TODO: remove this - }; + console.log(">>> final request:", request); StateMachine.langClient() - .getFlowModel(params) + .getFlowModel(request) .then((model) => { - console.log(">>> bi flow model from ls", model); + console.log(">>> bi flow model received from ls"); resolve(model); }) .catch((error) => { console.log(">>> error fetching bi flow model from ls", error); - return new Promise((resolve) => { - resolve(undefined); - }); + resolve(undefined); }); }); } @@ -616,7 +631,7 @@ export class BiDiagramRpcManager implements BIDiagramAPI { { title: "Delete", isCloseAffordance: false }, { title: "Cancel", isCloseAffordance: true } ); - + if (response?.title !== "Delete") { return; } @@ -912,30 +927,6 @@ export class BiDiagramRpcManager implements BIDiagramAPI { }); } - async getConfigVariables(): Promise { - return new Promise(async (resolve) => { - const projectPath = StateMachine.context().projectPath; - const variables = await StateMachine.langClient().getConfigVariables({ projectPath: projectPath }) as ConfigVariableResponse; - resolve(variables); - }); - } - - async updateConfigVariables(params: UpdateConfigVariableRequest): Promise { - return new Promise(async (resolve) => { - const req: UpdateConfigVariableRequest = params; - - if (!fs.existsSync(params.configFilePath)) { - - // Create config.bal if it doesn't exist - writeBallerinaFileDidOpen(params.configFilePath, "\n"); - } - - const response = await StateMachine.langClient().updateConfigVariables(req) as BISourceCodeResponse; - await updateSourceCode({ textEdits: response.textEdits, artifactData: { artifactType: DIRECTORY_MAP.CONFIGURABLE }, description: 'Config Variable Update' }); - resolve(response); - }); - } - async getConfigVariablesV2(params: ConfigVariableRequest): Promise { return new Promise(async (resolve) => { const projectPath = StateMachine.context().projectPath; @@ -1001,10 +992,11 @@ export class BiDiagramRpcManager implements BIDiagramAPI { // Function to open Config.toml async openConfigToml(params: OpenConfigTomlRequest): Promise { return new Promise(async (resolve) => { - const currentProject: BallerinaProject | undefined = await getCurrentBIProject(params.filePath); + console.log(">>> opening Config.toml at", params.filePath); + const currentProject: BallerinaProject | undefined = await getCurrentBallerinaProject(params.filePath); - const configFilePath = path.join(StateMachine.context().projectPath, "Config.toml"); - const ignoreFile = path.join(StateMachine.context().projectPath, ".gitignore"); + const configFilePath = path.join(params.filePath, "Config.toml"); + const ignoreFile = path.join(params.filePath, ".gitignore"); const docLink = "https://ballerina.io/learn/provide-values-to-configurable-variables/#provide-via-toml-syntax"; const uri = Uri.file(configFilePath); @@ -1136,13 +1128,19 @@ export class BiDiagramRpcManager implements BIDiagramAPI { openAIChat(params: AIChatRequest): void { if (params.readme) { - commands.executeCommand("ballerina.open.ai.panel", { - type: 'command-template', - command: Command.Code, - templateId: TemplateId.GenerateFromReadme, + openAIPanelWithPrompt({ + type: 'text', + text: 'generate an integration according to the given Readme file', + planMode: true, + }); + } else if (params.planMode) { + openAIPanelWithPrompt({ + type: 'text', + text: '', + planMode: true, }); } else { - commands.executeCommand("ballerina.open.ai.panel"); + openAIPanelWithPrompt(undefined); } } @@ -1379,7 +1377,6 @@ export class BiDiagramRpcManager implements BIDiagramAPI { new vscode.Location(vscode.Uri.file(params.filePath), new vscode.Position(params.breakpoint.line, params.breakpoint?.column))); vscode.debug.addBreakpoints([breakpoint]); - notifyBreakpointChange(); }); } @@ -1408,7 +1405,6 @@ export class BiDiagramRpcManager implements BIDiagramAPI { vscode.debug.removeBreakpoints(breakpoints); } - notifyBreakpointChange(); }); } @@ -1510,10 +1506,16 @@ export class BiDiagramRpcManager implements BIDiagramAPI { }); } - async getDesignModel(): Promise { + async getDesignModel(params: BIDesignModelRequest): Promise { console.log(">>> requesting design model from ls"); return new Promise((resolve) => { - const projectPath = StateMachine.context().projectPath; + let projectPath: string; + if (params?.projectPath) { + const uri = Uri.file(params.projectPath); + projectPath = uri.with({ scheme: 'ai' }).toString(); + } else { + projectPath = StateMachine.context().projectPath; + } StateMachine.langClient() .getDesignModel({ projectPath }) @@ -1533,12 +1535,23 @@ export class BiDiagramRpcManager implements BIDiagramAPI { async getTypes(params: GetTypesRequest): Promise { - const projectPath = StateMachine.context().projectPath; - const ballerinaFiles = await getBallerinaFiles(Uri.file(projectPath).fsPath); + let filePath = params.filePath; + + if (!filePath && StateMachine.context()?.projectPath){ + const projectPath = StateMachine.context().projectPath; + const ballerinaFiles = await getBallerinaFiles(Uri.file(projectPath).fsPath); + filePath = ballerinaFiles.at(0); + } + + if (!filePath) { + return new Promise((resolve, reject) => { + reject(new Error("No file path provided")); + }); + } return new Promise((resolve, reject) => { StateMachine.langClient() - .getTypes({ filePath: ballerinaFiles[0] }) + .getTypes({ filePath }) .then((types) => { resolve(types); }).catch((error) => { @@ -1962,7 +1975,8 @@ export class BiDiagramRpcManager implements BIDiagramAPI { await updateSourceCode({ textEdits: res.source.textEditsMap, description: `OpenAPI Client Generation`, - skipUpdateViewOnTomlUpdate: true + skipUpdateViewOnTomlUpdate: true, + skipPayloadCheck: true }); console.log(">>> Applied text edits for openapi client"); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/bi-diagram/utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/bi-diagram/utils.ts index ce5e15270e1..d87771e59b8 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/bi-diagram/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/bi-diagram/utils.ts @@ -38,11 +38,80 @@ export function getFunctionNodePosition(nodeProperties: NodeProperties, syntaxTr export async function applyBallerinaTomlEdit(tomlPath: Uri, textEdit: TextEdit) { const workspaceEdit = new WorkspaceEdit(); - const range = new Range(new Position(textEdit.range.start.line, textEdit.range.start.character), - new Position(textEdit.range.end.line, textEdit.range.end.character)); + let { startLine, startChar, endLine, endChar } = { + startLine: textEdit.range.start.line, + startChar: textEdit.range.start.character, + endLine: textEdit.range.end.line, + endChar: textEdit.range.end.character + }; - // Create the position and range + // Adjust position to skip header comments if inserting at the beginning of the file + if (startLine === 0) { + try { + const document = await workspace.openTextDocument(tomlPath); + ({ startLine, startChar, endLine, endChar } = adjustRangeForHeaderComments( + document.getText(), + textEdit.range + )); + } catch (error) { + console.warn('Could not read TOML file to check for header comments:', error); + } + } + + const range = new Range(new Position(startLine, startChar), new Position(endLine, endChar)); workspaceEdit.replace(tomlPath, range, textEdit.newText); - // Apply the edit await workspace.applyEdit(workspaceEdit); } + +/** + * Adjusts a text edit range to skip header comments in a TOML file. + * If the edit targets line 0, it will be moved after any header comments. + * @param content The content of the TOML file + * @param range The original range from the text edit + * @returns Adjusted position coordinates + */ +function adjustRangeForHeaderComments( + content: string, + range: { start: { line: number; character: number }; end: { line: number; character: number } } +): { startLine: number; startChar: number; endLine: number; endChar: number } { + let { line: startLine, character: startChar } = range.start; + let { line: endLine, character: endChar } = range.end; + + if (content.length > 0 && content.trimStart().startsWith('#')) { + const headerEndLine = findHeaderCommentEndLine(content); + if (headerEndLine > 0) { + if (endLine < headerEndLine || (endLine === 0 && endChar === 0)) { + endLine = headerEndLine; + endChar = 0; + } + startLine = headerEndLine; + startChar = 0; + } + } + + return { startLine, startChar, endLine, endChar }; +} + +/** + * Find the end position of header comments in a TOML file. + * Header comments are consecutive lines starting with '#' at the beginning of the file. + * @param content The content of the TOML file + * @returns The line number after the header comments (0-based), or 0 if no header comments + */ +function findHeaderCommentEndLine(content: string): number { + const lines = content.split('\n'); + let headerEndLine = 0; + + for (let i = 0; i < lines.length; i++) { + const trimmedLine = lines[i].trim(); + // Continue if line is a comment or empty (part of header) + if (trimmedLine.startsWith('#') || trimmedLine === '') { + headerEndLine = i + 1; + } else { + // Stop at first non-comment, non-empty line + break; + } + } + + return headerEndLine; +} \ No newline at end of file diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/common/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/common/rpc-manager.ts index 7afd0f10909..9dc94adda13 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/common/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/common/rpc-manager.ts @@ -273,7 +273,7 @@ export class CommonRpcManager implements CommonRPCAPI { async downloadSelectedSampleFromGithub(params: SampleDownloadRequest): Promise { - const repoUrl = 'https://raw.githubusercontent.com/wso2/integration-samples/refs/heads/main/ballerina-integrator/samples/'; + const repoUrl = 'https://devant-cdn.wso2.com/bi-samples/v1/'; const rawFileLink = repoUrl + params.zipFileName + '.zip'; const defaultDownloadsPath = path.join(os.homedir(), 'Downloads'); // Construct the default downloads path const pathFromDialog = await selectSampleDownloadPath(); diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/common/utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/common/utils.ts index 3dc2a3ebcda..d8505f53153 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/common/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/common/utils.ts @@ -141,7 +141,7 @@ async function downloadFile(url: string, filePath: string, progressCallback?: (d const response = await axios.get(url, { responseType: 'stream', headers: { - "User-Agent": "Mozilla/5.0" + "User-Agent": "axios" }, onDownloadProgress: (progressEvent) => { totalBytes = progressEvent.total ?? 0; diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/connector-wizard/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/connector-wizard/rpc-manager.ts index 1a1e960a21e..5ba006e47d1 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/connector-wizard/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/connector-wizard/rpc-manager.ts @@ -121,7 +121,9 @@ export class ConnectorWizardRpcManager implements ConnectorWizardAPI { if (wsdlResponse?.source?.textEditsMap) { await updateSourceCode({ textEdits: wsdlResponse.source.textEditsMap, - description: `WSDL API Client Generation` + description: `WSDL API Client Generation`, + skipUpdateViewOnTomlUpdate: true, + skipPayloadCheck: true }); console.log(">>> Applied text edits for wsdl api client"); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-handler.ts index d4d063a30e8..b77af293c10 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-handler.ts @@ -26,6 +26,7 @@ import { AddSubMappingRequest, ClausePositionRequest, clearTypeCache, + ConvertExpressionRequest, convertToQuery, ConvertToQueryRequest, DataMapperModelRequest, @@ -39,6 +40,7 @@ import { DMModelRequest, FieldPropertyRequest, getClausePosition, + getConvertedExpression, getDataMapperCodedata, GetDataMapperCodedataRequest, getDataMapperModel, @@ -84,5 +86,6 @@ export function registerDataMapperRpcHandlers(messenger: Messenger) { messenger.onRequest(getClausePosition, (args: ClausePositionRequest) => rpcManger.getClausePosition(args)); messenger.onRequest(getExpandedDMFromDMModel, (args: DMModelRequest) => rpcManger.getExpandedDMFromDMModel(args)); messenger.onRequest(getProcessTypeReference, (args: ProcessTypeReferenceRequest) => rpcManger.getProcessTypeReference(args)); + messenger.onRequest(getConvertedExpression, (args: ConvertExpressionRequest) => rpcManger.getConvertedExpression(args)); messenger.onRequest(clearTypeCache, () => rpcManger.clearTypeCache()); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts index 439a0d31391..d09867f659b 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/rpc-manager.ts @@ -24,6 +24,8 @@ import { ClausePositionRequest, ClausePositionResponse, ClearTypeCacheResponse, + ConvertExpressionRequest, + ConvertExpressionResponse, ConvertToQueryRequest, DataMapperAPI, DataMapperModelRequest, @@ -407,6 +409,15 @@ export class DataMapperRpcManager implements DataMapperAPI { }); } + async getConvertedExpression(params: ConvertExpressionRequest): Promise { + return new Promise(async (resolve) => { + const res = await StateMachine + .langClient() + .getConvertedExpression(params); + resolve(res); + }); + } + async clearTypeCache(): Promise { return new Promise(async (resolve) => { await StateMachine @@ -417,5 +428,4 @@ export class DataMapperRpcManager implements DataMapperAPI { }); }); } - } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts index eb84089cc1b..649e782c2df 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/data-mapper/utils.ts @@ -163,7 +163,7 @@ export async function updateSource( const updatedArtifacts = await updateSourceCodeIteratively({ textEdits }); // Find the artifact that contains our code changes - const relevantArtifact = findRelevantArtifact(updatedArtifacts, filePath, codedata.lineRange); + const relevantArtifact = findRelevantArtifact(updatedArtifacts, filePath, varName, codedata.lineRange); if (!relevantArtifact) { throw new Error(`No artifact found for file: ${filePath} within the specified line range`); } @@ -230,17 +230,22 @@ export async function updateSubMappingSource( function findRelevantArtifact( artifacts: ProjectStructureArtifactResponse[], filePath: string, - lineRange: ELineRange + identifier: string, + lineRange: ELineRange, ): ProjectStructureArtifactResponse | null { if (!artifacts || artifacts.length === 0) { return null; } for (const currentArtifact of artifacts) { - if (isWithinArtifact(currentArtifact.path, filePath, currentArtifact.position, lineRange)) { + if (currentArtifact.type === "DATA_MAPPER") { + if (currentArtifact.name === identifier) { + return currentArtifact; + } + } else if (isWithinArtifact(currentArtifact.path, filePath, currentArtifact.position, lineRange)) { // If this artifact has resources, recursively search for a more specific match if (currentArtifact.resources && currentArtifact.resources.length > 0) { - const nestedMatch = findRelevantArtifact(currentArtifact.resources, filePath, lineRange); + const nestedMatch = findRelevantArtifact(currentArtifact.resources, filePath, identifier, lineRange); // Return the nested match if found, otherwise return the current artifact return nestedMatch || currentArtifact; } @@ -261,7 +266,7 @@ async function getFlowModelForArtifact(artifact: ProjectStructureArtifactRespons const flowModelResponse = await StateMachine .langClient() .getFlowModel({ - filePath, + filePath: filePath, startLine: { line: artifact.position.startLine, offset: artifact.position.startColumn @@ -478,7 +483,7 @@ function processInputRoots(model: DMModel): IOType[] { const inputs: IORoot[] = []; const focusInputs: Record = {}; for (const input of model.inputs) { - if (input.focusExpression) { + if (input.focusExpression && (input.isIterationVariable || input.isSeq || input.isGroupingKey)) { focusInputs[input.focusExpression] = input as IOTypeField; } else { inputs.push(input); @@ -567,7 +572,7 @@ function createBaseIOType(root: IORoot): IOType { typeName: root.typeName, kind: root.kind, ...(root.category && { category: root.category }), - ...(root.optional !== undefined && { optional: root.optional }), + ...(root.optional && { optional: root.optional }), ...(root.typeInfo && { typeInfo: root.typeInfo }) }; @@ -577,7 +582,7 @@ function createBaseIOType(root: IORoot): IOType { name: member.displayName || member.name, typeName: member.typeName, kind: member.kind, - ...(member.optional !== undefined && { optional: member.optional }) + ...(member.optional && { optional: member.optional }) })); } @@ -625,7 +630,7 @@ function processArray( typeName: member.typeName!, kind: member.kind, ...(isFocused && { isFocused }), - ...(member.optional !== undefined && { optional: member.optional }), + ...(member.optional && { optional: member.optional }), ...(member.typeInfo && { typeInfo: member.typeInfo }) }; @@ -664,7 +669,7 @@ function processUnion( displayName: unionMember.displayName, typeName: unionMember.typeName, kind: unionMember.kind, - ...(unionMember.optional !== undefined && { optional: unionMember.optional }), + ...(unionMember.optional && { optional: unionMember.optional }), ...(unionMember.typeInfo && { typeInfo: unionMember.typeInfo }) }; @@ -753,7 +758,7 @@ function processTypeFields( kind: field.kind, ...(isFocused && { isFocused }), ...(isSeq && { isSeq }), - ...(field.optional !== undefined && { optional: field.optional }), + ...(field.optional && { optional: field.optional }), ...(field.typeInfo && { typeInfo: field.typeInfo }) }; @@ -779,7 +784,7 @@ function processEnum( displayName: member.typeName, typeName: member.typeName, kind: member.kind, - ...(member.optional !== undefined && { optional: member.optional }) + ...(member.optional && { optional: member.optional }) })); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts index 040e97d28cb..3b1d9b53be3 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/service-designer/rpc-manager.ts @@ -61,7 +61,7 @@ import { window, workspace } from "vscode"; import { extension } from "../../BalExtensionContext"; import { StateMachine } from "../../stateMachine"; import { updateSourceCode } from "../../utils/source-utils"; -import { generateExamplePayload } from "../../features/ai/service/editor/payload-json/payload_json"; +import { generateExamplePayload } from "../../features/ai/payload-generator/payload_json"; export class ServiceDesignerRpcManager implements ServiceDesignerAPI { diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts index dc8dee2b991..32b05613080 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-handler.ts @@ -36,7 +36,8 @@ import { undo, undoRedoState, updateCurrentArtifactLocation, - UpdatedArtifactsResponse + UpdatedArtifactsResponse, + reviewAccepted } from "@wso2/ballerina-core"; import { Messenger } from "vscode-messenger"; import { VisualizerRpcManager } from "./rpc-manager"; @@ -57,4 +58,5 @@ export function registerVisualizerRpcHandlers(messenger: Messenger) { messenger.onRequest(joinProjectPath, (args: JoinProjectPathRequest) => rpcManger.joinProjectPath(args)); messenger.onRequest(getThemeKind, () => rpcManger.getThemeKind()); messenger.onRequest(updateCurrentArtifactLocation, (args: UpdatedArtifactsResponse) => rpcManger.updateCurrentArtifactLocation(args)); + messenger.onNotification(reviewAccepted, () => rpcManger.reviewAccepted()); } diff --git a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts index 810097dd469..7a271dee1c2 100644 --- a/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts +++ b/workspaces/ballerina/ballerina-extension/src/rpc-managers/visualizer/rpc-manager.ts @@ -291,4 +291,16 @@ export class VisualizerRpcManager implements VisualizerAPI { resolve(currentArtifact); }); } + + reviewAccepted(): void { + // When user accepts changes in review mode, navigate back to normal view + console.log("Review accepted - changes will be kept"); + // Navigate to package overview + openView( + EVENT_TYPE.OPEN_VIEW, + { + view: MACHINE_VIEW.PackageOverview + } + ); + } } diff --git a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts index 16586c0b920..87e89eef813 100644 --- a/workspaces/ballerina/ballerina-extension/src/stateMachine.ts +++ b/workspaces/ballerina/ballerina-extension/src/stateMachine.ts @@ -39,15 +39,7 @@ import * as path from 'path'; import { extension } from './BalExtensionContext'; import { AIStateMachine } from './views/ai-panel/aiMachine'; import { StateMachinePopup } from './stateMachinePopup'; -import { - checkIsBallerinaPackage, - checkIsBallerinaWorkspace, - checkIsBI, - fetchScope, - getOrgPackageName, - UndoRedoManager, - getOrgAndPackageName -} from './utils'; +import { checkIsBallerinaPackage, checkIsBI, fetchScope, getOrgPackageName, UndoRedoManager, getProjectTomlValues, getOrgAndPackageName, checkIsBallerinaWorkspace } from './utils'; import { activateDevantFeatures } from './features/devant/activator'; import { buildProjectsStructure } from './utils/project-artifacts'; import { runCommandWithOutput } from './utils/runCommand'; @@ -68,6 +60,7 @@ interface MachineContext extends VisualizerLocation { errorCode: string | null; dependenciesResolved?: boolean; isInDevant: boolean; + isViewUpdateTransition?: boolean; } export let history: History; @@ -100,9 +93,7 @@ const stateMachine = createMachine( () => { // Use queueMicrotask to ensure context is updated before command execution queueMicrotask(() => { - console.log('Refreshing BI project explorer'); commands.executeCommand("BI.project-explorer.refresh"); - console.log('Notifying current webview'); // Check if the current view is Service desginer and if so don't notify the webview if (StateMachine.context().view !== MACHINE_VIEW.ServiceDesigner && StateMachine.context().view !== MACHINE_VIEW.BIDiagram) { notifyCurrentWebview(); @@ -196,12 +187,14 @@ const stateMachine = createMachine( org: (context, event) => event.data.orgName, package: (context, event) => event.data.packageName }), - (context, event) => notifyTreeView( - event.data.projectPath, - context.documentUri, - context.position, - context.view - ) + (context, event) => { + notifyTreeView( + event.data.projectPath, + context.documentUri, + context.position, + context.view + ); + } ] }, { @@ -216,12 +209,14 @@ const stateMachine = createMachine( org: (context, event) => event.data.orgName, package: (context, event) => event.data.packageName }), - (context, event) => notifyTreeView( - event.data.projectPath, - context.documentUri, - context.position, - context.view - ) + (context, event) => { + notifyTreeView( + event.data.projectPath, + context.documentUri, + context.position, + context.view + ); + } ] } ], @@ -318,7 +313,9 @@ const stateMachine = createMachine( addType: (context, event) => event.viewLocation?.addType, dataMapperMetadata: (context, event) => event.viewLocation?.dataMapperMetadata, artifactInfo: (context, event) => event.viewLocation?.artifactInfo, - rootDiagramId: (context, event) => event.viewLocation?.rootDiagramId + rootDiagramId: (context, event) => event.viewLocation?.rootDiagramId, + reviewData: (context, event) => event.viewLocation?.reviewData, + isViewUpdateTransition: false }), (context, event) => notifyTreeView( context.projectPath, @@ -378,7 +375,9 @@ const stateMachine = createMachine( position: (context, event) => event.data.position, syntaxTree: (context, event) => event.data.syntaxTree, focusFlowDiagramView: (context, event) => event.data.focusFlowDiagramView, - dataMapperMetadata: (context, event) => event.data.dataMapperMetadata + dataMapperMetadata: (context, event) => event.data.dataMapperMetadata, + reviewData: (context, event) => event.data.reviewData, + isViewUpdateTransition: false }) } } @@ -403,7 +402,9 @@ const stateMachine = createMachine( addType: (context, event) => event.viewLocation?.addType, dataMapperMetadata: (context, event) => event.viewLocation?.dataMapperMetadata, artifactInfo: (context, event) => event.viewLocation?.artifactInfo, - rootDiagramId: (context, event) => event.viewLocation?.rootDiagramId + rootDiagramId: (context, event) => event.viewLocation?.rootDiagramId, + reviewData: (context, event) => event.viewLocation?.reviewData, + isViewUpdateTransition: false }), (context, event) => notifyTreeView( event.viewLocation?.projectPath || context?.projectPath, @@ -425,7 +426,9 @@ const stateMachine = createMachine( type: (context, event) => event.viewLocation?.type, isGraphql: (context, event) => event.viewLocation?.isGraphql, addType: (context, event) => event.viewLocation?.addType, - dataMapperMetadata: (context, event) => event.viewLocation?.dataMapperMetadata + dataMapperMetadata: (context, event) => event.viewLocation?.dataMapperMetadata, + reviewData: (context, event) => event.viewLocation?.reviewData, + isViewUpdateTransition: true }), (context, event) => notifyTreeView( context.projectPath, @@ -582,8 +585,6 @@ const stateMachine = createMachine( ); if (result.success) { - console.log('Build task completed successfully'); - // Retry resolving missing dependencies after build is successful. This is a temporary solution to ensure the project is reloaded with new dependencies. const projectUri = Uri.file(context.projectPath).toString(); await StateMachine.langClient().resolveMissingDependencies({ @@ -651,7 +652,8 @@ const stateMachine = createMachine( type: context?.type, isGraphql: context?.isGraphql, addType: context?.addType, - dataMapperMetadata: context?.dataMapperMetadata + dataMapperMetadata: context?.dataMapperMetadata, + reviewData: context?.reviewData } }); return resolve(); @@ -673,7 +675,12 @@ const stateMachine = createMachine( return resolve({ ...selectedEntry.location, view: selectedEntry.location.view ? selectedEntry.location.view : MACHINE_VIEW.PackageOverview }); } - if (selectedEntry && (selectedEntry.location.view === MACHINE_VIEW.ERDiagram || selectedEntry.location.view === MACHINE_VIEW.ServiceDesigner || selectedEntry.location.view === MACHINE_VIEW.BIDiagram)) { + if (selectedEntry && (selectedEntry.location.view === MACHINE_VIEW.ERDiagram || selectedEntry.location.view === MACHINE_VIEW.ServiceDesigner || selectedEntry.location.view === MACHINE_VIEW.BIDiagram || selectedEntry.location.view === MACHINE_VIEW.ReviewMode)) { + // Get updated location and identifier if transition was from VIEW_UPDATE event + if (context.isViewUpdateTransition && selectedEntry.location.view !== MACHINE_VIEW.ReviewMode) { + const updatedView = await getView(selectedEntry.location.documentUri, selectedEntry.location.position, context?.projectPath); + return resolve(updatedView.location); + } return resolve(selectedEntry.location); } @@ -795,7 +802,9 @@ function startMachine(): Promise { // Define your API as functions export const StateMachine = { - initialize: async () => await startMachine(), + initialize: async () => { + await startMachine(); + }, service: () => { return stateService; }, context: () => { return stateService.getSnapshot().context; }, langClient: () => { return stateService.getSnapshot().context.langClient; }, @@ -861,13 +870,13 @@ export function updateView(refreshTreeView?: boolean) { const project = StateMachine.context().projectStructure.projects.find(project => project.projectPath === projectPath); // These changes will be revisited in the revamp - project.directoryMap[targetedArtifactType].forEach((artifact) => { + project.directoryMap[targetedArtifactType].forEach((artifact: ProjectStructureArtifactResponse) => { if (artifact.id === currentIdentifier || artifact.name === currentIdentifier) { currentArtifact = artifact; } // Check if artifact has resources and find within those if (artifact.resources && artifact.resources.length > 0) { - const resource = artifact.resources.find((resource) => resource.id === currentIdentifier || resource.name === currentIdentifier); + const resource = artifact.resources.find((resource: ProjectStructureArtifactResponse) => resource.id === currentIdentifier || resource.name === currentIdentifier); if (resource) { currentArtifact = resource; } @@ -997,8 +1006,8 @@ async function handleMultipleWorkspaceFolders(workspaceFolders: readonly Workspa const isBI = checkIsBI(balProjects[0].uri); const scope = isBI && fetchScope(balProjects[0].uri); const { orgName, packageName } = getOrgPackageName(balProjects[0].uri.fsPath); - setBIContext(isBI); const projectPath = balProjects[0].uri.fsPath; + setContextValues(isBI, projectPath); return { isBI, projectPath, scope, orgName, packageName }; } @@ -1010,7 +1019,7 @@ async function handleSingleWorkspaceFolder(workspaceURI: Uri): Promise { + const tomlValues = await getProjectTomlValues(projectPath); + return tomlValues?.package?.library === true; +} diff --git a/workspaces/ballerina/ballerina-extension/src/utils/file-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/file-utils.ts index 97bc039886a..64ba23e69b6 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/file-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/file-utils.ts @@ -432,7 +432,13 @@ export async function findBallerinaPackageRoot(filePath: string) { return null; } - let currentFolderPath = path.dirname(filePath); + // Start with the path itself if it's a directory, otherwise start with its parent + let currentFolderPath: string; + try { + currentFolderPath = fs.statSync(filePath).isDirectory() ? filePath : path.dirname(filePath); + } catch { + currentFolderPath = path.dirname(filePath); + } while (currentFolderPath !== path.sep) { const isBallerinaPackage = await checkIsBallerinaPackage(Uri.parse(currentFolderPath)); diff --git a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts index 9269a352017..737f95fb1a8 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/project-artifacts.ts @@ -16,12 +16,12 @@ * under the License. */ import * as vscode from "vscode"; -import * as path from 'path'; import { URI, Utils } from "vscode-uri"; import { ARTIFACT_TYPE, Artifacts, ArtifactsNotification, BaseArtifact, DIRECTORY_MAP, PROJECT_KIND, ProjectInfo, ProjectStructure, ProjectStructureArtifactResponse, ProjectStructureResponse } from "@wso2/ballerina-core"; import { StateMachine } from "../stateMachine"; import { ExtendedLangClient } from "../core/extended-language-client"; import { ArtifactsUpdated, ArtifactNotificationHandler } from "./project-artifacts-handler"; +import { isLibraryProject } from "./config"; export async function buildProjectsStructure( projectInfo: ProjectInfo, @@ -68,6 +68,9 @@ async function buildProjectArtifactsStructure( projectName: packageName, projectPath: projectPath, projectTitle: packageTitle, + // Workaround to check if the project is a library project. + // This will be removed once the projectInfo is updated to include the library flag. + isLibrary: await isLibraryProject(projectPath), directoryMap: { [DIRECTORY_MAP.AUTOMATION]: [], [DIRECTORY_MAP.SERVICE]: [], @@ -95,11 +98,21 @@ async function buildProjectArtifactsStructure( export async function updateProjectArtifacts(publishedArtifacts: ArtifactsNotification): Promise { // Current project structure const currentProjectStructure: ProjectStructureResponse = StateMachine.context().projectStructure; + if (!StateMachine.context().projectPath && !StateMachine.context().workspacePath) { + console.warn("No project or workspace path found in the StateMachine context."); + return; + } const projectUri = URI.file(StateMachine.context().projectPath) || URI.file(StateMachine.context().workspacePath); const isWithinProject = URI .parse(publishedArtifacts.uri).fsPath.toLowerCase() .includes(projectUri.fsPath.toLowerCase()); - if (currentProjectStructure && isWithinProject) { + + const isSubmodule = publishedArtifacts?.moduleName; + + const persistDir = Utils.joinPath(projectUri, 'persist').fsPath.toLowerCase(); + const isInPersistDir = URI.parse(publishedArtifacts.uri).fsPath.toLowerCase().includes(persistDir); + + if (currentProjectStructure && isWithinProject && !isSubmodule && !isInPersistDir) { const entryLocations = await traverseUpdatedComponents(publishedArtifacts.artifacts, currentProjectStructure); const notificationHandler = ArtifactNotificationHandler.getInstance(); // Publish a notification to the artifact handler @@ -211,7 +224,11 @@ async function getEntryValue(artifact: BaseArtifact, projectPath: string, icon: entryValue.icon = getCustomEntryNodeIcon(getTypePrefix(artifact.module)); break; case DIRECTORY_MAP.CONNECTION: - entryValue.icon = icon; + if ((artifact as any).metadata?.connectorType === "persist") { + entryValue.icon = "bi-db"; + } else { + entryValue.icon = icon; + } break; case DIRECTORY_MAP.RESOURCE: // Do things related to resource @@ -478,6 +495,10 @@ function getCustomEntryNodeIcon(type: string) { return "bi-mcp"; case "solace": return "bi-solace"; + case "mssql": + return "bi-mssql"; + case "postgresql": + return "bi-postgresql"; default: return "bi-globe"; } diff --git a/workspaces/ballerina/ballerina-extension/src/utils/project-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/project-utils.ts index 919ae05e7be..ef343ac4011 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/project-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/project-utils.ts @@ -26,6 +26,10 @@ import { dirname, sep } from 'path'; import { parseTomlToConfig } from '../features/config-generator/utils'; import { PROJECT_TYPE } from "../features/project"; import { StateMachine } from "../stateMachine"; +import { VisualizerWebview } from "../views/visualizer/webview"; +import { findBallerinaPackageRoot } from "./file-utils"; +import { needsProjectDiscovery, requiresPackageSelection, selectPackageOrPrompt } from "./command-utils"; +import { findWorkspaceTypeFromWorkspaceFolders } from "../rpc-managers/common/utils"; const BALLERINA_TOML_REGEX = `**${sep}Ballerina.toml`; const BALLERINA_FILE_REGEX = `**${sep}*.bal`; @@ -220,6 +224,57 @@ function getWorkspaceRoot(): string | undefined { return workspace.workspaceFolders?.[0]?.uri.fsPath; } +/** + * Resolves the project path based on the current context and updates the state machine accordingly. + * @param promptMessage - The message to display when prompting for package selection + * @returns The resolved project path or undefined if no project path is available + */ +async function resolveProjectPath(promptMessage?: string): Promise { + const { workspacePath, view: webviewType, projectPath, projectInfo } = StateMachine.context(); + const isWebviewOpen = VisualizerWebview.currentPanel !== undefined; + const hasActiveTextEditor = !!window.activeTextEditor; + const currentBallerinaFile = tryGetCurrentBallerinaFile(); + const projectRoot = await findBallerinaPackageRoot(currentBallerinaFile); + + let targetPath = projectPath ?? ""; + + if (requiresPackageSelection(workspacePath, webviewType, projectPath, isWebviewOpen, hasActiveTextEditor)) { + const availablePackages = projectInfo?.children.map((child: any) => child.projectPath) ?? []; + const selectedPackage = await selectPackageOrPrompt(availablePackages, promptMessage); + if (!selectedPackage) { + return undefined; + } + targetPath = selectedPackage; + await StateMachine.updateProjectRootAndInfo(selectedPackage, projectInfo); + } else if (needsProjectDiscovery(projectInfo, projectRoot, projectPath)) { + try { + const workspaceType = await findWorkspaceTypeFromWorkspaceFolders(); + const packageRoot = await getCurrentProjectRoot(); + + if (!packageRoot) { + return undefined; + } + + if (workspaceType.type === "MULTIPLE_PROJECTS") { + const projectInfo = await StateMachine.langClient().getProjectInfo({ projectPath: packageRoot }); + await StateMachine.updateProjectRootAndInfo(packageRoot, projectInfo); + return packageRoot; + } + + if (workspaceType.type === "BALLERINA_WORKSPACE") { + await StateMachine.updateProjectRootAndInfo(packageRoot, projectInfo); + return packageRoot; + } + + return packageRoot; + } catch { + return undefined; + } + } + + return targetPath; +} + export { addToWorkspace, getCurrentBallerinaProject, @@ -227,5 +282,6 @@ export { getCurrenDirectoryPath, selectBallerinaProjectForDebugging, getCurrentProjectRoot, - getWorkspaceRoot + getWorkspaceRoot, + resolveProjectPath }; diff --git a/workspaces/ballerina/ballerina-extension/src/utils/server/server.ts b/workspaces/ballerina/ballerina-extension/src/utils/server/server.ts index d817676ef4c..5aff49ba8f0 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/server/server.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/server/server.ts @@ -21,7 +21,7 @@ import { debug, log } from '../logger'; import { ServerOptions, ExecutableOptions } from 'vscode-languageclient/node'; import { isWindows } from '..'; import { BallerinaExtension } from '../../core'; -import { isSupportedSLVersion, createVersionNumber } from '../config'; +import { isSupportedSLVersion, createVersionNumber, isWSL } from '../config'; import * as fs from 'fs'; import * as path from 'path'; import { orderBy } from 'lodash'; @@ -122,6 +122,81 @@ export function findHighestVersionJdk(directory: string): string | null { if (jdkInfos.length === 0) { debug(`No JDK directories found matching pattern in: ${directory}`); + // If no JDK directories found, check for system set jdk version by using JAVA_HOME environment variable + // Try to find JAVA_HOME using environment variables on Windows, WSL, Ubuntu, or Mac + let javaHome = process.env.JAVA_HOME; + + // For WSL, try to detect Linux JAVA_HOME if not found or is a windows path + if ((!javaHome || javaHome.includes('\\')) && isWSL()) { + try { + // Try to run 'bash -c "echo $JAVA_HOME"' to get the Linux side JAVA_HOME + const wslJavaHome = require('child_process').execSync('bash -c "echo $JAVA_HOME"', { encoding: 'utf8' }).trim(); + if (wslJavaHome) { + debug(`Using WSL system set JDK from Linux environment: ${wslJavaHome}`); + return wslJavaHome; + } + } catch (e) { + debug(`Could not get JAVA_HOME from WSL Linux environment: ${e}`); + } + } + + if (javaHome) { + debug(`Using system set JDK: ${javaHome}`); + return javaHome; + } + + // Try some common fallback locations for Ubuntu / Mac + const platform = process.platform; + let commonJavaDirs: string[] = []; + debug(`Detecting platform-specific common Java directories for platform: ${platform}`); + + if (platform === 'darwin') { // macOS + debug('Platform is macOS. Checking default Java and SDKMAN directories.'); + commonJavaDirs = [ + '/Library/Java/JavaVirtualMachines', + process.env.HOME ? `${process.env.HOME}/.sdkman/candidates/java/current` : '' + ]; + debug(`Common Java directories for macOS: ${JSON.stringify(commonJavaDirs)}`); + } else if (platform === 'linux' || isWSL()) { // Linux, also WSL + debug('Platform is Linux or WSL. Checking standard Java and SDKMAN directories.'); + commonJavaDirs = [ + '/usr/lib/jvm', + '/usr/java', + process.env.HOME ? `${process.env.HOME}/.sdkman/candidates/java/current` : '' + ]; + debug(`Common Java directories for Linux/WSL: ${JSON.stringify(commonJavaDirs)}`); + } else if (platform === 'win32') { // Windows + debug('Platform is Windows. Checking ProgramFiles Java directories.'); + if (process.env['ProgramFiles']) { + debug(`Adding Java directory from ProgramFiles: ${process.env['ProgramFiles']}\\Java`); + commonJavaDirs.push(`${process.env['ProgramFiles']}\\Java`); + } + if (process.env['ProgramFiles(x86)']) { + debug(`Adding Java directory from ProgramFiles(x86): ${process.env['ProgramFiles(x86)']}\\Java`); + commonJavaDirs.push(`${process.env['ProgramFiles(x86)']}\\Java`); + } + debug(`Common Java directories for Windows: ${JSON.stringify(commonJavaDirs)}`); + } else { + debug(`Unknown or unsupported platform for Java directory detection: ${platform}`); + } + + for (const dir of commonJavaDirs) { + if (dir && fs.existsSync(dir)) { + // Check for JDK subdirectories + const subDirs = fs.readdirSync(dir); + for (const sub of subDirs) { + // JDK dir must contain bin/java[.exe] + const javaBin = platform === 'win32' + ? path.join(dir, sub, 'bin', 'java.exe') + : path.join(dir, sub, 'bin', 'java'); + if (fs.existsSync(javaBin)) { + debug(`Found JDK in fallback directory: ${path.join(dir, sub)}`); + return path.join(dir, sub); + } + } + } + } + debug(`No system set JDK found, returning null`); return null; } @@ -243,7 +318,7 @@ function getServerOptionsUsingJava(extension: BallerinaExtension): ServerOptions "bal-shell-service*", "org.eclipse.lsp4j*", "diagram-util*", - "openapi-ls-extension*", + "openapi-ls-extension*", "sqlite-jdbc*" ]; @@ -316,11 +391,6 @@ function getServerOptionsUsingJava(extension: BallerinaExtension): ServerOptions throw new Error(`JDK not found in ${dependenciesDir}`); } - const jdkVersionMatch = jdkDir.match(/jdk-(.+)-jre/); - if (jdkVersionMatch) { - log(`JDK Version: ${jdkVersionMatch[1]}`); - } - debug(`JDK Version: ${jdkVersionMatch[1]}`); const javaExecutable = isWindows() ? 'java.exe' : 'java'; const cmd = join(jdkDir, 'bin', javaExecutable); const args = ['-cp', classpath, `-Dballerina.home=${ballerinaHome}`, 'org.ballerinalang.langserver.launchers.stdio.Main']; diff --git a/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts b/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts index 5150e8700b7..d5d312c5dda 100644 --- a/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/utils/source-utils.ts @@ -107,6 +107,10 @@ export async function updateSourceCode(updateSourceCodeRequest: UpdateSourceCode modificationRequests[fileUriString] = { filePath: fileUri.fsPath, modifications: modificationList }; } } + if (edits.length === 0) { + StateMachine.setReadyMode(); + return []; + } } // Iterate through modificationRequests and apply modifications @@ -222,7 +226,7 @@ export async function updateSourceCode(updateSourceCodeRequest: UpdateSourceCode // Notify webview unless a new TYPE artifact is created outside the type diagram view // */ function checkAndNotifyWebview( - response: ProjectStructureArtifactResponse[], + response: ProjectStructureArtifactResponse[], request: UpdateSourceCodeRequest, isChangeFromHelperPane?: boolean ) { diff --git a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/aiMachine.ts b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/aiMachine.ts index 75c813df5fd..1bf828d31de 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/aiMachine.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/aiMachine.ts @@ -18,11 +18,13 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { createMachine, assign, interpret } from 'xstate'; -import { AIMachineStateValue, AIPanelPrompt, AIMachineEventType, AIMachineContext, AIUserToken, AIMachineSendableEvent, LoginMethod } from '@wso2/ballerina-core'; +import { AIMachineStateValue, AIPanelPrompt, AIMachineEventType, AIMachineContext, AIUserToken, AIMachineSendableEvent, LoginMethod, SHARED_COMMANDS } from '@wso2/ballerina-core'; import { AiPanelWebview } from './webview'; import { extension } from '../../BalExtensionContext'; import { getAccessToken, getLoginMethod } from '../../utils/ai/auth'; import { checkToken, initiateInbuiltAuth, logout, validateApiKey, validateAwsCredentials } from './utils'; +import * as vscode from 'vscode'; +import { notifyAiPromptUpdated } from '../../RPCLayer'; export const USER_CHECK_BACKEND_URL = '/user/usage'; @@ -32,6 +34,10 @@ export const openAIWebview = (defaultprompt?: AIPanelPrompt) => { AiPanelWebview.currentPanel = new AiPanelWebview(); } else { AiPanelWebview.currentPanel!.getWebview()?.reveal(); + // Notify the webview to refetch the prompt since it's already open + if (defaultprompt) { + notifyAiPromptUpdated(); + } } }; @@ -42,6 +48,41 @@ export const closeAIWebview = () => { } }; +/** + * Typesafe wrapper function to open the AI Panel with an optional prompt. + * + * This function provides type safety when opening the AI Panel by ensuring that + * only valid AIPanelPrompt objects are passed as parameters. + * + * @param prompt - Optional prompt configuration for the AI Panel. Can be: + * - `{ type: 'command-template', ... }` - Opens with a specific command template + * - `{ type: 'text', text: string, planMode: boolean }` - Opens with raw text input + * - `undefined` - Opens without any default prompt + * + * @example + * // Open with a command template + * openAIPanelWithPrompt({ + * type: 'command-template', + * command: Command.Tests, + * templateId: TemplateId.TestsForService, + * }); + * + * @example + * // Open with text input (agent mode is the default) + * openAIPanelWithPrompt({ + * type: 'text', + * text: 'Generate a REST API', + * planMode: true + * }); + * + * @example + * // Open empty panel + * openAIPanelWithPrompt(); + */ +export function openAIPanelWithPrompt(prompt?: AIPanelPrompt): void { + vscode.commands.executeCommand(SHARED_COMMANDS.OPEN_AI_PANEL, prompt); +} + const aiMachine = createMachine({ id: 'ballerina-ai', initial: 'Initialize', diff --git a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/chatHistoryUtils.ts b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/chatHistoryUtils.ts new file mode 100644 index 00000000000..2b7815981e9 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/chatHistoryUtils.ts @@ -0,0 +1,74 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { ChatMessage } from '@wso2/ballerina-core/lib/state-machine-types'; +import { generateId } from './idGenerators'; + +/** + * Adds a user message to the chat history + * @param history The current chat history + * @param content The user message content + * @returns Updated chat history with the new message + */ +export const addUserMessage = ( + history: ChatMessage[], + content: string +): ChatMessage[] => { + const lastMessage = history[history.length - 1]; + const baseHistory = lastMessage && !lastMessage.uiResponse && lastMessage.modelMessages.length === 0 + ? history.slice(0, -1) + : history; + + return [ + ...baseHistory, + { + id: generateId(), + content, + uiResponse: '', + modelMessages: [], + timestamp: Date.now(), + }, + ]; +}; + +/** + * Updates a specific chat message in the history + * @param history The current chat history + * @param id The ID of the message to update + * @param updates The updates to apply to the message + * @returns Updated chat history + */ +export const updateChatMessage = ( + history: ChatMessage[], + id: string, + updates: { + uiResponse?: string; + modelMessages?: any[]; + } +): ChatMessage[] => { + return history.map(msg => { + if (msg.id === id) { + return { + ...msg, + uiResponse: updates.uiResponse !== undefined ? updates.uiResponse : msg.uiResponse, + modelMessages: updates.modelMessages !== undefined ? updates.modelMessages : msg.modelMessages, + }; + } + return msg; + }); +}; diff --git a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/chatStateStorage.ts b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/chatStateStorage.ts new file mode 100644 index 00000000000..87db2884388 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/chatStateStorage.ts @@ -0,0 +1,743 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { + WorkspaceChatState, + ChatThread, + Generation, + GenerationMetadata, + GenerationReviewState, + Checkpoint, +} from '@wso2/ballerina-core/lib/state-machine-types'; +import { Command } from '@wso2/ballerina-core'; +import * as crypto from 'crypto'; + +/** + * Active execution handle + * Tracks running AI operations for abort functionality + */ +export interface ActiveExecution { + generationId: string; // For logging and correlation with generation + abortController: AbortController; // For actual abort operation +} + +/** + * Thread-based ChatStateStorage + * + * Single source of truth for all copilot chat state. + * Stores workspace -> threads -> generations hierarchy. + * Session-only storage (cleared when VSCode closes). + */ +export class ChatStateStorage { + // In-memory storage: workspaceId -> WorkspaceChatState + private storage: Map = new Map(); + + // Track active executions per workspace/thread for abort functionality + private activeExecutions: Map> = new Map(); + + // ============================================ + // Workspace Management + // ============================================ + + /** + * Initialize workspace state (creates default thread if needed) + * @param workspaceId Workspace identifier + * @returns Workspace state + */ + initializeWorkspace(workspaceId: string): WorkspaceChatState { + let workspaceState = this.storage.get(workspaceId); + + if (!workspaceState) { + // Create default thread + const defaultThread: ChatThread = { + id: 'default', + name: 'Default Thread', + generations: [], + createdAt: Date.now(), + updatedAt: Date.now(), + }; + + workspaceState = { + workspaceId, + threads: new Map([[defaultThread.id, defaultThread]]), + activeThreadId: defaultThread.id, + }; + + this.storage.set(workspaceId, workspaceState); + console.log(`[ChatStateStorage] Initialized workspace: ${workspaceId} with default thread`); + } + + return workspaceState; + } + + /** + * Get workspace state + * @param workspaceId Workspace identifier + * @returns Workspace state or undefined + */ + getWorkspaceState(workspaceId: string): WorkspaceChatState | undefined { + return this.storage.get(workspaceId); + } + + /** + * Clear workspace state + * Cleans up any pending review temp projects before clearing. + * @param workspaceId Workspace identifier + */ + async clearWorkspace(workspaceId: string): Promise { + // Cleanup pending review temp projects before clearing + const workspace = this.storage.get(workspaceId); + if (workspace) { + for (const [threadId, thread] of workspace.threads) { + const pendingReview = this.getPendingReviewGeneration(workspaceId, threadId); + if (pendingReview?.reviewState.tempProjectPath) { + console.log(`[ChatStateStorage] Cleaning up pending review temp project: ${pendingReview.reviewState.tempProjectPath}`); + + // Cleanup temp directory + if (!process.env.AI_TEST_ENV) { + const { cleanupTempProject } = require('../../features/ai/utils/project/temp-project'); + try { + await cleanupTempProject(pendingReview.reviewState.tempProjectPath); + } catch (error) { + console.error(`[ChatStateStorage] Error cleaning up temp project:`, error); + } + } + } + } + } + + this.storage.delete(workspaceId); + console.log(`[ChatStateStorage] Cleared workspace: ${workspaceId}`); + } + + /** + * Clear all workspace states + * Cleans up temp projects for each workspace before clearing. + */ + async clearAll(): Promise { + // Clear each workspace individually to trigger cleanup logic + const workspaceIds = Array.from(this.storage.keys()); + await Promise.all(workspaceIds.map(workspaceId => this.clearWorkspace(workspaceId))); + console.log('[ChatStateStorage] Cleared all workspaces'); + } + + // ============================================ + // Thread Management (Minimal) + // ============================================ + + /** + * Get or create a thread by ID + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + * @returns Thread + */ + getOrCreateThread(workspaceId: string, threadId: string): ChatThread { + const workspace = this.initializeWorkspace(workspaceId); + let thread = workspace.threads.get(threadId); + + if (!thread) { + thread = { + id: threadId, + name: threadId === 'default' ? 'Default Thread' : `Thread ${threadId}`, + generations: [], + createdAt: Date.now(), + updatedAt: Date.now(), + }; + workspace.threads.set(threadId, thread); + workspace.activeThreadId = threadId; + console.log(`[ChatStateStorage] Created thread: ${threadId} in workspace: ${workspaceId}`); + } + + return thread; + } + + /** + * Get active thread + * @param workspaceId Workspace identifier + * @returns Active thread or undefined + */ + getActiveThread(workspaceId: string): ChatThread | undefined { + const workspace = this.storage.get(workspaceId); + if (!workspace) { + return undefined; + } + return workspace.threads.get(workspace.activeThreadId); + } + + // ============================================ + // Generation Management + // ============================================ + + /** + * Add a new generation to a thread + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + * @param userPrompt User's prompt + * @param metadata Generation metadata + * @param id Optional generation ID (if not provided, generates new one) + * @returns Created generation + */ + addGeneration( + workspaceId: string, + threadId: string, + userPrompt: string, + metadata: Partial, + id?: string + ): Generation { + const thread = this.getOrCreateThread(workspaceId, threadId); + + const generation: Generation = { + id: id || this.generateId(), + userPrompt, + modelMessages: [], + uiResponse: '', + timestamp: Date.now(), + reviewState: { + status: 'pending', + modifiedFiles: [], + }, + currentTaskIndex: -1, + metadata: { + isPlanMode: metadata.isPlanMode || false, + operationType: metadata.operationType, + generationType: metadata.generationType || 'agent', + commandType: metadata.commandType, + }, + }; + + thread.generations.push(generation); + thread.updatedAt = Date.now(); + + console.log(`[ChatStateStorage] Added generation: ${generation.id} to thread: ${threadId}`); + + // Capture checkpoint for this generation asynchronously + this.captureCheckpointForGeneration(workspaceId, threadId, generation.id).catch(error => { + console.error('[ChatStateStorage] Failed to capture checkpoint:', error); + }); + + return generation; + } + + /** + * Capture checkpoint for a generation asynchronously + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + * @param generationId Generation identifier + */ + private async captureCheckpointForGeneration( + workspaceId: string, + threadId: string, + generationId: string + ): Promise { + try { + // Dynamic import to avoid circular dependencies + const { captureWorkspaceSnapshot } = await import('../../views/ai-panel/checkpoint/checkpointUtils'); + const { notifyCheckpointCaptured } = await import('../../RPCLayer'); + + const checkpoint = await captureWorkspaceSnapshot(generationId); + + if (checkpoint) { + await this.addCheckpointToGeneration(workspaceId, threadId, generationId, checkpoint); + + notifyCheckpointCaptured({ + messageId: generationId, + checkpointId: checkpoint.id, + }); + } + } catch (error) { + console.error('[ChatStateStorage] Failed to capture checkpoint:', error); + } + } + + /** + * Update a generation + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + * @param generationId Generation identifier + * @param updates Partial updates to generation + */ + updateGeneration( + workspaceId: string, + threadId: string, + generationId: string, + updates: Partial + ): void { + const thread = this.getOrCreateThread(workspaceId, threadId); + const generation = thread.generations.find(g => g.id === generationId); + + if (!generation) { + console.error(`[ChatStateStorage] Generation not found: ${generationId}`); + return; + } + + // Apply updates + Object.assign(generation, updates); + thread.updatedAt = Date.now(); + + console.log(`[ChatStateStorage] Updated generation: ${generationId}`); + } + + /** + * Get a specific generation + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + * @param generationId Generation identifier + * @returns Generation or undefined + */ + getGeneration( + workspaceId: string, + threadId: string, + generationId: string + ): Generation | undefined { + const thread = this.getOrCreateThread(workspaceId, threadId); + return thread.generations.find(g => g.id === generationId); + } + + /** + * Get all generations for a thread + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + * @returns Array of generations + */ + getGenerations(workspaceId: string, threadId: string): Generation[] { + const thread = this.getOrCreateThread(workspaceId, threadId); + return thread.generations; + } + + // ============================================ + // Chat History (for LLM) + // ============================================ + + /** + * Get chat history for LLM (model messages only) + * Includes ALL generations (pending, under_review, accepted) + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + * @returns Array of model messages for LLM context + */ + getChatHistoryForLLM(workspaceId: string, threadId: string): any[] { + const thread = this.getOrCreateThread(workspaceId, threadId); + const messages: any[] = []; + + for (const generation of thread.generations) { + if (generation.modelMessages && generation.modelMessages.length > 0) { + messages.push(...generation.modelMessages); + } + } + + console.log(`[ChatStateStorage] Retrieved ${messages.length} model messages for thread: ${threadId}`); + return messages; + } + + // ============================================ + // Review State Management + // ============================================ + + /** + * Get pending review generation (latest with 'under_review' status) + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + * @returns Generation or undefined + */ + getPendingReviewGeneration( + workspaceId: string, + threadId: string + ): Generation | undefined { + const thread = this.getOrCreateThread(workspaceId, threadId); + + // Find the LATEST generation with 'under_review' status + // Iterate in reverse to get the most recent one + for (let i = thread.generations.length - 1; i >= 0; i--) { + const generation = thread.generations[i]; + if (generation.reviewState.status === 'under_review') { + console.log(`[ChatStateStorage] Found pending review generation: ${generation.id}`); + return generation; + } + } + + console.log(`[ChatStateStorage] No pending review generation in thread: ${threadId}`); + return undefined; + } + + /** + * Update review state for a generation + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + * @param generationId Generation identifier + * @param state Review state updates + */ + updateReviewState( + workspaceId: string, + threadId: string, + generationId: string, + state: Partial + ): void { + const thread = this.getOrCreateThread(workspaceId, threadId); + const generation = thread.generations.find(g => g.id === generationId); + + if (!generation) { + console.error(`[ChatStateStorage] Generation not found for review update: ${generationId}`); + return; + } + + Object.assign(generation.reviewState, state); + thread.updatedAt = Date.now(); + + console.log(`[ChatStateStorage] Updated review state for generation: ${generationId}, status: ${generation.reviewState.status}`); + } + + /** + * Accept all reviews in a thread + * Marks ALL 'under_review' generations as 'accepted' + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + */ + acceptAllReviews(workspaceId: string, threadId: string): void { + const thread = this.getOrCreateThread(workspaceId, threadId); + let count = 0; + + for (const generation of thread.generations) { + if (generation.reviewState.status === 'under_review') { + generation.reviewState.status = 'accepted'; + count++; + } + } + + thread.updatedAt = Date.now(); + console.log(`[ChatStateStorage] Accepted ${count} review(s) in thread: ${threadId}`); + } + + /** + * Decline all reviews in a thread + * Marks ALL 'under_review' generations as 'error' + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + */ + declineAllReviews(workspaceId: string, threadId: string): void { + const thread = this.getOrCreateThread(workspaceId, threadId); + let count = 0; + + for (const generation of thread.generations) { + if (generation.reviewState.status === 'under_review') { + generation.reviewState.status = 'error'; + generation.reviewState.errorMessage = 'Declined by user'; + count++; + } + } + + thread.updatedAt = Date.now(); + console.log(`[ChatStateStorage] Declined ${count} review(s) in thread: ${threadId}`); + } + + // ============================================ + // Checkpoint Management + // ============================================ + + /** + * Get all checkpoints for a thread (across all generations) + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + * @returns Array of checkpoints in chronological order + */ + getCheckpoints(workspaceId: string, threadId: string): Checkpoint[] { + const thread = this.getOrCreateThread(workspaceId, threadId); + const checkpoints: Checkpoint[] = []; + + for (const generation of thread.generations) { + if (generation.checkpoint) { + checkpoints.push(generation.checkpoint); + } + } + + return checkpoints; + } + + /** + * Find checkpoint by ID + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + * @param checkpointId Checkpoint identifier + * @returns Checkpoint and its generation, or undefined + */ + findCheckpoint( + workspaceId: string, + threadId: string, + checkpointId: string + ): { checkpoint: Checkpoint; generation: Generation } | undefined { + const thread = this.getOrCreateThread(workspaceId, threadId); + + for (const generation of thread.generations) { + if (generation.checkpoint?.id === checkpointId) { + return { checkpoint: generation.checkpoint, generation }; + } + } + + return undefined; + } + + /** + * Add checkpoint to a generation + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + * @param generationId Generation identifier + * @param checkpoint Checkpoint to add + */ + async addCheckpointToGeneration( + workspaceId: string, + threadId: string, + generationId: string, + checkpoint: Checkpoint + ): Promise { + const thread = this.getOrCreateThread(workspaceId, threadId); + const generation = thread.generations.find(g => g.id === generationId); + + if (!generation) { + console.error(`[ChatStateStorage] Generation not found: ${generationId}`); + return; + } + + generation.checkpoint = checkpoint; + thread.updatedAt = Date.now(); + + console.log(`[ChatStateStorage] Added checkpoint ${checkpoint.id} to generation ${generationId}`); + + // Enforce maxCount limit by removing oldest checkpoints + await this.enforceCheckpointLimit(workspaceId, threadId); + } + + /** + * Enforce checkpoint limit by removing oldest checkpoints beyond maxCount + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + */ + private async enforceCheckpointLimit(workspaceId: string, threadId: string): Promise { + // Dynamic import to avoid circular dependencies + const { getCheckpointConfig } = await import('../../views/ai-panel/checkpoint/checkpointConfig'); + const config = getCheckpointConfig(); + + if (!config.enabled) { + return; + } + + const thread = this.getOrCreateThread(workspaceId, threadId); + + // Collect all generations with checkpoints + const generationsWithCheckpoints = thread.generations + .map((gen, index) => ({ generation: gen, index })) + .filter(item => item.generation.checkpoint !== undefined); + + // If we're within the limit, nothing to do + if (generationsWithCheckpoints.length <= config.maxCount) { + return; + } + + // Calculate how many checkpoints to remove + const checkpointsToRemove = generationsWithCheckpoints.length - config.maxCount; + + // Remove checkpoints from oldest generations (keep the most recent maxCount) + for (let i = 0; i < checkpointsToRemove; i++) { + const { generation } = generationsWithCheckpoints[i]; + const checkpointId = generation.checkpoint?.id; + + console.log(`[ChatStateStorage] Removing old checkpoint ${checkpointId} (exceeds maxCount: ${config.maxCount})`); + generation.checkpoint = undefined; + } + + thread.updatedAt = Date.now(); + } + + /** + * Restore thread to a checkpoint (truncate generations after checkpoint) + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + * @param checkpointId Checkpoint identifier + * @returns true if restored, false if checkpoint not found + */ + restoreThreadToCheckpoint( + workspaceId: string, + threadId: string, + checkpointId: string + ): boolean { + const thread = this.getOrCreateThread(workspaceId, threadId); + + // Find the generation containing this checkpoint + let checkpointGenerationIndex = -1; + for (let i = 0; i < thread.generations.length; i++) { + if (thread.generations[i].checkpoint?.id === checkpointId) { + checkpointGenerationIndex = i; + break; + } + } + + if (checkpointGenerationIndex === -1) { + console.error(`[ChatStateStorage][RESTORE] Checkpoint ${checkpointId} not found in thread ${threadId}`); + return false; + } + + // Truncate generations at the checkpoint + // Remove the generation WITH the checkpoint and everything after it + // This restores to the state BEFORE the user submitted this message + thread.generations = thread.generations.slice(0, checkpointGenerationIndex); + thread.updatedAt = Date.now(); + + return true; + } + + // ============================================ + // Utilities + // ============================================ + + /** + * Generate a unique ID + * @returns Unique string ID + */ + private generateId(): string { + return `${Date.now()}-${crypto.randomBytes(8).toString('hex')}`; + } + + /** + * Get storage statistics + */ + getStats(): { + workspaceCount: number; + totalThreads: number; + totalGenerations: number; + estimatedSizeMB: number; + } { + let totalThreads = 0; + let totalGenerations = 0; + let estimatedSize = 0; + + for (const workspace of this.storage.values()) { + totalThreads += workspace.threads.size; + + for (const thread of workspace.threads.values()) { + totalGenerations += thread.generations.length; + } + + // Rough estimate of size (serialize to JSON) + estimatedSize += JSON.stringify({ + workspaceId: workspace.workspaceId, + threads: Array.from(workspace.threads.values()), + }).length; + } + + return { + workspaceCount: this.storage.size, + totalThreads, + totalGenerations, + estimatedSizeMB: estimatedSize / (1024 * 1024) + }; + } + + // ============================================ + // Active Execution Management (for abort functionality) + // ============================================ + + /** + * Register active execution for a thread + * Auto-aborts existing execution if present + * + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + * @param execution Active execution handle + */ + setActiveExecution( + workspaceId: string, + threadId: string, + execution: ActiveExecution + ): void { + // Abort any existing execution for this thread first + this.abortActiveExecution(workspaceId, threadId); + + let threadMap = this.activeExecutions.get(workspaceId); + if (!threadMap) { + threadMap = new Map(); + this.activeExecutions.set(workspaceId, threadMap); + } + + threadMap.set(threadId, execution); + console.log(`[ChatStateStorage] Registered active execution: ${execution.generationId} for thread: ${threadId}`); + } + + /** + * Abort active execution for a thread + * Called by RPC abort handler + * + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + * @returns true if execution was aborted, false if no active execution found + */ + abortActiveExecution(workspaceId: string, threadId: string): boolean { + const threadMap = this.activeExecutions.get(workspaceId); + if (!threadMap) { + return false; + } + + const execution = threadMap.get(threadId); + if (!execution) { + return false; + } + + console.log(`[ChatStateStorage] Aborting execution: ${execution.generationId} for thread: ${threadId}`); + execution.abortController.abort(); + + // Cleanup + threadMap.delete(threadId); + if (threadMap.size === 0) { + this.activeExecutions.delete(workspaceId); + } + + return true; + } + + /** + * Clear active execution when completed normally + * Called in finally block of AICommandExecutor.run() + * + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + */ + clearActiveExecution(workspaceId: string, threadId: string): void { + const threadMap = this.activeExecutions.get(workspaceId); + if (!threadMap) { + return; + } + + threadMap.delete(threadId); + if (threadMap.size === 0) { + this.activeExecutions.delete(workspaceId); + } + + console.log(`[ChatStateStorage] Cleared active execution for thread: ${threadId}`); + } + + /** + * Get active execution (for debugging/inspection) + * + * @param workspaceId Workspace identifier + * @param threadId Thread identifier + * @returns Active execution or undefined + */ + getActiveExecution(workspaceId: string, threadId: string): ActiveExecution | undefined { + return this.activeExecutions.get(workspaceId)?.get(threadId); + } +} + +// Singleton export +export const chatStateStorage = new ChatStateStorage(); diff --git a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/checkpoint/checkpointConfig.ts b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/checkpoint/checkpointConfig.ts new file mode 100644 index 00000000000..aa11ca3c713 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/checkpoint/checkpointConfig.ts @@ -0,0 +1,53 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import * as vscode from 'vscode'; + +export interface CheckpointConfig { + enabled: boolean; + maxCount: number; + ignorePatterns: string[]; + maxSnapshotSize: number; +} + +export const DEFAULT_CHECKPOINT_CONFIG: CheckpointConfig = { + enabled: true, + maxCount: 3, + ignorePatterns: [ + 'node_modules/**', + '.git/**', + 'target/**', + 'build/**', + 'dist/**', + '.vscode/**', + '*.log', + '.DS_Store' + ], + maxSnapshotSize: 52428800 +}; + +export function getCheckpointConfig(): CheckpointConfig { + const config = vscode.workspace.getConfiguration('ballerina.copilot.checkpoints'); + + return { + enabled: config.get('enabled', DEFAULT_CHECKPOINT_CONFIG.enabled), + maxCount: config.get('maxCount', DEFAULT_CHECKPOINT_CONFIG.maxCount), + ignorePatterns: config.get('ignorePatterns', DEFAULT_CHECKPOINT_CONFIG.ignorePatterns), + maxSnapshotSize: config.get('maxSnapshotSize', DEFAULT_CHECKPOINT_CONFIG.maxSnapshotSize) + }; +} diff --git a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/checkpoint/checkpointUtils.ts b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/checkpoint/checkpointUtils.ts new file mode 100644 index 00000000000..ab222c8d531 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/checkpoint/checkpointUtils.ts @@ -0,0 +1,274 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import * as vscode from 'vscode'; +import * as path from 'path'; +import { Checkpoint } from '@wso2/ballerina-core/lib/state-machine-types'; +import { getCheckpointConfig } from './checkpointConfig'; +import { ArtifactNotificationHandler, ArtifactsUpdated } from '../../../utils/project-artifacts-handler'; +import { VisualizerRpcManager } from '../../../rpc-managers/visualizer/rpc-manager'; +import { StateMachine, updateView } from '../../../../src/stateMachine'; +import { refreshDataMapper } from '../../../../src/rpc-managers/data-mapper/utils'; + +const generateId = () => `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; + +function matchesPattern(filePath: string, pattern: string): boolean { + const normalizedPath = filePath.replace(/\\/g, '/'); + + const regexPattern = pattern + .replace(/\./g, '\\.') + .replace(/\*\*/g, '::DOUBLESTAR::') + .replace(/\*/g, '[^/]*') + .replace(/::DOUBLESTAR::/g, '.*'); + + const regex = new RegExp(`^${regexPattern}$`); + return regex.test(normalizedPath); +} + +export async function captureWorkspaceSnapshot(messageId: string): Promise { + const config = getCheckpointConfig(); + + if (!config.enabled) { + return null; + } + + const workspaceFolders = vscode.workspace.workspaceFolders; + if (!workspaceFolders || workspaceFolders.length === 0) { + console.warn('[Checkpoint] No workspace folder found'); + return null; + } + + const workspaceRoot = workspaceFolders[0].uri; + const workspaceSnapshot: { [filePath: string]: string } = {}; + const fileList: string[] = []; + let totalSize = 0; + + try { + const allFiles = await getAllWorkspaceFiles(workspaceRoot, config.ignorePatterns); + + for (const fileUri of allFiles) { + try { + const fileContent = await vscode.workspace.fs.readFile(fileUri); + const content = Buffer.from(fileContent).toString('utf8'); + const relativePath = path.relative(workspaceRoot.fsPath, fileUri.fsPath); + + workspaceSnapshot[relativePath] = content; + fileList.push(relativePath); + totalSize += content.length; + + if (totalSize > config.maxSnapshotSize) { + console.warn(`[Checkpoint] Snapshot size exceeded max limit: ${totalSize} bytes`); + vscode.window.showWarningMessage( + `Checkpoint snapshot size (${Math.round(totalSize / 1024 / 1024)}MB) exceeds limit. Some files may not be included.` + ); + break; + } + } catch (error) { + console.error(`[Checkpoint] Failed to read file ${fileUri.fsPath}:`, error); + } + } + + const checkpoint: Checkpoint = { + id: generateId(), + messageId, + timestamp: Date.now(), + workspaceSnapshot, + fileList, + snapshotSize: totalSize + }; + + return checkpoint; + } catch (error) { + console.error('[Checkpoint] Failed to capture workspace snapshot:', error); + vscode.window.showErrorMessage('Failed to create checkpoint: ' + (error as Error).message); + return null; + } +} + +export async function restoreWorkspaceSnapshot(checkpoint: Checkpoint): Promise { + const workspaceFolders = vscode.workspace.workspaceFolders; + if (!workspaceFolders || workspaceFolders.length === 0) { + throw new Error('No workspace folder found'); + } + + const workspaceRoot = workspaceFolders[0].uri; + let isBalFileRestored = false; + + try { + await vscode.window.withProgress({ + location: vscode.ProgressLocation.Notification, + title: 'Restoring checkpoint...', + cancellable: false + }, async (progress) => { + progress.report({ message: 'Reading current workspace...' }); + + const config = getCheckpointConfig(); + const currentFiles = await getAllWorkspaceFiles(workspaceRoot, config.ignorePatterns); + const currentFilePaths = new Set( + currentFiles.map(uri => path.relative(workspaceRoot.fsPath, uri.fsPath)) + ); + + const snapshotFilePaths = new Set(checkpoint.fileList); + + const filesToDelete = Array.from(currentFilePaths).filter( + filePath => !snapshotFilePaths.has(filePath) + ); + + // Check if any .bal files are being modified + isBalFileRestored = filesToDelete.some(filePath => filePath.endsWith('.bal')) || + checkpoint.fileList.some(filePath => filePath.endsWith('.bal')); + + // Create a WorkspaceEdit for batch operations + const workspaceEdit = new vscode.WorkspaceEdit(); + + progress.report({ message: `Preparing ${filesToDelete.length} deletions and ${checkpoint.fileList.length} file restorations...` }); + + // Queue all file deletions + for (const filePath of filesToDelete) { + const fileUri = vscode.Uri.file(path.join(workspaceRoot.fsPath, filePath)); + workspaceEdit.deleteFile(fileUri, { ignoreIfNotExists: true }); + } + + // Queue all file creations/updates with content + for (const [filePath, content] of Object.entries(checkpoint.workspaceSnapshot)) { + const fileUri = vscode.Uri.file(path.join(workspaceRoot.fsPath, filePath)); + + // Create file first (empty or existing) + workspaceEdit.createFile(fileUri, { ignoreIfExists: true, overwrite: true }); + + // Then replace content to trigger proper LS notifications + workspaceEdit.replace( + fileUri, + new vscode.Range( + new vscode.Position(0, 0), + new vscode.Position(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER) + ), + content + ); + } + + progress.report({ message: 'Applying workspace changes...' }); + + // Apply all changes atomically + const success = await vscode.workspace.applyEdit(workspaceEdit); + await vscode.workspace.saveAll(); + if (!success) { + throw new Error('Failed to apply workspace edit'); + } + + progress.report({ message: 'Checkpoint restored successfully!' }); + await renderDatamapper(); + }); + + // Wait for artifact update notification if any .bal files were restored + await new Promise((resolve, reject) => { + if (!isBalFileRestored) { + resolve(); + return; + } + + // Get the artifact notification handler instance + const notificationHandler = ArtifactNotificationHandler.getInstance(); + // Subscribe to artifact updated notifications + let unsubscribe = notificationHandler.subscribe(ArtifactsUpdated.method, undefined, async (payload) => { + new VisualizerRpcManager().updateCurrentArtifactLocation({ artifacts: payload.data }); + clearTimeout(timeoutId); + resolve(); + unsubscribe(); + }); + + // Set a timeout to reject if no notification is received within 10 seconds + const timeoutId = setTimeout(() => { + console.log("[Checkpoint] No artifact update notification received within 10 seconds"); + reject(new Error("Operation timed out. Please try again.")); + unsubscribe(); + }, 10000); + + // Clear the timeout when notification is received + const originalUnsubscribe = unsubscribe; + unsubscribe = () => { + clearTimeout(timeoutId); + originalUnsubscribe(); + }; + }); + + vscode.window.showInformationMessage('Checkpoint restored successfully'); + } catch (error) { + console.error('[Checkpoint] Failed to restore workspace snapshot:', error); + vscode.window.showErrorMessage('Failed to restore checkpoint: ' + (error as Error).message); + } +} + +//TODO: Verify why this doesnt work. +export async function renderDatamapper() { + const context = StateMachine.context(); + const dataMapperMetadata = context.dataMapperMetadata; + if (!dataMapperMetadata || !dataMapperMetadata.codeData) { + updateView(); + return true; + } + + // Refresh data mapper with the updated code + let filePath = dataMapperMetadata.codeData.lineRange?.fileName; + const varName = dataMapperMetadata.name; + if (!filePath || !varName) { + updateView(); + return true; + } + + await refreshDataMapper(filePath, dataMapperMetadata.codeData, varName); +} + +async function getAllWorkspaceFiles(workspaceRoot: vscode.Uri, ignorePatterns: string[]): Promise { + const files: vscode.Uri[] = []; + + async function scanDirectory(dirUri: vscode.Uri): Promise { + try { + const entries = await vscode.workspace.fs.readDirectory(dirUri); + + for (const [name, type] of entries) { + const entryUri = vscode.Uri.joinPath(dirUri, name); + const relativePath = path.relative(workspaceRoot.fsPath, entryUri.fsPath); + + if (shouldIgnoreFile(relativePath, ignorePatterns)) { + continue; + } + + if (type === vscode.FileType.File) { + files.push(entryUri); + } else if (type === vscode.FileType.Directory) { + await scanDirectory(entryUri); + } + } + } catch (error) { + console.error(`[Checkpoint] Failed to scan directory ${dirUri.fsPath}:`, error); + } + } + + await scanDirectory(workspaceRoot); + return files; +} + +function shouldIgnoreFile(filePath: string, ignorePatterns: string[]): boolean { + for (const pattern of ignorePatterns) { + if (matchesPattern(filePath, pattern)) { + return true; + } + } + return false; +} diff --git a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/codeContextUtils.ts b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/codeContextUtils.ts new file mode 100644 index 00000000000..43518f62b0e --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/codeContextUtils.ts @@ -0,0 +1,60 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import * as path from 'path'; +import { workspace } from 'vscode'; +import { CodeContext } from '@wso2/ballerina-core/lib/rpc-types/ai-panel/interfaces'; + +/** + * Normalizes codeContext to use relative paths from workspace root + * @param codeContext The code context with potentially absolute file path + * @returns CodeContext with relative file path, or undefined if input is undefined + */ +export const normalizeCodeContext = (codeContext?: CodeContext): CodeContext | undefined => { + if (!codeContext) { + return undefined; + } + + const workspaceFolders = workspace.workspaceFolders; + if (!workspaceFolders || workspaceFolders.length === 0) { + return codeContext; + } + + const workspaceRoot = workspaceFolders[0].uri.fsPath; + const absolutePath = path.isAbsolute(codeContext.filePath) + ? codeContext.filePath + : path.join(workspaceRoot, codeContext.filePath); + + // Convert to relative path from workspace root + const relativePath = path.relative(workspaceRoot, absolutePath); + + if (codeContext.type === 'addition') { + return { + type: 'addition', + position: codeContext.position, + filePath: relativePath + }; + } else { + return { + type: 'selection', + startPosition: codeContext.startPosition, + endPosition: codeContext.endPosition, + filePath: relativePath + }; + } +}; diff --git a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/idGenerators.ts b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/idGenerators.ts new file mode 100644 index 00000000000..ff6915c5134 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/idGenerators.ts @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. + * + * WSO2 LLC. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import * as crypto from 'crypto'; +import { workspace } from 'vscode'; + +/** + * Generates a unique identifier for messages and other entities + * @returns A unique string ID + */ +export const generateId = () => `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; + +/** + * Generates a unique session identifier + * @returns A unique session ID string + */ +export const generateSessionId = () => `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`; + +/** + * Generates a unique project identifier based on the workspace root path + * @returns A UUID string for the current project + */ +export const generateProjectId = (): string => { + const workspaceFolders = workspace.workspaceFolders; + + if (!workspaceFolders || workspaceFolders.length === 0) { + // Fallback for when no workspace is open + return 'default-project'; + } + + // Use the first workspace folder path to generate a consistent UUID + const workspacePath = workspaceFolders[0].uri.fsPath; + + // Create a hash of the workspace path for consistent project ID + const hash = crypto.createHash('sha256'); + hash.update(workspacePath); + const projectHash = hash.digest('hex').substring(0, 16); + + return `project-${projectHash}`; +}; diff --git a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/utils.ts b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/utils.ts index 8033adafaca..59a5f05b275 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/ai-panel/utils.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/ai-panel/utils.ts @@ -25,7 +25,7 @@ import { getAuthUrl, getLogoutUrl } from './auth'; import { extension } from '../../BalExtensionContext'; import { getAccessToken, clearAuthCredentials, storeAuthCredentials, getLoginMethod, exchangeStsToken, getAuthCredentials } from '../../utils/ai/auth'; import { DEVANT_STS_TOKEN_CONFIG } from '../../features/ai/utils'; -import { getBedrockRegionalPrefix } from '../../features/ai/service/connection'; +import { getBedrockRegionalPrefix } from '../../features/ai/utils/ai-client'; import { getDevantStsToken } from '../../features/devant/activator'; const LEGACY_ACCESS_TOKEN_SECRET_KEY = 'BallerinaAIUser'; diff --git a/workspaces/ballerina/ballerina-extension/src/views/visualizer/webview.ts b/workspaces/ballerina/ballerina-extension/src/views/visualizer/webview.ts index ecf6d46eb55..4b13946ad73 100644 --- a/workspaces/ballerina/ballerina-extension/src/views/visualizer/webview.ts +++ b/workspaces/ballerina/ballerina-extension/src/views/visualizer/webview.ts @@ -145,6 +145,10 @@ export class VisualizerWebview { return this._panel; } + public static isVisualizerActive(): boolean { + return VisualizerWebview.currentPanel?.getWebview()?.active ?? false; + } + private getWebviewContent(webView: Webview) { // Check if devant.editor extension is active const isDevantEditor = vscode.commands.executeCommand('getContext', 'devant.editor') !== undefined; diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts index ea93b1bacf4..1804b3666dd 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/code.test.ts @@ -48,8 +48,7 @@ const TEST_USE_CASES: readonly TestUseCase[] = testCases.map((testCase, index) = id: `usecase_${index + 1}`, description: testCase.prompt.substring(0, 50) + "...", usecase: testCase.prompt, - operationType: "CODE_GENERATION" as const, - // projectPath: path.join(PROJECT_ROOT, testCase.projectPath) + operationType: undefined, projectPath: path.join(PROJECT_ROOT, testCase.projectPath) })); @@ -145,19 +144,19 @@ async function setupTestEnvironment(): Promise { dotenv.config({ path: envPath }); console.log("Loaded .env file for AI tests"); } - + // Poll for AI test command availability let attempts = 0; - + while (attempts < TIMING.MAX_ACTIVATION_ATTEMPTS) { const availableCommands = await vscode.commands.getCommands(); - if (availableCommands.includes(VSCODE_COMMANDS.AI_GENERATE_CODE_CORE)) { + if (availableCommands.includes(VSCODE_COMMANDS.AI_GENERATE_AGENT_FOR_TEST)) { break; } await new Promise(resolve => setTimeout(resolve, TIMING.EXTENSION_ACTIVATION_RETRY_INTERVAL)); attempts++; } - + if (attempts >= TIMING.MAX_ACTIVATION_ATTEMPTS) { throw new Error("AI test command never registered - extension failed to activate"); } @@ -172,7 +171,7 @@ async function setupTestEnvironment(): Promise { } } -suite.skip("AI Code Generator Tests Suite", () => { +suite.only("AI Code Generator Tests Suite", () => { suiteSetup(async function (): Promise { await setupTestEnvironment(); @@ -186,7 +185,7 @@ suite.skip("AI Code Generator Tests Suite", () => { // Check API key before running any tests in this suite const anthropicApiKey = process.env.ANTHROPIC_API_KEY; const hasAnthropicKey = anthropicApiKey && anthropicApiKey.trim() !== ""; - + if (!hasAnthropicKey) { console.log(`\n⚠️ Skipping entire test suite: ANTHROPIC_API_KEY not set`); return; // Skip the entire suite diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts index 447935f9bfc..37c66435d0c 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/result-management/result-conversion.ts @@ -22,7 +22,14 @@ import { FILES } from '../utils/constants'; * Converts TestCaseResult to UsecaseResult format */ export function convertTestResultToUsecaseResult(testResult: TestCaseResult, iteration?: number): UsecaseResult { - const files = extractSourceFilesFromContent(testResult.result.fullContent); + // Use generatedSources if available (actual .bal files from filesystem), + // otherwise fall back to parsing fullContent (backward compatibility) + const files = testResult.generatedSources + ? testResult.generatedSources.map(sf => ({ + fileName: sf.filePath, // Convert filePath to fileName for result types + content: sf.content + })) + : extractSourceFilesFromContent(testResult.result.fullContent); const diagnostics: DiagnosticMessage[] = testResult.result.diagnostics.map(diag => ({ message: typeof diag === 'string' ? diag : (diag as { message?: string }).message || diag.toString(), diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts index bdc81d4e600..210c56c0e4e 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/test-cases.ts @@ -259,9 +259,116 @@ export const testCasesForExistingSemanticErrors = [ } ]; +export const langlibTestCases = [ + { + // cloneWithType(), trim(), toLowerAscii(), toJson(), string.length(), indexOf(), substring(), message() + prompt: "Build a service that reads customer data from a JSON file, removes extra spaces from names, converts all email addresses to lowercase, filters out customers from blocked domains, and exports the cleaned data back to JSON format for CRM import.", + projectPath: "bi_init" + }, + { + // toString(), fromBase64(), message(), fromBytes(), ‘join(), endsWith(), replaceAll(), message(), string.length() + prompt: "Develop an integration that receives base64 encoded files, decodes them to text, removes special characters, checks if filenames end with specific extensions, combines multiple file contents with separators, and uploads the merged data as JSON to cloud storage.", + projectPath: "bi_init" + }, + { + // array.length(), indexOf(), subString(), push(), filter(), trim(), clone(), cloneReadOnly() + prompt: "Write a service that processes configuration files, checks which settings exist, lists all available parameter names, finds positions of delimiter characters, extracts values between delimiters, filters empty configurations, and creates typed copies for different environments.", + projectPath: "bi_init" + }, + { + // findAll(), substring(), push(), findGroups(), string.length(), push(), startswith(), fromJsonString(), cloneWithType(), arr.length() + prompt: "Build an integration that scans HTML email content for all URLs, finds the first clickable link, counts total links and XML attachments, parses XML metadata, checks if URLs start with https, deserializes embedded JSON data with type safety, and measures the size of extracted collections.", + projectPath: "bi_init" + }, + { + // toUpperAscii(), cloneReadOnly(), string.length() + prompt: "Create a service that reads product names from inventory, alphabetically compares and arranges them using unicode ordering, removes the oldest and newest entries, converts remaining names to uppercase, creates immutable copies, measures text lengths, and exports as an array structure.", + projectPath: "bi_init" + }, + { + // trim(), replaceAll(), decimal:fromString(), float:fromString(), array:length(), .toString(), message(), push() + prompt: "Develop an API that reads scientific measurements from spreadsheets, converts text values to floating point numbers, applies exponential calculations for growth projections, parses currency amounts, validates data types match requirements, aggregates results, and returns JSON output after trimming whitespace.", + projectPath: "bi_init" + }, + { + // length(), push(), split(), trim(), toLowerAscii(), includes(), keys(), removeAll(), unshift(), cloneReadOnly(), join() + prompt: "Write an integration that processes comma-separated log entries, splits them into fields, checks for error keywords, removes sensitive configuration keys conditionally, clears entire cache when needed, prepends priority entries to the front, creates read-only snapshots, combines messages, and finds specific entry positions.", + projectPath: "bi_init" + }, + { + // xml:fromString(), cloneWithType(), fromCodePointInt(), push(), int:fromString(), toString(), length(), message() + prompt: "Create a service that iterates through XML records from multiple files, merges them into a single document, deserializes typed JSON configurations, generates special unicode characters for formatting, converts character codes to strings, parses numeric IDs, retrieves associated metadata, and outputs combined JSON.", + projectPath: "bi_init" + }, + { + // length(), toCodePointInt(), regexp:fromString(), isFullMatch(), matches(), matchAt(), substring(), push(), toLowerAscii(), trim(), getCodePoint(), fromCodePointInt() + prompt: "Build a validation service that examines text input character by character, extracts unicode code points at specific positions, converts characters to numeric codes, validates entire strings match patterns, checks pattern matches at exact locations, filters valid entries, interprets yes/no flags, and generates text reports.", + projectPath: "bi_init" + }, + { + // toLowerAscii(), startsWith(), substring(), int:fromHexString(), findAll(), push(), ensureType(), sort(), keys(), get(), length(), toString(), message() + prompt: "Develop a sensor data processor that reads hexadecimal encoded temperature values, converts them to readable float format, parses hex device IDs to integers, validates data packet sizes, orders readings chronologically, deserializes JSON metadata, extracts grouped sensor identifiers, and iterates through all key-value pairs for storage.", + projectPath: "bi_init" + }, + { + // toLowerAscii(), findGroups(), length(), push(), substring(), toJson(), toStream(), stream.forEach(), sleep() + prompt: "Write a polling integration that waits 30 seconds between API calls, retrieves streaming data one record at a time, processes each stream item, normalizes email addresses to lowercase, captures all pattern groups from reference numbers, accumulates results in a collection, and serializes the batch to JSON.", + projectPath: "bi_init" + }, + { + // message(), cause(), detail(), entries(), toString(), push(), length(), startsWith(), toCodePontInt(), int:fromString() + prompt: "Build a monitoring service that captures exception messages, traces root causes of failures, extracts detailed error information, filters errors starting with specific codes, converts error objects to readable text, parses XML error reports, and retrieves severity levels from configuration for alerting.", + projectPath: "bi_init" + }, + { + // findAll(), decimal:fromString(), substring(), length(), regexp:fromString(), replace(), fromJsonString(), cloneWithType() + prompt: "Create a text processing service that replaces the first occurrence of placeholder tokens, substitutes all remaining placeholders, extracts specific text portions, aggregates numeric values found in content, calculates totals, deserializes typed JSON templates, combines processed segments, and counts final elements.", + projectPath: "bi_init" + }, + { + // message(), findGroups(), findAllGroups(), toLowerAscii(), includes(), isFullMatch(), matchAt(), find(), substring(), find(), replace(), trim(), replaceAll(), push(), clone(), codePointCompare() + prompt: "Develop a log analysis tool that extracts first matching pattern groups from log lines, captures all pattern groups across entries, checks if lines contain error keywords, identifies lines starting with timestamps, filters relevant entries, sorts messages using unicode comparison, and processes all metadata key-value pairs.", + projectPath: "bi_init" + }, + { + // stream.forEach(), push(), trim(), decimal:fromString(), close(), ‘join(), float:exp(), removeAll(), next(), toJson(), toJsonString(), toStream() + prompt: "Build a streaming data processor that properly closes data streams after use, retrieves next items individually, processes each stream element, aggregates values across the stream, converts results to JSON, combines text fragments with delimiters, clears temporary cache completely, and applies exponential transformations to metrics.", + projectPath: "bi_init" + }, + + + // Langlib test cases for existing code + { + // toLowerAscii(), split(), push(), length(), substring() + prompt: "Develop a resource function for processing customers that receives customer data via POST /customers/process endpoint. Parse the incoming JSON payload into typed customer records, export the processed customer data as formatted JSON output, and validate email domains are in lowercase format before storing the customer information.", + projectPath: "langlib_with_existing_code" + }, + { + // message(), cloneWithType(), toJson(), toString(), join() + prompt: "Develop a resource function for the POST /customers endpoint that receives customer data. Parse the incoming JSON payload, convert it to a customer record type, serialize the customer data back to JSON format, and ensure all values are converted to string representations for logging.", + projectPath: "langlib_with_existing_code" + }, + { + // cloneReadOnly(), hasKey(), toString(), toArray(), concat(), get(), ensureType(), push(), cloneWithType() + prompt: "Develop a resource function for the GET /orders/export endpoint that transforms XML order data into immutable structures, ensures product records cannot be modified after creation, and creates read-only order objects that preserve data consistency.", + projectPath: "langlib_with_existing_code" + }, + { + // fromJsonString(), cloneWithType(), cloneReaadOnly(), stratsWith(), ensureType() + prompt: "Develop a resource function for the POST /config/validate endpoint that receives configuration data for validation and environment-specific handling. Parse incoming JSON configuration with type safety, validate data structures match expected formats, and create isolated configuration copies for different deployment environments.", + projectPath: "langlib_with_existing_code" + }, + { + // fromJsonString(), cloneWithType(), length(), push(), message(), fromJsonStringWithType() + prompt: "Develop a resource function for the POST /payments/process endpoint that accepts payment transaction data. Parse the incoming JSON string payload into payment records, validate that payment IDs have the correct length, convert payment records to order-compatible format using type conversion, and capture detailed error messages when validation or conversion fails for proper logging and error response", + projectPath: "langlib_with_existing_code" + } +]; + export let testCases = []; testCases.push(...initialTestCases); testCases.push(...httpTestCases); testCases.push(...textEditSpecializedTestCases); testCases.push(...testCasesForExistingProject); testCases.push(...testCasesForExistingSemanticErrors); +testCases.push(...langlibTestCases); diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts index 55329bd725e..d853e7eafdc 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/types/test-types.ts @@ -14,7 +14,7 @@ // specific language governing permissions and limitations // under the License. -import { ChatNotify } from "@wso2/ballerina-core"; +import { ChatNotify, CodeContext, FileAttatchment, OperationType, SourceFile } from "@wso2/ballerina-core"; import { LLMEvaluationResult } from "../utils/evaluator-utils"; /** @@ -25,8 +25,10 @@ export interface TestUseCase { readonly description: string; readonly usecase: string; readonly projectPath: string; - readonly operationType: "CODE_GENERATION" | "CODE_FOR_USER_REQUIREMENT" | "TESTS_FOR_USER_REQUIREMENT"; - readonly fileAttachments?: readonly { fileName: string; content: string; }[]; + readonly operationType: OperationType; + readonly fileAttachments?: readonly FileAttatchment[]; + readonly isPlanMode?: boolean; + readonly codeContext?: CodeContext; } /** @@ -117,4 +119,5 @@ export interface TestCaseResult { readonly noDiagnosticsCheck: boolean; }; readonly evaluationResult?: LLMEvaluationResult; + readonly generatedSources?: readonly SourceFile[]; } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts index eab486a6be7..d9398f196f2 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/batch-processing.ts @@ -18,8 +18,7 @@ import { TestUseCase, UsecaseResult } from '../types'; import { executeSingleTestCase } from './test-execution'; import { convertTestResultToUsecaseResult, createFailedUsecaseResult } from '../result-management/result-conversion'; import { FILES, PATHS, TIMING, VSCODE_COMMANDS } from './constants'; -import path from 'path'; -import { commands, Uri, workspace } from 'vscode'; +import { commands } from 'vscode'; /** * Processes a single batch of test cases in parallel @@ -37,16 +36,16 @@ export async function processSingleBatch( const batchPromises = batch.map(useCase => executeSingleTestCase(useCase) ); - + const batchResults = await Promise.allSettled(batchPromises); const usecaseResults: UsecaseResult[] = []; - + for (let j = 0; j < batchResults.length; j++) { const settledResult = batchResults[j]; const useCase = batch[j]; - + let usecaseResult: UsecaseResult; - + if (settledResult.status === 'fulfilled') { usecaseResult = convertTestResultToUsecaseResult(settledResult.value, iteration); } else { @@ -57,10 +56,10 @@ export async function processSingleBatch( usecaseResult = { ...usecaseResult, iteration }; } } - + usecaseResults.push(usecaseResult); } - + return usecaseResults; } catch (error) { console.error(`❌ Batch ${batchNumber} processing failed:`, (error as Error).message); @@ -89,17 +88,10 @@ export function wait(ms: number): Promise { } async function setupTestEnvironmentForBatch(projectPath: string): Promise { - // Wait for VSCode startup to complete - await new Promise(resolve => setTimeout(resolve, TIMING.WORKSPACE_SETUP_DELAY)); - + // With isolated test projects, we no longer need to switch workspaces + // Just ensure editors are closed to avoid memory issues await commands.executeCommand(VSCODE_COMMANDS.CLOSE_ALL_EDITORS); - - // Add the Ballerina workspace to trigger workspaceContains activation event - const currentFolderCount = workspace.workspaceFolders?.length || 0; - workspace.updateWorkspaceFolders(0, currentFolderCount, { - uri: Uri.file(projectPath), - }); - - // Give VSCode time to detect the workspace and trigger activation - await new Promise(resolve => setTimeout(resolve, TIMING.WORKSPACE_SETTLE_DELAY)); + + console.log(`[Batch Setup] Batch using base project: ${projectPath}`); + // Note: Each test will get its own isolated copy via createIsolatedTestProject } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts index 6225a495d57..6a8d1c11433 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/constants.ts @@ -15,13 +15,12 @@ // under the License. import { TestConfiguration } from '../types'; -import * as path from 'path'; /** * Default test configuration */ export const DEFAULT_TEST_CONFIG: TestConfiguration = { - // should be 1, 5, 10, 15, 20 ... + // ExecutionContext pattern enables parallel execution without race conditions! maxConcurrency: 5, iterations: 1 } as const; @@ -76,5 +75,5 @@ observabilityIncluded = true export const VSCODE_COMMANDS = { CLOSE_ALL_EDITORS: "workbench.action.closeAllEditors", OPEN: "vscode.open", - AI_GENERATE_CODE_CORE: "ballerina.test.ai.generateCodeCore" + AI_GENERATE_AGENT_FOR_TEST: "ballerina.test.ai.generateAgentForTest" } as const; diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts index c175edc1293..de17846193a 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-execution.ts @@ -15,13 +15,13 @@ // under the License. import { commands } from "vscode"; -import { GenerateCodeRequest } from "@wso2/ballerina-core"; import { TestUseCase, TestCaseResult } from '../types'; import { createTestEventHandler } from './test-event-handler'; import { validateTestResult } from './test-validation'; import { VSCODE_COMMANDS } from './constants'; -import { getProjectFromResponse, getProjectSource } from "./evaluator-utils"; import { SourceFile } from "@wso2/ballerina-core"; +import { createIsolatedTestProject, cleanupIsolatedTestProject, extractSourceFiles, IsolatedProjectResult } from './test-project-utils'; +import { GenerateAgentForTestParams, GenerateAgentForTestResult } from "../../../../../src/features/ai/activator"; /** * Executes a single test case and returns the result @@ -29,32 +29,89 @@ import { SourceFile } from "@wso2/ballerina-core"; export async function executeSingleTestCase(useCase: TestUseCase): Promise { console.log(`\n🚀 Starting test case: ${useCase.id} - ${useCase.description}`); - const { handler: testEventHandler, getResult } = createTestEventHandler(useCase); + // Track projects for cleanup + let isolatedProject: IsolatedProjectResult | null = null; + let aiTempProjectPath: string | null = null; - const params: GenerateCodeRequest = { - usecase: useCase.usecase, - chatHistory: [], - operationType: useCase.operationType, - fileAttachmentContents: useCase.fileAttachments ? [...useCase.fileAttachments] : [], - }; + try { + isolatedProject = createIsolatedTestProject(useCase.projectPath, useCase.id); + console.log(`[${useCase.id}] Created isolated test project at: ${isolatedProject.path}`); - const initialSources: SourceFile[] = (await getProjectSource(useCase.projectPath)).sourceFiles; + // Step 2: Capture initial state from isolated project + const initialSourceFiles = extractSourceFiles(isolatedProject.path); + const initialSources: SourceFile[] = initialSourceFiles.map(sf => ({ + filePath: sf.filePath, + content: sf.content + })); - try { - await commands.executeCommand(VSCODE_COMMANDS.AI_GENERATE_CODE_CORE, params, testEventHandler); + // Step 3: Set up event handler + const { handler: testEventHandler, getResult } = createTestEventHandler(useCase); + + // Step 4: Prepare generation parameters with isolated project path + // The command will set StateMachine.context().projectPath internally + const params: GenerateAgentForTestParams = { + usecase: useCase.usecase, + operationType: useCase.operationType, + fileAttachmentContents: useCase.fileAttachments ? [...useCase.fileAttachments] : [], + isPlanMode: useCase.isPlanMode ?? false, + codeContext: useCase.codeContext, + projectPath: isolatedProject.path + }; + + // Step 5: Execute test command + // generateAgentForTest will: + // 1. Set StateMachine.context().projectPath to params.projectPath + // 2. Call generateAgentCore which creates temp copy from StateMachine.context().projectPath + const generationResult = await commands.executeCommand( + VSCODE_COMMANDS.AI_GENERATE_AGENT_FOR_TEST, + params, + testEventHandler + ); + + // Verify we got the expected return value + if (!generationResult || !generationResult.tempProjectPath) { + throw new Error(`Test command did not return expected result. Got: ${JSON.stringify(generationResult)}`); + } + console.log(`[${useCase.id}] Generation completed.`); + console.log(`[${useCase.id}] - Isolated project (source): ${generationResult.isolatedProjectPath}`); + console.log(`[${useCase.id}] - Temp project (AI generated): ${generationResult.tempProjectPath}`); + + // Store temp project path for cleanup in finally block + aiTempProjectPath = generationResult.tempProjectPath; + + // Step 6: Extract final state from temp project path (where AI actually made changes) const result = getResult(); - const finalSources: SourceFile[] = getProjectFromResponse(result.fullContent) + const finalSourceFiles = extractSourceFiles(generationResult.tempProjectPath); + const finalSources: SourceFile[] = finalSourceFiles.map(sf => ({ + filePath: sf.filePath, + content: sf.content + })); + + console.log(`[${useCase.id}] Extracted ${finalSources.length} files from AI temp project for validation`); + + // Step 7: Validate results return await validateTestResult(result, useCase, initialSources, finalSources); } catch (error) { - const result = getResult(); console.error(`❌ Test case ${useCase.id} failed with error:`, error); + const result = createTestEventHandler(useCase).getResult(); return { useCase, result, passed: false, failureReason: `Execution error: ${(error as Error).message}` }; + } finally { + // Step 8: Always cleanup both isolated project and AI temp project + if (aiTempProjectPath) { + console.log(`[${useCase.id}] Cleaning up AI temp project: ${aiTempProjectPath}`); + // cleanupIsolatedTestProject({ path: aiTempProjectPath, basePath: '', testId: useCase.id }); + } + + if (isolatedProject) { + console.log(`[${useCase.id}] Cleaning up isolated test project: ${isolatedProject.path}`); + // cleanupIsolatedTestProject(isolatedProject); + } } } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-project-utils.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-project-utils.ts new file mode 100644 index 00000000000..8e54cd61b5b --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-project-utils.ts @@ -0,0 +1,140 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) +// +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import * as fs from 'fs'; +import * as path from 'path'; +import * as os from 'os'; +import * as crypto from 'crypto'; + +/** + * Result of creating an isolated test project + */ +export interface IsolatedProjectResult { + /** Absolute path to the isolated test project */ + path: string; + /** Original base project path that was copied */ + basePath: string; + /** Test case ID this project was created for */ + testId: string; +} + +/** + * Creates an isolated copy of a project for a specific test case. + * Each test gets its own fresh copy to prevent state contamination. + * + * @param baseProjectPath Absolute path to the base project template + * @param testId Unique identifier for the test case + * @returns Information about the created isolated project + */ +export function createIsolatedTestProject( + baseProjectPath: string, + testId: string +): IsolatedProjectResult { + // Validate base project exists + if (!fs.existsSync(baseProjectPath)) { + throw new Error(`Base project path does not exist: ${baseProjectPath}`); + } + + // Create unique temp directory for this specific test + const timestamp = Date.now(); + const randomSuffix = crypto.randomBytes(4).toString('hex'); + const sanitizedTestId = testId.replace(/[^a-zA-Z0-9_-]/g, '_'); + const tempDirName = `bal-test-${sanitizedTestId}-${timestamp}-${randomSuffix}`; + const tempProjectPath = path.join(os.tmpdir(), tempDirName); + + // Create temp directory + fs.mkdirSync(tempProjectPath, { recursive: true }); + + try { + // Copy entire project to isolated temp directory + fs.cpSync(baseProjectPath, tempProjectPath, { + recursive: true, + // Exclude common build artifacts and caches + filter: (source) => { + const basename = path.basename(source); + return basename !== 'target' && + basename !== '.ballerina' && + basename !== 'node_modules'; + } + }); + + console.log(`[Test Isolation] Created isolated project for ${testId} at: ${tempProjectPath}`); + + return { + path: tempProjectPath, + basePath: baseProjectPath, + testId + }; + } catch (error) { + console.error(`[DESIGN_DEBUG] [TEST ISOLATION] Failed to create isolated project:`, error); + // Cleanup on error + try { + fs.rmSync(tempProjectPath, { recursive: true, force: true }); + } catch (cleanupError) { + console.error(`[Test Isolation] Failed to cleanup after error:`, cleanupError); + } + throw new Error(`Failed to create isolated test project: ${error}`); + } +} + +/** + * Cleans up an isolated test project + * + * @param isolatedProject The isolated project information + */ +export function cleanupIsolatedTestProject(isolatedProject: IsolatedProjectResult): void { + if (fs.existsSync(isolatedProject.path)) { + try { + fs.rmSync(isolatedProject.path, { recursive: true, force: true }); + console.log(`[Test Isolation] Cleaned up isolated project for ${isolatedProject.testId}`); + } catch (error) { + console.error(`[Test Isolation] Failed to cleanup ${isolatedProject.path}:`, error); + } + } +} + +/** + * Extracts source files from an isolated test project + * Used for validation after generation + * + * @param projectPath Absolute path to the project + * @returns Array of source files with their content + */ +export function extractSourceFiles(projectPath: string): Array<{filePath: string, content: string}> { + const sourceFiles: Array<{filePath: string, content: string}> = []; + + function scanDirectory(dirPath: string, relativeTo: string) { + const entries = fs.readdirSync(dirPath, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = path.join(dirPath, entry.name); + const relativePath = path.relative(relativeTo, fullPath); + + if (entry.isDirectory()) { + // Skip build artifacts and caches + if (entry.name !== 'target' && entry.name !== '.ballerina') { + scanDirectory(fullPath, relativeTo); + } + } else if (entry.isFile() && entry.name.endsWith('.bal')) { + const content = fs.readFileSync(fullPath, 'utf-8'); + sourceFiles.push({ filePath: relativePath, content }); + } + } + } + + scanDirectory(projectPath, projectPath); + return sourceFiles; +} diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-validation.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-validation.ts index 5d1a7405f0d..b1af029b746 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-validation.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/code/utils/test-validation.ts @@ -49,6 +49,7 @@ export async function validateTestResult(result: TestEventResult, useCase: TestU passed, failureReason: failureReason || undefined, validationDetails, - evaluationResult: evaluation + evaluationResult: evaluation, + generatedSources: finalSources }; } diff --git a/workspaces/ballerina/ballerina-extension/test/ai/evals/datamapper/datamapper.test.ts b/workspaces/ballerina/ballerina-extension/test/ai/evals/datamapper/datamapper.test.ts index 09adc7963f8..f165511f76c 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/evals/datamapper/datamapper.test.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/evals/datamapper/datamapper.test.ts @@ -159,7 +159,7 @@ async function setupTestEnvironment(): Promise { } } -suite.only("AI Datamapper Tests Suite", () => { +suite.skip("AI Datamapper Tests Suite", () => { suiteSetup(async function (): Promise { await setupTestEnvironment(); diff --git a/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/libs.test.ts b/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/libs.test.ts index 451d14337c1..cf6b862b0a3 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/libs.test.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/libs.test.ts @@ -21,7 +21,7 @@ import { VSCODE_COMMANDS, transformLibraryToGetFunctionResponse, } from "./test-helpers"; -import { GenerationType } from "../../../../src/features/ai/service/libs/libs"; +import { GenerationType } from "../../../../src/features/ai/utils/libs/libraries"; suite("Library Integration Tests", () => { suiteSetup(async function (): Promise { diff --git a/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/test-helpers.ts b/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/test-helpers.ts index eb0dd0c6e62..bc74526a794 100644 --- a/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/test-helpers.ts +++ b/workspaces/ballerina/ballerina-extension/test/ai/integration_tests/libs/test-helpers.ts @@ -14,8 +14,8 @@ // specific language governing permissions and limitations // under the License. -import { Library, Client, RemoteFunction, ResourceFunction } from "../../../../src/features/ai/service/libs/libs_types"; -import { GetFunctionResponse, MinifiedClient, MinifiedRemoteFunction, MinifiedResourceFunction } from "../../../../src/features/ai/service/libs/funcs_inter_types"; +import { Library, Client, RemoteFunction, ResourceFunction } from "../../../features/ai/utils/libs/library-types"; +import { GetFunctionResponse, MinifiedClient, MinifiedRemoteFunction, MinifiedResourceFunction } from "../../../features/ai/utils/libs/function-types"; /** * Transforms a Library to GetFunctionResponse format for testing diff --git a/workspaces/ballerina/ballerina-extension/test/ai/post_proccess/post.test.ts b/workspaces/ballerina/ballerina-extension/test/ai/post_proccess/post.test.ts deleted file mode 100644 index 9809a7105b9..00000000000 --- a/workspaces/ballerina/ballerina-extension/test/ai/post_proccess/post.test.ts +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. - * - * WSO2 LLC. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import * as path from 'path'; -import { attemptRepairProject } from '../../../src/rpc-managers/ai-panel/repair-utils'; -import * as assert from 'assert'; -import * as fs from 'fs'; -import * as os from 'os'; -import { StateMachine } from '../../stateMachine'; -import { Uri } from 'vscode'; -import { Diagnostics } from '@wso2/ballerina-core'; - -const RESOURCES_PATH = path.resolve(__dirname, '../../../../test/ai/post_proccess/resources'); - -suite("AI Post processing tests", () => { - setup(done => { - done(); - }); - - const testFolders = fs.readdirSync(RESOURCES_PATH) - .filter((file) => fs.lstatSync(path.join(RESOURCES_PATH, file)).isDirectory()); - - testFolders.forEach((folder) => { - test(`AI Tests : ${folder}`, async () => { - const randomNum = Math.floor(Math.random() * 90000) + 10000; - const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), `bal-proj-${randomNum}-${folder}`)); - const projectRoot = path.join(RESOURCES_PATH, folder); - fs.cpSync(projectRoot, tempDir, { recursive: true }); - - // Find all .bal files in the tempDir and open them - const findBallerinaFiles = (dir: string): string[] => { - let results: string[] = []; - const files = fs.readdirSync(dir); - - files.forEach((file) => { - const filePath = path.join(dir, file); - const stat = fs.statSync(filePath); - - if (stat.isDirectory()) { - results = results.concat(findBallerinaFiles(filePath)); - } else if (path.extname(file) === '.bal') { - results.push(filePath); - } - }); - - return results; - }; - - // Convert file path to URI format - const filePathToUri = (filePath: string): string => { - return Uri.file(filePath).toString(); - }; - //Copy project - const langClient = StateMachine.langClient(); - // Find all Ballerina files and open them - const ballerinaFiles = findBallerinaFiles(tempDir); - for (const filePath of ballerinaFiles) { - const fileContent = fs.readFileSync(filePath, 'utf-8'); - const fileUri = filePathToUri(filePath); - - langClient.didOpen({ - textDocument: { - uri: fileUri, - languageId: 'ballerina', - version: 1, - text: fileContent - } - }); - } - const diags : Diagnostics[] = await attemptRepairProject(langClient, tempDir); - assert.deepStrictEqual(diags, []); - }); - }); -}) - diff --git a/workspaces/ballerina/ballerina-extension/test/ai/post_proccess/resources/complex/Ballerina.toml b/workspaces/ballerina/ballerina-extension/test/ai/post_proccess/resources/complex/Ballerina.toml deleted file mode 100644 index 255d571f2ee..00000000000 --- a/workspaces/ballerina/ballerina-extension/test/ai/post_proccess/resources/complex/Ballerina.toml +++ /dev/null @@ -1,8 +0,0 @@ -[package] -org = "wso2" -name = "test12" -version = "0.1.0" -distribution = "2201.10.0" - -[build-options] -observabilityIncluded = true diff --git a/workspaces/ballerina/ballerina-extension/test/ai/post_proccess/resources/complex/main.bal b/workspaces/ballerina/ballerina-extension/test/ai/post_proccess/resources/complex/main.bal deleted file mode 100644 index aa0895ce990..00000000000 --- a/workspaces/ballerina/ballerina-extension/test/ai/post_proccess/resources/complex/main.bal +++ /dev/null @@ -1,18 +0,0 @@ - -import ballerina/io; -import ballerinax/snowflake; - -snowflake:Options options = { - properties: { - "JDBC_QUERY_RESULT_FORMAT": "JSON" - } -}; - -final snowflake:Client snowflakeClient = check new ("accountIdentifier", "user", "password", options); - -service / on new http:Listener(9090) { - resource function get foo() returns string|http:NotFound { - log:printInfo("hai"); - return "Hello, World!"; - } -} diff --git a/workspaces/ballerina/ballerina-extension/test/data/bi_init/Ballerina.toml b/workspaces/ballerina/ballerina-extension/test/data/bi_init/Ballerina.toml index cdfe34ee006..a70c5e50e1b 100644 --- a/workspaces/ballerina/ballerina-extension/test/data/bi_init/Ballerina.toml +++ b/workspaces/ballerina/ballerina-extension/test/data/bi_init/Ballerina.toml @@ -2,3 +2,6 @@ org = "wso2" name = "bi_empty" version = "0.1.0" + +[build-options] +sticky=false diff --git a/workspaces/ballerina/ballerina-extension/test/data/langlib_with_existing_code/Ballerina.toml b/workspaces/ballerina/ballerina-extension/test/data/langlib_with_existing_code/Ballerina.toml new file mode 100644 index 00000000000..5bb2f9f658f --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/data/langlib_with_existing_code/Ballerina.toml @@ -0,0 +1,4 @@ +[package] +org = "test" +name = "langlib_test" +version = "0.1.0" diff --git a/workspaces/ballerina/ballerina-extension/test/data/langlib_with_existing_code/functions.bal b/workspaces/ballerina/ballerina-extension/test/data/langlib_with_existing_code/functions.bal new file mode 100644 index 00000000000..cd3a04a0af7 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/data/langlib_with_existing_code/functions.bal @@ -0,0 +1,64 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Utility functions that need completion +function parseConfigFile(string content) returns ConfigData|error { + return error("Not implemented"); +} + +function convertOrderToReadonly(Order 'order) returns readonly|error { + return error("Not implemented"); +} + +function extractEmailDomain(string email) returns string|error { + return error("Not implemented"); +} + +function removeDuplicateCustomers(Customer[] customerList) returns Customer[] { + return customerList; +} + +function formatAddress(Address addr) returns string { + return ""; +} + +function validateProductSKU(string sku) returns boolean { + return false; +} + +function getTopProducts(Product[] productList, int count) returns Product[] { + return []; +} + +function parseProductXML(string xmlContent) returns Product[]|error { + return error("Not implemented"); +} + +function getConfigValue(map config, string key) returns string|error { + return error("Not implemented"); +} + +function decodeCustomerData(string encoded) returns Customer|error { + return error("Not implemented"); +} + +function calculateDiscount(decimal price, decimal percentage) returns decimal { + return price; +} + +function processLogStream() returns error? { + return error("Not implemented"); +} diff --git a/workspaces/ballerina/ballerina-extension/test/data/langlib_with_existing_code/types.bal b/workspaces/ballerina/ballerina-extension/test/data/langlib_with_existing_code/types.bal new file mode 100644 index 00000000000..99b687968a7 --- /dev/null +++ b/workspaces/ballerina/ballerina-extension/test/data/langlib_with_existing_code/types.bal @@ -0,0 +1,86 @@ +// Copyright (c) 2025, WSO2 LLC. (https://www.wso2.com/) All Rights Reserved. + +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at + +// http://www.apache.org/licenses/LICENSE-2.0 + +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +// Type definitions for the customer management system +type Address record { + string street; + string city; + string zipCode; + string country; +}; + +type Customer record { + int id; + string name; + string email; + string phone; + Address address; + string[] tags; + decimal creditLimit; +}; + +type CustomerDTO record {| + int id; + string name; + string email; +|}; + +type Product record { + string sku; + string name; + decimal price; + int stockQuantity; + string category; + boolean active; +}; + +type OrderItem record { + string productSku; + int quantity; + decimal unitPrice; +}; + +type Order record { + string orderId; + int customerId; + OrderItem[] items; + decimal totalAmount; + string status; + string orderDate; +}; + +type PaymentRecord record { + string paymentId; + string orderId; + decimal amount; + string method; + string timestamp; +}; + +type ConfigData record {| + string apiKey; + string endpoint; + int timeout; + boolean enableLogging; +|}; + +type LogEntry record { + string timestamp; + string level; + string message; + string? userId; + map metadata; +}; diff --git a/workspaces/ballerina/ballerina-extension/test/index.ts b/workspaces/ballerina/ballerina-extension/test/index.ts index 7de53cce420..5dd1d9aaf02 100644 --- a/workspaces/ballerina/ballerina-extension/test/index.ts +++ b/workspaces/ballerina/ballerina-extension/test/index.ts @@ -48,7 +48,10 @@ function _readCoverOptions(testsRoot: string): ITestRunnerOptions | undefined { } } -function run(testsRoot: string, clb: any): any { +function run(testsRoot: string, clb: any): void { + console.log("🔍 [TEST RUNNER] run() function called"); + console.log("🔍 [TEST RUNNER] testsRoot:", testsRoot); + // Enable source map support require("source-map-support").install(); @@ -60,16 +63,22 @@ function run(testsRoot: string, clb: any): any { coverageRunner.setupCoverage(); } - // Glob test files - glob("**/**.test.js", { cwd: testsRoot }, (error, files): any => { - if (error) { - return clb(error); - } + console.log("🔍 [TEST RUNNER] Starting glob for test files..."); + + // Wrap async glob call to work with callback interface + (async () => { try { + // Glob test files - using promise-based API (glob v11+) + const files = await glob.glob("**/**.test.js", { cwd: testsRoot }); + + console.log("🔍 [TEST RUNNER] Glob completed"); + console.log("🔍 [TEST RUNNER] Files found:", files?.length, files); + // Fill into Mocha files.forEach((f): Mocha => { return mocha.addFile(paths.join(testsRoot, f)); }); + // Run the tests let failureCount = 0; @@ -81,9 +90,10 @@ function run(testsRoot: string, clb: any): any { clb(undefined, failureCount); }); } catch (error) { + console.log("🔍 [TEST RUNNER] Error occurred:", error); return clb(error); } - }); + })(); } exports.run = run; diff --git a/workspaces/ballerina/ballerina-extension/test/language-server/lang-client.test.ts b/workspaces/ballerina/ballerina-extension/test/language-server/lang-client.test.ts index fd11ab78384..7f75595e918 100644 --- a/workspaces/ballerina/ballerina-extension/test/language-server/lang-client.test.ts +++ b/workspaces/ballerina/ballerina-extension/test/language-server/lang-client.test.ts @@ -802,7 +802,7 @@ suite.skip("Language Server Tests", function () { }); }); - test.only("Test get completion", function (done): void { + test("Test get completion", function (done): void { const uri = Uri.file(join(PROJECT_ROOT, 'hello_world.bal')); commands.executeCommand('vscode.open', uri).then(() => { langClient.getCompletion({ diff --git a/workspaces/ballerina/ballerina-extension/ui-test/utils/ServiceDesigner.ts b/workspaces/ballerina/ballerina-extension/ui-test/utils/ServiceDesigner.ts index 98b8112e837..fa87e22b605 100644 --- a/workspaces/ballerina/ballerina-extension/ui-test/utils/ServiceDesigner.ts +++ b/workspaces/ballerina/ballerina-extension/ui-test/utils/ServiceDesigner.ts @@ -22,7 +22,7 @@ import { By, VSBrowser, until } from "vscode-extension-tester"; export class ServiceDesigner { static async waitForServiceDesigner() { - const serviceDesignView = By.xpath("//*[@data-testid='service-design-view']"); + const serviceDesignView = By.xpath("//*[@data-testid='service-agent-view']"); await waitUntil(serviceDesignView, 30000); } diff --git a/workspaces/ballerina/ballerina-rpc-client/package.json b/workspaces/ballerina/ballerina-rpc-client/package.json index 9f0c2f0ec52..43fbe5103cf 100644 --- a/workspaces/ballerina/ballerina-rpc-client/package.json +++ b/workspaces/ballerina/ballerina-rpc-client/package.json @@ -26,10 +26,10 @@ "devDependencies": { "@types/react": "18.2.0", "@types/react-dom": "18.2.0", - "@typescript-eslint/eslint-plugin": "^8.32.1", - "@typescript-eslint/parser": "^8.32.1", + "@typescript-eslint/eslint-plugin": "8.32.1", + "@typescript-eslint/parser": "8.32.1", "copyfiles": "^2.4.1", - "eslint": "^9.27.0", + "eslint": "9.27.0", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", "typescript": "5.8.3" diff --git a/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts b/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts index 7b5882861a8..f4cba7d1927 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/BallerinaRpcClient.ts @@ -51,10 +51,15 @@ import { currentThemeChanged, ChatNotify, onChatNotify, + checkpointCaptured, + CheckpointCapturedPayload, + promptUpdated, AIMachineSendableEvent, dependencyPullProgress, ProjectMigrationResult, - onMigratedProject + onMigratedProject, + refreshReviewMode, + onHideReviewActions } from "@wso2/ballerina-core"; import { LangClientRpcClient } from "./rpc-clients/lang-client/rpc-client"; import { LibraryBrowserRpcClient } from "./rpc-clients/library-browser/rpc-client"; @@ -198,6 +203,14 @@ export class BallerinaRpcClient { this.messenger.sendRequest(sendAIStateEvent, HOST_EXTENSION, event); } + onCheckpointCaptured(callback: (payload: CheckpointCapturedPayload) => void) { + this.messenger.onNotification(checkpointCaptured, callback); + } + + onPromptUpdated(callback: () => void) { + this.messenger.onNotification(promptUpdated, callback); + } + onProjectContentUpdated(callback: (state: boolean) => void) { this.messenger.onNotification(projectContentUpdated, callback); } @@ -259,4 +272,12 @@ export class BallerinaRpcClient { onThemeChanged(callback: (kind: ColorThemeKind) => void) { this.messenger.onNotification(currentThemeChanged, callback); } + + onRefreshReviewMode(callback: () => void) { + this.messenger.onNotification(refreshReviewMode, callback); + } + + onHideReviewActions(callback: () => void) { + this.messenger.onNotification(onHideReviewActions, callback); + } } diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/agent-chat/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/agent-chat/rpc-client.ts index 4f3a08c0288..a188f336d61 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/agent-chat/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/agent-chat/rpc-client.ts @@ -26,7 +26,13 @@ import { getTracingStatus, showTraceView, TraceInput, - TraceStatus + TraceStatus, + ChatHistoryResponse, + AgentStatusResponse, + ClearChatResponse, + getChatHistory, + clearChatHistory, + getAgentStatus } from "@wso2/ballerina-core"; import { HOST_EXTENSION } from "vscode-messenger-common"; import { Messenger } from "vscode-messenger-webview"; @@ -53,4 +59,16 @@ export class AgentChatRpcClient implements AgentChatAPI { showTraceView(params: TraceInput): Promise { return this._messenger.sendRequest(showTraceView, HOST_EXTENSION, params); } + + getChatHistory(): Promise { + return this._messenger.sendRequest(getChatHistory, HOST_EXTENSION); + } + + clearChatHistory(): Promise { + return this._messenger.sendRequest(clearChatHistory, HOST_EXTENSION); + } + + getAgentStatus(): Promise { + return this._messenger.sendRequest(getAgentStatus, HOST_EXTENSION); + } } diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-panel/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-panel/rpc-client.ts index 8bb17458bfa..e61df942a79 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-panel/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/ai-panel/rpc-client.ts @@ -18,91 +18,75 @@ * THIS FILE INCLUDES AUTO GENERATED CODE */ import { - AIChatSummary, AIMachineSnapshot, AIPanelAPI, AIPanelPrompt, + AbortAIGenerationRequest, AddFilesToProjectRequest, - DeleteFromProjectRequest, - DeveloperDocument, + ApproveTaskRequest, + CheckpointInfo, + ConnectorSpecCancelRequest, + ConnectorSpecRequest, DocGenerationRequest, - FetchDataRequest, - FetchDataResponse, - GenerateCodeRequest, + GenerateAgentCodeRequest, GenerateOpenAPIRequest, - GetFromFileRequest, LLMDiagnostics, LoginMethod, MetadataWithAttachments, - PostProcessRequest, - PostProcessResponse, + PlanApprovalRequest, ProcessContextTypeCreationRequest, ProcessMappingParametersRequest, - ProjectDiagnostics, - ProjectSource, - RelevantLibrariesAndFunctionsRequest, - RelevantLibrariesAndFunctionsResponse, - RepairParams, RequirementSpecification, + RestoreCheckpointRequest, + SemanticDiffRequest, + SemanticDiffResponse, SubmitFeedbackRequest, + TaskDeclineRequest, TestGenerationMentions, - TestGenerationRequest, - TestGenerationResponse, - TestGeneratorIntermediaryState, - TestPlanGenerationRequest, + UIChatMessage, + UpdateChatMessageRequest, abortAIGeneration, - abortTestGeneration, - addChatSummary, + acceptChanges, addFilesToProject, - applyDoOnFailBlocks, - checkSyntaxError, + approvePlan, + approveTask, + cancelConnectorSpec, + clearChat, clearInitialPrompt, createTestDirecoryIfNotExists, - deleteFromProject, - fetchData, - generateCode, + declineChanges, + declinePlan, + declineTask, + generateAgent, generateContextTypes, - generateFunctionTests, - generateHealthcareCode, generateInlineMappingCode, generateMappingCode, generateOpenAPI, - generateTestPlan, getAIMachineSnapshot, - getAccessToken, - getBackendUrl, + getActiveTempDir, + getChatMessages, + getCheckpoints, getDefaultPrompt, getDriftDiagnosticContents, - getFileExists, getFromDocumentation, - getFromFile, getGeneratedDocumentation, - getGeneratedTests, getLoginMethod, - getProjectUuid, - getRefreshedAccessToken, - getRelevantLibrariesAndFunctions, - getResourceMethodAndPaths, - getResourceSourceForMethodAndPath, + getSemanticDiff, + getAffectedPackages, + isWorkspaceProject, getServiceNames, - getServiceSourceForName, - getShadowDiagnostics, - getTestDiagnostics, - handleChatSummaryError, isCopilotSignedIn, - isNaturalProgrammingDirectoryExists, - isRequirementsSpecificationFileExist, + isPlanModeFeatureEnabled, isUserAuthenticated, markAlertShown, + openAIPanel, openChatWindowWithCommand, - postProcess, promptGithubAuthorize, - promptWSO2AILogout, - readDeveloperMdFile, - repairGeneratedCode, + provideConnectorSpec, + restoreCheckpoint, showSignInAlert, submitFeedback, - updateDevelopmentDocument, + updateChatMessage, updateRequirementSpecification } from "@wso2/ballerina-core"; import { HOST_EXTENSION } from "vscode-messenger-common"; @@ -115,26 +99,10 @@ export class AiPanelRpcClient implements AIPanelAPI { this._messenger = messenger; } - getBackendUrl(): Promise { - return this._messenger.sendRequest(getBackendUrl, HOST_EXTENSION); - } - - getProjectUuid(): Promise { - return this._messenger.sendRequest(getProjectUuid, HOST_EXTENSION); - } - getLoginMethod(): Promise { return this._messenger.sendRequest(getLoginMethod, HOST_EXTENSION); } - getAccessToken(): Promise { - return this._messenger.sendRequest(getAccessToken, HOST_EXTENSION); - } - - getRefreshedAccessToken(): Promise { - return this._messenger.sendRequest(getRefreshedAccessToken, HOST_EXTENSION); - } - getDefaultPrompt(): Promise { return this._messenger.sendRequest(getDefaultPrompt, HOST_EXTENSION); } @@ -143,30 +111,6 @@ export class AiPanelRpcClient implements AIPanelAPI { return this._messenger.sendRequest(getAIMachineSnapshot, HOST_EXTENSION); } - fetchData(params: FetchDataRequest): Promise { - return this._messenger.sendRequest(fetchData, HOST_EXTENSION, params); - } - - getFromFile(params: GetFromFileRequest): Promise { - return this._messenger.sendRequest(getFromFile, HOST_EXTENSION, params); - } - - getFileExists(params: GetFromFileRequest): Promise { - return this._messenger.sendRequest(getFileExists, HOST_EXTENSION, params); - } - - deleteFromProject(params: DeleteFromProjectRequest): void { - return this._messenger.sendNotification(deleteFromProject, HOST_EXTENSION, params); - } - - getShadowDiagnostics(params: ProjectSource): Promise { - return this._messenger.sendRequest(getShadowDiagnostics, HOST_EXTENSION, params); - } - - checkSyntaxError(params: ProjectSource): Promise { - return this._messenger.sendRequest(checkSyntaxError, HOST_EXTENSION, params); - } - clearInitialPrompt(): void { return this._messenger.sendNotification(clearInitialPrompt, HOST_EXTENSION); } @@ -187,147 +131,143 @@ export class AiPanelRpcClient implements AIPanelAPI { return this._messenger.sendNotification(generateInlineMappingCode, HOST_EXTENSION, params); } - getGeneratedTests(params: TestGenerationRequest): Promise { - return this._messenger.sendRequest(getGeneratedTests, HOST_EXTENSION, params); - } - - getTestDiagnostics(params: TestGenerationResponse): Promise { - return this._messenger.sendRequest(getTestDiagnostics, HOST_EXTENSION, params); + getServiceNames(): Promise { + return this._messenger.sendRequest(getServiceNames, HOST_EXTENSION); } - getServiceSourceForName(params: string): Promise { - return this._messenger.sendRequest(getServiceSourceForName, HOST_EXTENSION, params); + promptGithubAuthorize(): Promise { + return this._messenger.sendRequest(promptGithubAuthorize, HOST_EXTENSION); } - getResourceSourceForMethodAndPath(params: string): Promise { - return this._messenger.sendRequest(getResourceSourceForMethodAndPath, HOST_EXTENSION, params); + isCopilotSignedIn(): Promise { + return this._messenger.sendRequest(isCopilotSignedIn, HOST_EXTENSION); } - getServiceNames(): Promise { - return this._messenger.sendRequest(getServiceNames, HOST_EXTENSION); + showSignInAlert(): Promise { + return this._messenger.sendRequest(showSignInAlert, HOST_EXTENSION); } - getResourceMethodAndPaths(): Promise { - return this._messenger.sendRequest(getResourceMethodAndPaths, HOST_EXTENSION); + markAlertShown(): void { + return this._messenger.sendNotification(markAlertShown, HOST_EXTENSION); } - abortTestGeneration(): void { - return this._messenger.sendNotification(abortTestGeneration, HOST_EXTENSION); + getFromDocumentation(params: string): Promise { + return this._messenger.sendRequest(getFromDocumentation, HOST_EXTENSION, params); } - applyDoOnFailBlocks(): void { - return this._messenger.sendNotification(applyDoOnFailBlocks, HOST_EXTENSION); + getDriftDiagnosticContents(): Promise { + return this._messenger.sendRequest(getDriftDiagnosticContents, HOST_EXTENSION); } - postProcess(params: PostProcessRequest): Promise { - return this._messenger.sendRequest(postProcess, HOST_EXTENSION, params); + updateRequirementSpecification(params: RequirementSpecification): void { + return this._messenger.sendNotification(updateRequirementSpecification, HOST_EXTENSION, params); } - promptGithubAuthorize(): Promise { - return this._messenger.sendRequest(promptGithubAuthorize, HOST_EXTENSION); + createTestDirecoryIfNotExists(): void { + return this._messenger.sendNotification(createTestDirecoryIfNotExists, HOST_EXTENSION); } - promptWSO2AILogout(): Promise { - return this._messenger.sendRequest(promptWSO2AILogout, HOST_EXTENSION); + submitFeedback(params: SubmitFeedbackRequest): Promise { + return this._messenger.sendRequest(submitFeedback, HOST_EXTENSION, params); } - isCopilotSignedIn(): Promise { - return this._messenger.sendRequest(isCopilotSignedIn, HOST_EXTENSION); + generateOpenAPI(params: GenerateOpenAPIRequest): void { + return this._messenger.sendNotification(generateOpenAPI, HOST_EXTENSION, params); } - showSignInAlert(): Promise { - return this._messenger.sendRequest(showSignInAlert, HOST_EXTENSION); + generateAgent(params: GenerateAgentCodeRequest): Promise { + return this._messenger.sendRequest(generateAgent, HOST_EXTENSION, params); } - markAlertShown(): void { - return this._messenger.sendNotification(markAlertShown, HOST_EXTENSION); + abortAIGeneration(params: AbortAIGenerationRequest): void { + return this._messenger.sendNotification(abortAIGeneration, HOST_EXTENSION, params); } - getFromDocumentation(params: string): Promise { - return this._messenger.sendRequest(getFromDocumentation, HOST_EXTENSION, params); + getGeneratedDocumentation(params: DocGenerationRequest): Promise { + return this._messenger.sendRequest(getGeneratedDocumentation, HOST_EXTENSION, params); } - isRequirementsSpecificationFileExist(params: string): Promise { - return this._messenger.sendRequest(isRequirementsSpecificationFileExist, HOST_EXTENSION, params); + addFilesToProject(params: AddFilesToProjectRequest): Promise { + return this._messenger.sendRequest(addFilesToProject, HOST_EXTENSION, params); } - getDriftDiagnosticContents(params: string): Promise { - return this._messenger.sendRequest(getDriftDiagnosticContents, HOST_EXTENSION, params); + isUserAuthenticated(): Promise { + return this._messenger.sendRequest(isUserAuthenticated, HOST_EXTENSION); } - addChatSummary(params: AIChatSummary): Promise { - return this._messenger.sendRequest(addChatSummary, HOST_EXTENSION, params); + openAIPanel(params: AIPanelPrompt): Promise { + return this._messenger.sendRequest(openAIPanel, HOST_EXTENSION, params); } - handleChatSummaryError(params: string): void { - return this._messenger.sendNotification(handleChatSummaryError, HOST_EXTENSION, params); + isPlanModeFeatureEnabled(): Promise { + return this._messenger.sendRequest(isPlanModeFeatureEnabled, HOST_EXTENSION); } - isNaturalProgrammingDirectoryExists(params: string): Promise { - return this._messenger.sendRequest(isNaturalProgrammingDirectoryExists, HOST_EXTENSION, params); + getSemanticDiff(params: SemanticDiffRequest): Promise { + return this._messenger.sendRequest(getSemanticDiff, HOST_EXTENSION, params); } - readDeveloperMdFile(params: string): Promise { - return this._messenger.sendRequest(readDeveloperMdFile, HOST_EXTENSION, params); + getAffectedPackages(): Promise { + return this._messenger.sendRequest(getAffectedPackages, HOST_EXTENSION); } - updateDevelopmentDocument(params: DeveloperDocument): void { - return this._messenger.sendNotification(updateDevelopmentDocument, HOST_EXTENSION, params); + isWorkspaceProject(): Promise { + return this._messenger.sendRequest(isWorkspaceProject, HOST_EXTENSION); } - updateRequirementSpecification(params: RequirementSpecification): void { - return this._messenger.sendNotification(updateRequirementSpecification, HOST_EXTENSION, params); + acceptChanges(): Promise { + return this._messenger.sendRequest(acceptChanges, HOST_EXTENSION); } - createTestDirecoryIfNotExists(params: string): void { - return this._messenger.sendNotification(createTestDirecoryIfNotExists, HOST_EXTENSION, params); + declineChanges(): Promise { + return this._messenger.sendRequest(declineChanges, HOST_EXTENSION); } - submitFeedback(params: SubmitFeedbackRequest): Promise { - return this._messenger.sendRequest(submitFeedback, HOST_EXTENSION, params); + approvePlan(params: PlanApprovalRequest): Promise { + return this._messenger.sendRequest(approvePlan, HOST_EXTENSION, params); } - getRelevantLibrariesAndFunctions(params: RelevantLibrariesAndFunctionsRequest): Promise { - return this._messenger.sendRequest(getRelevantLibrariesAndFunctions, HOST_EXTENSION, params); + declinePlan(params: PlanApprovalRequest): Promise { + return this._messenger.sendRequest(declinePlan, HOST_EXTENSION, params); } - generateOpenAPI(params: GenerateOpenAPIRequest): void { - return this._messenger.sendNotification(generateOpenAPI, HOST_EXTENSION, params); + approveTask(params: ApproveTaskRequest): Promise { + return this._messenger.sendRequest(approveTask, HOST_EXTENSION, params); } - generateCode(params: GenerateCodeRequest): void { - return this._messenger.sendNotification(generateCode, HOST_EXTENSION, params); + declineTask(params: TaskDeclineRequest): Promise { + return this._messenger.sendRequest(declineTask, HOST_EXTENSION, params); } - repairGeneratedCode(params: RepairParams): void { - return this._messenger.sendNotification(repairGeneratedCode, HOST_EXTENSION, params); + provideConnectorSpec(params: ConnectorSpecRequest): Promise { + return this._messenger.sendRequest(provideConnectorSpec, HOST_EXTENSION, params); } - generateTestPlan(params: TestPlanGenerationRequest): void { - return this._messenger.sendNotification(generateTestPlan, HOST_EXTENSION, params); + cancelConnectorSpec(params: ConnectorSpecCancelRequest): Promise { + return this._messenger.sendRequest(cancelConnectorSpec, HOST_EXTENSION, params); } - generateFunctionTests(params: TestGeneratorIntermediaryState): void { - return this._messenger.sendNotification(generateFunctionTests, HOST_EXTENSION, params); + getChatMessages(): Promise { + return this._messenger.sendRequest(getChatMessages, HOST_EXTENSION); } - generateHealthcareCode(params: GenerateCodeRequest): void { - return this._messenger.sendNotification(generateHealthcareCode, HOST_EXTENSION, params); + getCheckpoints(): Promise { + return this._messenger.sendRequest(getCheckpoints, HOST_EXTENSION); } - abortAIGeneration(): void { - return this._messenger.sendNotification(abortAIGeneration, HOST_EXTENSION); + restoreCheckpoint(params: RestoreCheckpointRequest): Promise { + return this._messenger.sendRequest(restoreCheckpoint, HOST_EXTENSION, params); } - getGeneratedDocumentation(params: DocGenerationRequest): Promise { - return this._messenger.sendRequest(getGeneratedDocumentation, HOST_EXTENSION, params); + clearChat(): Promise { + return this._messenger.sendRequest(clearChat, HOST_EXTENSION); } - addFilesToProject(params: AddFilesToProjectRequest): Promise { - return this._messenger.sendRequest(addFilesToProject, HOST_EXTENSION, params); + updateChatMessage(params: UpdateChatMessageRequest): Promise { + return this._messenger.sendRequest(updateChatMessage, HOST_EXTENSION, params); } - isUserAuthenticated(): Promise { - return this._messenger.sendRequest(isUserAuthenticated, HOST_EXTENSION); + getActiveTempDir(): Promise { + return this._messenger.sendRequest(getActiveTempDir, HOST_EXTENSION); } } diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/bi-diagram/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/bi-diagram/rpc-client.ts index 95e8bc53f4f..1e45c2e40b0 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/bi-diagram/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/bi-diagram/rpc-client.ts @@ -22,14 +22,17 @@ import { AddFieldRequest, AddFunctionRequest, AddImportItemResponse, + AddProjectToWorkspaceRequest, BIAiSuggestionsRequest, BIAiSuggestionsResponse, BIAvailableNodesRequest, BIAvailableNodesResponse, BIDeleteByComponentInfoRequest, BIDeleteByComponentInfoResponse, + BIDesignModelRequest, BIDesignModelResponse, BIDiagramAPI, + BIFlowModelRequest, BIFlowModelResponse, BIGetEnclosedFunctionRequest, BIGetEnclosedFunctionResponse, @@ -64,6 +67,9 @@ import { ExpressionCompletionsResponse, ExpressionDiagnosticsRequest, ExpressionDiagnosticsResponse, + ExpressionTokensRequest, + FormDiagnosticsRequest, + FormDiagnosticsResponse, FormDidCloseParams, FormDidOpenParams, FunctionNodeRequest, @@ -88,6 +94,7 @@ import { OpenAPIGeneratedModulesRequest, OpenAPIGeneratedModulesResponse, OpenConfigTomlRequest, + OpenReadmeRequest, ProjectComponentsResponse, ProjectRequest, ProjectStructureResponse, @@ -102,9 +109,7 @@ import { SignatureHelpRequest, SignatureHelpResponse, SourceEditResponse, - UpdateConfigVariableRequest, UpdateConfigVariableRequestV2, - UpdateConfigVariableResponse, UpdateConfigVariableResponseV2, UpdateImportsRequest, UpdateImportsResponse, @@ -122,11 +127,11 @@ import { addBreakpointToSource, addClassField, addFunction, + addProjectToWorkspace, buildProject, createComponent, createGraphqlClassType, createProject, - addProjectToWorkspace, deleteByComponentInfo, deleteConfigVariableV2, deleteFlowNode, @@ -147,7 +152,6 @@ import { getAvailableVectorStores, getBreakpointInfo, getConfigVariableNodeTemplate, - getConfigVariables, getConfigVariablesV2, getDataMapperCompletions, getDesignModel, @@ -156,7 +160,9 @@ import { getEndOfFile, getExpressionCompletions, getExpressionDiagnostics, + getExpressionTokens, getFlowModel, + getFormDiagnostics, getFunctionNames, getFunctionNode, getModuleNodes, @@ -188,21 +194,13 @@ import { search, searchNodes, updateClassField, - updateConfigVariables, updateConfigVariablesV2, updateImports, updateRecordConfig, updateServiceClass, updateType, updateTypes, - verifyTypeDelete, - FormDiagnosticsRequest, - FormDiagnosticsResponse, - getFormDiagnostics, - getExpressionTokens, - ExpressionTokensRequest, - AddProjectToWorkspaceRequest, - OpenReadmeRequest, + verifyTypeDelete } from "@wso2/ballerina-core"; import { HOST_EXTENSION } from "vscode-messenger-common"; import { Messenger } from "vscode-messenger-webview"; @@ -214,8 +212,8 @@ export class BiDiagramRpcClient implements BIDiagramAPI { this._messenger = messenger; } - getFlowModel(): Promise { - return this._messenger.sendRequest(getFlowModel, HOST_EXTENSION); + getFlowModel(params: BIFlowModelRequest): Promise { + return this._messenger.sendRequest(getFlowModel, HOST_EXTENSION, params); } getSourceCode(params: BISourceCodeRequest): Promise { @@ -314,14 +312,6 @@ export class BiDiagramRpcClient implements BIDiagramAPI { return this._messenger.sendRequest(getDataMapperCompletions, HOST_EXTENSION, params); } - getConfigVariables(): Promise { - return this._messenger.sendRequest(getConfigVariables, HOST_EXTENSION); - } - - updateConfigVariables(params: UpdateConfigVariableRequest): Promise { - return this._messenger.sendRequest(updateConfigVariables, HOST_EXTENSION, params); - } - getConfigVariablesV2(params: ConfigVariableRequest): Promise { return this._messenger.sendRequest(getConfigVariablesV2, HOST_EXTENSION, params); } @@ -410,8 +400,8 @@ export class BiDiagramRpcClient implements BIDiagramAPI { return this._messenger.sendRequest(formDidClose, HOST_EXTENSION, params); } - getDesignModel(): Promise { - return this._messenger.sendRequest(getDesignModel, HOST_EXTENSION); + getDesignModel(params: BIDesignModelRequest): Promise { + return this._messenger.sendRequest(getDesignModel, HOST_EXTENSION, params); } getTypes(params: GetTypesRequest): Promise { diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/data-mapper/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/data-mapper/rpc-client.ts index 7c8219b7f43..b049b5bbb1d 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/data-mapper/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/data-mapper/rpc-client.ts @@ -24,6 +24,8 @@ import { ClausePositionRequest, ClausePositionResponse, ClearTypeCacheResponse, + ConvertExpressionRequest, + ConvertExpressionResponse, ConvertToQueryRequest, DMModelRequest, DataMapperAPI, @@ -57,6 +59,7 @@ import { deleteMapping, deleteSubMapping, getClausePosition, + getConvertedExpression, getDataMapperCodedata, getDataMapperModel, getDataMapperSource, @@ -160,6 +163,10 @@ export class DataMapperRpcClient implements DataMapperAPI { return this._messenger.sendRequest(getProcessTypeReference, HOST_EXTENSION, params); } + getConvertedExpression(params: ConvertExpressionRequest): Promise { + return this._messenger.sendRequest(getConvertedExpression, HOST_EXTENSION, params); + } + clearTypeCache(): Promise { return this._messenger.sendRequest(clearTypeCache, HOST_EXTENSION); } diff --git a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts index 8df1ec6c8de..9e76681ec11 100644 --- a/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts +++ b/workspaces/ballerina/ballerina-rpc-client/src/rpc-clients/visualizer/rpc-client.ts @@ -41,7 +41,8 @@ import { resetUndoRedoStack, undo, undoRedoState, - updateCurrentArtifactLocation + updateCurrentArtifactLocation, + reviewAccepted } from "@wso2/ballerina-core"; import { HOST_EXTENSION } from "vscode-messenger-common"; import { Messenger } from "vscode-messenger-webview"; @@ -108,4 +109,8 @@ export class VisualizerRpcClient implements VisualizerAPI { updateCurrentArtifactLocation(params: UpdatedArtifactsResponse): Promise { return this._messenger.sendRequest(updateCurrentArtifactLocation, HOST_EXTENSION, params); } + + reviewAccepted(): void { + return this._messenger.sendNotification(reviewAccepted, HOST_EXTENSION); + } } diff --git a/workspaces/ballerina/ballerina-side-panel/package.json b/workspaces/ballerina/ballerina-side-panel/package.json index 9c1eaeb002c..c88cd97430d 100644 --- a/workspaces/ballerina/ballerina-side-panel/package.json +++ b/workspaces/ballerina/ballerina-side-panel/package.json @@ -29,7 +29,7 @@ "@wso2/ballerina-core": "workspace:*", "@wso2/ballerina-rpc-client": "workspace:*", "@wso2/ui-toolkit": "workspace:*", - "lodash": "~4.17.21", + "lodash": "4.17.23", "markdown-it": "~14.1.0", "prosemirror-commands": "~1.7.1", "prosemirror-gapcursor": "~1.4.0", diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx index 8cd3684ecb6..c0c95b4c22c 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/Form/index.tsx @@ -49,6 +49,7 @@ import { VisualizableField, NodeProperties, VisualizerLocation, + getPrimaryInputType, } from "@wso2/ballerina-core"; import { FormContext, Provider } from "../../context"; import { @@ -70,7 +71,7 @@ namespace S { height: ${({ nestedForm, footerActionButton }) => { if (nestedForm) return "unset"; if (footerActionButton) return "100%"; - return "calc(100vh - 100px)"; + return "calc(100vh - 50px)"; }}; max-height: ${({ footerActionButton }) => footerActionButton ? "100%" : "none"}; min-height: ${({ footerActionButton }) => footerActionButton ? "0" : "auto"}; @@ -138,7 +139,6 @@ namespace S { export const FooterActionButtonContainer = styled.div<{}>` position: sticky; bottom: 0; - padding: 20px 0px; display: flex; justify-content: center; align-items: center; @@ -247,6 +247,7 @@ namespace S { export const MarkdownWrapper = styled.div` position: relative; width: 100%; + margin-bottom: -12px; `; export const MarkdownContainer = styled.div<{ isExpanded: boolean }>` @@ -484,15 +485,29 @@ export const Form = forwardRef((props: FormProps) => { const diagnosticsMap: FormDiagnostics[] = []; const formValues = getValues(); console.log("Existing form values: ", formValues); + + // First, preserve ALL existing form values + Object.keys(formValues).forEach(key => { + if (formValues[key] !== undefined && formValues[key] !== "") { + defaultValues[key] = formValues[key]; + } + }); + formFields.forEach((field) => { - if (isDropdownField(field)) { - defaultValues[field.key] = getValueForDropdown(field) ?? ""; - } else if (field.type === "FLAG") { - defaultValues[field.key] = field.value === "true" || (typeof field.value === "boolean" && field.value); - } else if (typeof field.value === "string") { - defaultValues[field.key] = formatJSONLikeString(field.value) ?? ""; - } else { - defaultValues[field.key] = field.value ?? ""; + // Only set field defaults if no existing value is present + if (defaultValues[field.key] === undefined) { + if (field.hidden) { + defaultValues[field.key] = field.value; + } else if (isDropdownField(field)) { + defaultValues[field.key] = getValueForDropdown(field) ?? ""; + } else if (field.type === "FLAG" && field.types?.length > 1) { + defaultValues[field.key] = String(field.value === "true") || String((typeof field.value === "boolean" && field.value)); + } else if (field.type === "FLAG") { + defaultValues[field.key] = field.value || "true"; + } else if (typeof field.value === "string") { + defaultValues[field.key] = formatJSONLikeString(field.value) ?? ""; + } else { + defaultValues[field.key] = field.value ?? ""; } if (field.key === "variable") { defaultValues[field.key] = formValues[field.key] ?? defaultValues[field.key] ?? ""; @@ -521,7 +536,10 @@ export const Form = forwardRef((props: FormProps) => { if (selectedChoice && selectedChoice?.properties) { Object.entries(selectedChoice.properties).forEach(([propKey, propValue]) => { - if (propValue?.value !== undefined) { + // Preserve existing form values if they exist, otherwise use propValue.value + if (formValues[propKey] !== undefined && formValues[propKey] !== "") { + defaultValues[propKey] = formValues[propKey]; + } else if (propValue?.value !== undefined && defaultValues[propKey] === undefined) { defaultValues[propKey] = propValue.value; } @@ -530,11 +548,8 @@ export const Form = forwardRef((props: FormProps) => { } } - if (formValues[field.key] !== undefined && formValues[field.key] !== "" && !field.value) { - defaultValues[field.key] = formValues[field.key]; - } diagnosticsMap.push({ key: field.key, diagnostics: [] }); - }); + }}); setDiagnosticsInfo(diagnosticsMap); reset(defaultValues); @@ -630,8 +645,77 @@ export const Form = forwardRef((props: FormProps) => { ); }; + // Recursively collect advanced fields from selected choices (including nested choices) + const advancedChoiceFields = useMemo(() => { + const fields: FormField[] = []; + const formValues = getValues(); + + // Recursive function to traverse nested choices + const collectAdvancedFields = (properties: any) => { + if (!properties) return; + + Object.entries(properties).forEach(([propKey, propValue]: [string, any]) => { + // If this property is a choice field, recurse into selected choice + if (propValue?.choices && propValue.choices.length > 0) { + const selectedChoiceIndex = formValues[propKey] !== undefined ? Number(formValues[propKey]) : 0; + const selectedChoice = propValue.choices[selectedChoiceIndex]; + + if (selectedChoice && selectedChoice?.properties && !selectedChoice.advanced && !propValue.advanced) { + // Recursively collect from nested choice properties + collectAdvancedFields(selectedChoice.properties); + } + } + // If this property is advanced, add it to the list + else if (propValue.advanced && propValue.enabled && !propValue.hidden && !propValue.choices) { + const choiceFormField: FormField = { + key: propKey, + label: propValue?.metadata?.label || propKey.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/^./, str => str.toUpperCase()), + type: getPrimaryInputType(propValue.types)?.fieldType, + documentation: propValue?.metadata?.description || "", + types: propValue.types, + editable: propValue.editable, + enabled: propValue?.enabled ?? true, + optional: propValue.optional, + value: propValue.value, + advanced: propValue.advanced, + diagnostics: [], + items: propValue.items, + choices: propValue.choices, + placeholder: propValue.placeholder, + }; + fields.push(choiceFormField); + } + }); + }; + + // Start collection from top-level form fields + formFields.forEach((field) => { + if (field?.choices && field.choices.length > 0) { + const selectedChoiceIndex = formValues[field.key] !== undefined ? Number(formValues[field.key]) : 0; + const selectedChoice = field.choices[selectedChoiceIndex]; + + if (selectedChoice && selectedChoice?.properties && !field.advanced) { + collectAdvancedFields(selectedChoice.properties); + } + } + }); + + return fields; + }, [formFields, watch()]); + + // Initialize form values for advanced choice fields + useEffect(() => { + advancedChoiceFields.forEach(field => { + const currentValue = getValues(field.key); + // Only set the value if it's currently undefined and the field has a value + if (currentValue === undefined && field.value !== undefined) { + setValue(field.key, field.value); + } + }); + }, [advancedChoiceFields, getValues, setValue]); + // has advance fields - const hasAdvanceFields = formFields.some((field) => field.advanced && field.enabled && !field.hidden); + const hasAdvanceFields = formFields.some((field) => field.advanced && field.enabled && !field.hidden) || advancedChoiceFields.length > 0; const variableField = formFields.find((field) => field.key === "variable"); const typeField = formFields.find((field) => field.key === "type"); const expressionField = formFields.find((field) => field.key === "expression"); @@ -819,6 +903,13 @@ export const Form = forwardRef((props: FormProps) => { const handleOnSaveClick = async () => { setSavingButton('save'); + + // Check for existing form errors (including pattern validation errors) + if (Object.keys(errors).length > 0) { + setSavingButton(null); + return; + } + const isValidForm = onFormValidation ? await handleFormValidation() : true; if (isValidForm) { handleSubmit(handleOnSave)(); @@ -998,6 +1089,28 @@ export const Form = forwardRef((props: FormProps) => { } return null; })} + {hasAdvanceFields && + showAdvancedOptions && + advancedChoiceFields.map((field) => { + const updatedField = updateFormFieldWithImports(field, formImports); + return ( + + handleOpenRecordEditor(open, updatedField, newType)) + } + subPanelView={subPanelView} + handleOnFieldFocus={handleOnFieldFocus} + recordTypeFields={recordTypeFields} + onIdentifierEditingStateChange={handleIdentifierEditingStateChange} + handleOnTypeChange={handleOnTypeChange} + onBlur={handleOnBlur} + /> + + ); + })} {!preserveOrder && (variableField || typeField || targetTypeField) && ( @@ -1027,7 +1140,7 @@ export const Form = forwardRef((props: FormProps) => { /> )} - {targetTypeField && ( + {targetTypeField && !targetTypeField.advanced && ( <> Promise; getTypeHelper: ( fieldKey: string, - valueTypeConstraint: string, + types: InputType[], typeBrowserRef: RefObject, currentType: string, currentCursorPosition: number, @@ -192,7 +193,7 @@ type FormHelperPaneConditionalProps = { helperPaneHeight: HelperPaneHeight, recordTypeField?: RecordTypeField, isAssignIdentifier?: boolean, - valueTypeConstraint?: string | string[], + inputTypes?: InputType[], inputMode?: InputMode ) => JSX.Element; helperPaneOrigin?: HelperPaneOrigin; diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/ModeSwitcher/index.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/ModeSwitcher/index.tsx index 422df6601f6..c3d8672f3f4 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/ModeSwitcher/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/ModeSwitcher/index.tsx @@ -19,37 +19,36 @@ import React, { useMemo } from 'react'; import { Label, Slider, SwitchWrapper } from './styles'; import { InputMode } from '../editors/MultiModeExpressionEditor/ChipExpressionEditor/types'; -import { getDefaultExpressionMode } from '../editors/MultiModeExpressionEditor/ChipExpressionEditor/utils'; +import { getDefaultExpressionMode, getSecondaryMode } from '../editors/MultiModeExpressionEditor/ChipExpressionEditor/utils'; +import { InputType } from '@wso2/ballerina-core'; interface ModeSwitcherProps { value: InputMode; isRecordTypeField: boolean; onChange: (value: InputMode) => void; - valueTypeConstraint: string | string[]; - fieldKey?: string; + types: InputType[]; } -const ModeSwitcher: React.FC = ({ value, isRecordTypeField, onChange, valueTypeConstraint, fieldKey }) => { - const isChecked = value === InputMode.EXP; - +const ModeSwitcher: React.FC = ({ value, isRecordTypeField, onChange, types }) => { const defaultMode = useMemo( - () => isRecordTypeField ? InputMode.RECORD : getDefaultExpressionMode(valueTypeConstraint, fieldKey), - [valueTypeConstraint, isRecordTypeField, fieldKey] + () => isRecordTypeField ? InputMode.RECORD : getDefaultExpressionMode(types), + [types, isRecordTypeField] ); - const handlePrimaryModeClick = () => { - onChange(defaultMode); - }; - - const handleExpressionClick = () => { - onChange(InputMode.EXP); - }; + const secondaryMode = useMemo( + () => isRecordTypeField ? InputMode.EXP : getSecondaryMode(types), + [types, isRecordTypeField] + ); + const handleModeSwitch = (mode: InputMode) => { + onChange(mode); + } + const isChecked = value === secondaryMode; return ( - - + + ); diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx index f8e1e6ba4e2..895d8b29108 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/NodeList/index.tsx @@ -542,11 +542,6 @@ export function NodeList(props: NodeListProps) { ); const getCategoryContainer = (groups: Category[], isSubCategory = false, parentCategoryTitle?: string) => { - const callFunctionNode = groups - .flatMap((group) => group?.items || []) - .filter((item) => item != null) - .find((item) => "id" in item && item.id === "FUNCTION"); - // Configuration for special categories const categoryConfig = { "Connections": { hasBackground: false }, @@ -578,8 +573,7 @@ export function NodeList(props: NodeListProps) { const categoryActions = getCategoryActions(group.title, title); const config = categoryConfig[group.title] || { hasBackground: true }; const shouldShowSeparator = config.showSeparatorBefore; - const isLoggingCategory = group.title === "Logging"; - + // Hide categories that don't have items, except for special categories that can add items if (!group || !group.items || group.items.length === 0) { // Only show empty categories if they have add functionality @@ -711,25 +705,6 @@ export function NodeList(props: NodeListProps) { group.items as (Node | Category)[], !isSubCategory ? group.title : parentCategoryTitle )} - {/* Add Show More Functions under Logging category */} - {isLoggingCategory && callFunctionNode && isCategoryExpanded && ( - - handleAddNode(callFunctionNode as Node)}> - Show More Functions - - - - )} )} @@ -792,6 +767,12 @@ export function NodeList(props: NodeListProps) { return category; }); + // Find the call function node across all categories + const callFunctionNode = filteredCategories + .flatMap((group) => group?.items || []) + .filter((item) => item != null) + .find((item) => "id" in item && item.id === "FUNCTION"); + // When searching, expand all categories const shouldExpandAll = searchText && searchText.length > 0; @@ -851,7 +832,28 @@ export function NodeList(props: NodeListProps) { )} {!showGeneratePanel && !isSearching && ( - {getCategoryContainer(filteredCategories)} + + {getCategoryContainer(filteredCategories)} + {/* Show More Functions button - moved outside Logging category */} + {callFunctionNode && !searchText && ( + + handleAddNode(callFunctionNode as Node)}> + Show More Functions + + + + )} + )} {showAiPanel && showGeneratePanel && ( diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ParamEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ParamEditor.tsx index 18b77bf5056..e710378d7c1 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ParamEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/ParamEditor.tsx @@ -24,7 +24,7 @@ import { Parameter } from './ParamManager'; import Form from '../Form'; import { FormField, FormValues, HelperpaneOnChangeOptions } from '../Form/types'; import { useFormContext } from '../../context'; -import { RecordTypeField, TextEdit } from '@wso2/ballerina-core'; +import { InputType, RecordTypeField, TextEdit } from '@wso2/ballerina-core'; import { HelperPaneHeight } from '@wso2/ui-toolkit'; import { FormExpressionEditorRef } from '@wso2/ui-toolkit'; @@ -71,7 +71,7 @@ export function ParamEditor(props: ParamProps) { const getTypeHelper = ( fieldKey: string, - valueTypeConstraint: string, + types: InputType[], typeBrowserRef: RefObject, currentType: string, currentCursorPosition: number, @@ -84,7 +84,7 @@ export function ParamEditor(props: ParamProps) { ) => { return expressionEditor?.getTypeHelper( propertyKey, - valueTypeConstraint, + types, typeBrowserRef, currentType, currentCursorPosition, diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/styles.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/styles.tsx index 7c47f6acaa2..fdaceaad36e 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/styles.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/ParamManager/styles.tsx @@ -91,7 +91,7 @@ export const KeyTextWrapper = styled.div` height: 100%; `; -export const Key= styled.div` +export const Key = styled.div` cursor: pointer; margin-left: 10px; white-space: nowrap; diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx index 046290cfb8b..957fda6a5da 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ActionTypeEditor.tsx @@ -43,7 +43,7 @@ import { getPropertyFromFormField, sanitizeType } from "./utils"; import { debounce } from "lodash"; import styled from "@emotion/styled"; import ReactMarkdown from "react-markdown"; -import { NodeProperties, PropertyModel } from "@wso2/ballerina-core"; +import { getPrimaryInputType, NodeProperties, PropertyModel } from "@wso2/ballerina-core"; const isGraphQLScalarType = (type: string): boolean => { const scalarTypes = [ @@ -323,7 +323,7 @@ export function ActionTypeEditor(props: ActionTypeEditorProps) { setFocused(true); // Trigger actions on focus await onFocus?.(); - await retrieveVisibleTypes(value, value.length, true, field.valueTypeConstraint as string, field.key); + await retrieveVisibleTypes(value, value.length, true, field.types, field.key); handleOnFieldFocus?.(field.key); }; @@ -382,7 +382,7 @@ export function ActionTypeEditor(props: ActionTypeEditorProps) { ) => { return getTypeHelper( field.key, - field.valueTypeConstraint as string, + field.types, typeBrowserRef, value, cursorPositionRef.current, @@ -590,12 +590,12 @@ export function ActionTypeEditor(props: ActionTypeEditorProps) { })() } - {field.valueTypeConstraint && + {getPrimaryInputType(field.types)?.ballerinaType && - {sanitizeType(field.valueTypeConstraint as string)} + {sanitizeType(getPrimaryInputType(field.types)?.ballerinaType)} } @@ -675,7 +675,7 @@ export function ActionTypeEditor(props: ActionTypeEditorProps) { updatedValue, updatedCursorPosition, false, - field.valueTypeConstraint as string, + field.types, field.key ); }} diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx index e35afc239bf..12c068c0a32 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxConditionalEditor.tsx @@ -22,7 +22,7 @@ import { CheckBoxGroup, FormCheckBox } from "@wso2/ui-toolkit"; import styled from "@emotion/styled"; import { EditorFactory } from "./EditorFactory"; import { useFormContext } from "../../context"; -import { PropertyModel } from "@wso2/ballerina-core"; +import { getPrimaryInputType, PropertyModel } from "@wso2/ballerina-core"; const Form = styled.div` display: grid; @@ -175,7 +175,7 @@ function mapPropertiesToFormFields(properties: { [key: string]: PropertyModel; } // Determine value for MULTIPLE_SELECT let value: any = property.value; - if (property.valueType === "MULTIPLE_SELECT") { + if (getPrimaryInputType(property.types).fieldType === "MULTIPLE_SELECT") { if (property.values && property.values.length > 0) { value = property.values; } else if (property.value) { @@ -188,21 +188,20 @@ function mapPropertiesToFormFields(properties: { [key: string]: PropertyModel; } } let items = undefined; - if (property.valueType === "MULTIPLE_SELECT" || property.valueType === "SINGLE_SELECT") { + if (getPrimaryInputType(property.types)?.fieldType === "MULTIPLE_SELECT" || getPrimaryInputType(property.types)?.fieldType === "SINGLE_SELECT") { items = property.items; } return { key, label: property?.metadata?.label, - type: property.valueType, + type: getPrimaryInputType(property.types)?.fieldType, documentation: property?.metadata?.description || "", - valueType: property.valueTypeConstraint, editable: true, enabled: property.enabled ?? true, optional: property.optional, value, - valueTypeConstraint: property.valueTypeConstraint, + types: property.types, advanced: property.advanced, diagnostics: [], items, diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxEditor.tsx index d69774536af..b6f54b579f7 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/CheckBoxEditor.tsx @@ -16,7 +16,7 @@ * under the License. */ -import React from "react"; +import React, { useEffect } from "react"; import { FormField } from "../Form/types"; import { CheckBoxGroup, FormCheckBox } from "@wso2/ui-toolkit"; import { useFormContext } from "../../context"; @@ -55,6 +55,14 @@ export function CheckBoxEditor(props: TextEditorProps) { const { form } = useFormContext(); const { register, control, setValue } = form; + useEffect(() => { + if (field.value) { + setValue(field.key, true); + } else { + setValue(field.key, false); + } + }, [field.value]); + const getBooleanValue = (value: any) => { if (field.type === "FLAG") { return value === "true" || value === true; diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ChoiceForm.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ChoiceForm.tsx index 5cbe6bfe7a6..054d987e92f 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ChoiceForm.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ChoiceForm.tsx @@ -24,7 +24,7 @@ import { FormField } from "../Form/types"; import { capitalize, getValueForDropdown } from "./utils"; import { useFormContext } from "../../context"; import styled from "@emotion/styled"; -import { PropertyModel, RecordTypeField } from "@wso2/ballerina-core"; +import { getPrimaryInputType, PropertyModel, RecordTypeField } from "@wso2/ballerina-core"; import { EditorFactory } from "./EditorFactory"; interface ChoiceFormProps { @@ -59,6 +59,17 @@ export function ChoiceForm(props: ChoiceFormProps) { const [dynamicFields, setDynamicFields] = useState([]); + useEffect(() => { + // Find the first enabled choice + const enabledChoiceIndex = field.choices.findIndex(choice => choice.enabled); + if (enabledChoiceIndex !== -1) { + const newSelectedOption = enabledChoiceIndex + 1; + if (newSelectedOption !== selectedOption) { + setSelectedOption(newSelectedOption); + setValue(field.key, enabledChoiceIndex); + } + } + }, [field.choices]); // Add useEffect to set initial values useEffect(() => { @@ -80,20 +91,19 @@ export function ChoiceForm(props: ChoiceFormProps) { for (const key in model.properties) { const expression = model.properties[key]; let items = undefined; - if (expression.valueType === "MULTIPLE_SELECT" || expression.valueType === "SINGLE_SELECT") { + if (getPrimaryInputType(expression.types)?.fieldType === "MULTIPLE_SELECT" || getPrimaryInputType(expression.types)?.fieldType === "SINGLE_SELECT") { items = expression.items; } const formField: FormField = { key: key, label: expression?.metadata.label || key.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/^./, str => str.toUpperCase()), - type: expression.valueType, + type: getPrimaryInputType(expression.types)?.fieldType, documentation: expression?.metadata.description || "", - valueType: expression.valueTypeConstraint, + types: expression.types, editable: expression.editable, enabled: expression?.enabled ?? true, optional: expression.optional, value: expression.value, - valueTypeConstraint: expression.valueTypeConstraint, advanced: expression.advanced, diagnostics: [], items, @@ -103,7 +113,6 @@ export function ChoiceForm(props: ChoiceFormProps) { } formFields.push(formField); } - console.log("Dynamic Form Fields:", formFields) return formFields; } @@ -118,7 +127,6 @@ export function ChoiceForm(props: ChoiceFormProps) { value={selectedOption} options={field.choices.map((choice, index) => ({ id: index.toString(), value: index + 1, content: choice.metadata.label }))} onChange={(e) => { - console.log("Choice Form Index:", Number(e.target.value)) const checkedValue = Number(e.target.value); const realValue = checkedValue - 1; setSelectedOption(checkedValue); @@ -129,7 +137,7 @@ export function ChoiceForm(props: ChoiceFormProps) { - {dynamicFields.map((dfield, index) => { + {dynamicFields.filter(dfield => (field.advanced || !dfield.advanced)).map((dfield, index) => { return ( { scopeFieldAddon } = props; + const showWithExpressionEditor = field.types?.some(type => { + return type && ( + type.fieldType === "EXPRESSION" || + type.fieldType === "LV_EXPRESSION" || + type.fieldType === "ACTION_OR_EXPRESSION" || + type.fieldType === "TEXT" || + type.fieldType === "EXPRESSION_SET" || + type.fieldType === "TEXT_SET" || + type.fieldType === "MAPPING_EXPRESSION_SET" || + type.fieldType === "MAPPING_EXPRESSION" || + (type.fieldType === "SINGLE_SELECT" && isDropDownType(type)) || + type.fieldType === "RECORD_MAP_EXPRESSION" || + (field.type === "FLAG" && field.types?.length > 1) + ); + }); + if (!field.enabled || field.hidden) { return <>; } else if (field.type === "MULTIPLE_SELECT") { @@ -99,35 +113,21 @@ export const EditorFactory = (props: FormFieldEditorProps) => { return ; } else if (field.type === "TEXTAREA" || field.type === "STRING") { return ; - } else if (field.type === "EXPRESSION_SET") { - return ; - } else if (field.type === "MAPPING_EXPRESSION_SET") { - return ( - recordField.key === field.key)} - /> - ); - } else if (field.type === "FLAG") { + } else if (field.type === "FLAG" && !showWithExpressionEditor) { return ; } else if (field.type === "EXPRESSION" && field.key === "resourcePath") { // HACK: this should fixed with the LS API. this is used to avoid the expression editor for resource path field. return ; - } else if (field.type.toUpperCase() === "ENUM") { + } else if (field.type?.toUpperCase() === "ENUM") { // Enum is a dropdown field return ; - } else if (field.type.toUpperCase() === "AUTOCOMPLETE") { + } else if (field.type?.toUpperCase() === "AUTOCOMPLETE") { return ; } else if (field.type === "CUSTOM_DROPDOWN") { return ; } else if (field.type === "FILE_SELECT" && field.editable) { return ; - } else if (field.type === "SINGLE_SELECT" && field.editable) { + } else if (field.type === "SINGLE_SELECT" && !showWithExpressionEditor && field.editable) { return ; } else if (!field.items && (field.type === "ACTION_TYPE") && field.editable) { return ( @@ -155,7 +155,7 @@ export const EditorFactory = (props: FormFieldEditorProps) => { /> ); - } else if (!field.items && (field.type === "RAW_TEMPLATE") && field.editable) { + } else if (!field.items && (field.type === "RAW_TEMPLATE" || getPrimaryInputType(field.types)?.ballerinaType === "ai:Prompt") && field.editable) { return ( { recordTypeField={recordTypeFields?.find(recordField => recordField.key === field.key)} /> ); - } else if (!field.items && (field.type === "EXPRESSION" || field.type === "LV_EXPRESSION" || field.type == "ACTION_OR_EXPRESSION") && field.editable) { + + } else if (!field.items && field.type === "ACTION_EXPRESSION") { + return ( + recordField.key === field.key)} + /> + ); + } else if (showWithExpressionEditor && field.editable) { // Expression field is a inline expression editor return ( { } else if (field.type === "VIEW") { // Skip this property return <>; - } else if (field.type === "PARAM_MANAGER") { + } else if ( + (field.type === "PARAM_MANAGER") || + (field.type === "REPEATABLE_PROPERTY" && isTemplateType(getPrimaryInputType(field.types))) + ) { return ; } else if (field.type === "REPEATABLE_PROPERTY") { return ; @@ -200,17 +215,6 @@ export const EditorFactory = (props: FormFieldEditorProps) => { return ; } else if (field.type === "SERVICE_PATH" || field.type === "ACTION_PATH") { return ; - } else if (!field.items && field.type === "ACTION_EXPRESSION") { - return ( - recordField.key === field.key)} - /> - ); } else if (field.type === "CONDITIONAL_FIELDS" && field.editable) { // Conditional fields is a group of fields which are conditionally shown based on a checkbox field return ( diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/ExpandedEditor.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/ExpandedEditor.tsx index aaedb7adf26..073e80ebd4e 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/ExpandedEditor.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/ExpandedEditor.tsx @@ -241,8 +241,11 @@ export const ExpandedEditor: React.FC = ({ error, formDiagnostics }), - // Props for template mode - ...(mode === InputMode.TEMPLATE && { + // Props for template and Text modes + ...(( + mode === InputMode.TEMPLATE || + mode === InputMode.TEXT + ) && { completions, fileName, targetLineRange, diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/ExpressionMode.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/ExpressionMode.tsx index 388bf5122b7..8c84d6c2946 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/ExpressionMode.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/ExpressionMode.tsx @@ -17,18 +17,10 @@ */ import React from "react"; -import styled from "@emotion/styled"; import { EditorModeExpressionProps } from "./types"; import { ChipExpressionEditorComponent } from "../../MultiModeExpressionEditor/ChipExpressionEditor/components/ChipExpressionEditor"; import { ErrorBanner } from "@wso2/ui-toolkit"; - -const ExpressionContainer = styled.div` - width: 100%; - height: 100%; - display: flex; - flex-direction: column; - box-sizing: border-box; -`; +import { ExpressionContainer } from "./styles"; /** * Expression mode editor - uses ChipExpressionBaseComponent in expanded mode @@ -36,6 +28,7 @@ const ExpressionContainer = styled.div` export const ExpressionMode: React.FC = ({ value, onChange, + field, completions = [], fileName, targetLineRange, @@ -66,6 +59,7 @@ export const ExpressionMode: React.FC = ({ rawExpression={rawExpression} isInExpandedMode={true} isExpandedVersion={true} + placeholder={field.placeholder} /> {error ? diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/PromptMode.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/PromptMode.tsx index 0a34527402d..875e43a2a7b 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/PromptMode.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/PromptMode.tsx @@ -17,7 +17,6 @@ */ import React, { useState, useRef } from "react"; -import styled from "@emotion/styled"; import { EditorView as CodeMirrorView } from "@codemirror/view"; import { EditorView as ProseMirrorView } from "prosemirror-view"; import { EditorModeExpressionProps } from "./types"; @@ -27,15 +26,8 @@ import { RichTemplateMarkdownToolbar } from "../controls/RichTemplateMarkdownToo import { RawTemplateMarkdownToolbar } from "../controls/RawTemplateMarkdownToolbar"; import { ErrorBanner } from "@wso2/ui-toolkit"; import { RawTemplateEditorConfig, StringTemplateEditorConfig } from "../../MultiModeExpressionEditor/Configurations"; - -const ExpressionContainer = styled.div` - width: 100%; - flex: 1; - display: flex; - flex-direction: column; - box-sizing: border-box; - overflow: hidden; -`; +import { getPrimaryInputType } from "@wso2/ballerina-core"; +import { FlexExpressionContainer } from "./styles"; const SIMPLE_PROMPT_FIELDS = ["query", "instructions", "role"]; @@ -111,7 +103,7 @@ export const PromptMode: React.FC = ({ /> )} {isSourceView ? ( - + = ({ toolbarRef={isSimpleMode ? undefined : rawToolbarRef} enableListContinuation={true} inputMode={inputMode} - configuration={field.valueTypeConstraint === "string" ? new StringTemplateEditorConfig() : new RawTemplateEditorConfig()} + configuration={getPrimaryInputType(field.types)?.ballerinaType === "string" ? new StringTemplateEditorConfig() : new RawTemplateEditorConfig()} + placeholder={field.placeholder} /> - + ) : ( - + = ({ getHelperPane={isSimpleMode ? undefined : getHelperPane} onEditorViewReady={setProseMirrorView} onHelperPaneStateChange={handleHelperPaneStateChange} - configuration={field.valueTypeConstraint === "string" ? new StringTemplateEditorConfig() : new RawTemplateEditorConfig()} + configuration={getPrimaryInputType(field.types)?.ballerinaType === "string" ? new StringTemplateEditorConfig() : new RawTemplateEditorConfig()} + placeholder={field.placeholder} /> - + ) } {error ? diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/TemplateMode.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/TemplateMode.tsx index 1bbda23f839..234549ae758 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/TemplateMode.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/TemplateMode.tsx @@ -17,23 +17,16 @@ */ import React from "react"; -import styled from "@emotion/styled"; import { EditorModeExpressionProps } from "./types"; import { ChipExpressionEditorComponent } from "../../MultiModeExpressionEditor/ChipExpressionEditor/components/ChipExpressionEditor"; import { ErrorBanner } from "@wso2/ui-toolkit"; -import { RawTemplateEditorConfig } from "../../MultiModeExpressionEditor/Configurations"; - -const ExpressionContainer = styled.div` - width: 100%; - height: 100%; - display: flex; - flex-direction: column; - box-sizing: border-box; -`; +import { getEditorConfiguration } from "../../ExpressionField"; +import { ExpressionContainer } from "./styles"; export const TemplateMode: React.FC = ({ value, onChange, + field, completions = [], fileName, targetLineRange, @@ -66,6 +59,8 @@ export const TemplateMode: React.FC = ({ isInExpandedMode={true} isExpandedVersion={true} inputMode={inputMode} + configuration={getEditorConfiguration(inputMode)} + placeholder={field.placeholder} /> {error ? diff --git a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/TextMode.tsx b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/TextMode.tsx index d7287461914..57c8b82d201 100644 --- a/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/TextMode.tsx +++ b/workspaces/ballerina/ballerina-side-panel/src/components/editors/ExpandedEditor/modes/TextMode.tsx @@ -17,40 +17,54 @@ */ import React from "react"; -import styled from "@emotion/styled"; -import { ThemeColors } from "@wso2/ui-toolkit"; -import { EditorModeProps } from "./types"; - -const TextArea = styled.textarea` - width: 100%; - height: 100%; - padding: 12px !important; - fontSize: 13px; - font-family: var(--vscode-editor-font-family); - background: var(--input-background); - color: ${ThemeColors.ON_SURFACE}; - border: 1px solid ${ThemeColors.OUTLINE_VARIANT}; - border-radius: 4px; - resize: none; - outline: none; - box-sizing: border-box; - - &:focus { - border-color: ${ThemeColors.OUTLINE}; - box-shadow: 0 0 0 1px ${ThemeColors.OUTLINE}; - } -`; +import { EditorModeExpressionProps } from "./types"; +import { ExpressionContainer } from "./styles"; +import { ChipExpressionEditorComponent } from "../../MultiModeExpressionEditor/ChipExpressionEditor/components/ChipExpressionEditor"; +import { getEditorConfiguration } from "../../ExpressionField"; +import { ErrorBanner } from "@wso2/ui-toolkit"; /** * Text mode editor - simple textarea without any formatting tools */ -export const TextMode: React.FC = ({ value, onChange, field }) => { +export const TextMode: React.FC = ({ + value, + onChange, + completions = [], + fileName, + targetLineRange, + sanitizedExpression, + extractArgsFromFunction, + getHelperPane, + rawExpression, + error, + formDiagnostics, + inputMode +}) => { + return ( -